# HG changeset patch # User mru # Date 1263401195 0 # Node ID 03d8758218d219fb601e0e5e4b2abfb5f484149f # Parent 6a6a1c2d87457a2aab8df3dae18d0f51247f915e AAC: Unswitch loop over window groups in decode_spectrum_and_dequant() GCC should be able to do this, but doesn't. Slightly faster code. diff -r 6a6a1c2d8745 -r 03d8758218d2 aac.c --- 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;