|
|
|
@ -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); |
|
|
|
|
|
|
|
|
|