Mercurial > libavcodec.hg
comparison aac.c @ 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 |
comparison
equal
deleted
inserted
replaced
10875:6a6a1c2d8745 | 10876:03d8758218d2 |
---|---|
980 const float *vq = ff_aac_codebook_vector_vals[cbt_m1]; | 980 const float *vq = ff_aac_codebook_vector_vals[cbt_m1]; |
981 const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1]; | 981 const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1]; |
982 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table; | 982 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table; |
983 const int cb_size = ff_aac_spectral_sizes[cbt_m1]; | 983 const int cb_size = ff_aac_spectral_sizes[cbt_m1]; |
984 | 984 |
985 for (group = 0; group < g_len; group++, cfo+=128) { | 985 switch (cbt_m1 >> 1) { |
986 float *cf = cfo; | 986 case 0: |
987 uint32_t *icf = (uint32_t *) cf; | 987 for (group = 0; group < g_len; group++, cfo+=128) { |
988 int len = off_len; | 988 float *cf = cfo; |
989 | 989 int len = off_len; |
990 switch (cbt_m1 >> 1) { | 990 |
991 case 0: | |
992 do { | 991 do { |
993 const int index = get_vlc2(gb, vlc_tab, 6, 3); | 992 const int index = get_vlc2(gb, vlc_tab, 6, 3); |
994 unsigned cb_idx; | 993 unsigned cb_idx; |
995 | 994 |
996 if (index >= cb_size) { | 995 if (index >= cb_size) { |
999 } | 998 } |
1000 | 999 |
1001 cb_idx = cb_vector_idx[index]; | 1000 cb_idx = cb_vector_idx[index]; |
1002 cf = VMUL4(cf, vq, cb_idx, sf + idx); | 1001 cf = VMUL4(cf, vq, cb_idx, sf + idx); |
1003 } while (len -= 4); | 1002 } while (len -= 4); |
1004 break; | 1003 } |
1005 case 1: | 1004 break; |
1005 | |
1006 case 1: | |
1007 for (group = 0; group < g_len; group++, cfo+=128) { | |
1008 float *cf = cfo; | |
1009 int len = off_len; | |
1010 | |
1006 do { | 1011 do { |
1007 const int index = get_vlc2(gb, vlc_tab, 6, 3); | 1012 const int index = get_vlc2(gb, vlc_tab, 6, 3); |
1008 unsigned nnz; | 1013 unsigned nnz; |
1009 unsigned cb_idx; | 1014 unsigned cb_idx; |
1010 uint32_t bits; | 1015 uint32_t bits; |
1017 cb_idx = cb_vector_idx[index]; | 1022 cb_idx = cb_vector_idx[index]; |
1018 nnz = cb_idx >> 8 & 15; | 1023 nnz = cb_idx >> 8 & 15; |
1019 bits = get_bits(gb, nnz) << (32-nnz); | 1024 bits = get_bits(gb, nnz) << (32-nnz); |
1020 cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx); | 1025 cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx); |
1021 } while (len -= 4); | 1026 } while (len -= 4); |
1022 break; | 1027 } |
1023 case 2: | 1028 break; |
1029 | |
1030 case 2: | |
1031 for (group = 0; group < g_len; group++, cfo+=128) { | |
1032 float *cf = cfo; | |
1033 int len = off_len; | |
1034 | |
1024 do { | 1035 do { |
1025 const int index = get_vlc2(gb, vlc_tab, 6, 3); | 1036 const int index = get_vlc2(gb, vlc_tab, 6, 3); |
1026 unsigned cb_idx; | 1037 unsigned cb_idx; |
1027 | 1038 |
1028 if (index >= cb_size) { | 1039 if (index >= cb_size) { |
1031 } | 1042 } |
1032 | 1043 |
1033 cb_idx = cb_vector_idx[index]; | 1044 cb_idx = cb_vector_idx[index]; |
1034 cf = VMUL2(cf, vq, cb_idx, sf + idx); | 1045 cf = VMUL2(cf, vq, cb_idx, sf + idx); |
1035 } while (len -= 2); | 1046 } while (len -= 2); |
1036 break; | 1047 } |
1037 case 3: | 1048 break; |
1038 case 4: | 1049 |
1050 case 3: | |
1051 case 4: | |
1052 for (group = 0; group < g_len; group++, cfo+=128) { | |
1053 float *cf = cfo; | |
1054 int len = off_len; | |
1055 | |
1039 do { | 1056 do { |
1040 const int index = get_vlc2(gb, vlc_tab, 6, 3); | 1057 const int index = get_vlc2(gb, vlc_tab, 6, 3); |
1041 unsigned nnz; | 1058 unsigned nnz; |
1042 unsigned cb_idx; | 1059 unsigned cb_idx; |
1043 unsigned sign; | 1060 unsigned sign; |
1050 cb_idx = cb_vector_idx[index]; | 1067 cb_idx = cb_vector_idx[index]; |
1051 nnz = cb_idx >> 8 & 15; | 1068 nnz = cb_idx >> 8 & 15; |
1052 sign = get_bits(gb, nnz) << (cb_idx >> 12); | 1069 sign = get_bits(gb, nnz) << (cb_idx >> 12); |
1053 cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx); | 1070 cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx); |
1054 } while (len -= 2); | 1071 } while (len -= 2); |
1055 break; | 1072 } |
1056 default: | 1073 break; |
1074 | |
1075 default: | |
1076 for (group = 0; group < g_len; group++, cfo+=128) { | |
1077 float *cf = cfo; | |
1078 uint32_t *icf = (uint32_t *) cf; | |
1079 int len = off_len; | |
1080 | |
1057 do { | 1081 do { |
1058 const int index = get_vlc2(gb, vlc_tab, 6, 3); | 1082 const int index = get_vlc2(gb, vlc_tab, 6, 3); |
1059 unsigned nzt, nnz; | 1083 unsigned nzt, nnz; |
1060 unsigned cb_idx; | 1084 unsigned cb_idx; |
1061 uint32_t bits; | 1085 uint32_t bits; |