[FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once
This makes the h.264 decoder threadsafe to initialize. Signed-off-by: Derek Buitenhuis--- libavcodec/h264.c | 9 - libavcodec/h264.h | 7 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 3209c9c..1abdc4b 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -644,6 +644,8 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) return 0; } +static pthread_once_t ff_h264_vlc_init = PTHREAD_ONCE_INIT; + av_cold int ff_h264_decode_init(AVCodecContext *avctx) { H264Context *h = avctx->priv_data; @@ -657,7 +659,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx) if (!avctx->has_b_frames) h->low_delay = 1; -ff_h264_decode_init_vlc(); +ret = pthread_once(_h264_vlc_init, _h264_decode_init_vlc); +if (ret != 0) { +av_log(avctx, AV_LOG_ERROR, "pthread_once has failed."); +return AVERROR_UNKNOWN; +} if (avctx->codec_id == AV_CODEC_ID_H264) { if (avctx->ticks_per_frame == 1) { @@ -1993,6 +1999,7 @@ AVCodec ff_h264_decoder = { .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, +.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, .flush = flush_dpb, .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context), diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 769abda..f8a58a6 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -29,6 +29,7 @@ #define AVCODEC_H264_H #include "libavutil/intreadwrite.h" +#include "libavutil/thread.h" #include "cabac.h" #include "error_resilience.h" #include "get_bits.h" @@ -43,6 +44,12 @@ #include "rectangle.h" #include "videodsp.h" +#if HAVE_PTHREADS +# include +#elif HAVE_W32THREADS +# include "compat/w32pthreads.h" +#endif + #define H264_MAX_PICTURE_COUNT 36 #define H264_MAX_THREADS 32 -- 1.8.3.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once
On Wed, 7 Oct 2015 12:24:32 -0400 Derek Buitenhuiswrote: > This makes the h.264 decoder threadsafe to initialize. > > Signed-off-by: Derek Buitenhuis > --- > libavcodec/h264.c | 9 - > libavcodec/h264.h | 7 +++ > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/libavcodec/h264.c b/libavcodec/h264.c > index 3209c9c..1abdc4b 100644 > --- a/libavcodec/h264.c > +++ b/libavcodec/h264.c > @@ -644,6 +644,8 @@ static int h264_init_context(AVCodecContext *avctx, > H264Context *h) > return 0; > } > > +static pthread_once_t ff_h264_vlc_init = PTHREAD_ONCE_INIT; > + > av_cold int ff_h264_decode_init(AVCodecContext *avctx) > { > H264Context *h = avctx->priv_data; > @@ -657,7 +659,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx) > if (!avctx->has_b_frames) > h->low_delay = 1; > > -ff_h264_decode_init_vlc(); > +ret = pthread_once(_h264_vlc_init, _h264_decode_init_vlc); > +if (ret != 0) { > +av_log(avctx, AV_LOG_ERROR, "pthread_once has failed."); > +return AVERROR_UNKNOWN; > +} > > if (avctx->codec_id == AV_CODEC_ID_H264) { > if (avctx->ticks_per_frame == 1) { > @@ -1993,6 +1999,7 @@ AVCodec ff_h264_decoder = { > .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ > AV_CODEC_CAP_DR1 | > AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS > | > AV_CODEC_CAP_FRAME_THREADS, > +.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, > .flush = flush_dpb, > .init_thread_copy = > ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), > .update_thread_context = > ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context), > diff --git a/libavcodec/h264.h b/libavcodec/h264.h > index 769abda..f8a58a6 100644 > --- a/libavcodec/h264.h > +++ b/libavcodec/h264.h > @@ -29,6 +29,7 @@ > #define AVCODEC_H264_H > > #include "libavutil/intreadwrite.h" > +#include "libavutil/thread.h" > #include "cabac.h" > #include "error_resilience.h" > #include "get_bits.h" > @@ -43,6 +44,12 @@ > #include "rectangle.h" > #include "videodsp.h" > > +#if HAVE_PTHREADS > +# include > +#elif HAVE_W32THREADS > +# include "compat/w32pthreads.h" > +#endif > + > #define H264_MAX_PICTURE_COUNT 36 > #define H264_MAX_THREADS 32 > I think you forgot to remove the second chunk? It's unnecessary with thread.h included. Other than that LGTM. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once
On 10/7/2015 5:24 PM, Derek Buitenhuis wrote: > This makes the h.264 decoder threadsafe to initialize. > > Signed-off-by: Derek Buitenhuis> --- > libavcodec/h264.c | 9 - > libavcodec/h264.h | 7 +++ > 2 files changed, 15 insertions(+), 1 deletion(-) Disregard this one, wrong ver sent. - Derek ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel