Commit 34271cab authored by Kostya Shishkov's avatar Kostya Shishkov

imc: make IMDCT support stereo output

This will be useful for Indeo Audio decoder which is almost the same
but supports stereo.
parent c45e2da6
...@@ -589,10 +589,12 @@ static void imc_adjust_bit_allocation(IMCContext *q, IMCChannel *chctx, ...@@ -589,10 +589,12 @@ static void imc_adjust_bit_allocation(IMCContext *q, IMCChannel *chctx,
} }
} }
static void imc_imdct256(IMCContext *q, IMCChannel *chctx) static void imc_imdct256(IMCContext *q, IMCChannel *chctx, int channels)
{ {
int i; int i;
float re, im; float re, im;
float *dst1 = q->out_samples;
float *dst2 = q->out_samples + (COEFFS - 1) * channels;
/* prerotation */ /* prerotation */
for (i = 0; i < COEFFS / 2; i++) { for (i = 0; i < COEFFS / 2; i++) {
...@@ -610,10 +612,12 @@ static void imc_imdct256(IMCContext *q, IMCChannel *chctx) ...@@ -610,10 +612,12 @@ static void imc_imdct256(IMCContext *q, IMCChannel *chctx)
for (i = 0; i < COEFFS / 2; i++) { for (i = 0; i < COEFFS / 2; i++) {
re = ( q->samples[i].re * q->post_cos[i]) + (-q->samples[i].im * q->post_sin[i]); re = ( q->samples[i].re * q->post_cos[i]) + (-q->samples[i].im * q->post_sin[i]);
im = (-q->samples[i].im * q->post_cos[i]) - ( q->samples[i].re * q->post_sin[i]); im = (-q->samples[i].im * q->post_cos[i]) - ( q->samples[i].re * q->post_sin[i]);
q->out_samples[i * 2] = (q->mdct_sine_window[COEFFS - 1 - i * 2] * chctx->last_fft_im[i]) *dst1 = (q->mdct_sine_window[COEFFS - 1 - i * 2] * chctx->last_fft_im[i])
+ (q->mdct_sine_window[i * 2] * re); + (q->mdct_sine_window[i * 2] * re);
q->out_samples[COEFFS - 1 - i * 2] = (q->mdct_sine_window[i * 2] * chctx->last_fft_im[i]) *dst2 = (q->mdct_sine_window[i * 2] * chctx->last_fft_im[i])
- (q->mdct_sine_window[COEFFS - 1 - i * 2] * re); - (q->mdct_sine_window[COEFFS - 1 - i * 2] * re);
dst1 += channels * 2;
dst2 -= channels * 2;
chctx->last_fft_im[i] = im; chctx->last_fft_im[i] = im;
} }
} }
...@@ -840,7 +844,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) ...@@ -840,7 +844,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch)
memset(chctx->skipFlags, 0, sizeof(chctx->skipFlags)); memset(chctx->skipFlags, 0, sizeof(chctx->skipFlags));
imc_imdct256(q, chctx); imc_imdct256(q, chctx, avctx->channels);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment