X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fpcm.c;h=7f0af8564f68dac8df4ff0a088499cfd7f4a3c11;hb=4390573c44a47e0bed4790a45934006df7ee1e2f;hp=12d1b3a2c34897221ab44052e2ecfd905b276e05;hpb=771f91532c5cb65666820f1156b3a0e1661a3102;p=ffmpeg diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 12d1b3a2c34..7f0af8564f6 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) \ @@ -569,6 +575,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ .capabilities = AV_CODEC_CAP_DR1, \ .sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ AV_SAMPLE_FMT_NONE }, \ + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ } #define PCM_DECODER_2(cf, id, sample_fmt, name, long_name) \