diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-10-18 23:04:03 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-10-22 10:10:08 -0400 |
commit | 5d1007f74dd496d54b932242004382f44e3b22b4 (patch) | |
tree | 930aa4e1ea79a56ea308bb7883c64b01425a8384 /libavcodec | |
parent | 78edce3f1973cf8d611e0408b8d3681038828cfc (diff) | |
download | ffmpeg-5d1007f74dd496d54b932242004382f44e3b22b4.tar.gz |
atrac3: initialize static tables in AVCodec.init_static_data()
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/atrac3.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index 69b42fd07d..9e0f27332e 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -117,6 +117,7 @@ typedef struct ATRAC3Context { } ATRAC3Context; static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE]; +static VLC_TYPE atrac3_vlc_table[4096][2]; static VLC spectral_coeff_tab[7]; static float gain_tab1[16]; static float gain_tab2[31]; @@ -838,14 +839,37 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data, return avctx->block_align; } +static void atrac3_init_static_data(AVCodec *codec) +{ + int i; + + init_atrac3_window(); + ff_atrac_generate_tables(); + + /* Initialize the VLC tables. */ + for (i = 0; i < 7; i++) { + spectral_coeff_tab[i].table = &atrac3_vlc_table[atrac3_vlc_offs[i]]; + spectral_coeff_tab[i].table_allocated = atrac3_vlc_offs[i + 1] - + atrac3_vlc_offs[i ]; + init_vlc(&spectral_coeff_tab[i], 9, huff_tab_sizes[i], + huff_bits[i], 1, 1, + huff_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); + } + + /* Generate gain tables */ + for (i = 0; i < 16; i++) + gain_tab1[i] = powf(2.0, (4 - i)); + + for (i = -15; i < 16; i++) + gain_tab2[i + 15] = powf(2.0, i * -0.125); +} + static av_cold int atrac3_decode_init(AVCodecContext *avctx) { int i, ret; int version, delay, samples_per_frame, frame_factor; const uint8_t *edata_ptr = avctx->extradata; ATRAC3Context *q = avctx->priv_data; - static VLC_TYPE atrac3_vlc_table[4096][2]; - static int vlcs_initialized = 0; /* Take data from the AVCodecContext (RM container). */ q->sample_rate = avctx->sample_rate; @@ -935,20 +959,6 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) if (q->decoded_bytes_buffer == NULL) return AVERROR(ENOMEM); - - /* Initialize the VLC tables. */ - if (!vlcs_initialized) { - for (i = 0; i < 7; i++) { - spectral_coeff_tab[i].table = &atrac3_vlc_table[atrac3_vlc_offs[i]]; - spectral_coeff_tab[i].table_allocated = atrac3_vlc_offs[i + 1] - - atrac3_vlc_offs[i ]; - init_vlc(&spectral_coeff_tab[i], 9, huff_tab_sizes[i], - huff_bits[i], 1, 1, - huff_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); - } - vlcs_initialized = 1; - } - avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; /* initialize the MDCT transform */ @@ -958,16 +968,6 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) return ret; } - init_atrac3_window(); - ff_atrac_generate_tables(); - - /* Generate gain tables */ - for (i = 0; i < 16; i++) - gain_tab1[i] = powf(2.0, (4 - i)); - - for (i = -15; i < 16; i++) - gain_tab2[i + 15] = powf(2.0, i * -0.125); - /* init the joint-stereo decoding data */ q->weighting_delay[0] = 0; q->weighting_delay[1] = 7; @@ -1003,6 +1003,7 @@ AVCodec ff_atrac3_decoder = { .id = AV_CODEC_ID_ATRAC3, .priv_data_size = sizeof(ATRAC3Context), .init = atrac3_decode_init, + .init_static_data = atrac3_init_static_data, .close = atrac3_decode_close, .decode = atrac3_decode_frame, .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1, |