Rearrange loop structure for approx. 35-50% faster calc_transform_coeffs_cpl()
authorJustin Ruggles <justin.ruggles@gmail.com>
Sun, 27 Sep 2009 07:16:51 +0000 (07:16 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Sun, 27 Sep 2009 07:16:51 +0000 (07:16 +0000)
depending on content.

Originally committed as revision 20055 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/ac3dec.c

index efeb284..85c6024 100644 (file)
@@ -416,17 +416,22 @@ static void calc_transform_coeffs_cpl(AC3DecodeContext *s)
 
     bin = s->start_freq[CPL_CH];
     for (band = 0; band < s->num_cpl_bands; band++) {
+        int band_start = bin;
         int band_end = bin + s->cpl_band_sizes[band];
-        for (; bin < band_end; bin++) {
-            for (ch = 1; ch <= s->fbw_channels; ch++) {
-                if (s->channel_in_cpl[ch]) {
+        for (ch = 1; ch <= s->fbw_channels; ch++) {
+            if (s->channel_in_cpl[ch]) {
+                int64_t cpl_coord = s->cpl_coords[ch][band];
+                for (bin = band_start; bin < band_end; bin++) {
                     s->fixed_coeffs[ch][bin] = ((int64_t)s->fixed_coeffs[CPL_CH][bin] *
-                                                (int64_t)s->cpl_coords[ch][band]) >> 23;
-                    if (ch == 2 && s->phase_flags[band])
-                        s->fixed_coeffs[ch][bin] = -s->fixed_coeffs[ch][bin];
+                                                cpl_coord) >> 23;
+                }
+                if (ch == 2 && s->phase_flags[band]) {
+                    for (bin = band_start; bin < band_end; bin++)
+                        s->fixed_coeffs[2][bin] = -s->fixed_coeffs[2][bin];
                 }
             }
         }
+        bin = band_end;
     }
 }