[FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once
wm4
nfxjfg at googlemail.com
Wed Oct 7 18:32:26 CEST 2015
On Wed, 7 Oct 2015 12:24:32 -0400
Derek Buitenhuis <derek.buitenhuis at gmail.com> wrote:
> This makes the h.264 decoder threadsafe to initialize.
>
> Signed-off-by: Derek Buitenhuis <derek.buitenhuis at 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.
More information about the ffmpeg-devel
mailing list