Mercurial > libavcodec.hg
comparison ac3dec.c @ 7563:8390efaa0c03 libavcodec
simd downmix
13% faster ac3 if downmixing
author | lorenm |
---|---|
date | Wed, 13 Aug 2008 23:33:48 +0000 |
parents | ef456ee01ea2 |
children | 7cf793954871 |
comparison
equal
deleted
inserted
replaced
7562:ef456ee01ea2 | 7563:8390efaa0c03 |
---|---|
630 } | 630 } |
631 | 631 |
632 /** | 632 /** |
633 * Downmix the output to mono or stereo. | 633 * Downmix the output to mono or stereo. |
634 */ | 634 */ |
635 static av_noinline void ac3_downmix(AC3DecodeContext *s, | 635 void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len) |
636 float samples[AC3_MAX_CHANNELS][256]) | |
637 { | 636 { |
638 int i, j; | 637 int i, j; |
639 float v0, v1; | 638 float v0, v1; |
640 | 639 if(out_ch == 2) { |
641 if(s->output_mode == AC3_CHMODE_STEREO) { | 640 for(i=0; i<len; i++) { |
642 for(i=0; i<256; i++) { | |
643 v0 = v1 = 0.0f; | 641 v0 = v1 = 0.0f; |
644 for(j=0; j<s->fbw_channels; j++) { | 642 for(j=0; j<in_ch; j++) { |
645 v0 += samples[j][i] * s->downmix_coeffs[j][0]; | 643 v0 += samples[j][i] * matrix[j][0]; |
646 v1 += samples[j][i] * s->downmix_coeffs[j][1]; | 644 v1 += samples[j][i] * matrix[j][1]; |
647 } | 645 } |
648 samples[0][i] = v0; | 646 samples[0][i] = v0; |
649 samples[1][i] = v1; | 647 samples[1][i] = v1; |
650 } | 648 } |
651 } else if(s->output_mode == AC3_CHMODE_MONO) { | 649 } else if(out_ch == 1) { |
652 for(i=0; i<256; i++) { | 650 for(i=0; i<len; i++) { |
653 v0 = 0.0f; | 651 v0 = 0.0f; |
654 for(j=0; j<s->fbw_channels; j++) | 652 for(j=0; j<in_ch; j++) |
655 v0 += samples[j][i] * s->downmix_coeffs[j][0]; | 653 v0 += samples[j][i] * matrix[j][0]; |
656 samples[0][i] = v0; | 654 samples[0][i] = v0; |
657 } | 655 } |
658 } | 656 } |
659 } | 657 } |
660 | 658 |
1016 } | 1014 } |
1017 | 1015 |
1018 do_imdct(s, s->channels); | 1016 do_imdct(s, s->channels); |
1019 | 1017 |
1020 if(downmix_output) { | 1018 if(downmix_output) { |
1021 ac3_downmix(s, s->output); | 1019 s->dsp.ac3_downmix(s->output, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256); |
1022 } | 1020 } |
1023 } else { | 1021 } else { |
1024 if(downmix_output) { | 1022 if(downmix_output) { |
1025 ac3_downmix(s, s->transform_coeffs+1); | 1023 s->dsp.ac3_downmix(s->transform_coeffs+1, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256); |
1026 } | 1024 } |
1027 | 1025 |
1028 if(downmix_output && !s->downmixed) { | 1026 if(downmix_output && !s->downmixed) { |
1029 s->downmixed = 1; | 1027 s->downmixed = 1; |
1030 // FIXME delay[] is half the size of the other downmixes | 1028 s->dsp.ac3_downmix(s->delay, s->downmix_coeffs, s->out_channels, s->fbw_channels, 128); |
1031 ac3_downmix(s, s->delay); | |
1032 } | 1029 } |
1033 | 1030 |
1034 do_imdct(s, s->out_channels); | 1031 do_imdct(s, s->out_channels); |
1035 } | 1032 } |
1036 | 1033 |