comparison aac.c @ 10875:6a6a1c2d8745 libavcodec

AAC: simplify some calculations in decode_spectrum_and_dequant() Simplify cur_band_type, group_len, and coef/offset calculations. This makes the code easier to read and slightly faster.
author mru
date Wed, 13 Jan 2010 16:46:32 +0000
parents bcfe2acbf190
children 03d8758218d2
comparison
equal deleted inserted replaced
10874:bcfe2acbf190 10875:6a6a1c2d8745
948 948
949 for (g = 0; g < ics->num_windows; g++) 949 for (g = 0; g < ics->num_windows; g++)
950 memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float) * (c - offsets[ics->max_sfb])); 950 memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float) * (c - offsets[ics->max_sfb]));
951 951
952 for (g = 0; g < ics->num_window_groups; g++) { 952 for (g = 0; g < ics->num_window_groups; g++) {
953 unsigned g_len = ics->group_len[g];
954
953 for (i = 0; i < ics->max_sfb; i++, idx++) { 955 for (i = 0; i < ics->max_sfb; i++, idx++) {
954 const int cur_band_type = band_type[idx]; 956 const unsigned cbt_m1 = band_type[idx] - 1;
957 float *cfo = coef + offsets[i];
958 int off_len = offsets[i + 1] - offsets[i];
955 int group; 959 int group;
956 if (cur_band_type == ZERO_BT || cur_band_type == INTENSITY_BT2 || cur_band_type == INTENSITY_BT) { 960
957 for (group = 0; group < ics->group_len[g]; group++) { 961 if (cbt_m1 >= INTENSITY_BT2 - 1) {
958 memset(coef + group * 128 + offsets[i], 0, (offsets[i + 1] - offsets[i]) * sizeof(float)); 962 for (group = 0; group < g_len; group++, cfo+=128) {
963 memset(cfo, 0, off_len * sizeof(float));
959 } 964 }
960 } else if (cur_band_type == NOISE_BT) { 965 } else if (cbt_m1 == NOISE_BT - 1) {
961 for (group = 0; group < ics->group_len[g]; group++) { 966 for (group = 0; group < g_len; group++, cfo+=128) {
962 float scale; 967 float scale;
963 float band_energy; 968 float band_energy;
964 float *cf = coef + group * 128 + offsets[i]; 969
965 int len = offsets[i+1] - offsets[i]; 970 for (k = 0; k < off_len; k++) {
966
967 for (k = 0; k < len; k++) {
968 ac->random_state = lcg_random(ac->random_state); 971 ac->random_state = lcg_random(ac->random_state);
969 cf[k] = ac->random_state; 972 cfo[k] = ac->random_state;
970 } 973 }
971 974
972 band_energy = ac->dsp.scalarproduct_float(cf, cf, len); 975 band_energy = ac->dsp.scalarproduct_float(cfo, cfo, off_len);
973 scale = sf[idx] / sqrtf(band_energy); 976 scale = sf[idx] / sqrtf(band_energy);
974 ac->dsp.vector_fmul_scalar(cf, cf, scale, len); 977 ac->dsp.vector_fmul_scalar(cfo, cfo, scale, off_len);
975 } 978 }
976 } else { 979 } else {
977 const float *vq = ff_aac_codebook_vector_vals[cur_band_type-1]; 980 const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
978 const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cur_band_type-1]; 981 const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1];
979 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cur_band_type - 1].table; 982 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table;
980 const int cb_size = ff_aac_spectral_sizes[cur_band_type-1]; 983 const int cb_size = ff_aac_spectral_sizes[cbt_m1];
981 984
982 for (group = 0; group < ics->group_len[g]; group++) { 985 for (group = 0; group < g_len; group++, cfo+=128) {
983 float *cf = coef + (group << 7) + offsets[i]; 986 float *cf = cfo;
984 uint32_t *icf = (uint32_t *) cf; 987 uint32_t *icf = (uint32_t *) cf;
985 int len = offsets[i + 1] - offsets[i]; 988 int len = off_len;
986 989
987 switch ((cur_band_type-1) >> 1) { 990 switch (cbt_m1 >> 1) {
988 case 0: 991 case 0:
989 do { 992 do {
990 const int index = get_vlc2(gb, vlc_tab, 6, 3); 993 const int index = get_vlc2(gb, vlc_tab, 6, 3);
991 unsigned cb_idx; 994 unsigned cb_idx;
992 995
1049 sign = get_bits(gb, nnz) << (cb_idx >> 12); 1052 sign = get_bits(gb, nnz) << (cb_idx >> 12);
1050 cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx); 1053 cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
1051 } while (len -= 2); 1054 } while (len -= 2);
1052 break; 1055 break;
1053 default: 1056 default:
1054 for (k = 0; k < len; k += 2, icf += 2) { 1057 do {
1055 const int index = get_vlc2(gb, vlc_tab, 6, 3); 1058 const int index = get_vlc2(gb, vlc_tab, 6, 3);
1056 unsigned nzt, nnz; 1059 unsigned nzt, nnz;
1057 unsigned cb_idx; 1060 unsigned cb_idx;
1058 uint32_t bits; 1061 uint32_t bits;
1059 int j; 1062 int j;
1060 1063
1061 if (!index) { 1064 if (!index) {
1062 icf[0] = icf[1] = 0; 1065 *icf++ = 0;
1066 *icf++ = 0;
1063 continue; 1067 continue;
1064 } 1068 }
1065 1069
1066 if (index >= cb_size) { 1070 if (index >= cb_size) {
1067 err_idx = index; 1071 err_idx = index;
1082 if (n == 13) { 1086 if (n == 13) {
1083 av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n"); 1087 av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n");
1084 return -1; 1088 return -1;
1085 } 1089 }
1086 n = (1 << n) + get_bits(gb, n); 1090 n = (1 << n) + get_bits(gb, n);
1087 icf[j] = cbrt_tab[n] | (bits & 1<<31); 1091 *icf++ = cbrt_tab[n] | (bits & 1<<31);
1088 bits <<= 1; 1092 bits <<= 1;
1089 } else { 1093 } else {
1090 unsigned v = ((const uint32_t*)vq)[cb_idx & 15]; 1094 unsigned v = ((const uint32_t*)vq)[cb_idx & 15];
1091 icf[j] = (bits & 1<<31) | v; 1095 *icf++ = (bits & 1<<31) | v;
1092 bits <<= !!v; 1096 bits <<= !!v;
1093 } 1097 }
1094 cb_idx >>= 4; 1098 cb_idx >>= 4;
1095 } 1099 }
1096 } 1100 } while (len -= 2);
1097 1101
1098 ac->dsp.vector_fmul_scalar(cf, cf, sf[idx], len); 1102 ac->dsp.vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
1099 } 1103 }
1100 } 1104 }
1101 } 1105 }
1102 } 1106 }
1103 coef += ics->group_len[g] << 7; 1107 coef += g_len << 7;
1104 } 1108 }
1105 1109
1106 if (pulse_present) { 1110 if (pulse_present) {
1107 idx = 0; 1111 idx = 0;
1108 for (i = 0; i < pulse->num_pulse; i++) { 1112 for (i = 0; i < pulse->num_pulse; i++) {