|  |  | @@ -60,11 +60,11 @@ typedef struct { | 
		
	
		
			
			|  |  |  | int                 idwls[AT1_MAX_BFU];                 ///< the word length indexes for each BFU | 
		
	
		
			
			|  |  |  | int                 idsfs[AT1_MAX_BFU];                 ///< the scalefactor indexes for each BFU | 
		
	
		
			
			|  |  |  | float*              spectrum[2]; | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,spec1[AT1_SU_SAMPLES]);        ///< mdct buffer | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,spec2[AT1_SU_SAMPLES]);        ///< mdct buffer | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,fst_qmf_delay[46]);            ///< delay line for the 1st stacked QMF filter | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,snd_qmf_delay[46]);            ///< delay line for the 2nd stacked QMF filter | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,last_qmf_delay[256+23]);       ///< delay line for the last stacked QMF filter | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, spec1[AT1_SU_SAMPLES]);       ///< mdct buffer | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, spec2[AT1_SU_SAMPLES]);       ///< mdct buffer | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, fst_qmf_delay[46]);           ///< delay line for the 1st stacked QMF filter | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, snd_qmf_delay[46]);           ///< delay line for the 2nd stacked QMF filter | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, last_qmf_delay[256+23]);      ///< delay line for the last stacked QMF filter | 
		
	
		
			
			|  |  |  | } AT1SUCtx; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /** | 
		
	
	
		
			
				|  |  | @@ -72,13 +72,13 @@ typedef struct { | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | typedef struct { | 
		
	
		
			
			|  |  |  | AT1SUCtx            SUs[AT1_MAX_CHANNELS];              ///< channel sound unit | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,spec[AT1_SU_SAMPLES]);         ///< the mdct spectrum buffer | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, spec[AT1_SU_SAMPLES]);        ///< the mdct spectrum buffer | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, low[256]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, mid[256]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,high[512]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,  low[256]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,  mid[256]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, high[512]); | 
		
	
		
			
			|  |  |  | float*              bands[3]; | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float,out_samples[AT1_MAX_CHANNELS][AT1_SU_SAMPLES]); | 
		
	
		
			
			|  |  |  | DECLARE_ALIGNED_16(float, out_samples[AT1_MAX_CHANNELS][AT1_SU_SAMPLES]); | 
		
	
		
			
			|  |  |  | MDCTContext         mdct_ctx[3]; | 
		
	
		
			
			|  |  |  | int                 channels; | 
		
	
		
			
			|  |  |  | DSPContext          dsp; | 
		
	
	
		
			
				|  |  | @@ -97,11 +97,11 @@ static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits, | 
		
	
		
			
			|  |  |  | MDCTContext* mdct_context; | 
		
	
		
			
			|  |  |  | int transf_size = 1 << nbits; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | mdct_context = &q->mdct_ctx[nbits - 5 - (nbits>6)]; | 
		
	
		
			
			|  |  |  | mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (rev_spec) { | 
		
	
		
			
			|  |  |  | int i; | 
		
	
		
			
			|  |  |  | for (i=0 ; i<transf_size/2 ; i++) | 
		
	
		
			
			|  |  |  | for (i = 0; i < transf_size / 2; i++) | 
		
	
		
			
			|  |  |  | FFSWAP(float, spec[i], spec[transf_size - 1 - i]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | ff_imdct_half(mdct_context, out, spec); | 
		
	
	
		
			
				|  |  | @@ -110,10 +110,10 @@ static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits, | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int             band_num, band_samples, log2_block_count, nbits, num_blocks, block_size; | 
		
	
		
			
			|  |  |  | unsigned int    start_pos, ref_pos=0, pos = 0; | 
		
	
		
			
			|  |  |  | int          band_num, band_samples, log2_block_count, nbits, num_blocks, block_size; | 
		
	
		
			
			|  |  |  | unsigned int start_pos, ref_pos = 0 pos = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (band_num=0 ; band_num<AT1_QMF_BANDS ; band_num++) { | 
		
	
		
			
			|  |  |  | for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) { | 
		
	
		
			
			|  |  |  | band_samples = samples_per_band[band_num]; | 
		
	
		
			
			|  |  |  | log2_block_count = su->log2_block_count[band_num]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -128,7 +128,7 @@ static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q) | 
		
	
		
			
			|  |  |  | /* calc transform size in bits according to the block_size_mode */ | 
		
	
		
			
			|  |  |  | nbits = mdct_long_nbits[band_num] - log2_block_count; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (nbits!=5 && nbits!=7 && nbits!=8) | 
		
	
		
			
			|  |  |  | if (nbits != 5 && nbits != 7 && nbits != 8) | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (num_blocks == 1) { | 
		
	
	
		
			
				|  |  | @@ -137,23 +137,22 @@ static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q) | 
		
	
		
			
			|  |  |  | pos += block_size; // move to the next mdct block in the spectrum | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* overlap and window long blocks */ | 
		
	
		
			
			|  |  |  | q->dsp.vector_fmul_window(q->bands[band_num], &su->spectrum[1][ref_pos+band_samples-16], | 
		
	
		
			
			|  |  |  | &su->spectrum[0][ref_pos], short_window, 0, 16); | 
		
	
		
			
			|  |  |  | memcpy(q->bands[band_num]+32, &su->spectrum[0][ref_pos+16], 240 * sizeof(float)); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | q->dsp.vector_fmul_window(q->bands[band_num], &su->spectrum[1][ref_pos + band_samples - 16], | 
		
	
		
			
			|  |  |  | &su->spectrum[0][ref_pos], short_window, 0, 16); | 
		
	
		
			
			|  |  |  | memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos + 16], 240 * sizeof(float)); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | /* short blocks */ | 
		
	
		
			
			|  |  |  | float *prev_buf; | 
		
	
		
			
			|  |  |  | start_pos = 0; | 
		
	
		
			
			|  |  |  | prev_buf = &su->spectrum[1][ref_pos+band_samples-16]; | 
		
	
		
			
			|  |  |  | for (; num_blocks!=0 ; num_blocks--) { | 
		
	
		
			
			|  |  |  | at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos+start_pos], 5, band_num); | 
		
	
		
			
			|  |  |  | prev_buf = &su->spectrum[1][ref_pos + band_samples - 16]; | 
		
	
		
			
			|  |  |  | for (; num_blocks != 0; num_blocks--) { | 
		
	
		
			
			|  |  |  | at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], 5, band_num); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* overlap and window between short blocks */ | 
		
	
		
			
			|  |  |  | q->dsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf, | 
		
	
		
			
			|  |  |  | &su->spectrum[0][ref_pos+start_pos], short_window, 0, 16); | 
		
	
		
			
			|  |  |  | &su->spectrum[0][ref_pos + start_pos], short_window, 0, 16); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | prev_buf = &su->spectrum[0][ref_pos+start_pos+16]; | 
		
	
		
			
			|  |  |  | prev_buf = &su->spectrum[0][ref_pos+start_pos + 16]; | 
		
	
		
			
			|  |  |  | start_pos += 32; // use hardcoded block_size | 
		
	
		
			
			|  |  |  | pos += 32; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -175,7 +174,7 @@ static int at1_parse_bsm(GetBitContext* gb, int log2_block_cnt[AT1_QMF_BANDS]) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int log2_block_count_tmp, i; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for(i=0 ; i<2 ; i++) { | 
		
	
		
			
			|  |  |  | for (i = 0; i < 2; i++) { | 
		
	
		
			
			|  |  |  | /* low and mid band */ | 
		
	
		
			
			|  |  |  | log2_block_count_tmp = get_bits(gb, 2); | 
		
	
		
			
			|  |  |  | if (log2_block_count_tmp & 1) | 
		
	
	
		
			
				|  |  | @@ -210,11 +209,11 @@ static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su, | 
		
	
		
			
			|  |  |  | (bfu_amount_tab3[get_bits(gb, 3)] << 1); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* get word length index (idwl) for each BFU */ | 
		
	
		
			
			|  |  |  | for (i=0 ; i<su->num_bfus ; i++) | 
		
	
		
			
			|  |  |  | for (i = 0; i < su->num_bfus; i++) | 
		
	
		
			
			|  |  |  | su->idwls[i] = get_bits(gb, 4); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* get scalefactor index (idsf) for each BFU */ | 
		
	
		
			
			|  |  |  | for (i=0 ; i<su->num_bfus ; i++) | 
		
	
		
			
			|  |  |  | for (i = 0; i < su->num_bfus; i++) | 
		
	
		
			
			|  |  |  | su->idsfs[i] = get_bits(gb, 6); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* zero idwl/idsf for empty BFUs */ | 
		
	
	
		
			
				|  |  | @@ -222,8 +221,8 @@ static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su, | 
		
	
		
			
			|  |  |  | su->idwls[i] = su->idsfs[i] = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* read in the spectral data and reconstruct MDCT spectrum of this channel */ | 
		
	
		
			
			|  |  |  | for (band_num=0 ; band_num<AT1_QMF_BANDS ; band_num++) { | 
		
	
		
			
			|  |  |  | for (bfu_num=bfu_bands_t[band_num] ; bfu_num<bfu_bands_t[band_num+1] ; bfu_num++) { | 
		
	
		
			
			|  |  |  | for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) { | 
		
	
		
			
			|  |  |  | for (bfu_num = bfu_bands_t[band_num]; bfu_num < bfu_bands_t[band_num+1]; bfu_num++) { | 
		
	
		
			
			|  |  |  | int pos; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int num_specs = specs_per_bfu[bfu_num]; | 
		
	
	
		
			
				|  |  | @@ -241,14 +240,14 @@ static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su, | 
		
	
		
			
			|  |  |  | if (word_len) { | 
		
	
		
			
			|  |  |  | float   max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (i=0 ; i<num_specs ; i++) { | 
		
	
		
			
			|  |  |  | for (i = 0; i < num_specs; i++) { | 
		
	
		
			
			|  |  |  | /* read in a quantized spec and convert it to | 
		
	
		
			
			|  |  |  | * signed int and then inverse quantization | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | spec[pos+i] = get_sbits(gb, word_len) * scale_factor * max_quant; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } else { /* word_len = 0 -> empty BFU, zero all specs in the emty BFU */ | 
		
	
		
			
			|  |  |  | memset(&spec[pos], 0, num_specs*sizeof(float)); | 
		
	
		
			
			|  |  |  | memset(&spec[pos], 0, num_specs * sizeof(float)); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -259,15 +258,15 @@ static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su, | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx* su, float *pOut) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | float   temp[256]; | 
		
	
		
			
			|  |  |  | float   iqmf_temp[512 + 46]; | 
		
	
		
			
			|  |  |  | float temp[256]; | 
		
	
		
			
			|  |  |  | float iqmf_temp[512 + 46]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* combine low and middle bands */ | 
		
	
		
			
			|  |  |  | atrac_iqmf(q->bands[0], q->bands[1], 128, temp, su->fst_qmf_delay, iqmf_temp); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* delay the signal of the high band by 23 samples */ | 
		
	
		
			
			|  |  |  | memcpy( su->last_qmf_delay,    &su->last_qmf_delay[256], sizeof(float)*23); | 
		
	
		
			
			|  |  |  | memcpy(&su->last_qmf_delay[23], q->bands[2],             sizeof(float)*256); | 
		
	
		
			
			|  |  |  | memcpy( su->last_qmf_delay,    &su->last_qmf_delay[256], sizeof(float) *  23); | 
		
	
		
			
			|  |  |  | memcpy(&su->last_qmf_delay[23], q->bands[2],             sizeof(float) * 256); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* combine (low + middle) and high bands */ | 
		
	
		
			
			|  |  |  | atrac_iqmf(temp, su->last_qmf_delay, 256, pOut, su->snd_qmf_delay, iqmf_temp); | 
		
	
	
		
			
				|  |  | @@ -290,10 +289,10 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data, | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (ch=0 ; ch<q->channels ; ch++) { | 
		
	
		
			
			|  |  |  | for (ch = 0; ch < q->channels; ch++) { | 
		
	
		
			
			|  |  |  | AT1SUCtx* su = &q->SUs[ch]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | init_get_bits(&gb, &buf[212*ch], 212*8); | 
		
	
		
			
			|  |  |  | init_get_bits(&gb, &buf[212 * ch], 212 * 8); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* parse block_size_mode, 1st byte */ | 
		
	
		
			
			|  |  |  | ret = at1_parse_bsm(&gb, su->log2_block_count); | 
		
	
	
		
			
				|  |  | @@ -313,15 +312,17 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data, | 
		
	
		
			
			|  |  |  | /* round, convert to 16bit and interleave */ | 
		
	
		
			
			|  |  |  | if (q->channels == 1) { | 
		
	
		
			
			|  |  |  | /* mono */ | 
		
	
		
			
			|  |  |  | q->dsp.vector_clipf(samples, q->out_samples[0], -32700.0 / (1<<15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1<<15), AT1_SU_SAMPLES); | 
		
	
		
			
			|  |  |  | q->dsp.vector_clipf(samples, q->out_samples[0], -32700.0 / (1 << 15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1 << 15), AT1_SU_SAMPLES); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | /* stereo */ | 
		
	
		
			
			|  |  |  | for (i = 0; i < AT1_SU_SAMPLES; i++) { | 
		
	
		
			
			|  |  |  | samples[i*2]   = av_clipf(q->out_samples[0][i], -32700.0 / (1<<15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1<<15)); | 
		
	
		
			
			|  |  |  | samples[i*2+1] = av_clipf(q->out_samples[1][i], -32700.0 / (1<<15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1<<15)); | 
		
	
		
			
			|  |  |  | samples[i * 2]     = av_clipf(q->out_samples[0][i], | 
		
	
		
			
			|  |  |  | -32700.0 / (1 << 15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1 << 15)); | 
		
	
		
			
			|  |  |  | samples[i * 2 + 1] = av_clipf(q->out_samples[1][i], | 
		
	
		
			
			|  |  |  | -32700.0 / (1 << 15), | 
		
	
		
			
			|  |  |  | 32700.0 / (1 << 15)); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -339,9 +340,9 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx) | 
		
	
		
			
			|  |  |  | q->channels = avctx->channels; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* Init the mdct transforms */ | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[0], 6, 1, -1.0/ (1<<15)); | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1<<15)); | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1<<15)); | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[0], 6, 1, -1.0/ (1 << 15)); | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1 << 15)); | 
		
	
		
			
			|  |  |  | ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1 << 15)); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | ff_sine_window_init(short_window, 32); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | 
 |