Anton Khirnov: > AV_CODEC_CAP_AUTO_THREADS was originally added in b4d44a45f9a to mark > codecs that spawn threads internally and are able to select an optimal > threads count by themselves (all such codecs are wrappers around > external libraries). It is used by lavc generic code to check whether it > should handle thread_count=0 itself or pass the zero directly to the > codec implementation. Within this meaning, it is clearly supposed to be > an internal cap rather than a public one, since from the viewpoint of a > libavcodec user, lavc ALWAYS handles thread_count=0. Whether it happens > in the generic code or within the codec internals is not a meaningful > difference for the caller. > > External aspects of this flag will be dealt with in the following > commit. > --- > libavcodec/internal.h | 4 ++++ > libavcodec/libaomdec.c | 1 + > libavcodec/libaomenc.c | 1 + > libavcodec/libdav1d.c | 3 ++- > libavcodec/libdavs2.c | 1 + > libavcodec/libkvazaar.c | 3 ++- > libavcodec/libopenh264enc.c | 3 ++- > libavcodec/librav1e.c | 2 +- > libavcodec/libsvtav1.c | 1 + > libavcodec/libuavs3d.c | 1 + > libavcodec/libvpxdec.c | 2 ++ > libavcodec/libvpxenc.c | 2 ++ > libavcodec/libx264.c | 9 +++++---- > libavcodec/libx265.c | 1 + > libavcodec/libxavs.c | 1 + > libavcodec/libxavs2.c | 1 + > libavcodec/pthread.c | 2 +- > libavcodec/utils.c | 2 +- > 18 files changed, 30 insertions(+), 10 deletions(-) > > diff --git a/libavcodec/internal.h b/libavcodec/internal.h > index 400ea508ef..b57b996816 100644 > --- a/libavcodec/internal.h > +++ b/libavcodec/internal.h > @@ -74,6 +74,10 @@ > * uses ff_thread_report/await_progress(). > */ > #define FF_CODEC_CAP_ALLOCATE_PROGRESS (1 << 6) > +/** > + * Codec handles avctx->thread_count == 0 (auto) internally. > + */ > +#define FF_CODEC_CAP_AUTO_THREADS (1 << 7) > > /** > * AVCodec.codec_tags termination value > diff --git a/libavcodec/libaomdec.c b/libavcodec/libaomdec.c > index 1430a651fe..327a5e18fb 100644 > --- a/libavcodec/libaomdec.c > +++ b/libavcodec/libaomdec.c > @@ -237,6 +237,7 @@ AVCodec ff_libaom_av1_decoder = { > .close = aom_free, > .decode = aom_decode, > .capabilities = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .profiles = NULL_IF_CONFIG_SMALL(ff_av1_profiles), > .wrapper_name = "libaom", > }; > diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c > index 9a26b5f9ef..f99fdc0b73 100644 > --- a/libavcodec/libaomenc.c > +++ b/libavcodec/libaomenc.c > @@ -1346,6 +1346,7 @@ AVCodec ff_libaom_av1_encoder = { > .encode2 = aom_encode, > .close = aom_free, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .profiles = NULL_IF_CONFIG_SMALL(ff_av1_profiles), > .priv_class = &class_aom, > .defaults = defaults, > diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c > index 383e4557b4..93aeab4cb1 100644 > --- a/libavcodec/libdav1d.c > +++ b/libavcodec/libdav1d.c > @@ -485,7 +485,8 @@ AVCodec ff_libdav1d_decoder = { > .flush = libdav1d_flush, > .receive_frame = libdav1d_receive_frame, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_SETS_PKT_DTS, > + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_SETS_PKT_DTS | > + FF_CODEC_CAP_AUTO_THREADS, > .priv_class = &libdav1d_class, > .wrapper_name = "libdav1d", > }; > diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c > index 218f3ec239..f6a03df373 100644 > --- a/libavcodec/libdavs2.c > +++ b/libavcodec/libdavs2.c > @@ -222,6 +222,7 @@ AVCodec ff_libdavs2_decoder = { > .decode = davs2_decode_frame, > .flush = davs2_flush, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, > AV_PIX_FMT_NONE }, > .wrapper_name = "libdavs2", > diff --git a/libavcodec/libkvazaar.c b/libavcodec/libkvazaar.c > index d94cf995c8..f75aa4eda3 100644 > --- a/libavcodec/libkvazaar.c > +++ b/libavcodec/libkvazaar.c > @@ -341,7 +341,8 @@ AVCodec ff_libkvazaar_encoder = { > .encode2 = libkvazaar_encode, > .close = libkvazaar_close, > > - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_INIT_CLEANUP, > + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_INIT_CLEANUP | > + FF_CODEC_CAP_AUTO_THREADS, > > .wrapper_name = "libkvazaar", > }; > diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c > index cf485663e1..cb5deb8b50 100644 > --- a/libavcodec/libopenh264enc.c > +++ b/libavcodec/libopenh264enc.c > @@ -448,7 +448,8 @@ AVCodec ff_libopenh264_encoder = { > .encode2 = svc_encode_frame, > .close = svc_encode_close, > .capabilities = AV_CODEC_CAP_AUTO_THREADS, > - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_INIT_CLEANUP, > + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_INIT_CLEANUP | > + FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, > AV_PIX_FMT_NONE }, > .defaults = svc_enc_defaults, > diff --git a/libavcodec/librav1e.c b/libavcodec/librav1e.c > index 2d5acc7d8e..bd93073664 100644 > --- a/libavcodec/librav1e.c > +++ b/libavcodec/librav1e.c > @@ -625,6 +625,6 @@ AVCodec ff_librav1e_encoder = { > .defaults = librav1e_defaults, > .pix_fmts = librav1e_pix_fmts, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, > + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, > .wrapper_name = "librav1e", > }; > diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c > index eb6043bcac..4244ae1daa 100644 > --- a/libavcodec/libsvtav1.c > +++ b/libavcodec/libsvtav1.c > @@ -561,6 +561,7 @@ AVCodec ff_libsvtav1_encoder = { > .receive_packet = eb_receive_packet, > .close = eb_enc_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, > AV_PIX_FMT_YUV420P10, > AV_PIX_FMT_NONE }, > diff --git a/libavcodec/libuavs3d.c b/libavcodec/libuavs3d.c > index d77cc2192d..6bc0ba09f0 100644 > --- a/libavcodec/libuavs3d.c > +++ b/libavcodec/libuavs3d.c > @@ -254,6 +254,7 @@ AVCodec ff_libuavs3d_decoder = { > .close = libuavs3d_end, > .decode = libuavs3d_decode_frame, > .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | > AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .flush = libuavs3d_flush, > .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, > AV_PIX_FMT_YUV420P10LE, > diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c > index 3e320446f8..7a1ccde992 100644 > --- a/libavcodec/libvpxdec.c > +++ b/libavcodec/libvpxdec.c > @@ -362,6 +362,7 @@ AVCodec ff_libvpx_vp8_decoder = { > .close = vpx_free, > .decode = vpx_decode, > .capabilities = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .wrapper_name = "libvpx", > }; > #endif /* CONFIG_LIBVPX_VP8_DECODER */ > @@ -383,6 +384,7 @@ AVCodec ff_libvpx_vp9_decoder = { > .close = vpx_free, > .decode = vpx_decode, > .capabilities = AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .init_static_data = ff_vp9_init_static, > .profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), > .wrapper_name = "libvpx", > diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c > index 02df4fe87b..df79839df5 100644 > --- a/libavcodec/libvpxenc.c > +++ b/libavcodec/libvpxenc.c > @@ -1871,6 +1871,7 @@ AVCodec ff_libvpx_vp8_encoder = { > .encode2 = vpx_encode, > .close = vpx_free, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, > AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE }, > .priv_class = &class_vp8, > .defaults = defaults, > @@ -1901,6 +1902,7 @@ AVCodec ff_libvpx_vp9_encoder = { > .encode2 = vpx_encode, > .close = vpx_free, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), > .priv_class = &class_vp9, > .defaults = defaults, > diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c > index 212ed7d015..8953368b5e 100644 > --- a/libavcodec/libx264.c > +++ b/libavcodec/libx264.c > @@ -1204,6 +1204,7 @@ AVCodec ff_libx264_encoder = { > .close = X264_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS | > AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .priv_class = &x264_class, > .defaults = x264_defaults, > #if X264_BUILD < 153 > @@ -1242,11 +1243,11 @@ AVCodec ff_libx264rgb_encoder = { > .priv_class = &rgbclass, > .defaults = x264_defaults, > .pix_fmts = pix_fmts_8bit_rgb, > + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS > #if X264_BUILD >= 158 > - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | > FF_CODEC_CAP_INIT_THREADSAFE, > -#else > - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, > + | FF_CODEC_CAP_INIT_THREADSAFE > #endif > + , > .wrapper_name = "libx264", > }; > #endif > @@ -1273,7 +1274,7 @@ AVCodec ff_libx262_encoder = { > .priv_class = &X262_class, > .defaults = x264_defaults, > .pix_fmts = pix_fmts_8bit, > - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, > + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | > FF_CODEC_CAP_AUTO_THREADS, > .wrapper_name = "libx264", > }; > #endif > diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c > index 686c205b6b..d502f47662 100644 > --- a/libavcodec/libx265.c > +++ b/libavcodec/libx265.c > @@ -702,5 +702,6 @@ AVCodec ff_libx265_encoder = { > .defaults = x265_defaults, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS | > AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .wrapper_name = "libx265", > }; > diff --git a/libavcodec/libxavs.c b/libavcodec/libxavs.c > index 752ff66dfa..12d5a5eb9e 100644 > --- a/libavcodec/libxavs.c > +++ b/libavcodec/libxavs.c > @@ -476,6 +476,7 @@ AVCodec ff_libxavs_encoder = { > .encode2 = XAVS_frame, > .close = XAVS_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, > AV_PIX_FMT_NONE }, > .priv_class = &xavs_class, > .defaults = xavs_defaults, > diff --git a/libavcodec/libxavs2.c b/libavcodec/libxavs2.c > index 8519f6925a..cd29d2b938 100644 > --- a/libavcodec/libxavs2.c > +++ b/libavcodec/libxavs2.c > @@ -295,6 +295,7 @@ AVCodec ff_libxavs2_encoder = { > .encode2 = xavs2_encode_frame, > .close = xavs2_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, > .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, > AV_PIX_FMT_NONE }, > .priv_class = &libxavs2, > diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c > index 572471586d..a013784846 100644 > --- a/libavcodec/pthread.c > +++ b/libavcodec/pthread.c > @@ -56,7 +56,7 @@ static void validate_thread_parameters(AVCodecContext > *avctx) > } else if (avctx->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS && > avctx->thread_type & FF_THREAD_SLICE) { > avctx->active_thread_type = FF_THREAD_SLICE; > - } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_AUTO_THREADS)) { > + } else if (!(avctx->codec->capabilities & FF_CODEC_CAP_AUTO_THREADS)) { > avctx->thread_count = 1; > avctx->active_thread_type = 0; > } > diff --git a/libavcodec/utils.c b/libavcodec/utils.c > index b8a8c0ac2e..412e02de72 100644 > --- a/libavcodec/utils.c > +++ b/libavcodec/utils.c > @@ -761,7 +761,7 @@ FF_ENABLE_DEPRECATION_WARNINGS > goto free_and_end; > } > } > - if (!HAVE_THREADS && !(codec->capabilities & AV_CODEC_CAP_AUTO_THREADS)) > + if (!HAVE_THREADS && !(codec->capabilities & FF_CODEC_CAP_AUTO_THREADS))
Shouldn't you check caps_internal here and in the pthread.c change above? > avctx->thread_count = 1; > > if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) { > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".