Le 2015-10-07 19:33, Derek Buitenhuis a écrit :
This makes the h.264 decoder threadsafe to initialize.
Signed-off-by: Derek Buitenhuis <[email protected]>
---
libavcodec/h264.c | 9 ++++++++-
libavcodec/h264.h | 1 +
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 4c1e135..0a0db9a 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 pthread_once_t ff_h264_vlc_init = PTHREAD_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 = pthread_once(&ff_h264_vlc_init, &ff_h264_decode_init_vlc);
+ if (ret != 0) {
I would assert and abort here. The most likely problems here are
deadlocks (i.e. recursive initialization) and memory corruption (once
ff_h264_vlc_init is garbage)...
+ 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),
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index bf8b07e..e9fd9cc 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"
--
Rémi Denis-Courmont
http://www.remlab.net/
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel