summaryrefslogtreecommitdiff
path: root/libavcodec/pcm.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-11-26 16:37:31 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-12-04 15:46:46 +0100
commit5634ce234a6f1aeab25e13c15f3695f672f06e63 (patch)
tree76ec3e3e5ab155b49fd54b0a3ded1955f1e33d34 /libavcodec/pcm.c
parent6643eaaa301ac857af92bb89131f94813ce3137f (diff)
downloadffmpeg-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>
Diffstat (limited to 'libavcodec/pcm.c')
-rw-r--r--libavcodec/pcm.c24
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) \