summaryrefslogtreecommitdiff
path: root/libavcodec/imc.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2012-06-02 20:35:41 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2012-06-05 18:28:44 +0200
commit34271cabacb20f24ad07bff818e3447330cdd851 (patch)
tree7f063e79be1abc3371cba50f59ed3adce13d96ed /libavcodec/imc.c
parentc45e2da617d74b6f0d82208efd017d66139eabe2 (diff)
imc: make IMDCT support stereo output
This will be useful for Indeo Audio decoder which is almost the same but supports stereo.
Diffstat (limited to 'libavcodec/imc.c')
-rw-r--r--libavcodec/imc.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/libavcodec/imc.c b/libavcodec/imc.c
index d53693c848..4b8ad7c536 100644
--- a/libavcodec/imc.c
+++ b/libavcodec/imc.c
@@ -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;
float re, im;
+ float *dst1 = q->out_samples;
+ float *dst2 = q->out_samples + (COEFFS - 1) * channels;
/* prerotation */
for (i = 0; i < COEFFS / 2; i++) {
@@ -610,10 +612,12 @@ static void imc_imdct256(IMCContext *q, IMCChannel *chctx)
for (i = 0; i < COEFFS / 2; 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]);
- q->out_samples[i * 2] = (q->mdct_sine_window[COEFFS - 1 - i * 2] * chctx->last_fft_im[i])
- + (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])
- - (q->mdct_sine_window[COEFFS - 1 - i * 2] * re);
+ *dst1 = (q->mdct_sine_window[COEFFS - 1 - i * 2] * chctx->last_fft_im[i])
+ + (q->mdct_sine_window[i * 2] * re);
+ *dst2 = (q->mdct_sine_window[i * 2] * chctx->last_fft_im[i])
+ - (q->mdct_sine_window[COEFFS - 1 - i * 2] * re);
+ dst1 += channels * 2;
+ dst2 -= channels * 2;
chctx->last_fft_im[i] = im;
}
}
@@ -840,7 +844,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch)
memset(chctx->skipFlags, 0, sizeof(chctx->skipFlags));
- imc_imdct256(q, chctx);
+ imc_imdct256(q, chctx, avctx->channels);
return 0;
}