Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * AAC decoder | ||
3 | * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org ) | ||
4 | * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com ) | ||
5 | * Copyright (c) 2008-2013 Alex Converse <alex.converse@gmail.com> | ||
6 | * | ||
7 | * AAC LATM decoder | ||
8 | * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz> | ||
9 | * Copyright (c) 2010 Janne Grunau <janne-libav@jannau.net> | ||
10 | * | ||
11 | * AAC decoder fixed-point implementation | ||
12 | * Copyright (c) 2013 | ||
13 | * MIPS Technologies, Inc., California. | ||
14 | * | ||
15 | * This file is part of FFmpeg. | ||
16 | * | ||
17 | * FFmpeg is free software; you can redistribute it and/or | ||
18 | * modify it under the terms of the GNU Lesser General Public | ||
19 | * License as published by the Free Software Foundation; either | ||
20 | * version 2.1 of the License, or (at your option) any later version. | ||
21 | * | ||
22 | * FFmpeg is distributed in the hope that it will be useful, | ||
23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
25 | * Lesser General Public License for more details. | ||
26 | * | ||
27 | * You should have received a copy of the GNU Lesser General Public | ||
28 | * License along with FFmpeg; if not, write to the Free Software | ||
29 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
30 | */ | ||
31 | |||
32 | #include "aacdec.h" | ||
33 | #include "libavcodec/lpc_functions.h" | ||
34 | |||
35 | #include "libavcodec/aactab.h" | ||
36 | |||
37 | /** | ||
38 | * Convert integer scalefactors to the decoder's native expected | ||
39 | * scalefactor values. | ||
40 | */ | ||
41 | 101704 | static void AAC_RENAME(dequant_scalefactors)(SingleChannelElement *sce) | |
42 | { | ||
43 | 101704 | IndividualChannelStream *ics = &sce->ics; | |
44 | 101704 | const int *sfo = sce->sfo; | |
45 | 101704 | INTFLOAT *sf = sce->AAC_RENAME(sf); | |
46 | |||
47 | 101704 | int idx = 0; | |
48 |
2/2✓ Branch 0 taken 106942 times.
✓ Branch 1 taken 101704 times.
|
208646 | for (int g = 0; g < ics->num_window_groups; g++) { |
49 |
2/2✓ Branch 0 taken 3817880 times.
✓ Branch 1 taken 106942 times.
|
3924822 | for (int sfb = 0; sfb < ics->max_sfb; sfb++, idx++) { |
50 |
4/4✓ Branch 0 taken 537005 times.
✓ Branch 1 taken 66207 times.
✓ Branch 2 taken 281615 times.
✓ Branch 3 taken 2933053 times.
|
3817880 | switch (sce->band_type[g*ics->max_sfb + sfb]) { |
51 | 537005 | case ZERO_BT: | |
52 | 537005 | sf[idx] = FIXR(0.); | |
53 | 537005 | break; | |
54 | 66207 | case INTENSITY_BT: /* fallthrough */ | |
55 | case INTENSITY_BT2: | ||
56 | #if USE_FIXED | ||
57 | 17856 | sf[idx] = 100 - (sfo[idx] + 100); | |
58 | #else | ||
59 | 48351 | sf[idx] = ff_aac_pow2sf_tab[-sfo[idx] - 100 + POW_SF2_ZERO]; | |
60 | #endif /* USE_FIXED */ | ||
61 | 66207 | break; | |
62 | 281615 | case NOISE_BT: | |
63 | #if USE_FIXED | ||
64 | 137931 | sf[idx] = -(100 + sfo[idx]); | |
65 | #else | ||
66 | 143684 | sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] + POW_SF2_ZERO]; | |
67 | #endif /* USE_FIXED */ | ||
68 | 281615 | break; | |
69 | 2933053 | default: | |
70 | #if USE_FIXED | ||
71 | 783227 | sf[idx] = -sfo[idx] - 100; | |
72 | #else | ||
73 | 2149826 | sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] + POW_SF2_ZERO]; | |
74 | #endif /* USE_FIXED */ | ||
75 | 2933053 | break; | |
76 | } | ||
77 | } | ||
78 | } | ||
79 | 101704 | } | |
80 | |||
81 | /** | ||
82 | * Mid/Side stereo decoding; reference: 4.6.8.1.3. | ||
83 | */ | ||
84 | 30850 | static void AAC_RENAME(apply_mid_side_stereo)(AACDecContext *ac, ChannelElement *cpe) | |
85 | { | ||
86 | 30850 | const IndividualChannelStream *ics = &cpe->ch[0].ics; | |
87 | 30850 | INTFLOAT *ch0 = cpe->ch[0].AAC_RENAME(coeffs); | |
88 | 30850 | INTFLOAT *ch1 = cpe->ch[1].AAC_RENAME(coeffs); | |
89 | 30850 | const uint16_t *offsets = ics->swb_offset; | |
90 |
2/2✓ Branch 0 taken 32555 times.
✓ Branch 1 taken 30850 times.
|
63405 | for (int g = 0; g < ics->num_window_groups; g++) { |
91 |
2/2✓ Branch 0 taken 1182527 times.
✓ Branch 1 taken 32555 times.
|
1215082 | for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) { |
92 | 1182527 | const int idx = g*cpe->max_sfb_ste + sfb; | |
93 |
2/2✓ Branch 0 taken 883483 times.
✓ Branch 1 taken 299044 times.
|
1182527 | if (cpe->ms_mask[idx] && |
94 |
1/2✓ Branch 0 taken 883483 times.
✗ Branch 1 not taken.
|
883483 | cpe->ch[0].band_type[idx] < NOISE_BT && |
95 |
2/2✓ Branch 0 taken 881107 times.
✓ Branch 1 taken 2376 times.
|
883483 | cpe->ch[1].band_type[idx] < NOISE_BT) { |
96 |
2/2✓ Branch 0 taken 911294 times.
✓ Branch 1 taken 881107 times.
|
1792401 | for (int group = 0; group < ics->group_len[g]; group++) |
97 | #if USE_FIXED | ||
98 | 256654 | ac->fdsp->butterflies_fixed(ch0 + group * 128 + offsets[sfb], | |
99 | 256654 | ch1 + group * 128 + offsets[sfb], | |
100 | 256654 | offsets[sfb+1] - offsets[sfb]); | |
101 | #else | ||
102 | 654640 | ac->fdsp->butterflies_float(ch0 + group * 128 + offsets[sfb], | |
103 | 654640 | ch1 + group * 128 + offsets[sfb], | |
104 | 654640 | offsets[sfb+1] - offsets[sfb]); | |
105 | #endif /* USE_FIXED */ | ||
106 | } | ||
107 | } | ||
108 | 32555 | ch0 += ics->group_len[g] * 128; | |
109 | 32555 | ch1 += ics->group_len[g] * 128; | |
110 | } | ||
111 | 30850 | } | |
112 | |||
113 | /** | ||
114 | * intensity stereo decoding; reference: 4.6.8.2.3 | ||
115 | * | ||
116 | * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; | ||
117 | * [1] mask is decoded from bitstream; [2] mask is all 1s; | ||
118 | * [3] reserved for scalable AAC | ||
119 | */ | ||
120 | 30786 | static void AAC_RENAME(apply_intensity_stereo)(AACDecContext *ac, | |
121 | ChannelElement *cpe, int ms_present) | ||
122 | { | ||
123 | 30786 | const IndividualChannelStream *ics = &cpe->ch[1].ics; | |
124 | 30786 | SingleChannelElement *sce1 = &cpe->ch[1]; | |
125 | 30786 | INTFLOAT *coef0 = cpe->ch[0].AAC_RENAME(coeffs), *coef1 = cpe->ch[1].AAC_RENAME(coeffs); | |
126 | 30786 | const uint16_t *offsets = ics->swb_offset; | |
127 | int c; | ||
128 | INTFLOAT scale; | ||
129 |
2/2✓ Branch 0 taken 32714 times.
✓ Branch 1 taken 30786 times.
|
63500 | for (int g = 0; g < ics->num_window_groups; g++) { |
130 |
2/2✓ Branch 0 taken 1165449 times.
✓ Branch 1 taken 32714 times.
|
1198163 | for (int sfb = 0; sfb < ics->max_sfb; sfb++) { |
131 | 1165449 | const int idx = g*ics->max_sfb + sfb; | |
132 |
2/2✓ Branch 0 taken 1101485 times.
✓ Branch 1 taken 63964 times.
|
1165449 | if (sce1->band_type[idx] == INTENSITY_BT || |
133 |
2/2✓ Branch 0 taken 2243 times.
✓ Branch 1 taken 1099242 times.
|
1101485 | sce1->band_type[idx] == INTENSITY_BT2) { |
134 | 66207 | c = -1 + 2 * (sce1->band_type[idx] - 14); | |
135 |
2/2✓ Branch 0 taken 61324 times.
✓ Branch 1 taken 4883 times.
|
66207 | if (ms_present) |
136 | 61324 | c *= 1 - 2 * cpe->ms_mask[idx]; | |
137 | 66207 | scale = c * sce1->AAC_RENAME(sf)[idx]; | |
138 |
2/2✓ Branch 0 taken 66538 times.
✓ Branch 1 taken 66207 times.
|
132745 | for (int group = 0; group < ics->group_len[g]; group++) |
139 | #if USE_FIXED | ||
140 | 17955 | subband_scale(coef1 + group * 128 + offsets[sfb], | |
141 | 17955 | coef0 + group * 128 + offsets[sfb], | |
142 | scale, | ||
143 | 23, | ||
144 | 17955 | offsets[sfb + 1] - offsets[sfb], ac->avctx); | |
145 | #else | ||
146 | 48583 | ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[sfb], | |
147 | 48583 | coef0 + group * 128 + offsets[sfb], | |
148 | scale, | ||
149 | 48583 | offsets[sfb + 1] - offsets[sfb]); | |
150 | #endif /* USE_FIXED */ | ||
151 | } | ||
152 | } | ||
153 | 32714 | coef0 += ics->group_len[g] * 128; | |
154 | 32714 | coef1 += ics->group_len[g] * 128; | |
155 | } | ||
156 | 30786 | } | |
157 | |||
158 | /** | ||
159 | * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3. | ||
160 | * | ||
161 | * @param decode 1 if tool is used normally, 0 if tool is used in LTP. | ||
162 | * @param coef spectral coefficients | ||
163 | */ | ||
164 | 6961 | static void AAC_RENAME(apply_tns)(void *_coef_param, TemporalNoiseShaping *tns, | |
165 | IndividualChannelStream *ics, int decode) | ||
166 | { | ||
167 | 6961 | const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb); | |
168 | int w, filt, m, i; | ||
169 | int bottom, top, order, start, end, size, inc; | ||
170 | 6961 | INTFLOAT *coef_param = _coef_param; | |
171 | INTFLOAT lpc[TNS_MAX_ORDER]; | ||
172 | INTFLOAT tmp[TNS_MAX_ORDER+1]; | ||
173 | 6961 | UINTFLOAT *coef = coef_param; | |
174 | |||
175 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6955 times.
|
6961 | if(!mmm) |
176 | 6 | return; | |
177 | |||
178 |
2/2✓ Branch 0 taken 11568 times.
✓ Branch 1 taken 6955 times.
|
18523 | for (w = 0; w < ics->num_windows; w++) { |
179 | 11568 | bottom = ics->num_swb; | |
180 |
2/2✓ Branch 0 taken 9407 times.
✓ Branch 1 taken 11568 times.
|
20975 | for (filt = 0; filt < tns->n_filt[w]; filt++) { |
181 | 9407 | top = bottom; | |
182 | 9407 | bottom = FFMAX(0, top - tns->length[w][filt]); | |
183 | 9407 | order = tns->order[w][filt]; | |
184 |
2/2✓ Branch 0 taken 520 times.
✓ Branch 1 taken 8887 times.
|
9407 | if (order == 0) |
185 | 520 | continue; | |
186 | |||
187 | // tns_decode_coef | ||
188 | 8887 | compute_lpc_coefs(tns->AAC_RENAME(coef)[w][filt], order, lpc, 0, 0, 0); | |
189 | |||
190 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8881 times.
|
8887 | start = ics->swb_offset[FFMIN(bottom, mmm)]; |
191 |
2/2✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1798 times.
|
8887 | end = ics->swb_offset[FFMIN( top, mmm)]; |
192 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8879 times.
|
8887 | if ((size = end - start) <= 0) |
193 | 8 | continue; | |
194 |
2/2✓ Branch 0 taken 3614 times.
✓ Branch 1 taken 5265 times.
|
8879 | if (tns->direction[w][filt]) { |
195 | 3614 | inc = -1; | |
196 | 3614 | start = end - 1; | |
197 | } else { | ||
198 | 5265 | inc = 1; | |
199 | } | ||
200 | 8879 | start += w * 128; | |
201 | |||
202 |
2/2✓ Branch 0 taken 8873 times.
✓ Branch 1 taken 6 times.
|
8879 | if (decode) { |
203 | // ar filter | ||
204 |
2/2✓ Branch 0 taken 2747532 times.
✓ Branch 1 taken 8873 times.
|
2756405 | for (m = 0; m < size; m++, start += inc) |
205 |
2/2✓ Branch 0 taken 21302901 times.
✓ Branch 1 taken 2747532 times.
|
24050433 | for (i = 1; i <= FFMIN(m, order); i++) |
206 | 21302901 | coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]); | |
207 | } else { | ||
208 | // ma filter | ||
209 |
2/2✓ Branch 0 taken 3696 times.
✓ Branch 1 taken 6 times.
|
3702 | for (m = 0; m < size; m++, start += inc) { |
210 | 3696 | tmp[0] = coef[start]; | |
211 |
2/2✓ Branch 0 taken 35416 times.
✓ Branch 1 taken 3696 times.
|
39112 | for (i = 1; i <= FFMIN(m, order); i++) |
212 | 35416 | coef[start] += AAC_MUL26(tmp[i], lpc[i - 1]); | |
213 |
2/2✓ Branch 0 taken 35728 times.
✓ Branch 1 taken 3696 times.
|
39424 | for (i = order; i > 0; i--) |
214 | 35728 | tmp[i] = tmp[i - 1]; | |
215 | } | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | } | ||
220 | |||
221 | /** | ||
222 | * Apply windowing and MDCT to obtain the spectral | ||
223 | * coefficient from the predicted sample by LTP. | ||
224 | */ | ||
225 | 786 | static inline void AAC_RENAME(windowing_and_mdct_ltp)(AACDecContext *ac, | |
226 | INTFLOAT *out, INTFLOAT *in, | ||
227 | IndividualChannelStream *ics) | ||
228 | { | ||
229 |
1/2✓ Branch 0 taken 786 times.
✗ Branch 1 not taken.
|
786 | const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); |
230 |
1/2✓ Branch 0 taken 786 times.
✗ Branch 1 not taken.
|
786 | const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); |
231 |
2/2✓ Branch 0 taken 784 times.
✓ Branch 1 taken 2 times.
|
786 | const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); |
232 |
2/2✓ Branch 0 taken 784 times.
✓ Branch 1 taken 2 times.
|
786 | const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); |
233 | |||
234 |
2/2✓ Branch 0 taken 784 times.
✓ Branch 1 taken 2 times.
|
786 | if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) { |
235 | 784 | ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024); | |
236 | } else { | ||
237 | 2 | memset(in, 0, 448 * sizeof(*in)); | |
238 | 2 | ac->fdsp->vector_fmul(in + 448, in + 448, swindow_prev, 128); | |
239 | } | ||
240 |
1/2✓ Branch 0 taken 786 times.
✗ Branch 1 not taken.
|
786 | if (ics->window_sequence[0] != LONG_START_SEQUENCE) { |
241 | 786 | ac->fdsp->vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024); | |
242 | } else { | ||
243 | ✗ | ac->fdsp->vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128); | |
244 | ✗ | memset(in + 1024 + 576, 0, 448 * sizeof(*in)); | |
245 | } | ||
246 | 786 | ac->mdct_ltp_fn(ac->mdct_ltp, out, in, sizeof(INTFLOAT)); | |
247 | 786 | } | |
248 | |||
249 | /** | ||
250 | * Apply the long term prediction | ||
251 | */ | ||
252 | 786 | static void AAC_RENAME(apply_ltp)(AACDecContext *ac, SingleChannelElement *sce) | |
253 | { | ||
254 | 786 | const LongTermPrediction *ltp = &sce->ics.ltp; | |
255 | 786 | const uint16_t *offsets = sce->ics.swb_offset; | |
256 | int i, sfb; | ||
257 | |||
258 |
1/2✓ Branch 0 taken 786 times.
✗ Branch 1 not taken.
|
786 | if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
259 | 786 | INTFLOAT *predTime = sce->AAC_RENAME(output); | |
260 | 786 | INTFLOAT *predFreq = ac->AAC_RENAME(buf_mdct); | |
261 | 786 | int16_t num_samples = 2048; | |
262 | |||
263 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 786 times.
|
786 | if (ltp->lag < 1024) |
264 | ✗ | num_samples = ltp->lag + 1024; | |
265 |
2/2✓ Branch 0 taken 1609728 times.
✓ Branch 1 taken 786 times.
|
1610514 | for (i = 0; i < num_samples; i++) |
266 | 1609728 | predTime[i] = AAC_MUL30(sce->AAC_RENAME(ltp_state)[i + 2048 - ltp->lag], ltp->AAC_RENAME(coef)); | |
267 | 786 | memset(&predTime[i], 0, (2048 - i) * sizeof(*predTime)); | |
268 | |||
269 | 786 | AAC_RENAME(windowing_and_mdct_ltp)(ac, predFreq, predTime, &sce->ics); | |
270 | |||
271 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 780 times.
|
786 | if (sce->tns.present) |
272 | 6 | AAC_RENAME(apply_tns)(predFreq, &sce->tns, &sce->ics, 0); | |
273 | |||
274 |
2/2✓ Branch 0 taken 31440 times.
✓ Branch 1 taken 786 times.
|
32226 | for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++) |
275 |
2/2✓ Branch 0 taken 22868 times.
✓ Branch 1 taken 8572 times.
|
31440 | if (ltp->used[sfb]) |
276 |
2/2✓ Branch 0 taken 347544 times.
✓ Branch 1 taken 22868 times.
|
370412 | for (i = offsets[sfb]; i < offsets[sfb + 1]; i++) |
277 | 347544 | sce->AAC_RENAME(coeffs)[i] += (UINTFLOAT)predFreq[i]; | |
278 | } | ||
279 | 786 | } | |
280 | |||
281 | /** | ||
282 | * Update the LTP buffer for next frame | ||
283 | */ | ||
284 | 3568 | static void AAC_RENAME(update_ltp)(AACDecContext *ac, SingleChannelElement *sce) | |
285 | { | ||
286 | 3568 | IndividualChannelStream *ics = &sce->ics; | |
287 | 3568 | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
288 | 3568 | INTFLOAT *saved_ltp = sce->AAC_RENAME(coeffs); | |
289 |
2/2✓ Branch 0 taken 3560 times.
✓ Branch 1 taken 8 times.
|
3568 | const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); |
290 |
2/2✓ Branch 0 taken 3560 times.
✓ Branch 1 taken 8 times.
|
3568 | const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); |
291 | int i; | ||
292 | |||
293 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3564 times.
|
3568 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
294 | 4 | memcpy(saved_ltp, saved, 512 * sizeof(*saved_ltp)); | |
295 | 4 | memset(saved_ltp + 576, 0, 448 * sizeof(*saved_ltp)); | |
296 | 4 | ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960, &swindow[64], 64); | |
297 | |||
298 |
2/2✓ Branch 0 taken 256 times.
✓ Branch 1 taken 4 times.
|
260 | for (i = 0; i < 64; i++) |
299 | 256 | saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]); | |
300 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3560 times.
|
3564 | } else if (1 && ics->window_sequence[0] == LONG_START_SEQUENCE) { |
301 | 4 | memcpy(saved_ltp, ac->AAC_RENAME(buf_mdct) + 512, 448 * sizeof(*saved_ltp)); | |
302 | 4 | memset(saved_ltp + 576, 0, 448 * sizeof(*saved_ltp)); | |
303 | 4 | ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960, &swindow[64], 64); | |
304 | |||
305 |
2/2✓ Branch 0 taken 256 times.
✓ Branch 1 taken 4 times.
|
260 | for (i = 0; i < 64; i++) |
306 | 256 | saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]); | |
307 | } else if (1) { // LONG_STOP or ONLY_LONG | ||
308 | 3560 | ac->fdsp->vector_fmul_reverse(saved_ltp, ac->AAC_RENAME(buf_mdct) + 512, &lwindow[512], 512); | |
309 | |||
310 |
2/2✓ Branch 0 taken 1822720 times.
✓ Branch 1 taken 3560 times.
|
1826280 | for (i = 0; i < 512; i++) |
311 | 1822720 | saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], lwindow[511 - i]); | |
312 | } | ||
313 | |||
314 | 3568 | memcpy(sce->AAC_RENAME(ltp_state), sce->AAC_RENAME(ltp_state)+1024, | |
315 | 1024 * sizeof(*sce->AAC_RENAME(ltp_state))); | ||
316 | 3568 | memcpy(sce->AAC_RENAME(ltp_state) + 1024, sce->AAC_RENAME(output), | |
317 | 1024 * sizeof(*sce->AAC_RENAME(ltp_state))); | ||
318 | 3568 | memcpy(sce->AAC_RENAME(ltp_state) + 2048, saved_ltp, | |
319 | 1024 * sizeof(*sce->AAC_RENAME(ltp_state))); | ||
320 | 3568 | } | |
321 | |||
322 | /** | ||
323 | * Conduct IMDCT and windowing. | ||
324 | */ | ||
325 | 70302 | static void AAC_RENAME(imdct_and_windowing)(AACDecContext *ac, SingleChannelElement *sce) | |
326 | { | ||
327 | 70302 | IndividualChannelStream *ics = &sce->ics; | |
328 | 70302 | INTFLOAT *in = sce->AAC_RENAME(coeffs); | |
329 | 70302 | INTFLOAT *out = sce->AAC_RENAME(output); | |
330 | 70302 | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
331 |
2/2✓ Branch 0 taken 48238 times.
✓ Branch 1 taken 22064 times.
|
70302 | const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); |
332 |
2/2✓ Branch 0 taken 48077 times.
✓ Branch 1 taken 22225 times.
|
70302 | const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); |
333 |
2/2✓ Branch 0 taken 48077 times.
✓ Branch 1 taken 22225 times.
|
70302 | const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); |
334 | 70302 | INTFLOAT *buf = ac->AAC_RENAME(buf_mdct); | |
335 | 70302 | INTFLOAT *temp = ac->AAC_RENAME(temp); | |
336 | int i; | ||
337 | |||
338 | // imdct | ||
339 |
2/2✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 68214 times.
|
70302 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
340 |
2/2✓ Branch 0 taken 16704 times.
✓ Branch 1 taken 2088 times.
|
18792 | for (i = 0; i < 1024; i += 128) |
341 | 16704 | ac->mdct128_fn(ac->mdct128, buf + i, in + i, sizeof(INTFLOAT)); | |
342 | } else { | ||
343 | 68214 | ac->mdct1024_fn(ac->mdct1024, buf, in, sizeof(INTFLOAT)); | |
344 | } | ||
345 | |||
346 | /* window overlapping | ||
347 | * NOTE: To simplify the overlapping code, all 'meaningless' short to long | ||
348 | * and long to short transitions are considered to be short to short | ||
349 | * transitions. This leaves just two cases (long to long and short to short) | ||
350 | * with a little special sauce for EIGHT_SHORT_SEQUENCE. | ||
351 | */ | ||
352 |
4/4✓ Branch 0 taken 4249 times.
✓ Branch 1 taken 66053 times.
✓ Branch 2 taken 1079 times.
✓ Branch 3 taken 3170 times.
|
70302 | if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && |
353 |
4/4✓ Branch 0 taken 1223 times.
✓ Branch 1 taken 65909 times.
✓ Branch 2 taken 1221 times.
✓ Branch 3 taken 2 times.
|
67132 | (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { |
354 | 67130 | ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 512); | |
355 | } else { | ||
356 | 3172 | memcpy( out, saved, 448 * sizeof(*out)); | |
357 | |||
358 |
2/2✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 1084 times.
|
3172 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
359 | 2088 | ac->fdsp->vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64); | |
360 | 2088 | ac->fdsp->vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64); | |
361 | 2088 | ac->fdsp->vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64); | |
362 | 2088 | ac->fdsp->vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64); | |
363 | 2088 | ac->fdsp->vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64); | |
364 | 2088 | memcpy( out + 448 + 4*128, temp, 64 * sizeof(*out)); | |
365 | } else { | ||
366 | 1084 | ac->fdsp->vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64); | |
367 | 1084 | memcpy( out + 576, buf + 64, 448 * sizeof(*out)); | |
368 | } | ||
369 | } | ||
370 | |||
371 | // buffer update | ||
372 |
2/2✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 68214 times.
|
70302 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
373 | 2088 | memcpy( saved, temp + 64, 64 * sizeof(*saved)); | |
374 | 2088 | ac->fdsp->vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64); | |
375 | 2088 | ac->fdsp->vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64); | |
376 | 2088 | ac->fdsp->vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64); | |
377 | 2088 | memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(*saved)); | |
378 |
2/2✓ Branch 0 taken 1221 times.
✓ Branch 1 taken 66993 times.
|
68214 | } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { |
379 | 1221 | memcpy( saved, buf + 512, 448 * sizeof(*saved)); | |
380 | 1221 | memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(*saved)); | |
381 | } else { // LONG_STOP or ONLY_LONG | ||
382 | 66993 | memcpy( saved, buf + 512, 512 * sizeof(*saved)); | |
383 | } | ||
384 | 70302 | } | |
385 | |||
386 | /** | ||
387 | * Conduct IMDCT and windowing for 768-point frames. | ||
388 | */ | ||
389 | ✗ | static void AAC_RENAME(imdct_and_windowing_768)(AACDecContext *ac, SingleChannelElement *sce) | |
390 | { | ||
391 | ✗ | IndividualChannelStream *ics = &sce->ics; | |
392 | ✗ | INTFLOAT *in = sce->AAC_RENAME(coeffs); | |
393 | ✗ | INTFLOAT *out = sce->AAC_RENAME(output); | |
394 | ✗ | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
395 | ✗ | const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(aac_kbd_short_96) : AAC_RENAME(sine_96); | |
396 | ✗ | const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_long_768) : AAC_RENAME(sine_768); | |
397 | ✗ | const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_short_96) : AAC_RENAME(sine_96); | |
398 | ✗ | INTFLOAT *buf = ac->AAC_RENAME(buf_mdct); | |
399 | ✗ | INTFLOAT *temp = ac->AAC_RENAME(temp); | |
400 | int i; | ||
401 | |||
402 | // imdct | ||
403 | ✗ | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { | |
404 | ✗ | for (i = 0; i < 8; i++) | |
405 | ✗ | ac->mdct96_fn(ac->mdct96, buf + i * 96, in + i * 96, sizeof(INTFLOAT)); | |
406 | } else { | ||
407 | ✗ | ac->mdct768_fn(ac->mdct768, buf, in, sizeof(INTFLOAT)); | |
408 | } | ||
409 | |||
410 | /* window overlapping | ||
411 | * NOTE: To simplify the overlapping code, all 'meaningless' short to long | ||
412 | * and long to short transitions are considered to be short to short | ||
413 | * transitions. This leaves just two cases (long to long and short to short) | ||
414 | * with a little special sauce for EIGHT_SHORT_SEQUENCE. | ||
415 | */ | ||
416 | |||
417 | ✗ | if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && | |
418 | ✗ | (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { | |
419 | ✗ | ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 384); | |
420 | } else { | ||
421 | ✗ | memcpy( out, saved, 336 * sizeof(*out)); | |
422 | |||
423 | ✗ | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { | |
424 | ✗ | ac->fdsp->vector_fmul_window(out + 336 + 0*96, saved + 336, buf + 0*96, swindow_prev, 48); | |
425 | ✗ | ac->fdsp->vector_fmul_window(out + 336 + 1*96, buf + 0*96 + 48, buf + 1*96, swindow, 48); | |
426 | ✗ | ac->fdsp->vector_fmul_window(out + 336 + 2*96, buf + 1*96 + 48, buf + 2*96, swindow, 48); | |
427 | ✗ | ac->fdsp->vector_fmul_window(out + 336 + 3*96, buf + 2*96 + 48, buf + 3*96, swindow, 48); | |
428 | ✗ | ac->fdsp->vector_fmul_window(temp, buf + 3*96 + 48, buf + 4*96, swindow, 48); | |
429 | ✗ | memcpy( out + 336 + 4*96, temp, 48 * sizeof(*out)); | |
430 | } else { | ||
431 | ✗ | ac->fdsp->vector_fmul_window(out + 336, saved + 336, buf, swindow_prev, 48); | |
432 | ✗ | memcpy( out + 432, buf + 48, 336 * sizeof(*out)); | |
433 | } | ||
434 | } | ||
435 | |||
436 | // buffer update | ||
437 | ✗ | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { | |
438 | ✗ | memcpy( saved, temp + 48, 48 * sizeof(*saved)); | |
439 | ✗ | ac->fdsp->vector_fmul_window(saved + 48, buf + 4*96 + 48, buf + 5*96, swindow, 48); | |
440 | ✗ | ac->fdsp->vector_fmul_window(saved + 144, buf + 5*96 + 48, buf + 6*96, swindow, 48); | |
441 | ✗ | ac->fdsp->vector_fmul_window(saved + 240, buf + 6*96 + 48, buf + 7*96, swindow, 48); | |
442 | ✗ | memcpy( saved + 336, buf + 7*96 + 48, 48 * sizeof(*saved)); | |
443 | ✗ | } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { | |
444 | ✗ | memcpy( saved, buf + 384, 336 * sizeof(*saved)); | |
445 | ✗ | memcpy( saved + 336, buf + 7*96 + 48, 48 * sizeof(*saved)); | |
446 | } else { // LONG_STOP or ONLY_LONG | ||
447 | ✗ | memcpy( saved, buf + 384, 384 * sizeof(*saved)); | |
448 | } | ||
449 | ✗ | } | |
450 | |||
451 | /** | ||
452 | * Conduct IMDCT and windowing. | ||
453 | */ | ||
454 | 387 | static void AAC_RENAME(imdct_and_windowing_960)(AACDecContext *ac, SingleChannelElement *sce) | |
455 | { | ||
456 | 387 | IndividualChannelStream *ics = &sce->ics; | |
457 | 387 | INTFLOAT *in = sce->AAC_RENAME(coeffs); | |
458 | 387 | INTFLOAT *out = sce->AAC_RENAME(output); | |
459 | 387 | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
460 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 373 times.
|
387 | const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120); |
461 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 373 times.
|
387 | const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_long_960) : AAC_RENAME(sine_960); |
462 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 373 times.
|
387 | const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120); |
463 | 387 | INTFLOAT *buf = ac->AAC_RENAME(buf_mdct); | |
464 | 387 | INTFLOAT *temp = ac->AAC_RENAME(temp); | |
465 | int i; | ||
466 | |||
467 | // imdct | ||
468 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 386 times.
|
387 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
469 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
|
9 | for (i = 0; i < 8; i++) |
470 | 8 | ac->mdct120_fn(ac->mdct120, buf + i * 120, in + i * 128, sizeof(INTFLOAT)); | |
471 | } else { | ||
472 | 386 | ac->mdct960_fn(ac->mdct960, buf, in, sizeof(INTFLOAT)); | |
473 | } | ||
474 | |||
475 | /* window overlapping | ||
476 | * NOTE: To simplify the overlapping code, all 'meaningless' short to long | ||
477 | * and long to short transitions are considered to be short to short | ||
478 | * transitions. This leaves just two cases (long to long and short to short) | ||
479 | * with a little special sauce for EIGHT_SHORT_SEQUENCE. | ||
480 | */ | ||
481 | |||
482 |
4/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 384 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
|
387 | if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && |
483 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 383 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
385 | (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { |
484 | 385 | ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 480); | |
485 | } else { | ||
486 | 2 | memcpy( out, saved, 420 * sizeof(*out)); | |
487 | |||
488 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
489 | 1 | ac->fdsp->vector_fmul_window(out + 420 + 0*120, saved + 420, buf + 0*120, swindow_prev, 60); | |
490 | 1 | ac->fdsp->vector_fmul_window(out + 420 + 1*120, buf + 0*120 + 60, buf + 1*120, swindow, 60); | |
491 | 1 | ac->fdsp->vector_fmul_window(out + 420 + 2*120, buf + 1*120 + 60, buf + 2*120, swindow, 60); | |
492 | 1 | ac->fdsp->vector_fmul_window(out + 420 + 3*120, buf + 2*120 + 60, buf + 3*120, swindow, 60); | |
493 | 1 | ac->fdsp->vector_fmul_window(temp, buf + 3*120 + 60, buf + 4*120, swindow, 60); | |
494 | 1 | memcpy( out + 420 + 4*120, temp, 60 * sizeof(*out)); | |
495 | } else { | ||
496 | 1 | ac->fdsp->vector_fmul_window(out + 420, saved + 420, buf, swindow_prev, 60); | |
497 | 1 | memcpy( out + 540, buf + 60, 420 * sizeof(*out)); | |
498 | } | ||
499 | } | ||
500 | |||
501 | // buffer update | ||
502 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 386 times.
|
387 | if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
503 | 1 | memcpy( saved, temp + 60, 60 * sizeof(*saved)); | |
504 | 1 | ac->fdsp->vector_fmul_window(saved + 60, buf + 4*120 + 60, buf + 5*120, swindow, 60); | |
505 | 1 | ac->fdsp->vector_fmul_window(saved + 180, buf + 5*120 + 60, buf + 6*120, swindow, 60); | |
506 | 1 | ac->fdsp->vector_fmul_window(saved + 300, buf + 6*120 + 60, buf + 7*120, swindow, 60); | |
507 | 1 | memcpy( saved + 420, buf + 7*120 + 60, 60 * sizeof(*saved)); | |
508 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 384 times.
|
386 | } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { |
509 | 2 | memcpy( saved, buf + 480, 420 * sizeof(*saved)); | |
510 | 2 | memcpy( saved + 420, buf + 7*120 + 60, 60 * sizeof(*saved)); | |
511 | } else { // LONG_STOP or ONLY_LONG | ||
512 | 384 | memcpy( saved, buf + 480, 480 * sizeof(*saved)); | |
513 | } | ||
514 | 387 | } | |
515 | |||
516 | 3636 | static void AAC_RENAME(imdct_and_windowing_ld)(AACDecContext *ac, SingleChannelElement *sce) | |
517 | { | ||
518 | 3636 | IndividualChannelStream *ics = &sce->ics; | |
519 | 3636 | INTFLOAT *in = sce->AAC_RENAME(coeffs); | |
520 | 3636 | INTFLOAT *out = sce->AAC_RENAME(output); | |
521 | 3636 | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
522 | 3636 | INTFLOAT *buf = ac->AAC_RENAME(buf_mdct); | |
523 | |||
524 | // imdct | ||
525 | 3636 | ac->mdct512_fn(ac->mdct512, buf, in, sizeof(INTFLOAT)); | |
526 | |||
527 | // window overlapping | ||
528 |
2/2✓ Branch 0 taken 62 times.
✓ Branch 1 taken 3574 times.
|
3636 | if (ics->use_kb_window[1]) { |
529 | // AAC LD uses a low overlap sine window instead of a KBD window | ||
530 | 62 | memcpy(out, saved, 192 * sizeof(*out)); | |
531 | 62 | ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, AAC_RENAME2(sine_128), 64); | |
532 | 62 | memcpy( out + 320, buf + 64, 192 * sizeof(*out)); | |
533 | } else { | ||
534 | 3574 | ac->fdsp->vector_fmul_window(out, saved, buf, AAC_RENAME2(sine_512), 256); | |
535 | } | ||
536 | |||
537 | // buffer update | ||
538 | 3636 | memcpy(saved, buf + 256, 256 * sizeof(*saved)); | |
539 | 3636 | } | |
540 | |||
541 | 26598 | static void AAC_RENAME(imdct_and_windowing_eld)(AACDecContext *ac, SingleChannelElement *sce) | |
542 | { | ||
543 | 26598 | UINTFLOAT *in = sce->AAC_RENAME(coeffs); | |
544 | 26598 | INTFLOAT *out = sce->AAC_RENAME(output); | |
545 | 26598 | INTFLOAT *saved = sce->AAC_RENAME(saved); | |
546 | 26598 | INTFLOAT *buf = ac->AAC_RENAME(buf_mdct); | |
547 | int i; | ||
548 |
2/2✓ Branch 0 taken 7118 times.
✓ Branch 1 taken 19480 times.
|
26598 | const int n = ac->oc[1].m4ac.frame_length_short ? 480 : 512; |
549 | 26598 | const int n2 = n >> 1; | |
550 | 26598 | const int n4 = n >> 2; | |
551 |
2/2✓ Branch 0 taken 7118 times.
✓ Branch 1 taken 19480 times.
|
26598 | const INTFLOAT *const window = n == 480 ? AAC_RENAME(ff_aac_eld_window_480) : |
552 | AAC_RENAME(ff_aac_eld_window_512); | ||
553 | |||
554 | // Inverse transform, mapped to the conventional IMDCT by | ||
555 | // Chivukula, R.K.; Reznik, Y.A.; Devarajan, V., | ||
556 | // "Efficient algorithms for MPEG-4 AAC-ELD, AAC-LD and AAC-LC filterbanks," | ||
557 | // International Conference on Audio, Language and Image Processing, ICALIP 2008. | ||
558 | // URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4590245&isnumber=4589950 | ||
559 |
2/2✓ Branch 0 taken 3347600 times.
✓ Branch 1 taken 26598 times.
|
3374198 | for (i = 0; i < n2; i+=2) { |
560 | INTFLOAT temp; | ||
561 | 3347600 | temp = in[i ]; in[i ] = -in[n - 1 - i]; in[n - 1 - i] = temp; | |
562 | 3347600 | temp = -in[i + 1]; in[i + 1] = in[n - 2 - i]; in[n - 2 - i] = temp; | |
563 | } | ||
564 | |||
565 |
2/2✓ Branch 0 taken 7118 times.
✓ Branch 1 taken 19480 times.
|
26598 | if (n == 480) |
566 | 7118 | ac->mdct480_fn(ac->mdct480, buf, in, sizeof(INTFLOAT)); | |
567 | else | ||
568 | 19480 | ac->mdct512_fn(ac->mdct512, buf, in, sizeof(INTFLOAT)); | |
569 | |||
570 |
2/2✓ Branch 0 taken 6695200 times.
✓ Branch 1 taken 26598 times.
|
6721798 | for (i = 0; i < n; i+=2) { |
571 | 6695200 | buf[i + 0] = -(UINTFLOAT)(USE_FIXED + 1)*buf[i + 0]; | |
572 | 6695200 | buf[i + 1] = (UINTFLOAT)(USE_FIXED + 1)*buf[i + 1]; | |
573 | } | ||
574 | // Like with the regular IMDCT at this point we still have the middle half | ||
575 | // of a transform but with even symmetry on the left and odd symmetry on | ||
576 | // the right | ||
577 | |||
578 | // window overlapping | ||
579 | // The spec says to use samples [0..511] but the reference decoder uses | ||
580 | // samples [128..639]. | ||
581 |
2/2✓ Branch 0 taken 3347600 times.
✓ Branch 1 taken 26598 times.
|
3374198 | for (i = n4; i < n2; i ++) { |
582 | 3347600 | out[i - n4] = AAC_MUL31( buf[ n2 - 1 - i] , window[i - n4]) + | |
583 | 3347600 | AAC_MUL31( saved[ i + n2] , window[i + n - n4]) + | |
584 | 3347600 | AAC_MUL31(-saved[n + n2 - 1 - i] , window[i + 2*n - n4]) + | |
585 | 3347600 | AAC_MUL31(-saved[ 2*n + n2 + i] , window[i + 3*n - n4]); | |
586 | } | ||
587 |
2/2✓ Branch 0 taken 6695200 times.
✓ Branch 1 taken 26598 times.
|
6721798 | for (i = 0; i < n2; i ++) { |
588 | 6695200 | out[n4 + i] = AAC_MUL31( buf[ i] , window[i + n2 - n4]) + | |
589 | 6695200 | AAC_MUL31(-saved[ n - 1 - i] , window[i + n2 + n - n4]) + | |
590 | 6695200 | AAC_MUL31(-saved[ n + i] , window[i + n2 + 2*n - n4]) + | |
591 | 6695200 | AAC_MUL31( saved[2*n + n - 1 - i] , window[i + n2 + 3*n - n4]); | |
592 | } | ||
593 |
2/2✓ Branch 0 taken 3347600 times.
✓ Branch 1 taken 26598 times.
|
3374198 | for (i = 0; i < n4; i ++) { |
594 | 3347600 | out[n2 + n4 + i] = AAC_MUL31( buf[ i + n2] , window[i + n - n4]) + | |
595 | 3347600 | AAC_MUL31(-saved[n2 - 1 - i] , window[i + 2*n - n4]) + | |
596 | 3347600 | AAC_MUL31(-saved[n + n2 + i] , window[i + 3*n - n4]); | |
597 | } | ||
598 | |||
599 | // buffer update | ||
600 | 26598 | memmove(saved + n, saved, 2 * n * sizeof(*saved)); | |
601 | 26598 | memcpy( saved, buf, n * sizeof(*saved)); | |
602 | 26598 | } | |
603 | |||
604 | 63150 | static void AAC_RENAME(clip_output)(AACDecContext *ac, ChannelElement *che, | |
605 | int type, int samples) | ||
606 | { | ||
607 | #if USE_FIXED | ||
608 | /* preparation for resampler */ | ||
609 |
2/2✓ Branch 0 taken 19978752 times.
✓ Branch 1 taken 19545 times.
|
19998297 | for (int j = 0; j < samples; j++){ |
610 | 19978752 | che->ch[0].output_fixed[j] = (int32_t)av_clip64((int64_t)che->ch[0].output_fixed[j]*128, | |
611 | 19978752 | INT32_MIN, INT32_MAX-0x8000)+0x8000; | |
612 |
5/6✓ Branch 0 taken 9946624 times.
✓ Branch 1 taken 10032128 times.
✓ Branch 2 taken 7981568 times.
✓ Branch 3 taken 1965056 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7981568 times.
|
19978752 | if (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) |
613 | 10032128 | che->ch[1].output_fixed[j] = (int32_t)av_clip64((int64_t)che->ch[1].output_fixed[j]*128, | |
614 | 10032128 | INT32_MIN, INT32_MAX-0x8000)+0x8000; | |
615 | } | ||
616 | #endif | ||
617 | 63150 | } | |
618 | |||
619 | 40 | static inline void reset_all_predictors(PredictorState *ps) | |
620 | { | ||
621 | int i; | ||
622 |
2/2✓ Branch 0 taken 26880 times.
✓ Branch 1 taken 40 times.
|
26920 | for (i = 0; i < MAX_PREDICTORS; i++) |
623 | 26880 | reset_predict_state(&ps[i]); | |
624 | 40 | } | |
625 | |||
626 | 518 | static inline void reset_predictor_group(PredictorState *ps, int group_num) | |
627 | { | ||
628 | int i; | ||
629 |
2/2✓ Branch 0 taken 11662 times.
✓ Branch 1 taken 518 times.
|
12180 | for (i = group_num - 1; i < MAX_PREDICTORS; i += 30) |
630 | 11662 | reset_predict_state(&ps[i]); | |
631 | 518 | } | |
632 | |||
633 | /** | ||
634 | * Apply AAC-Main style frequency domain prediction. | ||
635 | */ | ||
636 | 7388 | static void AAC_RENAME(apply_prediction)(AACDecContext *ac, SingleChannelElement *sce) | |
637 | { | ||
638 | int sfb, k; | ||
639 | |||
640 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 7368 times.
|
7388 | if (!sce->ics.predictor_initialized) { |
641 | 20 | reset_all_predictors(sce->AAC_RENAME(predictor_state)); | |
642 | 20 | sce->ics.predictor_initialized = 1; | |
643 | } | ||
644 | |||
645 |
2/2✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 20 times.
|
7388 | if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
646 | 7368 | for (sfb = 0; | |
647 |
2/2✓ Branch 0 taken 255198 times.
✓ Branch 1 taken 7368 times.
|
262566 | sfb < ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index]; |
648 | 255198 | sfb++) { | |
649 | 255198 | for (k = sce->ics.swb_offset[sfb]; | |
650 |
2/2✓ Branch 0 taken 4047936 times.
✓ Branch 1 taken 255198 times.
|
4303134 | k < sce->ics.swb_offset[sfb + 1]; |
651 | 4047936 | k++) { | |
652 | 4047936 | predict(&sce->AAC_RENAME(predictor_state)[k], | |
653 | &sce->AAC_RENAME(coeffs)[k], | ||
654 |
2/2✓ Branch 0 taken 892992 times.
✓ Branch 1 taken 3154944 times.
|
4047936 | sce->ics.predictor_present && |
655 |
2/2✓ Branch 0 taken 271896 times.
✓ Branch 1 taken 621096 times.
|
892992 | sce->ics.prediction_used[sfb]); |
656 | } | ||
657 | } | ||
658 |
2/2✓ Branch 0 taken 518 times.
✓ Branch 1 taken 6850 times.
|
7368 | if (sce->ics.predictor_reset_group) |
659 | 518 | reset_predictor_group(sce->AAC_RENAME(predictor_state), | |
660 | sce->ics.predictor_reset_group); | ||
661 | } else | ||
662 | 20 | reset_all_predictors(sce->AAC_RENAME(predictor_state)); | |
663 | 7388 | } | |
664 | |||
665 | 298 | static av_cold void AAC_RENAME(aac_dsp_init)(AACDecDSP *aac_dsp) | |
666 | { | ||
667 | #define SET(member) aac_dsp->member = AAC_RENAME(member) | ||
668 | 298 | SET(dequant_scalefactors); | |
669 | 298 | SET(apply_mid_side_stereo); | |
670 | 298 | SET(apply_intensity_stereo); | |
671 | 298 | SET(apply_tns); | |
672 | 298 | SET(apply_ltp); | |
673 | 298 | SET(update_ltp); | |
674 | |||
675 | 298 | SET(apply_prediction); | |
676 | |||
677 | 298 | SET(imdct_and_windowing); | |
678 | 298 | SET(imdct_and_windowing_768); | |
679 | 298 | SET(imdct_and_windowing_960); | |
680 | 298 | SET(imdct_and_windowing_ld); | |
681 | 298 | SET(imdct_and_windowing_eld); | |
682 | |||
683 | 298 | SET(apply_dependent_coupling); | |
684 | 298 | SET(apply_independent_coupling); | |
685 | |||
686 | 298 | SET(clip_output); | |
687 | #undef SET | ||
688 | 298 | } | |
689 |