[FFmpeg-devel] [PATCH] avcodec: Mark some codecs with threadsafe init as such

Derek Buitenhuis derek.buitenhuis at gmail.com
Tue Feb 7 18:36:38 EET 2017


Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>
---
I wrote this in Nov 2015, and it has resided on my GitHub fork in a branch
since then, since I never ot around to finishing it. I noticed a spike in
interest in the 'feature', so I rebase and am forwarding this, in case it
is of interest.

During the triage I noted the following codecs need to be properly fixed:
   * cavs
   * asv
   * bink
   * ... more ...

CC me in any reply you feel needs my direct response.
---
 libavcodec/aasc.c          | 1 +
 libavcodec/aic.c           | 1 +
 libavcodec/anm.c           | 1 +
 libavcodec/ansi.c          | 1 +
 libavcodec/aura.c          | 1 +
 libavcodec/avrndec.c       | 1 +
 libavcodec/avs.c           | 1 +
 libavcodec/avuidec.c       | 1 +
 libavcodec/bethsoftvideo.c | 1 +
 libavcodec/bfi.c           | 1 +
 libavcodec/bmvvideo.c      | 1 +
 libavcodec/c93.c           | 1 +
 libavcodec/cllc.c          | 1 +
 libavcodec/cyuv.c          | 2 ++
 libavcodec/fraps.c         | 1 +
 libavcodec/lcldec.c        | 2 ++
 libavcodec/pngdec.c        | 3 ++-
 libavcodec/r210dec.c       | 3 +++
 libavcodec/utvideodec.c    | 1 +
 libavcodec/v408dec.c       | 2 ++
 libavcodec/vble.c          | 1 +
 libavcodec/zerocodec.c     | 1 +
 22 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c
index fd63aba..58cc3c8 100644
--- a/libavcodec/aasc.c
+++ b/libavcodec/aasc.c
@@ -159,4 +159,5 @@ AVCodec ff_aasc_decoder = {
     .close          = aasc_decode_end,
     .decode         = aasc_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/aic.c b/libavcodec/aic.c
index ff8e392..4faa574 100644
--- a/libavcodec/aic.c
+++ b/libavcodec/aic.c
@@ -492,4 +492,5 @@ AVCodec ff_aic_decoder = {
     .decode         = aic_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .init_thread_copy = ONLY_IF_THREADS_ENABLED(aic_decode_init),
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/anm.c b/libavcodec/anm.c
index 29d59fb..7268418 100644
--- a/libavcodec/anm.c
+++ b/libavcodec/anm.c
@@ -199,4 +199,5 @@ AVCodec ff_anm_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/ansi.c b/libavcodec/ansi.c
index 19c88d8..3c82dcd 100644
--- a/libavcodec/ansi.c
+++ b/libavcodec/ansi.c
@@ -482,4 +482,5 @@ AVCodec ff_ansi_decoder = {
     .close          = decode_close,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/aura.c b/libavcodec/aura.c
index 5f84d95..5ef9316 100644
--- a/libavcodec/aura.c
+++ b/libavcodec/aura.c
@@ -105,4 +105,5 @@ AVCodec ff_aura2_decoder = {
     .init           = aura_decode_init,
     .decode         = aura_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/avrndec.c b/libavcodec/avrndec.c
index cdec99c..c37f996 100644
--- a/libavcodec/avrndec.c
+++ b/libavcodec/avrndec.c
@@ -170,4 +170,5 @@ AVCodec ff_avrn_decoder = {
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
     .max_lowres     = 3,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/avs.c b/libavcodec/avs.c
index 345d628..66724d4 100644
--- a/libavcodec/avs.c
+++ b/libavcodec/avs.c
@@ -186,4 +186,5 @@ AVCodec ff_avs_decoder = {
     .decode         = avs_decode_frame,
     .close          = avs_decode_end,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/avuidec.c b/libavcodec/avuidec.c
index 5117844..4cf620d 100644
--- a/libavcodec/avuidec.c
+++ b/libavcodec/avuidec.c
@@ -127,4 +127,5 @@ AVCodec ff_avui_decoder = {
     .init         = avui_decode_init,
     .decode       = avui_decode_frame,
     .capabilities = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/bethsoftvideo.c b/libavcodec/bethsoftvideo.c
index 97b745d..274516b 100644
--- a/libavcodec/bethsoftvideo.c
+++ b/libavcodec/bethsoftvideo.c
@@ -163,4 +163,5 @@ AVCodec ff_bethsoftvid_decoder = {
     .close          = bethsoftvid_decode_end,
     .decode         = bethsoftvid_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/bfi.c b/libavcodec/bfi.c
index 6727629..233a1d2 100644
--- a/libavcodec/bfi.c
+++ b/libavcodec/bfi.c
@@ -185,4 +185,5 @@ AVCodec ff_bfi_decoder = {
     .close          = bfi_decode_close,
     .decode         = bfi_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/bmvvideo.c b/libavcodec/bmvvideo.c
index 97f850d..dbbc100 100644
--- a/libavcodec/bmvvideo.c
+++ b/libavcodec/bmvvideo.c
@@ -295,4 +295,5 @@ AVCodec ff_bmv_video_decoder = {
     .init           = decode_init,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/c93.c b/libavcodec/c93.c
index fd026ac..b708659 100644
--- a/libavcodec/c93.c
+++ b/libavcodec/c93.c
@@ -269,4 +269,5 @@ AVCodec ff_c93_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/cllc.c b/libavcodec/cllc.c
index 1c6902a..80b0498 100644
--- a/libavcodec/cllc.c
+++ b/libavcodec/cllc.c
@@ -496,4 +496,5 @@ AVCodec ff_cllc_decoder = {
     .decode         = cllc_decode_frame,
     .close          = cllc_decode_close,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/cyuv.c b/libavcodec/cyuv.c
index 8e6749b..f2b0a7c 100644
--- a/libavcodec/cyuv.c
+++ b/libavcodec/cyuv.c
@@ -185,6 +185,7 @@ AVCodec ff_aura_decoder = {
     .init           = cyuv_decode_init,
     .decode         = cyuv_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 
@@ -198,5 +199,6 @@ AVCodec ff_cyuv_decoder = {
     .init           = cyuv_decode_init,
     .decode         = cyuv_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
diff --git a/libavcodec/fraps.c b/libavcodec/fraps.c
index 5ca6aff..ed8cb18 100644
--- a/libavcodec/fraps.c
+++ b/libavcodec/fraps.c
@@ -350,4 +350,5 @@ AVCodec ff_fraps_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/lcldec.c b/libavcodec/lcldec.c
index b1335e1..f5040c6 100644
--- a/libavcodec/lcldec.c
+++ b/libavcodec/lcldec.c
@@ -642,6 +642,7 @@ AVCodec ff_mszh_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 
@@ -656,5 +657,6 @@ AVCodec ff_zlib_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index e87c2aa..601b8db 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -1525,6 +1525,7 @@ AVCodec ff_apng_decoder = {
     .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 
@@ -1541,6 +1542,6 @@ AVCodec ff_png_decoder = {
     .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
-    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
+    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
diff --git a/libavcodec/r210dec.c b/libavcodec/r210dec.c
index 9c868cd..dbc94c7 100644
--- a/libavcodec/r210dec.c
+++ b/libavcodec/r210dec.c
@@ -104,6 +104,7 @@ AVCodec ff_r210_decoder = {
     .init           = decode_init,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 #if CONFIG_R10K_DECODER
@@ -115,6 +116,7 @@ AVCodec ff_r10k_decoder = {
     .init           = decode_init,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 #if CONFIG_AVRP_DECODER
@@ -126,5 +128,6 @@ AVCodec ff_avrp_decoder = {
     .init           = decode_init,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
index 38de2c8..d6f4dd0 100644
--- a/libavcodec/utvideodec.c
+++ b/libavcodec/utvideodec.c
@@ -941,4 +941,5 @@ AVCodec ff_utvideo_decoder = {
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/v408dec.c b/libavcodec/v408dec.c
index acff95d..196c575 100644
--- a/libavcodec/v408dec.c
+++ b/libavcodec/v408dec.c
@@ -88,6 +88,7 @@ AVCodec ff_ayuv_decoder = {
     .init         = v408_decode_init,
     .decode       = v408_decode_frame,
     .capabilities = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
 #if CONFIG_V408_DECODER
@@ -99,5 +100,6 @@ AVCodec ff_v408_decoder = {
     .init         = v408_decode_init,
     .decode       = v408_decode_frame,
     .capabilities = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
 #endif
diff --git a/libavcodec/vble.c b/libavcodec/vble.c
index 4a07ab3..c25ee98 100644
--- a/libavcodec/vble.c
+++ b/libavcodec/vble.c
@@ -215,4 +215,5 @@ AVCodec ff_vble_decoder = {
     .decode         = vble_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .init_thread_copy = ONLY_IF_THREADS_ENABLED(vble_decode_init),
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
index 55a9a91..e67eee4 100644
--- a/libavcodec/zerocodec.c
+++ b/libavcodec/zerocodec.c
@@ -149,4 +149,5 @@ AVCodec ff_zerocodec_decoder = {
     .decode         = zerocodec_decode_frame,
     .close          = zerocodec_decode_close,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
-- 
1.8.3.1



More information about the ffmpeg-devel mailing list