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;