diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2012-06-02 20:35:41 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2012-06-05 18:28:44 +0200 |
commit | 34271cabacb20f24ad07bff818e3447330cdd851 (patch) | |
tree | 7f063e79be1abc3371cba50f59ed3adce13d96ed | |
parent | c45e2da617d74b6f0d82208efd017d66139eabe2 (diff) | |
download | ffmpeg-streaming-34271cabacb20f24ad07bff818e3447330cdd851.zip ffmpeg-streaming-34271cabacb20f24ad07bff818e3447330cdd851.tar.gz |
imc: make IMDCT support stereo output
This will be useful for Indeo Audio decoder which is almost the same
but supports stereo.
-rw-r--r-- | libavcodec/imc.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/libavcodec/imc.c b/libavcodec/imc.c index d53693c..4b8ad7c 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; } |