diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c index efb04589f6..eba8c23cdd 100644 --- a/libavcodec/amfenc_h264.c +++ b/libavcodec/amfenc_h264.c @@ -391,7 +391,8 @@ const FFCodec ff_h264_amf_encoder = { .defaults = defaults, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.pix_fmts = ff_amf_pix_fmts, .p.wrapper_name = "amf", .hw_configs = ff_amfenc_hw_configs, diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c index 8ab9330730..5aaaa83e39 100644 --- a/libavcodec/amfenc_hevc.c +++ b/libavcodec/amfenc_hevc.c @@ -323,7 +323,8 @@ const FFCodec ff_hevc_amf_encoder = { .defaults = defaults, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.pix_fmts = ff_amf_pix_fmts, .p.wrapper_name = "amf", .hw_configs = ff_amfenc_hw_configs, diff --git a/libavcodec/codec_internal.h b/libavcodec/codec_internal.h index 5df286ce52..a90c19d61a 100644 --- a/libavcodec/codec_internal.h +++ b/libavcodec/codec_internal.h @@ -29,6 +29,13 @@ * allowing to call the init function without locking any global mutexes. */ #define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0) +/** + * The codec is not known to be init-threadsafe (i.e. it might be unsafe + * to initialize this codec and another codec concurrently, typically because + * the codec calls external APIs that are not known to be thread-safe). + * Therefore calling the codec's init function needs to be guarded with a lock. + */ +#define FF_CODEC_CAP_NOT_INIT_THREADSAFE (1 << 9) /** * The codec allows calling the close function for deallocation even if * the init function returned a failure. Without this capability flag, a diff --git a/libavcodec/crystalhd.c b/libavcodec/crystalhd.c index cf74f22e7d..555b1d2b6b 100644 --- a/libavcodec/crystalhd.c +++ b/libavcodec/crystalhd.c @@ -787,7 +787,8 @@ static int crystalhd_receive_frame(AVCodecContext *avctx, AVFrame *frame) .flush = flush, \ .bsfs = bsf_name, \ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \ - .caps_internal = FF_CODEC_CAP_SETS_FRAME_PROPS, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_SETS_FRAME_PROPS, \ .p.pix_fmts = (const enum AVPixelFormat[]){AV_PIX_FMT_YUYV422, AV_PIX_FMT_NONE}, \ .p.wrapper_name = "crystalhd", \ }; diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index b544b3361d..7dbd4c9ec1 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -1129,7 +1129,8 @@ static const AVCodecHWConfigInternal *const cuvid_hw_configs[] = { .flush = cuvid_flush, \ .bsfs = bsf_name, \ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \ - .caps_internal = FF_CODEC_CAP_SETS_FRAME_PROPS, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_SETS_FRAME_PROPS, \ .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \ AV_PIX_FMT_NV12, \ AV_PIX_FMT_P010, \ diff --git a/libavcodec/libaomdec.c b/libavcodec/libaomdec.c index 52a8bf19e2..3243610304 100644 --- a/libavcodec/libaomdec.c +++ b/libavcodec/libaomdec.c @@ -258,7 +258,8 @@ const FFCodec ff_libaom_av1_decoder = { .close = aom_free, FF_CODEC_DECODE_CB(aom_decode), .p.capabilities = AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .p.profiles = NULL_IF_CONFIG_SMALL(ff_av1_profiles), .p.wrapper_name = "libaom", }; diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c index 6b7e426bfd..b792226744 100644 --- a/libavcodec/libaomenc.c +++ b/libavcodec/libaomenc.c @@ -1442,7 +1442,8 @@ FFCodec ff_libaom_av1_encoder = { .init = av1_init, FF_CODEC_ENCODE_CB(aom_encode), .close = aom_free, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .defaults = defaults, .init_static_data = av1_init_static, }; diff --git a/libavcodec/libaribb24.c b/libavcodec/libaribb24.c index 9658e1d5ac..e89e49a771 100644 --- a/libavcodec/libaribb24.c +++ b/libavcodec/libaribb24.c @@ -388,6 +388,7 @@ const FFCodec ff_libaribb24_decoder = { .p.id = AV_CODEC_ID_ARIB_CAPTION, .p.priv_class = &aribb24_class, .p.wrapper_name = "libaribb24", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(Libaribb24Context), .init = libaribb24_init, .close = libaribb24_close, diff --git a/libavcodec/libcelt_dec.c b/libavcodec/libcelt_dec.c index d659d80ed2..a9c9962b71 100644 --- a/libavcodec/libcelt_dec.c +++ b/libavcodec/libcelt_dec.c @@ -134,6 +134,7 @@ const FFCodec ff_libcelt_decoder = { .p.id = AV_CODEC_ID_CELT, .p.capabilities = AV_CODEC_CAP_DR1, .p.wrapper_name = "libcelt", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(struct libcelt_context), .init = libcelt_dec_init, .close = libcelt_dec_close, diff --git a/libavcodec/libcodec2.c b/libavcodec/libcodec2.c index abb1130e80..0f2e671ab1 100644 --- a/libavcodec/libcodec2.c +++ b/libavcodec/libcodec2.c @@ -185,6 +185,7 @@ const FFCodec ff_libcodec2_decoder = { .p.supported_samplerates = (const int[]){ 8000, 0 }, .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .p.ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO, { 0 } }, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibCodec2Context), .init = libcodec2_init_decoder, .close = libcodec2_close, @@ -204,6 +205,7 @@ const FFCodec ff_libcodec2_encoder = { .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .p.ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO, { 0 } }, .p.priv_class = &libcodec2_enc_class, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibCodec2Context), .init = libcodec2_init_encoder, .close = libcodec2_close, diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c index 918e48502c..ce4c6a34f0 100644 --- a/libavcodec/libdavs2.c +++ b/libavcodec/libdavs2.c @@ -232,7 +232,8 @@ const FFCodec ff_libdavs2_decoder = { FF_CODEC_DECODE_CB(davs2_decode_frame), .flush = davs2_flush, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .p.wrapper_name = "libdavs2", diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c index a5697bde51..2ffbc180ba 100644 --- a/libavcodec/libfdk-aacenc.c +++ b/libavcodec/libfdk-aacenc.c @@ -480,6 +480,7 @@ const FFCodec ff_libfdk_aac_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("Fraunhofer FDK AAC"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_AAC, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(AACContext), .init = aac_encode_init, FF_CODEC_ENCODE_CB(aac_encode_frame), diff --git a/libavcodec/libgsmdec.c b/libavcodec/libgsmdec.c index 9c2304f7a2..6e37122261 100644 --- a/libavcodec/libgsmdec.c +++ b/libavcodec/libgsmdec.c @@ -132,6 +132,7 @@ const FFCodec ff_libgsm_decoder = { .p.id = AV_CODEC_ID_GSM, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, .p.wrapper_name = "libgsm", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibGSMDecodeContext), .init = libgsm_decode_init, .close = libgsm_decode_close, @@ -147,6 +148,7 @@ const FFCodec ff_libgsm_ms_decoder = { .p.id = AV_CODEC_ID_GSM_MS, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, .p.wrapper_name = "libgsm", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibGSMDecodeContext), .init = libgsm_decode_init, .close = libgsm_decode_close, diff --git a/libavcodec/libgsmenc.c b/libavcodec/libgsmenc.c index a45b77be95..f83389dd60 100644 --- a/libavcodec/libgsmenc.c +++ b/libavcodec/libgsmenc.c @@ -134,6 +134,7 @@ const FFCodec ff_libgsm_encoder = { .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .p.wrapper_name = "libgsm", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, }; #endif #if CONFIG_LIBGSM_MS_ENCODER @@ -154,5 +155,6 @@ const FFCodec ff_libgsm_ms_encoder = { .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .p.wrapper_name = "libgsm", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, }; #endif diff --git a/libavcodec/libilbc.c b/libavcodec/libilbc.c index a7b1eaf28c..0b6b1fbb24 100644 --- a/libavcodec/libilbc.c +++ b/libavcodec/libilbc.c @@ -122,6 +122,7 @@ const FFCodec ff_libilbc_decoder = { .p.long_name = NULL_IF_CONFIG_SMALL("iLBC (Internet Low Bitrate Codec)"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_ILBC, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(ILBCDecContext), .init = ilbc_decode_init, FF_CODEC_DECODE_CB(ilbc_decode_frame), @@ -204,6 +205,7 @@ const FFCodec ff_libilbc_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("iLBC (Internet Low Bitrate Codec)"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_ILBC, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(ILBCEncContext), .init = ilbc_encode_init, FF_CODEC_ENCODE_CB(ilbc_encode_frame), diff --git a/libavcodec/libjxldec.c b/libavcodec/libjxldec.c index 829478bbde..b9322b082a 100644 --- a/libavcodec/libjxldec.c +++ b/libavcodec/libjxldec.c @@ -455,6 +455,7 @@ const FFCodec ff_libjxl_decoder = { FF_CODEC_DECODE_CB(libjxl_decode_frame), .close = libjxl_decode_close, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_OTHER_THREADS, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "libjxl", }; diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c index 9d98a112e1..dd85fcbc8e 100644 --- a/libavcodec/libjxlenc.c +++ b/libavcodec/libjxlenc.c @@ -468,7 +468,8 @@ const FFCodec ff_libjxl_encoder = { FF_CODEC_ENCODE_CB(libjxl_encode_frame), .close = libjxl_encode_close, .p.capabilities = AV_CODEC_CAP_OTHER_THREADS, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB48, AV_PIX_FMT_RGBA64, diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c index 02a256c766..2cd51692a2 100644 --- a/libavcodec/libmp3lame.c +++ b/libavcodec/libmp3lame.c @@ -335,6 +335,7 @@ const FFCodec ff_libmp3lame_encoder = { .p.id = AV_CODEC_ID_MP3, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LAMEContext), .init = mp3lame_encode_init, FF_CODEC_ENCODE_CB(mp3lame_encode_frame), diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index 539f0ded3c..014dd53fa5 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -138,6 +138,7 @@ const FFCodec ff_libopencore_amrnb_decoder = { .p.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_AMR_NB, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(AMRContext), .init = amr_nb_decode_init, .close = amr_nb_decode_close, @@ -293,6 +294,7 @@ const FFCodec ff_libopencore_amrnb_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_AMR_NB, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(AMRContext), .init = amr_nb_encode_init, FF_CODEC_ENCODE_CB(amr_nb_encode_frame), @@ -379,6 +381,7 @@ const FFCodec ff_libopencore_amrwb_decoder = { .p.id = AV_CODEC_ID_AMR_WB, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, .p.wrapper_name = "libopencore_amrwb", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(AMRWBContext), .init = amr_wb_decode_init, .close = amr_wb_decode_close, diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index 58ac6c413a..fa420f145b 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -509,6 +509,7 @@ const FFCodec ff_libopenjpeg_decoder = { .p.max_lowres = 31, .p.priv_class = &openjpeg_class, .p.wrapper_name = "libopenjpeg", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibOpenJPEGContext), .init = libopenjpeg_decode_init, FF_CODEC_DECODE_CB(libopenjpeg_decode_frame), diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c index 06338e882c..750fce3d8d 100644 --- a/libavcodec/libopenjpegenc.c +++ b/libavcodec/libopenjpegenc.c @@ -759,6 +759,7 @@ const FFCodec ff_libopenjpeg_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), .p.type = AVMEDIA_TYPE_VIDEO, .p.id = AV_CODEC_ID_JPEG2000, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibOpenJPEGContext), .init = libopenjpeg_encode_init, FF_CODEC_ENCODE_CB(libopenjpeg_encode_frame), diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c index 316ab0f2a7..7b7d9c8a84 100644 --- a/libavcodec/libopusdec.c +++ b/libavcodec/libopusdec.c @@ -241,7 +241,8 @@ const FFCodec ff_libopus_decoder = { FF_CODEC_DECODE_CB(libopus_decode), .flush = libopus_flush, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c index c884075ffe..48dd32fc38 100644 --- a/libavcodec/libopusenc.c +++ b/libavcodec/libopusenc.c @@ -588,6 +588,7 @@ const FFCodec ff_libopus_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("libopus Opus"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_OPUS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibopusEncContext), .init = libopus_encode_init, FF_CODEC_ENCODE_CB(libopus_encode), diff --git a/libavcodec/librav1e.c b/libavcodec/librav1e.c index 9d811ba81c..67b301b802 100644 --- a/libavcodec/librav1e.c +++ b/libavcodec/librav1e.c @@ -628,6 +628,7 @@ const FFCodec ff_librav1e_encoder = { .p.pix_fmts = librav1e_pix_fmts, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, .p.wrapper_name = "librav1e", }; diff --git a/libavcodec/libshine.c b/libavcodec/libshine.c index 9bc545689a..123b1a0847 100644 --- a/libavcodec/libshine.c +++ b/libavcodec/libshine.c @@ -137,6 +137,7 @@ const FFCodec ff_libshine_encoder = { .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_MP3, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(SHINEContext), .init = libshine_encode_init, FF_CODEC_ENCODE_CB(libshine_encode_frame), diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 8c9e05e51d..daa6dec64a 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -197,6 +197,7 @@ const FFCodec ff_libspeex_decoder = { .p.id = AV_CODEC_ID_SPEEX, .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, .p.wrapper_name = "libspeex", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibSpeexContext), .init = libspeex_decode_init, .close = libspeex_decode_close, diff --git a/libavcodec/libspeexenc.c b/libavcodec/libspeexenc.c index ec4b3c6a8f..9eab8f8af0 100644 --- a/libavcodec/libspeexenc.c +++ b/libavcodec/libspeexenc.c @@ -353,6 +353,7 @@ const FFCodec ff_libspeex_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("libspeex Speex"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_SPEEX, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibSpeexEncContext), .init = encode_init, FF_CODEC_ENCODE_CB(encode_frame), diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index d9ebb6aa56..234c24ca7a 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -666,7 +666,8 @@ const FFCodec ff_libsvtav1_encoder = { FF_CODEC_RECEIVE_PACKET_CB(eb_receive_packet), .close = eb_enc_close, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP, .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_NONE }, diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c index 162d170b0f..22835553d6 100644 --- a/libavcodec/libtheoraenc.c +++ b/libavcodec/libtheoraenc.c @@ -374,6 +374,7 @@ const FFCodec ff_libtheora_encoder = { .p.id = AV_CODEC_ID_THEORA, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY /* for statsfile summary */, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(TheoraContext), .init = encode_init, .close = encode_close, diff --git a/libavcodec/libtwolame.c b/libavcodec/libtwolame.c index 1e53cf2257..98df38d013 100644 --- a/libavcodec/libtwolame.c +++ b/libavcodec/libtwolame.c @@ -214,6 +214,7 @@ const FFCodec ff_libtwolame_encoder = { .p.long_name = NULL_IF_CONFIG_SMALL("libtwolame MP2 (MPEG audio layer 2)"), .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_MP2, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(TWOLAMEContext), .init = twolame_encode_init, FF_CODEC_ENCODE_CB(twolame_encode_frame), diff --git a/libavcodec/libuavs3d.c b/libavcodec/libuavs3d.c index 7c6c3f0440..5ccd9893a5 100644 --- a/libavcodec/libuavs3d.c +++ b/libavcodec/libuavs3d.c @@ -256,7 +256,8 @@ const FFCodec ff_libuavs3d_decoder = { .close = libuavs3d_end, FF_CODEC_DECODE_CB(libuavs3d_decode_frame), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .flush = libuavs3d_flush, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10LE, diff --git a/libavcodec/libvo-amrwbenc.c b/libavcodec/libvo-amrwbenc.c index 12ef6d7fe6..e58c980b5c 100644 --- a/libavcodec/libvo-amrwbenc.c +++ b/libavcodec/libvo-amrwbenc.c @@ -148,6 +148,7 @@ const FFCodec ff_libvo_amrwbenc_encoder = { .p.id = AV_CODEC_ID_AMR_WB, .p.priv_class = &amrwb_class, .p.wrapper_name = "libvo_amrwbenc", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(AMRWBContext), .init = amr_wb_encode_init, FF_CODEC_ENCODE_CB(amr_wb_encode_frame), diff --git a/libavcodec/libvorbisdec.c b/libavcodec/libvorbisdec.c index 81c4ac1c02..38a8314760 100644 --- a/libavcodec/libvorbisdec.c +++ b/libavcodec/libvorbisdec.c @@ -216,6 +216,7 @@ const FFCodec ff_libvorbis_decoder = { .p.type = AVMEDIA_TYPE_AUDIO, .p.id = AV_CODEC_ID_VORBIS, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_CHANNEL_CONF, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(OggVorbisDecContext), .init = oggvorbis_decode_init, FF_CODEC_DECODE_CB(oggvorbis_decode_frame), diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c index 9460d3267c..3353776083 100644 --- a/libavcodec/libvorbisenc.c +++ b/libavcodec/libvorbisenc.c @@ -382,6 +382,7 @@ const FFCodec ff_libvorbis_encoder = { .p.id = AV_CODEC_ID_VORBIS, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibvorbisEncContext), .init = libvorbis_encode_init, FF_CODEC_ENCODE_CB(libvorbis_encode_frame), diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c index 0b279e7eda..c5b95332d3 100644 --- a/libavcodec/libvpxdec.c +++ b/libavcodec/libvpxdec.c @@ -366,7 +366,8 @@ const FFCodec ff_libvpx_vp8_decoder = { .init = vp8_init, .close = vpx_free, FF_CODEC_DECODE_CB(vpx_decode), - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, }; #endif /* CONFIG_LIBVPX_VP8_DECODER */ @@ -389,7 +390,8 @@ FFCodec ff_libvpx_vp9_decoder = { .init = vp9_init, .close = vpx_free, FF_CODEC_DECODE_CB(vpx_decode), - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .init_static_data = ff_vp9_init_static, }; #endif /* CONFIG_LIBVPX_VP9_DECODER */ diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 187a9e9a36..5b7c7735a1 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -1951,7 +1951,8 @@ const FFCodec ff_libvpx_vp8_encoder = { .init = vp8_init, FF_CODEC_ENCODE_CB(vpx_encode), .close = vpx_free, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE }, .p.priv_class = &class_vp8, .defaults = defaults, @@ -1986,7 +1987,8 @@ FFCodec ff_libvpx_vp9_encoder = { .init = vp9_init, FF_CODEC_ENCODE_CB(vpx_encode), .close = vpx_free, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .defaults = defaults, .init_static_data = ff_vp9_init_static, }; diff --git a/libavcodec/libwebpenc.c b/libavcodec/libwebpenc.c index c5dc1b160a..be7bfa3963 100644 --- a/libavcodec/libwebpenc.c +++ b/libavcodec/libwebpenc.c @@ -96,6 +96,7 @@ const FFCodec ff_libwebp_encoder = { .p.pix_fmts = ff_libwebpenc_pix_fmts, .p.priv_class = &ff_libwebpenc_class, .p.wrapper_name = "libwebp", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibWebPContext), .defaults = ff_libwebp_defaults, .init = libwebp_encode_init, diff --git a/libavcodec/libwebpenc_animencoder.c b/libavcodec/libwebpenc_animencoder.c index 765fcf70d2..43116c63c0 100644 --- a/libavcodec/libwebpenc_animencoder.c +++ b/libavcodec/libwebpenc_animencoder.c @@ -138,6 +138,7 @@ const FFCodec ff_libwebp_anim_encoder = { .p.pix_fmts = ff_libwebpenc_pix_fmts, .p.priv_class = &ff_libwebpenc_class, .p.wrapper_name = "libwebp", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(LibWebPAnimContext), .defaults = ff_libwebp_defaults, .init = libwebp_anim_encode_init, diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 98ec030865..17fd7ae3e1 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -1239,6 +1239,8 @@ FFCodec ff_libx264_encoder = { .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS #if X264_BUILD >= 158 | FF_CODEC_CAP_INIT_THREADSAFE +#else + | FF_CODEC_CAP_NOT_INIT_THREADSAFE #endif , }; @@ -1271,6 +1273,8 @@ const FFCodec ff_libx264rgb_encoder = { .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS #if X264_BUILD >= 158 | FF_CODEC_CAP_INIT_THREADSAFE +#else + | FF_CODEC_CAP_NOT_INIT_THREADSAFE #endif , }; @@ -1300,6 +1304,7 @@ const FFCodec ff_libx262_encoder = { FF_CODEC_ENCODE_CB(X264_frame), .close = X264_close, .defaults = x264_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, }; #endif diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index f68ecb3092..6d2590dd7f 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -757,5 +757,6 @@ FFCodec ff_libx265_encoder = { .close = libx265_encode_close, .priv_data_size = sizeof(libx265Context), .defaults = x265_defaults, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, }; diff --git a/libavcodec/libxavs.c b/libavcodec/libxavs.c index a3efbcb4a1..2c7577535f 100644 --- a/libavcodec/libxavs.c +++ b/libavcodec/libxavs.c @@ -432,7 +432,8 @@ const FFCodec ff_libxavs_encoder = { .init = XAVS_init, FF_CODEC_ENCODE_CB(XAVS_frame), .close = XAVS_close, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .p.priv_class = &xavs_class, .defaults = xavs_defaults, diff --git a/libavcodec/libxavs2.c b/libavcodec/libxavs2.c index bf34b7acbb..d4a1bf5bfc 100644 --- a/libavcodec/libxavs2.c +++ b/libavcodec/libxavs2.c @@ -297,7 +297,8 @@ const FFCodec ff_libxavs2_encoder = { .init = xavs2_init, FF_CODEC_ENCODE_CB(xavs2_encode_frame), .close = xavs2_close, - .caps_internal = FF_CODEC_CAP_AUTO_THREADS, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_AUTO_THREADS, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .p.priv_class = &libxavs2, diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c index 514e76f1b6..c88ede05b5 100644 --- a/libavcodec/libzvbi-teletextdec.c +++ b/libavcodec/libzvbi-teletextdec.c @@ -819,6 +819,7 @@ const FFCodec ff_libzvbi_teletext_decoder = { .p.capabilities = AV_CODEC_CAP_DELAY, .p.priv_class = &teletext_class, .p.wrapper_name = "libzvbi", + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, .priv_data_size = sizeof(TeletextContext), .init = teletext_init_decoder, .close = teletext_close_decoder, diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 6b4c39b4e0..0bf2a0595d 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -544,7 +544,8 @@ const FFCodec ff_ ## short_name ## _mediacodec_decoder = { .flush = mediacodec_decode_flush, \ .close = mediacodec_decode_close, \ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \ - .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_SETS_PKT_DTS, \ .bsfs = bsf, \ .hw_configs = mediacodec_hw_configs, \ .p.wrapper_name = "mediacodec", \ diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index 7fd24ad3b7..c9b7b16b69 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -841,7 +841,8 @@ static const AVClass ffmmal_dec_class = { .flush = ffmmal_flush, \ .p.priv_class = &ffmmal_dec_class, \ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \ - .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_SETS_PKT_DTS, \ .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL, \ AV_PIX_FMT_YUV420P, \ AV_PIX_FMT_NONE}, \ diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c index 1860c60a29..7fa6c23190 100644 --- a/libavcodec/nvenc_h264.c +++ b/libavcodec/nvenc_h264.c @@ -233,7 +233,8 @@ const FFCodec ff_h264_nvenc_encoder = { .defaults = defaults, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_ENCODER_FLUSH | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.pix_fmts = ff_nvenc_pix_fmts, .p.wrapper_name = "nvenc", .hw_configs = ff_nvenc_hw_configs, diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index 2c64cce598..290bb1eb77 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -215,7 +215,8 @@ const FFCodec ff_hevc_nvenc_encoder = { .p.pix_fmts = ff_nvenc_pix_fmts, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_ENCODER_FLUSH | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "nvenc", .hw_configs = ff_nvenc_hw_configs, }; diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 5fc5bed4c8..d8283b9207 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -1025,6 +1025,7 @@ const FFCodec ff_##x##_qsv_decoder = { \ AV_PIX_FMT_NONE }, \ .hw_configs = qsv_hw_configs, \ .p.wrapper_name = "qsv", \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, \ }; \ #define DEFINE_QSV_DECODER(x, X, bsf_name) DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, options) diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c index 87b09360cb..7756dc1789 100644 --- a/libavcodec/qsvenc_h264.c +++ b/libavcodec/qsvenc_h264.c @@ -200,7 +200,8 @@ const FFCodec ff_h264_qsv_encoder = { AV_PIX_FMT_NONE }, .p.priv_class = &class, .defaults = qsv_enc_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "qsv", .hw_configs = ff_qsv_enc_hw_configs, }; diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index f6027f600b..b09640365c 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c @@ -315,7 +315,8 @@ const FFCodec ff_hevc_qsv_encoder = { AV_PIX_FMT_NONE }, .p.priv_class = &class, .defaults = qsv_enc_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "qsv", .hw_configs = ff_qsv_enc_hw_configs, }; diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c index 825eb8dc06..c5b6a406a5 100644 --- a/libavcodec/qsvenc_jpeg.c +++ b/libavcodec/qsvenc_jpeg.c @@ -96,4 +96,5 @@ const FFCodec ff_mjpeg_qsv_encoder = { .defaults = qsv_enc_defaults, .p.wrapper_name = "qsv", .hw_configs = ff_qsv_enc_hw_configs, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, }; diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c index 5cb12a2582..7340ece9a9 100644 --- a/libavcodec/qsvenc_mpeg2.c +++ b/libavcodec/qsvenc_mpeg2.c @@ -108,7 +108,8 @@ const FFCodec ff_mpeg2_qsv_encoder = { AV_PIX_FMT_NONE }, .p.priv_class = &class, .defaults = qsv_enc_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "qsv", .hw_configs = ff_qsv_enc_hw_configs, }; diff --git a/libavcodec/qsvenc_vp9.c b/libavcodec/qsvenc_vp9.c index 4b2a6ce77f..3662df1823 100644 --- a/libavcodec/qsvenc_vp9.c +++ b/libavcodec/qsvenc_vp9.c @@ -118,7 +118,8 @@ const FFCodec ff_vp9_qsv_encoder = { AV_PIX_FMT_NONE }, .p.priv_class = &class, .defaults = qsv_enc_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .p.wrapper_name = "qsv", .hw_configs = ff_qsv_enc_hw_configs, }; diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c index d4f09f456d..77d09739a5 100644 --- a/libavcodec/rkmppdec.c +++ b/libavcodec/rkmppdec.c @@ -578,6 +578,7 @@ static const AVCodecHWConfigInternal *const rkmpp_hw_configs[] = { .hw_configs = rkmpp_hw_configs, \ .bsfs = BSFS, \ .p.wrapper_name = "rkmpp", \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, \ }; RKMPP_DEC(h264, AV_CODEC_ID_H264, "h264_mp4toannexb") diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 8a51dec3fa..81729e256c 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -252,7 +252,8 @@ static const AVOption options[] = { .close = v4l2_decode_close, \ .bsfs = bsf_name, \ .p.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ - .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ .p.wrapper_name = "v4l2m2m", \ } diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index 20f81df750..03425673ea 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -433,7 +433,8 @@ static const FFCodecDefault v4l2_m2m_defaults[] = { .close = v4l2_encode_close, \ .defaults = v4l2_m2m_defaults, \ .p.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \ - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \ + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ + FF_CODEC_CAP_INIT_CLEANUP, \ .p.wrapper_name = "v4l2m2m", \ } diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 7a6b54ab6f..f1f6694f3b 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -1337,7 +1337,8 @@ const FFCodec ff_h264_vaapi_encoder = { .p.priv_class = &vaapi_encode_h264_class, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_h264_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 456307d570..d5375add22 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -1456,7 +1456,8 @@ const FFCodec ff_hevc_vaapi_encoder = { .p.priv_class = &vaapi_encode_h265_class, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_h265_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, diff --git a/libavcodec/vaapi_encode_mjpeg.c b/libavcodec/vaapi_encode_mjpeg.c index 92960145ac..cf1497a440 100644 --- a/libavcodec/vaapi_encode_mjpeg.c +++ b/libavcodec/vaapi_encode_mjpeg.c @@ -575,7 +575,8 @@ const FFCodec ff_mjpeg_vaapi_encoder = { .close = &vaapi_encode_mjpeg_close, .p.priv_class = &vaapi_encode_mjpeg_class, .p.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_mjpeg_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c index 01d1b24908..f592043f37 100644 --- a/libavcodec/vaapi_encode_mpeg2.c +++ b/libavcodec/vaapi_encode_mpeg2.c @@ -699,7 +699,8 @@ const FFCodec ff_mpeg2_vaapi_encoder = { .p.priv_class = &vaapi_encode_mpeg2_class, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_mpeg2_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c index e1d7379501..1cb2446c88 100644 --- a/libavcodec/vaapi_encode_vp8.c +++ b/libavcodec/vaapi_encode_vp8.c @@ -254,7 +254,8 @@ const FFCodec ff_vp8_vaapi_encoder = { .p.priv_class = &vaapi_encode_vp8_class, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_vp8_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c index 52373543d3..892ad770c6 100644 --- a/libavcodec/vaapi_encode_vp9.c +++ b/libavcodec/vaapi_encode_vp9.c @@ -307,7 +307,8 @@ const FFCodec ff_vp9_vaapi_encoder = { .p.priv_class = &vaapi_encode_vp9_class, .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_vp9_defaults, .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI,