Mercurial > libavcodec.hg
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++) { |