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