From 43ee5fe0355ae19753c530006c73625ba7be190c Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Fri, 27 Mar 2009 23:42:22 +0000 Subject: [PATCH] mlpdec: Split read_channel_params() into its own function. Originally committed as revision 18207 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mlpdec.c | 86 ++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index fee4ff7d1f..c286c3b792 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -545,6 +545,54 @@ static int read_matrix_params(MLPDecodeContext *m, SubStream *s, GetBitContext * return 0; } +/** Read channel parameters. */ + +static int read_channel_params(MLPDecodeContext *m, unsigned int substr, + GetBitContext *gbp, unsigned int ch) +{ + ChannelParams *cp = &m->channel_params[ch]; + FilterParams *fir = &cp->filter_params[FIR]; + FilterParams *iir = &cp->filter_params[IIR]; + SubStream *s = &m->substream[substr]; + + if (s->param_presence_flags & PARAM_FIR) + if (get_bits1(gbp)) + if (read_filter_params(m, gbp, ch, FIR) < 0) + return -1; + + if (s->param_presence_flags & PARAM_IIR) + if (get_bits1(gbp)) + if (read_filter_params(m, gbp, ch, IIR) < 0) + return -1; + + if (fir->order && iir->order && + fir->shift != iir->shift) { + av_log(m->avctx, AV_LOG_ERROR, + "FIR and IIR filters must use the same precision.\n"); + return -1; + } + /* The FIR and IIR filters must have the same precision. + * To simplify the filtering code, only the precision of the + * FIR filter is considered. If only the IIR filter is employed, + * the FIR filter precision is set to that of the IIR filter, so + * that the filtering code can use it. */ + if (!fir->order && iir->order) + fir->shift = iir->shift; + + if (s->param_presence_flags & PARAM_HUFFOFFSET) + if (get_bits1(gbp)) + cp->huff_offset = get_sbits(gbp, 15); + + cp->codebook = get_bits(gbp, 2); + cp->huff_lsbs = get_bits(gbp, 5); + + cp->sign_huff_offset = calculate_sign_huff(m, substr, ch); + + /* TODO: validate */ + + return 0; +} + /** Read decoding parameters that change more often than those in the restart * header. */ @@ -596,44 +644,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, for (ch = s->min_channel; ch <= s->max_channel; ch++) if (get_bits1(gbp)) { - ChannelParams *cp = &m->channel_params[ch]; - FilterParams *fir = &cp->filter_params[FIR]; - FilterParams *iir = &cp->filter_params[IIR]; - - if (s->param_presence_flags & PARAM_FIR) - if (get_bits1(gbp)) - if (read_filter_params(m, gbp, ch, FIR) < 0) - return -1; - - if (s->param_presence_flags & PARAM_IIR) - if (get_bits1(gbp)) - if (read_filter_params(m, gbp, ch, IIR) < 0) - return -1; - - if (fir->order && iir->order && - fir->shift != iir->shift) { - av_log(m->avctx, AV_LOG_ERROR, - "FIR and IIR filters must use the same precision.\n"); + if (read_channel_params(m, substr, gbp, ch) < 0) return -1; - } - /* The FIR and IIR filters must have the same precision. - * To simplify the filtering code, only the precision of the - * FIR filter is considered. If only the IIR filter is employed, - * the FIR filter precision is set to that of the IIR filter, so - * that the filtering code can use it. */ - if (!fir->order && iir->order) - fir->shift = iir->shift; - - if (s->param_presence_flags & PARAM_HUFFOFFSET) - if (get_bits1(gbp)) - cp->huff_offset = get_sbits(gbp, 15); - - cp->codebook = get_bits(gbp, 2); - cp->huff_lsbs = get_bits(gbp, 5); - - cp->sign_huff_offset = calculate_sign_huff(m, substr, ch); - - /* TODO: validate */ } return 0;