Skip to content

Commit

Permalink
h264: Run VLC init under pthread_once
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dwbuiten authored and lu-zero committed Oct 14, 2015
1 parent c53e796 commit d15368e
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 1 deletion.
9 changes: 8 additions & 1 deletion libavcodec/h264.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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),
Expand Down
1 change: 1 addition & 0 deletions libavcodec/h264.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit d15368e

Please sign in to comment.