summaryrefslogtreecommitdiff
path: root/libavcodec/aac.c
diff options
context:
space:
mode:
authorMåns Rullgård <mans@mansr.com>2010-01-13 16:46:35 +0000
committerMåns Rullgård <mans@mansr.com>2010-01-13 16:46:35 +0000
commit95dff4aceda3fa8013908cfe8b50355662ba90f2 (patch)
tree15cd92e2f4664545b9c1c5057858fc49cdcc465e /libavcodec/aac.c
parent05f9d8fcaa1452c685fb7357f74f2a5af55b0ff7 (diff)
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
Diffstat (limited to 'libavcodec/aac.c')
-rw-r--r--libavcodec/aac.c54
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;