Browse Source

mlpdec: Split read_matrix_params() into its own function.

Originally committed as revision 18206 to svn://svn.ffmpeg.org/ffmpeg/trunk
tags/v0.6
Ramiro Polla 17 years ago
parent
commit
f8e6293bde
1 changed files with 50 additions and 38 deletions
  1. +50
    -38
      libavcodec/mlpdec.c

+ 50
- 38
libavcodec/mlpdec.c View File

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


Loading…
Cancel
Save