summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2015-03-11 20:43:58 +0000
committerVittorio Giovara <vittorio.giovara@gmail.com>2015-03-13 19:47:47 +0000
commit117b432748ca87de4cd0f09d9b1495545e264733 (patch)
tree0542c2432120a0e973bcc1748a717f122787f97c
parent9993a067f6c8c7e7838052ac3146aa6b80dd7e81 (diff)
lavc: Introduce AVCodec internal capabilities
This field is designed for marking codec properties useful to lavc internals. Two internal capabilities are added: - FF_CODEC_CAP_INIT_THREADSAFE: codec can be opened without locks; - FF_CODEC_CAP_INIT_CLEANUP: codec frees memory if initialization fails.
-rw-r--r--libavcodec/avcodec.h5
-rw-r--r--libavcodec/internal.h10
-rw-r--r--libavcodec/utils.c7
3 files changed, 21 insertions, 1 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 8b9e21fbbd..3cd24b1fc1 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2924,6 +2924,11 @@ typedef struct AVCodec {
* Will be called when seeking
*/
void (*flush)(AVCodecContext *);
+ /**
+ * Internal codec capabilities.
+ * See FF_CODEC_CAP_* in internal.h
+ */
+ int caps_internal;
} AVCodec;
/**
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index a68d6134e3..a681329f20 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -33,6 +33,16 @@
#include "avcodec.h"
#include "config.h"
+/**
+ * Codec is thread safe.
+ */
+#define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0)
+/**
+ * Codec cleans up memory on init failure.
+ */
+#define FF_CODEC_CAP_INIT_CLEANUP (1 << 1)
+
+
#define FF_SANE_NB_CHANNELS 63U
#define FF_SIGNBIT(x) (x >> CHAR_BIT * sizeof(x) - 1)
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 7b169ff209..f1acd780dc 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1049,7 +1049,8 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
}
entangled_thread_counter++;
- if (entangled_thread_counter != 1) {
+ if (entangled_thread_counter != 1 &&
+ !(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE)) {
av_log(avctx, AV_LOG_ERROR,
"Insufficient thread locking. At least %d threads are "
"calling avcodec_open2() at the same time right now.\n",
@@ -1286,6 +1287,10 @@ end:
return ret;
free_and_end:
+ if (avctx->codec &&
+ (avctx->codec->caps_internal & FF_CODEC_CAP_INIT_CLEANUP))
+ avctx->codec->close(avctx);
+
av_dict_free(&tmp);
av_freep(&avctx->priv_data);
if (avctx->internal) {