summaryrefslogtreecommitdiff
path: root/libavcodec/mlpdec.c
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2009-03-27 23:42:22 +0000
committerRamiro Polla <ramiro.polla@gmail.com>2009-03-27 23:42:22 +0000
commit43ee5fe0355ae19753c530006c73625ba7be190c (patch)
treec8341aff66102fbc1e66cc57718276e3ddbc8bd6 /libavcodec/mlpdec.c
parentf8e6293bdefb4e3ba2b105aac7984c37dae41316 (diff)
mlpdec: Split read_channel_params() into its own function.
Originally committed as revision 18207 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mlpdec.c')
-rw-r--r--libavcodec/mlpdec.c86
1 files 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;