On Wed, 7 Oct 2015 12:24:32 -0400 Derek Buitenhuis <derek.buitenh...@gmail.com> wrote:
> This makes the h.264 decoder threadsafe to initialize. > > Signed-off-by: Derek Buitenhuis <derek.buitenh...@gmail.com> > --- > 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(&ff_h264_vlc_init, &ff_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 <pthread.h> > +#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