summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2011-12-08 06:57:44 +0100
committerAnton Khirnov <anton@khirnov.net>2012-01-31 07:55:24 +0100
commitaf08d9aeea870de017139f7b1c44b7d816cf8e56 (patch)
treea94b59c3d1976b21855e9af7b847e4c81ecb062d /libavcodec
parentf7fe41a04f962707a99597d2ea49d73ca90b23a0 (diff)
lavc: add avcodec_is_open().
It allows to check whether an AVCodecContext is open in a documented way. Right now the undocumented way this check is done in lavf/lavc is by checking whether AVCodecContext.codec is NULL. However it's desirable to be able to set AVCodecContext.codec before avcodec_open2().
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/avcodec.h6
-rw-r--r--libavcodec/options.c2
-rw-r--r--libavcodec/utils.c8
3 files changed, 15 insertions, 1 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index a6bb6863f2..284c7f8cb8 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -4183,4 +4183,10 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id);
*/
const AVClass *avcodec_get_class(void);
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
#endif /* AVCODEC_AVCODEC_H */
diff --git a/libavcodec/options.c b/libavcodec/options.c
index c416b4aa4f..52fc66400a 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -485,7 +485,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec){
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
{
- if (dest->codec) { // check that the dest context is uninitialized
+ if (avcodec_is_open(dest)) { // check that the dest context is uninitialized
av_log(dest, AV_LOG_ERROR,
"Tried to copy AVCodecContext %p into already-initialized %p\n",
src, dest);
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 34a4122d5d..3ee6b09f74 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -627,6 +627,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
int ret = 0;
AVDictionary *tmp = NULL;
+ if (avcodec_is_open(avctx))
+ return 0;
+
if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
return AVERROR(EINVAL);
@@ -1803,3 +1806,8 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id)
return AVMEDIA_TYPE_UNKNOWN;
}
+
+int avcodec_is_open(AVCodecContext *s)
+{
+ return !!s->internal;
+}