From 13bd2044d3887b7f0008168c5173a274b5247488 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Fri, 15 May 2009 15:34:22 +0000 Subject: [PATCH] mlp: Simplify adressing of state and coeffs arrays for both filters by making the arrays sequential. Originally committed as revision 18841 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/dsputil.h | 4 ++-- libavcodec/mlp.h | 2 +- libavcodec/mlpdec.c | 15 ++++++++------- libavcodec/mlpdsp.c | 8 ++++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index 365f596fc9..9dc89409c4 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -476,8 +476,8 @@ typedef struct DSPContext { void (*shrink[4])(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height); /* mlp/truehd functions */ - void (*mlp_filter_channel)(int32_t *firbuf, const int32_t *fircoeff, int firorder, - int32_t *iirbuf, const int32_t *iircoeff, int iirorder, + void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff, + int firorder, int iirorder, unsigned int filter_shift, int32_t mask, int blocksize, int32_t *sample_buffer); diff --git a/libavcodec/mlp.h b/libavcodec/mlp.h index c1c0abd7c2..b83881653c 100644 --- a/libavcodec/mlp.h +++ b/libavcodec/mlp.h @@ -73,13 +73,13 @@ typedef struct { uint8_t order; ///< number of taps in filter uint8_t shift; ///< Right shift to apply to output of filter. - int32_t coeff[MAX_FIR_ORDER]; int32_t state[MAX_FIR_ORDER]; } FilterParams; /** sample data coding information */ typedef struct { FilterParams filter_params[NUM_FILTERS]; + int32_t coeff[NUM_FILTERS][MAX_FIR_ORDER]; int16_t huff_offset; ///< Offset to apply to residual values. int32_t sign_huff_offset; ///< sign/rounding-corrected version of huff_offset diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index 0a64d79897..88803959bf 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -495,6 +495,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp, fp->order = order; if (order > 0) { + int32_t *fcoeff = m->channel_params[channel].coeff[filter]; int coeff_bits, coeff_shift; fp->shift = get_bits(gbp, 4); @@ -515,7 +516,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp, } for (i = 0; i < order; i++) - fp->coeff[i] = get_sbits(gbp, coeff_bits) << coeff_shift; + fcoeff[i] = get_sbits(gbp, coeff_bits) << coeff_shift; if (get_bits1(gbp)) { int state_bits, state_shift; @@ -718,10 +719,10 @@ static void filter_channel(MLPDecodeContext *m, unsigned int substr, unsigned int channel) { SubStream *s = &m->substream[substr]; - int32_t fir_state_buffer[MAX_BLOCKSIZE + MAX_FIR_ORDER]; - int32_t iir_state_buffer[MAX_BLOCKSIZE + MAX_IIR_ORDER]; - int32_t *firbuf = fir_state_buffer + MAX_BLOCKSIZE; - int32_t *iirbuf = iir_state_buffer + MAX_BLOCKSIZE; + const int32_t *fircoeff = m->channel_params[channel].coeff[FIR]; + int32_t state_buffer[NUM_FILTERS][MAX_BLOCKSIZE + MAX_FIR_ORDER]; + int32_t *firbuf = state_buffer[FIR] + MAX_BLOCKSIZE; + int32_t *iirbuf = state_buffer[IIR] + MAX_BLOCKSIZE; FilterParams *fir = &m->channel_params[channel].filter_params[FIR]; FilterParams *iir = &m->channel_params[channel].filter_params[IIR]; unsigned int filter_shift = fir->shift; @@ -730,8 +731,8 @@ static void filter_channel(MLPDecodeContext *m, unsigned int substr, memcpy(firbuf, fir->state, MAX_FIR_ORDER * sizeof(int32_t)); memcpy(iirbuf, iir->state, MAX_IIR_ORDER * sizeof(int32_t)); - m->dsp.mlp_filter_channel(firbuf, fir->coeff, fir->order, - iirbuf, iir->coeff, iir->order, + m->dsp.mlp_filter_channel(firbuf, fircoeff, + fir->order, iir->order, filter_shift, mask, s->blocksize, &m->sample_buffer[s->blockpos][channel]); diff --git a/libavcodec/mlpdsp.c b/libavcodec/mlpdsp.c index 4b4b7b5beb..6519b16eab 100644 --- a/libavcodec/mlpdsp.c +++ b/libavcodec/mlpdsp.c @@ -22,11 +22,15 @@ #include "libavcodec/mlp.h" #include "dsputil.h" -static void ff_mlp_filter_channel(int32_t *firbuf, const int32_t *fircoeff, int firorder, - int32_t *iirbuf, const int32_t *iircoeff, int iirorder, +static void ff_mlp_filter_channel(int32_t *state, const int32_t *coeff, + int firorder, int iirorder, unsigned int filter_shift, int32_t mask, int blocksize, int32_t *sample_buffer) { + int32_t *firbuf = state; + int32_t *iirbuf = state + MAX_BLOCKSIZE + MAX_FIR_ORDER; + const int32_t *fircoeff = coeff; + const int32_t *iircoeff = coeff + MAX_FIR_ORDER; int i; for (i = 0; i < blocksize; i++) {