| @@ -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, | |||