diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index c5a97acf5d..fee4ff7d1f 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -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)