This field is designed for marking codec properties useful to lavc internals.
Two internal capabilities are added:
 - CODEC_INT_CAP_THREAD_SAFE: codec can be opened without locks;
 - CODEC_INT_CAP_CLEANUP_INIT: codec frees memory if initialization fails.
---
I feel like the variable name is overly long but not sure how else (or if
at all) to call it. Any suggestions?
Vittorio

 libavcodec/avcodec.h  |  5 +++++
 libavcodec/internal.h | 10 ++++++++++
 libavcodec/utils.c    |  7 ++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 8b9e21f..b9e5375 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 CODEC_CAP_INT_* in internal.h
+     */
+    int internal_capabilities;
 } AVCodec;
 
 /**
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index a68d613..bbc7d22 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -33,6 +33,16 @@
 #include "avcodec.h"
 #include "config.h"
 
+/**
+ * Codec is thread safe.
+ */
+#define CODEC_INT_CAP_THREAD_SAFE       1 << 0
+/**
+ * Codec cleans up memory on init failure.
+ */
+#define CODEC_INT_CAP_CLEANUP_INIT      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 f8a8908..451d005 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->internal_capabilities & CODEC_INT_CAP_THREAD_SAFE)) {
         av_log(avctx, AV_LOG_ERROR,
                "Insufficient thread locking around avcodec_open2(). "
                "At least %d threads are running at the same time right now.\n",
@@ -1286,6 +1287,10 @@ end:
 
     return ret;
 free_and_end:
+    if (avctx->codec &&
+        (avctx->codec->internal_capabilities & CODEC_INT_CAP_CLEANUP_INIT))
+        avctx->codec->close(avctx);
+
     av_dict_free(&tmp);
     av_freep(&avctx->priv_data);
     if (avctx->internal) {
-- 
1.9.3 (Apple Git-50)

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to