diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-11-26 16:37:31 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-12-04 15:46:46 +0100 |
commit | 5634ce234a6f1aeab25e13c15f3695f672f06e63 (patch) | |
tree | 76ec3e3e5ab155b49fd54b0a3ded1955f1e33d34 | |
parent | 6643eaaa301ac857af92bb89131f94813ce3137f (diff) | |
download | ffmpeg-5634ce234a6f1aeab25e13c15f3695f672f06e63.tar.gz |
avcodec/pcm: Make encoders init-threadsafe
Reviewed-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavcodec/pcm.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 12d1b3a2c3..8ba38c6645 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -24,8 +24,10 @@ * PCM codecs */ +#include "config.h" #include "libavutil/attributes.h" #include "libavutil/float_dsp.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "bytestream.h" #include "internal.h" @@ -35,19 +37,22 @@ static av_cold int pcm_encode_init(AVCodecContext *avctx) { avctx->frame_size = 0; +#if !CONFIG_HARDCODED_TABLES switch (avctx->codec->id) { - case AV_CODEC_ID_PCM_ALAW: - pcm_alaw_tableinit(); - break; - case AV_CODEC_ID_PCM_MULAW: - pcm_ulaw_tableinit(); - break; - case AV_CODEC_ID_PCM_VIDC: - pcm_vidc_tableinit(); - break; +#define INIT_ONCE(id, name) \ + case AV_CODEC_ID_PCM_ ## id: \ + if (CONFIG_PCM_ ## id ## _ENCODER) { \ + static AVOnce init_static_once = AV_ONCE_INIT; \ + ff_thread_once(&init_static_once, pcm_ ## name ## _tableinit); \ + } \ + break + INIT_ONCE(ALAW, alaw); + INIT_ONCE(MULAW, ulaw); + INIT_ONCE(VIDC, vidc); default: break; } +#endif avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id); avctx->block_align = avctx->channels * avctx->bits_per_coded_sample / 8; @@ -547,6 +552,7 @@ AVCodec ff_ ## name_ ## _encoder = { \ .capabilities = AV_CODEC_CAP_VARIABLE_FRAME_SIZE, \ .sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ AV_SAMPLE_FMT_NONE }, \ + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ } #define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) \ |