#include "dcahuff.h"
#include "dca.h"
#include "synth_filter.h"
+#include "dcadsp.h"
//#define TRACE
DSPContext dsp;
FFTContext imdct;
SynthFilterContext synth;
+ DCADSPContext dcadsp;
} DCAContext;
static const uint16_t dca_vlc_offs[] = {
}
}
-static void lfe_interpolation_fir(int decimation_select,
+static void lfe_interpolation_fir(DCAContext *s, int decimation_select,
int num_deci_sample, float *samples_in,
float *samples_out, float scale,
float bias)
* samples_out: An array holding interpolated samples
*/
- int decifactor, k, j;
+ int decifactor;
const float *prCoeff;
int deciindex;
}
/* Interpolation */
for (deciindex = 0; deciindex < num_deci_sample; deciindex++) {
- float *samples_out2 = samples_out + decifactor;
- const float *cf0 = prCoeff;
- const float *cf1 = prCoeff + 256;
-
- /* One decimated sample generates 2*decifactor interpolated ones */
- for (k = 0; k < decifactor; k++) {
- float v0 = 0.0;
- float v1 = 0.0;
- for (j = 0; j < 256 / decifactor; j++) {
- float s = samples_in[-j];
- v0 += s * *cf0++;
- v1 += s * *--cf1;
- }
- *samples_out++ = (v0 * scale) + bias;
- *samples_out2++ = (v1 * scale) + bias;
- }
-
+ s->dcadsp.lfe_fir(samples_out, samples_in, prCoeff, decifactor,
+ scale, bias);
samples_in++;
- samples_out += decifactor;
+ samples_out += 2 * decifactor;
}
}
if (s->output & DCA_LFE) {
int lfe_samples = 2 * s->lfe * s->subsubframes;
- lfe_interpolation_fir(s->lfe, 2 * s->lfe,
+ lfe_interpolation_fir(s, s->lfe, 2 * s->lfe,
s->lfe_data + lfe_samples +
2 * s->lfe * subsubframe,
&s->samples[256 * dca_lfe_index[s->amode]],
dsputil_init(&s->dsp, avctx);
ff_mdct_init(&s->imdct, 6, 1, 1.0);
ff_synth_filter_init(&s->synth);
+ ff_dcadsp_init(&s->dcadsp);
for(i = 0; i < 6; i++)
s->samples_chanptr[i] = s->samples + i * 256;