changeset 10876:03d8758218d2 libavcodec

AAC: Unswitch loop over window groups in decode_spectrum_and_dequant() GCC should be able to do this, but doesn't. Slightly faster code.
author mru
date Wed, 13 Jan 2010 16:46:35 +0000
parents 6a6a1c2d8745
children 9ad6c1c4455c
files aac.c
diffstat 1 files changed, 39 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/aac.c	Wed Jan 13 16:46:32 2010 +0000
+++ b/aac.c	Wed Jan 13 16:46:35 2010 +0000
@@ -982,13 +982,12 @@
                 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table;
                 const int cb_size = ff_aac_spectral_sizes[cbt_m1];
 
-                for (group = 0; group < g_len; group++, cfo+=128) {
-                    float *cf = cfo;
-                    uint32_t *icf = (uint32_t *) cf;
-                    int len = off_len;
+                switch (cbt_m1 >> 1) {
+                case 0:
+                    for (group = 0; group < g_len; group++, cfo+=128) {
+                        float *cf = cfo;
+                        int len = off_len;
 
-                    switch (cbt_m1 >> 1) {
-                    case 0:
                         do {
                             const int index = get_vlc2(gb, vlc_tab, 6, 3);
                             unsigned cb_idx;
@@ -1001,8 +1000,14 @@
                             cb_idx = cb_vector_idx[index];
                             cf = VMUL4(cf, vq, cb_idx, sf + idx);
                         } while (len -= 4);
-                        break;
-                    case 1:
+                    }
+                    break;
+
+                case 1:
+                    for (group = 0; group < g_len; group++, cfo+=128) {
+                        float *cf = cfo;
+                        int len = off_len;
+
                         do {
                             const int index = get_vlc2(gb, vlc_tab, 6, 3);
                             unsigned nnz;
@@ -1019,8 +1024,14 @@
                             bits = get_bits(gb, nnz) << (32-nnz);
                             cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx);
                         } while (len -= 4);
-                        break;
-                    case 2:
+                    }
+                    break;
+
+                case 2:
+                    for (group = 0; group < g_len; group++, cfo+=128) {
+                        float *cf = cfo;
+                        int len = off_len;
+
                         do {
                             const int index = get_vlc2(gb, vlc_tab, 6, 3);
                             unsigned cb_idx;
@@ -1033,9 +1044,15 @@
                             cb_idx = cb_vector_idx[index];
                             cf = VMUL2(cf, vq, cb_idx, sf + idx);
                         } while (len -= 2);
-                        break;
-                    case 3:
-                    case 4:
+                    }
+                    break;
+
+                case 3:
+                case 4:
+                    for (group = 0; group < g_len; group++, cfo+=128) {
+                        float *cf = cfo;
+                        int len = off_len;
+
                         do {
                             const int index = get_vlc2(gb, vlc_tab, 6, 3);
                             unsigned nnz;
@@ -1052,8 +1069,15 @@
                             sign = get_bits(gb, nnz) << (cb_idx >> 12);
                             cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
                         } while (len -= 2);
-                        break;
-                    default:
+                    }
+                    break;
+
+                default:
+                    for (group = 0; group < g_len; group++, cfo+=128) {
+                        float *cf = cfo;
+                        uint32_t *icf = (uint32_t *) cf;
+                        int len = off_len;
+
                         do {
                             const int index = get_vlc2(gb, vlc_tab, 6, 3);
                             unsigned nzt, nnz;