diff 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
line wrap: on
line diff
--- a/ac3dec.c	Wed Aug 13 23:30:53 2008 +0000
+++ b/ac3dec.c	Wed Aug 13 23:33:48 2008 +0000
@@ -632,27 +632,25 @@
 /**
  * Downmix the output to mono or stereo.
  */
-static av_noinline void ac3_downmix(AC3DecodeContext *s,
-                                    float samples[AC3_MAX_CHANNELS][256])
+void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len)
 {
     int i, j;
     float v0, v1;
-
-    if(s->output_mode == AC3_CHMODE_STEREO) {
-        for(i=0; i<256; i++) {
+    if(out_ch == 2) {
+        for(i=0; i<len; i++) {
             v0 = v1 = 0.0f;
-            for(j=0; j<s->fbw_channels; j++) {
-                v0 += samples[j][i] * s->downmix_coeffs[j][0];
-                v1 += samples[j][i] * s->downmix_coeffs[j][1];
+            for(j=0; j<in_ch; j++) {
+                v0 += samples[j][i] * matrix[j][0];
+                v1 += samples[j][i] * matrix[j][1];
             }
             samples[0][i] = v0;
             samples[1][i] = v1;
         }
-    } else if(s->output_mode == AC3_CHMODE_MONO) {
-        for(i=0; i<256; i++) {
+    } else if(out_ch == 1) {
+        for(i=0; i<len; i++) {
             v0 = 0.0f;
-            for(j=0; j<s->fbw_channels; j++)
-                v0 += samples[j][i] * s->downmix_coeffs[j][0];
+            for(j=0; j<in_ch; j++)
+                v0 += samples[j][i] * matrix[j][0];
             samples[0][i] = v0;
         }
     }
@@ -1018,17 +1016,16 @@
         do_imdct(s, s->channels);
 
         if(downmix_output) {
-            ac3_downmix(s, s->output);
+            s->dsp.ac3_downmix(s->output, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256);
         }
     } else {
         if(downmix_output) {
-            ac3_downmix(s, s->transform_coeffs+1);
+            s->dsp.ac3_downmix(s->transform_coeffs+1, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256);
         }
 
         if(downmix_output && !s->downmixed) {
             s->downmixed = 1;
-            // FIXME delay[] is half the size of the other downmixes
-            ac3_downmix(s, s->delay);
+            s->dsp.ac3_downmix(s->delay, s->downmix_coeffs, s->out_channels, s->fbw_channels, 128);
         }
 
         do_imdct(s, s->out_channels);