summaryrefslogtreecommitdiffstats
path: root/libavcodec/diracdec.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2017-03-27 11:24:43 -0400
committerRonald S. Bultje <rsbultje@gmail.com>2017-03-28 11:21:27 -0400
commit5ba8c3a0ed0e43e6418eabdf8af9549c9e806382 (patch)
tree5644876dde707aef7c7fe4c995bbbbe3f9e34c58 /libavcodec/diracdec.c
parent64b553998567141b05239dcf11ad4d24aeaead8e (diff)
downloadffmpeg-streaming-5ba8c3a0ed0e43e6418eabdf8af9549c9e806382.zip
ffmpeg-streaming-5ba8c3a0ed0e43e6418eabdf8af9549c9e806382.tar.gz
dirac: make initialization of arithmetic coder tables threadsafe.
Diffstat (limited to 'libavcodec/diracdec.c')
-rw-r--r--libavcodec/diracdec.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index e0604af..202ae94 100644
--- a/libavcodec/diracdec.c
+++ b/libavcodec/diracdec.c
@@ -26,6 +26,7 @@
* @author Marco Gerards <marco@gnu.org>, David Conrad, Jordi Ortiz <nenjordi@gmail.com>
*/
+#include "libavutil/thread.h"
#include "avcodec.h"
#include "get_bits.h"
#include "bytestream.h"
@@ -379,10 +380,12 @@ static void free_sequence_buffers(DiracContext *s)
av_freep(&s->mcscratch);
}
+static AVOnce dirac_arith_init = AV_ONCE_INIT;
+
static av_cold int dirac_decode_init(AVCodecContext *avctx)
{
DiracContext *s = avctx->priv_data;
- int i;
+ int i, ret;
s->avctx = avctx;
s->frame_number = -1;
@@ -404,6 +407,9 @@ static av_cold int dirac_decode_init(AVCodecContext *avctx)
return AVERROR(ENOMEM);
}
}
+ ret = ff_thread_once(&dirac_arith_init, ff_dirac_init_arith_tables);
+ if (ret != 0)
+ return AVERROR_UNKNOWN;
return 0;
}
@@ -2299,5 +2305,6 @@ AVCodec ff_dirac_decoder = {
.close = dirac_decode_end,
.decode = dirac_decode_frame,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DR1,
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
.flush = dirac_decode_flush,
};
OpenPOWER on IntegriCloud