diff options
author | Måns Rullgård <mans@mansr.com> | 2010-01-13 16:46:35 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2010-01-13 16:46:35 +0000 |
commit | 95dff4aceda3fa8013908cfe8b50355662ba90f2 (patch) | |
tree | 15cd92e2f4664545b9c1c5057858fc49cdcc465e | |
parent | 05f9d8fcaa1452c685fb7357f74f2a5af55b0ff7 (diff) | |
download | ffmpeg-95dff4aceda3fa8013908cfe8b50355662ba90f2.tar.gz |
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
GCC should be able to do this, but doesn't. Slightly faster code.
Originally committed as revision 21190 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/aac.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/libavcodec/aac.c b/libavcodec/aac.c index fddcefcf22..1341258a7f 100644 --- a/libavcodec/aac.c +++ b/libavcodec/aac.c @@ -982,13 +982,12 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], 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 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], 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 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], 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 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], 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 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], 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; |