|
|
|
@ -498,6 +498,53 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Read parameters for primitive matrices. */ |
|
|
|
|
|
|
|
|
|
static int read_matrix_params(MLPDecodeContext *m, SubStream *s, GetBitContext *gbp) |
|
|
|
|
{ |
|
|
|
|
unsigned int mat, ch; |
|
|
|
|
|
|
|
|
|
s->num_primitive_matrices = get_bits(gbp, 4); |
|
|
|
|
|
|
|
|
|
for (mat = 0; mat < s->num_primitive_matrices; mat++) { |
|
|
|
|
int frac_bits, max_chan; |
|
|
|
|
s->matrix_out_ch[mat] = get_bits(gbp, 4); |
|
|
|
|
frac_bits = get_bits(gbp, 4); |
|
|
|
|
s->lsb_bypass [mat] = get_bits1(gbp); |
|
|
|
|
|
|
|
|
|
if (s->matrix_out_ch[mat] > s->max_channel) { |
|
|
|
|
av_log(m->avctx, AV_LOG_ERROR, |
|
|
|
|
"Invalid channel %d specified as output from matrix.\n", |
|
|
|
|
s->matrix_out_ch[mat]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (frac_bits > 14) { |
|
|
|
|
av_log(m->avctx, AV_LOG_ERROR, |
|
|
|
|
"Too many fractional bits specified.\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
max_chan = s->max_matrix_channel; |
|
|
|
|
if (!s->noise_type) |
|
|
|
|
max_chan+=2; |
|
|
|
|
|
|
|
|
|
for (ch = 0; ch <= max_chan; ch++) { |
|
|
|
|
int coeff_val = 0; |
|
|
|
|
if (get_bits1(gbp)) |
|
|
|
|
coeff_val = get_sbits(gbp, frac_bits + 2); |
|
|
|
|
|
|
|
|
|
s->matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->noise_type) |
|
|
|
|
s->matrix_noise_shift[mat] = get_bits(gbp, 4); |
|
|
|
|
else |
|
|
|
|
s->matrix_noise_shift[mat] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Read decoding parameters that change more often than those in the restart
|
|
|
|
|
* header. */ |
|
|
|
|
|
|
|
|
@ -505,7 +552,7 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, |
|
|
|
|
unsigned int substr) |
|
|
|
|
{ |
|
|
|
|
SubStream *s = &m->substream[substr]; |
|
|
|
|
unsigned int mat, ch; |
|
|
|
|
unsigned int ch; |
|
|
|
|
|
|
|
|
|
if (s->param_presence_flags & PARAM_PRESENCE) |
|
|
|
|
if (get_bits1(gbp)) |
|
|
|
@ -523,43 +570,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, |
|
|
|
|
|
|
|
|
|
if (s->param_presence_flags & PARAM_MATRIX) |
|
|
|
|
if (get_bits1(gbp)) { |
|
|
|
|
s->num_primitive_matrices = get_bits(gbp, 4); |
|
|
|
|
|
|
|
|
|
for (mat = 0; mat < s->num_primitive_matrices; mat++) { |
|
|
|
|
int frac_bits, max_chan; |
|
|
|
|
s->matrix_out_ch[mat] = get_bits(gbp, 4); |
|
|
|
|
frac_bits = get_bits(gbp, 4); |
|
|
|
|
s->lsb_bypass [mat] = get_bits1(gbp); |
|
|
|
|
|
|
|
|
|
if (s->matrix_out_ch[mat] > s->max_channel) { |
|
|
|
|
av_log(m->avctx, AV_LOG_ERROR, |
|
|
|
|
"Invalid channel %d specified as output from matrix.\n", |
|
|
|
|
s->matrix_out_ch[mat]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (frac_bits > 14) { |
|
|
|
|
av_log(m->avctx, AV_LOG_ERROR, |
|
|
|
|
"Too many fractional bits specified.\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
max_chan = s->max_matrix_channel; |
|
|
|
|
if (!s->noise_type) |
|
|
|
|
max_chan+=2; |
|
|
|
|
|
|
|
|
|
for (ch = 0; ch <= max_chan; ch++) { |
|
|
|
|
int coeff_val = 0; |
|
|
|
|
if (get_bits1(gbp)) |
|
|
|
|
coeff_val = get_sbits(gbp, frac_bits + 2); |
|
|
|
|
|
|
|
|
|
s->matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->noise_type) |
|
|
|
|
s->matrix_noise_shift[mat] = get_bits(gbp, 4); |
|
|
|
|
else |
|
|
|
|
s->matrix_noise_shift[mat] = 0; |
|
|
|
|
} |
|
|
|
|
if (read_matrix_params(m, s, gbp) < 0) |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->param_presence_flags & PARAM_OUTSHIFT) |
|
|
|
|