|
|
|
@@ -634,6 +634,34 @@ static int atrac9_decode_block(ATRAC9Context *s, GetBitContext *gb, |
|
|
|
const int reuse_params = get_bits1(gb); |
|
|
|
const int stereo = s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_CPE; |
|
|
|
|
|
|
|
if (s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_LFE) { |
|
|
|
ATRAC9ChannelData *c = &b->channel[0]; |
|
|
|
const int precision = reuse_params ? 8 : 4; |
|
|
|
c->q_unit_cnt = b->q_unit_cnt = 2; |
|
|
|
|
|
|
|
memset(c->scalefactors, 0, sizeof(c->scalefactors)); |
|
|
|
memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine)); |
|
|
|
memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse)); |
|
|
|
|
|
|
|
for (int i = 0; i < b->q_unit_cnt; i++) { |
|
|
|
c->scalefactors[i] = get_bits(gb, 5); |
|
|
|
c->precision_coarse[i] = precision; |
|
|
|
c->precision_fine[i] = 0; |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < c->q_unit_cnt; i++) { |
|
|
|
const int start = at9_q_unit_to_coeff_idx[i + 0]; |
|
|
|
const int end = at9_q_unit_to_coeff_idx[i + 1]; |
|
|
|
for (int j = start; j < end; j++) |
|
|
|
c->q_coeffs_coarse[j] = get_bits(gb, c->precision_coarse[i] + 1); |
|
|
|
} |
|
|
|
|
|
|
|
dequantize (s, b, c); |
|
|
|
apply_scalefactors(s, b, 0); |
|
|
|
|
|
|
|
goto imdct; |
|
|
|
} |
|
|
|
|
|
|
|
if (first_in_pkt && reuse_params) { |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid block flags!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
@@ -718,7 +746,7 @@ static int atrac9_decode_block(ATRAC9Context *s, GetBitContext *gb, |
|
|
|
apply_scalefactors (s, b, stereo); |
|
|
|
apply_band_extension (s, b, stereo); |
|
|
|
|
|
|
|
/* iMDCT */ |
|
|
|
imdct: |
|
|
|
for (int i = 0; i <= stereo; i++) { |
|
|
|
ATRAC9ChannelData *c = &b->channel[i]; |
|
|
|
const int dst_idx = s->block_config->plane_map[block_idx][i]; |
|
|
|
|