summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2015-10-07 12:33:01 -0400
committerLuca Barbato <lu_zero@gentoo.org>2015-10-14 14:35:34 +0200
commitd15368ee3926152a3a301c13cc638fbf7a062ddf (patch)
treefda218f02537f55ca2ad0ad560337220fef130c4 /libavcodec/h264.c
parentc53e796f8b69799b7ad6d28fbab981d37edf1bc9 (diff)
h264: Run VLC init under pthread_once
This makes the h.264 decoder threadsafe to initialize. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 4c1e135dcc..ec57d6d2f7 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -606,6 +606,8 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h)
return 0;
}
+static AVOnce h264_vlc_init = AV_ONCE_INIT;
+
av_cold int ff_h264_decode_init(AVCodecContext *avctx)
{
H264Context *h = avctx->priv_data;
@@ -619,7 +621,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 = ff_thread_once(&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)
@@ -1801,6 +1807,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),