/src/libxaac/encoder/ixheaace_sbr_qmf_enc.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2023 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | |
21 | | #include <string.h> |
22 | | #include <stdlib.h> |
23 | | |
24 | | #include "ixheaac_type_def.h" |
25 | | #include "ixheaac_constants.h" |
26 | | #include "ixheaace_sbr_def.h" |
27 | | #include "ixheaace_resampler.h" |
28 | | #include "ixheaace_sbr_rom.h" |
29 | | #include "ixheaace_common_rom.h" |
30 | | #include "ixheaace_sbr_hbe.h" |
31 | | #include "ixheaace_sbr_qmf_enc.h" |
32 | | #include "ixheaace_sbr_hybrid.h" |
33 | | |
34 | | #include "ixheaace_aac_constants.h" |
35 | | #include "ixheaac_basic_ops32.h" |
36 | | #include "ixheaac_basic_ops16.h" |
37 | | #include "ixheaac_basic_ops40.h" |
38 | | #include "ixheaac_basic_ops.h" |
39 | | |
40 | | #include "ixheaace_psy_const.h" |
41 | | #include "ixheaace_tns.h" |
42 | | #include "ixheaace_tns_params.h" |
43 | | #include "ixheaace_rom.h" |
44 | | #include "ixheaace_fft.h" |
45 | | |
46 | 205M | static VOID ia_enhaacplus_enc_fct3_4(FLOAT32 *ptr_x) { |
47 | 205M | FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2; |
48 | | |
49 | 205M | xp2 = ptr_x[1]; |
50 | 205M | xp = ptr_x[0]; |
51 | | |
52 | 205M | xp2 = xp2 * IXHEAACE_COS_PI_BY_4; |
53 | | |
54 | 205M | tmp00 = xp + xp2; |
55 | 205M | tmp01 = xp - xp2; |
56 | | |
57 | 205M | xp = ptr_x[2]; |
58 | 205M | xp2 = ptr_x[3]; |
59 | | |
60 | 205M | tmp10 = (xp * IXHEAACE_COS_PI_BY_8) + (xp2 * IXHEAACE_SIN_PI_BY_8); |
61 | | |
62 | 205M | ptr_x[0] = tmp00 + tmp10; |
63 | 205M | ptr_x[3] = tmp00 - tmp10; |
64 | | |
65 | 205M | tmp11 = (xp * IXHEAACE_SIN_PI_BY_8) - (xp2 * IXHEAACE_COS_PI_BY_8); |
66 | | |
67 | 205M | ptr_x[1] = tmp01 + tmp11; |
68 | 205M | ptr_x[2] = tmp01 - tmp11; |
69 | 205M | } |
70 | | |
71 | 171M | static VOID ia_enhaacplus_enc_fst3_4r(FLOAT32 *ptr_x) { |
72 | 171M | FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2; |
73 | | |
74 | 171M | xp2 = ptr_x[2]; |
75 | 171M | xp = ptr_x[3]; |
76 | | |
77 | 171M | xp2 = xp2 * IXHEAACE_COS_PI_BY_4; |
78 | | |
79 | 171M | tmp00 = xp + xp2; |
80 | 171M | tmp01 = xp - xp2; |
81 | | |
82 | 171M | xp = ptr_x[1]; |
83 | 171M | xp2 = ptr_x[0]; |
84 | | |
85 | 171M | tmp10 = (xp * IXHEAACE_COS_PI_BY_8) + (xp2 * IXHEAACE_SIN_PI_BY_8); |
86 | | |
87 | 171M | ptr_x[3] = tmp00 + tmp10; |
88 | 171M | ptr_x[0] = tmp10 - tmp00; |
89 | | |
90 | 171M | tmp11 = (xp2 * IXHEAACE_COS_PI_BY_8) - (xp * IXHEAACE_SIN_PI_BY_8); |
91 | | |
92 | 171M | ptr_x[2] = tmp11 - tmp01; |
93 | 171M | ptr_x[1] = tmp11 + tmp01; |
94 | 171M | } |
95 | | |
96 | 102M | static VOID ia_enhaacplus_enc_fct4_4r(FLOAT32 *ptr_x) { |
97 | 102M | FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2; |
98 | | |
99 | 102M | xp = ptr_x[1]; |
100 | 102M | xp2 = ptr_x[0]; |
101 | | |
102 | 102M | xp = xp * IXHEAACE_COS_PI_BY_4; |
103 | 102M | tmp00 = xp2 + xp; |
104 | 102M | tmp01 = xp2 - xp; |
105 | | |
106 | 102M | xp = ptr_x[2]; |
107 | 102M | xp2 = ptr_x[3]; |
108 | | |
109 | 102M | xp = xp * IXHEAACE_COS_PI_BY_4; |
110 | 102M | tmp11 = xp2 - xp; |
111 | 102M | tmp10 = xp2 + xp; |
112 | | |
113 | 102M | ptr_x[3] = tmp00 * IXHEAACE_COS_PI_BY_16 + tmp10 * IXHEAACE_SIN_PI_BY_16; |
114 | 102M | ptr_x[0] = tmp00 * IXHEAACE_SIN_PI_BY_16 - tmp10 * IXHEAACE_COS_PI_BY_16; |
115 | | |
116 | 102M | ptr_x[2] = tmp01 * IXHEAACE_COS_3_PI_BY_16 - tmp11 * IXHEAACE_SIN_3_PI_BY_16; |
117 | 102M | ptr_x[1] = tmp01 * IXHEAACE_SIN_3_PI_BY_16 + tmp11 * IXHEAACE_COS_3_PI_BY_16; |
118 | 102M | } |
119 | | |
120 | 68.4M | static VOID ia_enhaacplus_enc_fst4_4(FLOAT32 *ptr_x) { |
121 | 68.4M | FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2; |
122 | | |
123 | 68.4M | xp = ptr_x[1]; |
124 | 68.4M | xp2 = ptr_x[0]; |
125 | | |
126 | 68.4M | xp = xp * IXHEAACE_COS_PI_BY_4; |
127 | 68.4M | tmp10 = xp2 + xp; |
128 | 68.4M | tmp11 = xp2 - xp; |
129 | | |
130 | 68.4M | xp = ptr_x[2]; |
131 | 68.4M | xp2 = ptr_x[3]; |
132 | | |
133 | 68.4M | xp = xp * IXHEAACE_COS_PI_BY_4; |
134 | 68.4M | tmp01 = xp2 - xp; |
135 | 68.4M | tmp00 = xp2 + xp; |
136 | | |
137 | 68.4M | ptr_x[0] = tmp00 * IXHEAACE_COS_PI_BY_16 + tmp10 * IXHEAACE_SIN_PI_BY_16; |
138 | 68.4M | ptr_x[3] = tmp10 * IXHEAACE_COS_PI_BY_16 - tmp00 * IXHEAACE_SIN_PI_BY_16; |
139 | 68.4M | ptr_x[1] = tmp11 * IXHEAACE_SIN_3_PI_BY_16 - tmp01 * IXHEAACE_COS_3_PI_BY_16; |
140 | 68.4M | ptr_x[2] = tmp01 * IXHEAACE_SIN_3_PI_BY_16 + tmp11 * IXHEAACE_COS_3_PI_BY_16; |
141 | 68.4M | } |
142 | | |
143 | 34.2M | static VOID ia_enhaacplus_enc_fct3_64(FLOAT32 *ptr_a, ixheaace_str_qmf_tabs *pstr_qmf_tab) { |
144 | 34.2M | WORD32 k; |
145 | | |
146 | 34.2M | const FLOAT32 *ptr_t1; |
147 | 34.2M | FLOAT32 xp, xp2, xp3, xp4, wc, ws; |
148 | | |
149 | 34.2M | FLOAT32 *ptr1, *ptr2; |
150 | 34.2M | FLOAT32 *ptr_ap, *ptr_an; |
151 | | |
152 | | /* bit reversal */ |
153 | 34.2M | xp = ptr_a[1]; |
154 | 34.2M | ptr_a[1] = ptr_a[32]; |
155 | 34.2M | ptr_a[32] = xp; |
156 | 34.2M | xp = ptr_a[2]; |
157 | 34.2M | ptr_a[2] = ptr_a[16]; |
158 | 34.2M | ptr_a[16] = xp; |
159 | 34.2M | xp = ptr_a[3]; |
160 | 34.2M | ptr_a[3] = ptr_a[48]; |
161 | 34.2M | ptr_a[48] = xp; |
162 | 34.2M | xp = ptr_a[4]; |
163 | 34.2M | ptr_a[4] = ptr_a[8]; |
164 | 34.2M | ptr_a[8] = xp; |
165 | 34.2M | xp = ptr_a[5]; |
166 | 34.2M | ptr_a[5] = ptr_a[40]; |
167 | 34.2M | ptr_a[40] = xp; |
168 | 34.2M | xp = ptr_a[6]; |
169 | 34.2M | ptr_a[6] = ptr_a[24]; |
170 | 34.2M | ptr_a[24] = xp; |
171 | 34.2M | xp = ptr_a[7]; |
172 | 34.2M | ptr_a[7] = ptr_a[56]; |
173 | 34.2M | ptr_a[56] = xp; |
174 | 34.2M | xp = ptr_a[9]; |
175 | 34.2M | ptr_a[9] = ptr_a[36]; |
176 | 34.2M | ptr_a[36] = xp; |
177 | 34.2M | xp = ptr_a[10]; |
178 | 34.2M | ptr_a[10] = ptr_a[20]; |
179 | 34.2M | ptr_a[20] = xp; |
180 | 34.2M | xp = ptr_a[11]; |
181 | 34.2M | ptr_a[11] = ptr_a[52]; |
182 | 34.2M | ptr_a[52] = xp; |
183 | 34.2M | xp = ptr_a[13]; |
184 | 34.2M | ptr_a[13] = ptr_a[44]; |
185 | 34.2M | ptr_a[44] = xp; |
186 | 34.2M | xp = ptr_a[14]; |
187 | 34.2M | ptr_a[14] = ptr_a[28]; |
188 | 34.2M | ptr_a[28] = xp; |
189 | 34.2M | xp = ptr_a[15]; |
190 | 34.2M | ptr_a[15] = ptr_a[60]; |
191 | 34.2M | ptr_a[60] = xp; |
192 | 34.2M | xp = ptr_a[17]; |
193 | 34.2M | ptr_a[17] = ptr_a[34]; |
194 | 34.2M | ptr_a[34] = xp; |
195 | 34.2M | xp = ptr_a[19]; |
196 | 34.2M | ptr_a[19] = ptr_a[50]; |
197 | 34.2M | ptr_a[50] = xp; |
198 | 34.2M | xp = ptr_a[21]; |
199 | 34.2M | ptr_a[21] = ptr_a[42]; |
200 | 34.2M | ptr_a[42] = xp; |
201 | 34.2M | xp = ptr_a[22]; |
202 | 34.2M | ptr_a[22] = ptr_a[26]; |
203 | 34.2M | ptr_a[26] = xp; |
204 | 34.2M | xp = ptr_a[23]; |
205 | 34.2M | ptr_a[23] = ptr_a[58]; |
206 | 34.2M | ptr_a[58] = xp; |
207 | 34.2M | xp = ptr_a[25]; |
208 | 34.2M | ptr_a[25] = ptr_a[38]; |
209 | 34.2M | ptr_a[38] = xp; |
210 | 34.2M | xp = ptr_a[27]; |
211 | 34.2M | ptr_a[27] = ptr_a[54]; |
212 | 34.2M | ptr_a[54] = xp; |
213 | 34.2M | xp = ptr_a[29]; |
214 | 34.2M | ptr_a[29] = ptr_a[46]; |
215 | 34.2M | ptr_a[46] = xp; |
216 | 34.2M | xp = ptr_a[31]; |
217 | 34.2M | ptr_a[31] = ptr_a[62]; |
218 | 34.2M | ptr_a[62] = xp; |
219 | 34.2M | xp = ptr_a[35]; |
220 | 34.2M | ptr_a[35] = ptr_a[49]; |
221 | 34.2M | ptr_a[49] = xp; |
222 | 34.2M | xp = ptr_a[37]; |
223 | 34.2M | ptr_a[37] = ptr_a[41]; |
224 | 34.2M | ptr_a[41] = xp; |
225 | 34.2M | xp = ptr_a[39]; |
226 | 34.2M | ptr_a[39] = ptr_a[57]; |
227 | 34.2M | ptr_a[57] = xp; |
228 | 34.2M | xp = ptr_a[43]; |
229 | 34.2M | ptr_a[43] = ptr_a[53]; |
230 | 34.2M | ptr_a[53] = xp; |
231 | 34.2M | xp = ptr_a[47]; |
232 | 34.2M | ptr_a[47] = ptr_a[61]; |
233 | 34.2M | ptr_a[61] = xp; |
234 | 34.2M | xp = ptr_a[55]; |
235 | 34.2M | ptr_a[55] = ptr_a[59]; |
236 | 34.2M | ptr_a[59] = xp; |
237 | | |
238 | 34.2M | xp = ptr_a[33]; |
239 | 34.2M | xp2 = ptr_a[62]; |
240 | 34.2M | ptr_a[62] = xp2 - xp; |
241 | 34.2M | ptr_a[33] = xp2 + xp; |
242 | 34.2M | xp = ptr_a[34]; |
243 | 34.2M | xp2 = ptr_a[60]; |
244 | 34.2M | ptr_a[60] = xp2 - xp; |
245 | 34.2M | ptr_a[34] = xp2 + xp; |
246 | 34.2M | xp = ptr_a[35]; |
247 | 34.2M | xp2 = ptr_a[61]; |
248 | 34.2M | ptr_a[61] = xp2 - xp; |
249 | 34.2M | ptr_a[35] = xp2 + xp; |
250 | 34.2M | xp = ptr_a[36]; |
251 | 34.2M | xp2 = ptr_a[56]; |
252 | 34.2M | ptr_a[56] = xp2 - xp; |
253 | 34.2M | ptr_a[36] = xp2 + xp; |
254 | 34.2M | xp = ptr_a[37]; |
255 | 34.2M | xp2 = ptr_a[57]; |
256 | 34.2M | ptr_a[57] = xp2 - xp; |
257 | 34.2M | ptr_a[37] = xp2 + xp; |
258 | 34.2M | xp = ptr_a[38]; |
259 | 34.2M | xp2 = ptr_a[58]; |
260 | 34.2M | ptr_a[58] = xp2 - xp; |
261 | 34.2M | ptr_a[38] = xp2 + xp; |
262 | 34.2M | xp = ptr_a[39]; |
263 | 34.2M | xp2 = ptr_a[59]; |
264 | 34.2M | ptr_a[59] = xp2 - xp; |
265 | 34.2M | ptr_a[39] = xp2 + xp; |
266 | 34.2M | xp = ptr_a[40]; |
267 | 34.2M | xp2 = ptr_a[48]; |
268 | 34.2M | ptr_a[48] = xp2 - xp; |
269 | 34.2M | ptr_a[40] = xp2 + xp; |
270 | 34.2M | xp = ptr_a[41]; |
271 | 34.2M | xp2 = ptr_a[49]; |
272 | 34.2M | ptr_a[49] = xp2 - xp; |
273 | 34.2M | ptr_a[41] = xp2 + xp; |
274 | 34.2M | xp = ptr_a[42]; |
275 | 34.2M | xp2 = ptr_a[50]; |
276 | 34.2M | ptr_a[50] = xp2 - xp; |
277 | 34.2M | ptr_a[42] = xp2 + xp; |
278 | 34.2M | xp = ptr_a[43]; |
279 | 34.2M | xp2 = ptr_a[51]; |
280 | 34.2M | ptr_a[51] = xp2 - xp; |
281 | 34.2M | ptr_a[43] = xp2 + xp; |
282 | 34.2M | xp = ptr_a[44]; |
283 | 34.2M | xp2 = ptr_a[52]; |
284 | 34.2M | ptr_a[52] = xp2 - xp; |
285 | 34.2M | ptr_a[44] = xp2 + xp; |
286 | 34.2M | xp = ptr_a[45]; |
287 | 34.2M | xp2 = ptr_a[53]; |
288 | 34.2M | ptr_a[53] = xp2 - xp; |
289 | 34.2M | ptr_a[45] = xp2 + xp; |
290 | 34.2M | xp = ptr_a[46]; |
291 | 34.2M | xp2 = ptr_a[54]; |
292 | 34.2M | ptr_a[54] = xp2 - xp; |
293 | 34.2M | ptr_a[46] = xp2 + xp; |
294 | 34.2M | xp = ptr_a[47]; |
295 | 34.2M | xp2 = ptr_a[55]; |
296 | 34.2M | ptr_a[55] = xp2 - xp; |
297 | 34.2M | ptr_a[47] = xp2 + xp; |
298 | 34.2M | xp = ptr_a[17]; |
299 | 34.2M | xp2 = ptr_a[30]; |
300 | 34.2M | ptr_a[30] = xp2 - xp; |
301 | 34.2M | ptr_a[17] = xp2 + xp; |
302 | 34.2M | xp = ptr_a[18]; |
303 | 34.2M | xp2 = ptr_a[28]; |
304 | 34.2M | ptr_a[28] = xp2 - xp; |
305 | 34.2M | ptr_a[18] = xp2 + xp; |
306 | 34.2M | xp = ptr_a[19]; |
307 | 34.2M | xp2 = ptr_a[29]; |
308 | 34.2M | ptr_a[29] = xp2 - xp; |
309 | 34.2M | ptr_a[19] = xp2 + xp; |
310 | 34.2M | xp = ptr_a[20]; |
311 | 34.2M | xp2 = ptr_a[24]; |
312 | 34.2M | ptr_a[24] = xp2 - xp; |
313 | 34.2M | ptr_a[20] = xp2 + xp; |
314 | 34.2M | xp = ptr_a[21]; |
315 | 34.2M | xp2 = ptr_a[25]; |
316 | 34.2M | ptr_a[25] = xp2 - xp; |
317 | 34.2M | ptr_a[21] = xp2 + xp; |
318 | 34.2M | xp = ptr_a[22]; |
319 | 34.2M | xp2 = ptr_a[26]; |
320 | 34.2M | ptr_a[26] = xp2 - xp; |
321 | 34.2M | ptr_a[22] = xp2 + xp; |
322 | 34.2M | xp = ptr_a[23]; |
323 | 34.2M | xp2 = ptr_a[27]; |
324 | 34.2M | ptr_a[27] = xp2 - xp; |
325 | 34.2M | ptr_a[23] = xp2 + xp; |
326 | 34.2M | xp = ptr_a[9]; |
327 | 34.2M | xp2 = ptr_a[14]; |
328 | 34.2M | ptr_a[14] = xp2 - xp; |
329 | 34.2M | ptr_a[9] = xp2 + xp; |
330 | 34.2M | xp = ptr_a[10]; |
331 | 34.2M | xp2 = ptr_a[12]; |
332 | 34.2M | ptr_a[12] = xp2 - xp; |
333 | 34.2M | ptr_a[10] = xp2 + xp; |
334 | 34.2M | xp = ptr_a[11]; |
335 | 34.2M | xp2 = ptr_a[13]; |
336 | 34.2M | ptr_a[13] = xp2 - xp; |
337 | 34.2M | ptr_a[11] = xp2 + xp; |
338 | 34.2M | xp = ptr_a[41]; |
339 | 34.2M | xp2 = ptr_a[46]; |
340 | 34.2M | ptr_a[46] = xp2 - xp; |
341 | 34.2M | ptr_a[41] = xp2 + xp; |
342 | 34.2M | xp = ptr_a[42]; |
343 | 34.2M | xp2 = ptr_a[44]; |
344 | 34.2M | ptr_a[44] = xp2 - xp; |
345 | 34.2M | ptr_a[42] = xp2 + xp; |
346 | 34.2M | xp = ptr_a[43]; |
347 | 34.2M | xp2 = ptr_a[45]; |
348 | 34.2M | ptr_a[45] = xp2 - xp; |
349 | 34.2M | ptr_a[43] = xp2 + xp; |
350 | 34.2M | xp = ptr_a[49]; |
351 | 34.2M | xp2 = ptr_a[54]; |
352 | 34.2M | ptr_a[49] = xp - xp2; |
353 | 34.2M | ptr_a[54] = xp2 + xp; |
354 | 34.2M | xp = ptr_a[50]; |
355 | 34.2M | xp2 = ptr_a[52]; |
356 | 34.2M | ptr_a[50] = xp - xp2; |
357 | 34.2M | ptr_a[52] = xp2 + xp; |
358 | 34.2M | xp = ptr_a[51]; |
359 | 34.2M | xp2 = ptr_a[53]; |
360 | 34.2M | ptr_a[51] = xp - xp2; |
361 | 34.2M | ptr_a[53] = xp2 + xp; |
362 | 34.2M | xp = ptr_a[5]; |
363 | 34.2M | xp2 = ptr_a[6]; |
364 | 34.2M | ptr_a[6] = xp2 - xp; |
365 | 34.2M | ptr_a[5] = xp2 + xp; |
366 | 34.2M | xp = ptr_a[21]; |
367 | 34.2M | xp2 = ptr_a[22]; |
368 | 34.2M | ptr_a[22] = xp2 - xp; |
369 | 34.2M | ptr_a[21] = xp2 + xp; |
370 | 34.2M | xp = ptr_a[25]; |
371 | 34.2M | xp2 = ptr_a[26]; |
372 | 34.2M | ptr_a[25] = xp - xp2; |
373 | 34.2M | ptr_a[26] = xp2 + xp; |
374 | 34.2M | xp = ptr_a[37]; |
375 | 34.2M | xp2 = ptr_a[38]; |
376 | 34.2M | ptr_a[38] = xp2 - xp; |
377 | 34.2M | ptr_a[37] = xp2 + xp; |
378 | 34.2M | xp = ptr_a[57]; |
379 | 34.2M | xp2 = ptr_a[58]; |
380 | 34.2M | ptr_a[57] = xp - xp2; |
381 | 34.2M | ptr_a[58] = xp2 + xp; |
382 | | |
383 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a); |
384 | 34.2M | ia_enhaacplus_enc_fct4_4r(ptr_a + 4); |
385 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a + 8); |
386 | 34.2M | ia_enhaacplus_enc_fst3_4r(ptr_a + 12); |
387 | | |
388 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a + 16); |
389 | 34.2M | ia_enhaacplus_enc_fct4_4r(ptr_a + 20); |
390 | 34.2M | ia_enhaacplus_enc_fst4_4(ptr_a + 24); |
391 | 34.2M | ia_enhaacplus_enc_fst3_4r(ptr_a + 28); |
392 | | |
393 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a + 32); |
394 | 34.2M | ia_enhaacplus_enc_fct4_4r(ptr_a + 36); |
395 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a + 40); |
396 | 34.2M | ia_enhaacplus_enc_fst3_4r(ptr_a + 44); |
397 | | |
398 | 34.2M | ia_enhaacplus_enc_fct3_4(ptr_a + 48); |
399 | 34.2M | ia_enhaacplus_enc_fst3_4r(ptr_a + 52); |
400 | 34.2M | ia_enhaacplus_enc_fst4_4(ptr_a + 56); |
401 | 34.2M | ia_enhaacplus_enc_fst3_4r(ptr_a + 60); |
402 | | |
403 | 34.2M | ptr_ap = ptr_a; |
404 | 34.2M | ptr_an = ptr_a + 7; |
405 | 171M | for (k = 4; k != 0; k--) { |
406 | 136M | xp = *ptr_ap++; |
407 | 136M | xp2 = *ptr_an--; |
408 | 136M | xp3 = *(ptr_ap + 15); |
409 | 136M | xp4 = *(ptr_an + 17); |
410 | 136M | *(ptr_an + 1) = xp - xp2; |
411 | 136M | *(ptr_ap - 1) = xp + xp2; |
412 | | |
413 | 136M | xp = *(ptr_ap + 23); |
414 | 136M | xp2 = *(ptr_an + 25); |
415 | 136M | *(ptr_an + 17) = xp3 - xp4; |
416 | 136M | *(ptr_ap + 15) = xp3 + xp4; |
417 | | |
418 | 136M | xp3 = *(ptr_ap + 31); |
419 | 136M | xp4 = *(ptr_an + 33); |
420 | 136M | *(ptr_ap + 23) = xp - xp2; |
421 | 136M | *(ptr_an + 25) = xp + xp2; |
422 | | |
423 | 136M | xp = *(ptr_ap + 55); |
424 | 136M | xp2 = *(ptr_an + 57); |
425 | 136M | *(ptr_an + 33) = xp3 - xp4; |
426 | 136M | *(ptr_ap + 31) = xp3 + xp4; |
427 | | |
428 | 136M | *(ptr_ap + 55) = xp - xp2; |
429 | 136M | *(ptr_an + 57) = xp + xp2; |
430 | 136M | } |
431 | | |
432 | 34.2M | ptr_t1 = pstr_qmf_tab->cos_sin_fct4_8; |
433 | | |
434 | 34.2M | ptr_ap = ptr_a + 8; |
435 | 34.2M | ptr_an = ptr_a + 15; |
436 | 171M | for (k = 4; k != 0; k--) { |
437 | 136M | wc = *ptr_t1++; |
438 | 136M | ws = *ptr_t1++; |
439 | | |
440 | 136M | xp = *ptr_ap * wc + *ptr_an * ws; |
441 | 136M | *ptr_ap = *ptr_ap * ws - *ptr_an * wc; |
442 | 136M | ptr_ap++; |
443 | 136M | *ptr_an-- = xp; |
444 | | |
445 | 136M | xp = *(ptr_ap + 31) * wc + *(ptr_an + 33) * ws; |
446 | 136M | *(ptr_ap + 31) = *(ptr_ap + 31) * ws - *(ptr_an + 33) * wc; |
447 | 136M | *(ptr_an + 33) = xp; |
448 | | |
449 | 136M | xp = *(ptr_ap + 39) * ws + *(ptr_an + 41) * wc; |
450 | 136M | *(ptr_an + 41) = *(ptr_ap + 39) * wc - *(ptr_an + 41) * ws; |
451 | 136M | *(ptr_ap + 39) = xp; |
452 | 136M | } |
453 | | |
454 | 34.2M | ptr_ap = ptr_a; |
455 | 34.2M | ptr_an = ptr_a + 15; |
456 | 308M | for (k = 8; k != 0; k--) { |
457 | 273M | xp = *ptr_ap++; |
458 | 273M | xp2 = *ptr_an--; |
459 | 273M | xp3 = *(ptr_ap + 31); |
460 | 273M | xp4 = *(ptr_an + 33); |
461 | | |
462 | 273M | *(ptr_an + 1) = xp - xp2; |
463 | 273M | *(ptr_ap - 1) = xp + xp2; |
464 | | |
465 | 273M | xp = *(ptr_ap + 47); |
466 | 273M | xp2 = *(ptr_an + 49); |
467 | 273M | *(ptr_an + 33) = xp3 - xp4; |
468 | 273M | *(ptr_ap + 31) = xp3 + xp4; |
469 | 273M | *(ptr_ap + 47) = xp - xp2; |
470 | 273M | *(ptr_an + 49) = xp + xp2; |
471 | 273M | } |
472 | | |
473 | 34.2M | ptr_t1 = pstr_qmf_tab->cos_sin_fct4_16; |
474 | | |
475 | 34.2M | ptr1 = &ptr_a[16]; |
476 | 34.2M | ptr2 = &ptr_a[31]; |
477 | 308M | for (k = 7; k >= 0; k--) { |
478 | 273M | wc = *ptr_t1++; |
479 | 273M | ws = *ptr_t1++; |
480 | | |
481 | 273M | xp = *ptr1; |
482 | 273M | xp2 = *ptr2; |
483 | | |
484 | 273M | *ptr2-- = xp * wc + xp2 * ws; |
485 | 273M | *ptr1++ = xp * ws - xp2 * wc; |
486 | 273M | } |
487 | | |
488 | 34.2M | ptr1 = &ptr_a[0]; |
489 | 34.2M | ptr2 = &ptr_a[31]; |
490 | 582M | for (k = 15; k >= 0; k--) { |
491 | 547M | xp = *ptr1; |
492 | 547M | xp2 = *ptr2; |
493 | | |
494 | 547M | *ptr1++ = xp + xp2; |
495 | 547M | *ptr2-- = xp - xp2; |
496 | 547M | } |
497 | | |
498 | 34.2M | ptr_t1 = pstr_qmf_tab->cos_sin_fct4_32; |
499 | 34.2M | ptr1 = &ptr_a[32]; |
500 | 34.2M | ptr2 = &ptr_a[63]; |
501 | | |
502 | 582M | for (k = 15; k >= 0; k--) { |
503 | 547M | wc = *ptr_t1++; |
504 | 547M | ws = *ptr_t1++; |
505 | | |
506 | 547M | xp = *ptr1; |
507 | 547M | xp2 = *ptr2; |
508 | | |
509 | 547M | *ptr2-- = xp * wc + xp2 * ws; |
510 | 547M | *ptr1++ = xp * ws - xp2 * wc; |
511 | 547M | } |
512 | | |
513 | 34.2M | ptr1 = &ptr_a[0]; |
514 | 34.2M | ptr2 = &ptr_a[63]; |
515 | 1.13G | for (k = 31; k >= 0; k--) { |
516 | 1.09G | xp = *ptr1; |
517 | 1.09G | xp2 = *ptr2; |
518 | | |
519 | 1.09G | *ptr1++ = xp + xp2; |
520 | 1.09G | *ptr2-- = xp - xp2; |
521 | 1.09G | } |
522 | 34.2M | } |
523 | | |
524 | 17.1M | static VOID ia_enhaacplus_enc_fst3_64(FLOAT32 *ptr_a, ixheaace_str_qmf_tabs *pstr_qmf_tab) { |
525 | 17.1M | WORD32 k; |
526 | 17.1M | FLOAT32 xp, xp2; |
527 | 17.1M | FLOAT32 *ptr1, *ptr2; |
528 | | |
529 | 17.1M | ptr1 = &ptr_a[0]; |
530 | 17.1M | ptr2 = &ptr_a[63]; |
531 | | |
532 | 565M | for (k = 31; k >= 0; k--) { |
533 | 547M | xp = *ptr1; |
534 | 547M | xp2 = *ptr2; |
535 | 547M | *ptr2-- = xp; |
536 | 547M | *ptr1++ = xp2; |
537 | 547M | } |
538 | | |
539 | 17.1M | ia_enhaacplus_enc_fct3_64(ptr_a, pstr_qmf_tab); |
540 | | |
541 | 17.1M | ptr1 = &ptr_a[1]; |
542 | | |
543 | 291M | for (k = 15; k >= 0; k--) { |
544 | 273M | xp = *ptr1; |
545 | 273M | xp2 = *(ptr1 + 2); |
546 | 273M | *ptr1++ = -xp; |
547 | 273M | ptr1++; |
548 | 273M | *ptr1++ = -xp2; |
549 | 273M | ptr1++; |
550 | 273M | } |
551 | 17.1M | } |
552 | | |
553 | 2.21M | static VOID ixheaace_sbr_pre_mdct(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_sine_window) { |
554 | 2.21M | WORD32 i; |
555 | 2.21M | FLOAT32 wre, wim, re1, re2, im1, im2; |
556 | | |
557 | 37.5M | for (i = 0; i < len / 4; i++) { |
558 | 35.3M | re1 = ptr_x[2 * i]; |
559 | 35.3M | re2 = ptr_x[2 * i + 1]; |
560 | 35.3M | im2 = ptr_x[len - 2 - 2 * i]; |
561 | 35.3M | im1 = ptr_x[len - 1 - 2 * i]; |
562 | | |
563 | 35.3M | wim = ptr_sine_window[2 * i]; |
564 | 35.3M | wre = ptr_sine_window[len - 1 - 2 * i]; |
565 | | |
566 | 35.3M | ptr_x[2 * i] = im1 * wim + re1 * wre; |
567 | | |
568 | 35.3M | ptr_x[2 * i + 1] = im1 * wre - re1 * wim; |
569 | | |
570 | 35.3M | wre = ptr_sine_window[len - 2 - 2 * i]; |
571 | 35.3M | wim = ptr_sine_window[2 * i + 1]; |
572 | | |
573 | 35.3M | ptr_x[len - 2 - 2 * i] = im2 * wim + re2 * wre; |
574 | | |
575 | 35.3M | ptr_x[len - 1 - 2 * i] = -(im2 * wre - re2 * wim); |
576 | 35.3M | } |
577 | 2.21M | } |
578 | 2.21M | static VOID ixheaace_sbr_pre_mdst(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_sine_window) { |
579 | 2.21M | WORD32 i; |
580 | 2.21M | FLOAT32 wre, wim, re1, re2, im1, im2; |
581 | | |
582 | 37.5M | for (i = 0; i < len / 4; i++) { |
583 | 35.3M | re1 = -ptr_x[2 * i]; |
584 | 35.3M | re2 = ptr_x[2 * i + 1]; |
585 | 35.3M | im2 = -ptr_x[len - 2 - 2 * i]; |
586 | 35.3M | im1 = ptr_x[len - 1 - 2 * i]; |
587 | | |
588 | 35.3M | wim = ptr_sine_window[2 * i]; |
589 | 35.3M | wre = ptr_sine_window[len - 1 - 2 * i]; |
590 | | |
591 | 35.3M | ptr_x[2 * i] = im1 * wim + re1 * wre; |
592 | | |
593 | 35.3M | ptr_x[2 * i + 1] = im1 * wre - re1 * wim; |
594 | | |
595 | 35.3M | wim = ptr_sine_window[2 * i + 1]; |
596 | 35.3M | wre = ptr_sine_window[len - 2 - 2 * i]; |
597 | | |
598 | 35.3M | ptr_x[len - 2 - 2 * i] = im2 * wim + re2 * wre; |
599 | | |
600 | 35.3M | ptr_x[len - 1 - 2 * i] = -(im2 * wre - re2 * wim); |
601 | 35.3M | } |
602 | 2.21M | } |
603 | 2.21M | static VOID ixheaace_sbr_post_mdct(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_trig_data) { |
604 | 2.21M | WORD32 i; |
605 | 2.21M | FLOAT32 wre, wim, re1, re2, im1, im2; |
606 | | |
607 | 2.21M | FLOAT32 temp1 = -ptr_x[1]; |
608 | 2.21M | FLOAT32 temp2 = ptr_x[len / 2]; |
609 | 2.21M | FLOAT32 temp3 = ptr_x[len / 2 + 1]; |
610 | 2.21M | FLOAT32 val = 0.70709228515625f; |
611 | | |
612 | 2.21M | re2 = ptr_x[len - 2]; |
613 | 2.21M | im2 = ptr_x[len - 1]; |
614 | 35.3M | for (i = 1; i < len / 4; i++) { |
615 | 33.1M | wim = ptr_trig_data[i]; |
616 | 33.1M | wre = ptr_trig_data[len / 2 - 1 - i]; |
617 | | |
618 | 33.1M | ptr_x[2 * i - 1] = (re2 * wre - im2 * wim); |
619 | 33.1M | ptr_x[len - 2 * i] = (re2 * wim + im2 * wre); |
620 | | |
621 | 33.1M | re1 = ptr_x[2 * i]; |
622 | 33.1M | im1 = ptr_x[2 * i + 1]; |
623 | 33.1M | re2 = ptr_x[len - 2 - 2 * i]; |
624 | 33.1M | im2 = ptr_x[len - 1 - 2 * i]; |
625 | | |
626 | 33.1M | ptr_x[2 * i] = (re1 * wre + im1 * wim); |
627 | 33.1M | ptr_x[len - 1 - 2 * i] = (re1 * wim - im1 * wre); |
628 | 33.1M | } |
629 | | |
630 | 2.21M | ptr_x[len / 2 - 1] = (temp2 - temp3) * val; |
631 | 2.21M | ptr_x[len / 2] = (temp2 + temp3) * val; |
632 | 2.21M | ptr_x[len - 1] = temp1; |
633 | 2.21M | } |
634 | 2.21M | static VOID ixheaace_sbr_post_mdst(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_trig_data) { |
635 | 2.21M | WORD32 i; |
636 | 2.21M | FLOAT32 wre, wim, re1, re2, im1, im2; |
637 | 2.21M | FLOAT32 temp0 = -ptr_x[0]; |
638 | 2.21M | FLOAT32 temp1 = ptr_x[1]; |
639 | 2.21M | FLOAT32 temp2 = ptr_x[len / 2]; |
640 | 2.21M | FLOAT32 temp3 = ptr_x[len / 2 + 1]; |
641 | 2.21M | FLOAT32 val = 0.70709228515625f; |
642 | | |
643 | 2.21M | re2 = ptr_x[len - 2]; |
644 | 2.21M | im2 = ptr_x[len - 1]; |
645 | | |
646 | 35.3M | for (i = 1; i < len / 4; i++) { |
647 | 33.1M | wim = ptr_trig_data[i]; |
648 | 33.1M | wre = ptr_trig_data[len / 2 - 1 - i]; |
649 | | |
650 | 33.1M | ptr_x[2 * i - 1] = -(re2 * wim + im2 * wre); |
651 | 33.1M | ptr_x[len - 2 * i] = -(re2 * wre - im2 * wim); |
652 | | |
653 | 33.1M | re1 = ptr_x[2 * i]; |
654 | 33.1M | im1 = ptr_x[2 * i + 1]; |
655 | 33.1M | re2 = ptr_x[len - 2 - 2 * i]; |
656 | 33.1M | im2 = ptr_x[len - 1 - 2 * i]; |
657 | | |
658 | 33.1M | ptr_x[len - 1 - 2 * i] = -(re1 * wre + im1 * wim); |
659 | 33.1M | ptr_x[2 * i] = -(re1 * wim - im1 * wre); |
660 | 33.1M | } |
661 | | |
662 | 2.21M | ptr_x[len / 2] = (temp3 - temp2) * val; |
663 | 2.21M | ptr_x[len / 2 - 1] = -(temp3 + temp2) * val; |
664 | | |
665 | 2.21M | ptr_x[0] = temp1; |
666 | 2.21M | ptr_x[len - 1] = temp0; |
667 | 2.21M | } |
668 | 2.21M | static VOID ixheaace_sbr_mdct(FLOAT32 *ptr_dct_data, WORD32 n, FLOAT32 *ptr_sbr_scratch) { |
669 | 2.21M | ixheaace_sbr_pre_mdct(ptr_dct_data, n, &long_window_sine_ld_64[0]); |
670 | | |
671 | 2.21M | ia_enhaacplus_enc_complex_fft_p2(ptr_dct_data, n / 2, ptr_sbr_scratch); |
672 | | |
673 | 2.21M | ixheaace_sbr_post_mdct(ptr_dct_data, n, &fft_twiddle_tab_32[0]); |
674 | 2.21M | } |
675 | | |
676 | 2.21M | static VOID ixheaace_sbr_mdst(FLOAT32 *ptr_dct_data, WORD32 n, FLOAT32 *ptr_sbr_scratch) { |
677 | 2.21M | ixheaace_sbr_pre_mdst(ptr_dct_data, n, &long_window_sine_ld_64[0]); |
678 | | |
679 | 2.21M | ia_enhaacplus_enc_complex_fft_p2(ptr_dct_data, n / 2, ptr_sbr_scratch); |
680 | | |
681 | 2.21M | ixheaace_sbr_post_mdst(ptr_dct_data, n, &fft_twiddle_tab_32[0]); |
682 | 2.21M | } |
683 | | static VOID ia_enhaacplus_enc_forward_modulation(const FLOAT32 *ptr_time_in, |
684 | | FLOAT32 *ptr_r_subband, FLOAT32 *ptr_i_subband, |
685 | | ixheaace_str_qmf_tabs *pstr_qmf_tab, |
686 | 19.3M | WORD32 is_ld_sbr, FLOAT32 *ptr_sbr_scratch) { |
687 | 19.3M | WORD32 i; |
688 | 19.3M | FLOAT32 tmp1, tmp2, tmp3, tmp4; |
689 | 19.3M | const FLOAT32 *ptr_inp1, *ptr_inp2; |
690 | 19.3M | FLOAT32 *ptr_re, *ptr_im; |
691 | 19.3M | FLOAT32 real, imag; |
692 | 19.3M | const FLOAT32 *ptr_window = &sbr_sin_cos_window[0]; |
693 | 19.3M | if (is_ld_sbr) { |
694 | 2.21M | ptr_re = &ptr_r_subband[0]; |
695 | 2.21M | ptr_im = &ptr_i_subband[0]; |
696 | 2.21M | ptr_inp1 = &ptr_time_in[0]; |
697 | 17.1M | } else { |
698 | 17.1M | ptr_r_subband[0] = ptr_time_in[0]; |
699 | 17.1M | ptr_re = &ptr_r_subband[1]; |
700 | 17.1M | ptr_im = &ptr_i_subband[0]; |
701 | 17.1M | ptr_inp1 = &ptr_time_in[1]; |
702 | 17.1M | } |
703 | 19.3M | ptr_inp2 = &ptr_time_in[127]; |
704 | 19.3M | if (is_ld_sbr) { |
705 | 2.21M | i = IXHEAACE_QMF_CHANNELS / 2 - 1; |
706 | 72.9M | while (i >= 0) { |
707 | 70.7M | tmp1 = *ptr_inp1++; |
708 | 70.7M | tmp2 = *ptr_inp2--; |
709 | 70.7M | tmp3 = *ptr_inp1++; |
710 | 70.7M | tmp4 = *ptr_inp2--; |
711 | 70.7M | *ptr_re++ = (tmp1 - tmp2); |
712 | 70.7M | *ptr_im++ = (tmp1 + tmp2); |
713 | 70.7M | *ptr_re++ = (tmp3 - tmp4); |
714 | 70.7M | *ptr_im++ = (tmp3 + tmp4); |
715 | 70.7M | i--; |
716 | 70.7M | } |
717 | | |
718 | 2.21M | ixheaace_sbr_mdct(ptr_r_subband, 64, ptr_sbr_scratch); |
719 | 2.21M | ixheaace_sbr_mdst(ptr_i_subband, 64, ptr_sbr_scratch); |
720 | | |
721 | 2.21M | i = 0; |
722 | 143M | while (i < IXHEAACE_QMF_CHANNELS) { |
723 | 141M | real = ptr_r_subband[i]; |
724 | 141M | imag = ptr_i_subband[i]; |
725 | 141M | ptr_r_subband[i] = |
726 | 141M | imag * ptr_window[i] + real * ptr_window[2 * IXHEAACE_QMF_CHANNELS - 1 - i]; |
727 | 141M | ptr_i_subband[i] = |
728 | 141M | imag * ptr_window[2 * IXHEAACE_QMF_CHANNELS - 1 - i] - real * ptr_window[i]; |
729 | 141M | i++; |
730 | 141M | } |
731 | 17.1M | } else { |
732 | 547M | for (i = 30; i >= 0; i--) { |
733 | 530M | tmp1 = *ptr_inp1++; |
734 | 530M | tmp2 = *ptr_inp2--; |
735 | 530M | tmp3 = *ptr_inp1++; |
736 | | |
737 | 530M | *ptr_re++ = tmp1 - tmp2; |
738 | 530M | tmp4 = *ptr_inp2--; |
739 | 530M | *ptr_im++ = tmp1 + tmp2; |
740 | 530M | *ptr_re++ = tmp3 - tmp4; |
741 | 530M | *ptr_im++ = tmp3 + tmp4; |
742 | 530M | } |
743 | 17.1M | tmp1 = *ptr_inp1; |
744 | 17.1M | tmp2 = *ptr_inp2; |
745 | 17.1M | *ptr_re = tmp1 - tmp2; |
746 | 17.1M | *ptr_im = tmp1 + tmp2; |
747 | | |
748 | 17.1M | ptr_i_subband[63] = ptr_time_in[64]; |
749 | | |
750 | 17.1M | ia_enhaacplus_enc_fct3_64(ptr_r_subband, pstr_qmf_tab); |
751 | | |
752 | 17.1M | ia_enhaacplus_enc_fst3_64(ptr_i_subband, pstr_qmf_tab); |
753 | 17.1M | } |
754 | 19.3M | } |
755 | | |
756 | | static VOID ia_enhaacplus_enc_sbr_qmf_analysis_win_add(const FLOAT32 *ptr_pf_l, |
757 | | const FLOAT32 *ptr_pf_r, FLOAT32 *ptr_fp1, |
758 | | FLOAT32 *ptr_fp2, |
759 | 17.1M | FLOAT32 *ptr_syn_buffer) { |
760 | 17.1M | FLOAT32 accu_l = 0, accu_r = 0; |
761 | 17.1M | WORD k; |
762 | 1.11G | for (k = 0; k < 64; k++) { |
763 | 1.09G | accu_l = 0; |
764 | 1.09G | accu_r = 0; |
765 | | |
766 | 1.09G | { |
767 | 1.09G | accu_l += *ptr_pf_l++ * ptr_fp1[k]; |
768 | 1.09G | accu_l += *ptr_pf_l++ * ptr_fp1[128 + k]; |
769 | 1.09G | accu_l += *ptr_pf_l++ * ptr_fp1[256 + k]; |
770 | 1.09G | accu_l += *ptr_pf_l++ * ptr_fp1[384 + k]; |
771 | 1.09G | accu_l += *ptr_pf_l++ * ptr_fp1[512 + k]; |
772 | | |
773 | 1.09G | accu_r += *--ptr_pf_r * ptr_fp2[k]; |
774 | 1.09G | accu_r += *--ptr_pf_r * ptr_fp2[128 + k]; |
775 | 1.09G | accu_r += *--ptr_pf_r * ptr_fp2[256 + k]; |
776 | 1.09G | accu_r += *--ptr_pf_r * ptr_fp2[384 + k]; |
777 | 1.09G | accu_r += *--ptr_pf_r * ptr_fp2[512 + k]; |
778 | 1.09G | } |
779 | 1.09G | ptr_syn_buffer[127 - k] = accu_l; |
780 | 1.09G | ptr_syn_buffer[63 - k] = accu_r; |
781 | 1.09G | ptr_pf_l += 5; |
782 | 1.09G | ptr_pf_r -= 5; |
783 | 1.09G | } |
784 | 17.1M | } |
785 | | |
786 | | static VOID ia_enhaacplus_enc_sbr_cld_analysis_win_add(FLOAT32 *ptr_filter_states, |
787 | | const FLOAT32 *ptr_coeffs, |
788 | | FLOAT32 *ptr_sync_buffer, |
789 | 2.21M | WORD32 num_qmf_ch, WORD32 time_sn_stride) { |
790 | 2.21M | WORD32 i; |
791 | 2.21M | WORD32 len = num_qmf_ch * time_sn_stride; |
792 | 2.21M | FLOAT32 *ptr_fil_states = &ptr_filter_states[CLD_FILTER_LENGTH - 1]; |
793 | | |
794 | 2.21M | memset(ptr_sync_buffer, 0, len * sizeof(*ptr_sync_buffer)); |
795 | | |
796 | 1.41G | for (i = 0; i < CLD_FILTER_LENGTH; i++) { |
797 | 1.41G | ptr_sync_buffer[i % len] += (*ptr_fil_states-- * ptr_coeffs[i]); |
798 | 1.41G | } |
799 | 2.21M | } |
800 | | VOID ixheaace_sbr_analysis_filtering(const FLOAT32 *ptr_time_in, WORD32 time_sn_stride, |
801 | | FLOAT32 **ptr_ana_r, FLOAT32 **ptr_ana_i, |
802 | | ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank, |
803 | | ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 num_qmf_subsamp, |
804 | | WORD32 is_ld_sbr, FLOAT32 *ptr_sbr_scratch, |
805 | 612k | WORD32 is_ps_960) { |
806 | 612k | WORD32 i, k; |
807 | 612k | const FLOAT32 *ptr_pf_l, *ptr_pf_r; |
808 | 612k | FLOAT32 *ptr_fp1, *ptr_fp2, *ptr_tmp; |
809 | 612k | FLOAT32 syn_buffer[2 * IXHEAACE_QMF_CHANNELS] = {0}; |
810 | 612k | const FLOAT32 *ptr_start_coeff_l; |
811 | 612k | const FLOAT32 *ptr_start_coeff_r; |
812 | 612k | FLOAT32 *ptr_qmf_states_curr_pos; |
813 | 612k | WORD32 start_coeff_cnt = 0; |
814 | 612k | WORD16 flag = 0; |
815 | 612k | WORD32 offset; |
816 | 612k | if (is_ld_sbr) { |
817 | 143k | offset = 576; |
818 | 143k | i = 0; |
819 | 2.35M | while (i < num_qmf_subsamp) { |
820 | 2.21M | ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos; |
821 | | |
822 | 2.21M | if (ptr_time_in) { |
823 | 2.21M | FLOAT32 *ptr_qmf_states = pstr_qmf_bank->ptr_qmf_states_curr_pos + offset; |
824 | | |
825 | 2.21M | const FLOAT32 *ptr_inp = &ptr_time_in[(i * 64 * time_sn_stride)]; |
826 | 2.21M | FLOAT32 tmp1, tmp2, tmp3, tmp4; |
827 | 37.5M | for (k = 15; k >= 0; k--) { |
828 | 35.3M | tmp1 = *ptr_inp; |
829 | 35.3M | ptr_inp += time_sn_stride; |
830 | | |
831 | 35.3M | tmp2 = *ptr_inp; |
832 | 35.3M | ptr_inp += time_sn_stride; |
833 | | |
834 | 35.3M | tmp3 = *ptr_inp; |
835 | 35.3M | ptr_inp += time_sn_stride; |
836 | | |
837 | 35.3M | *ptr_qmf_states++ = tmp1; |
838 | 35.3M | tmp4 = *ptr_inp; |
839 | 35.3M | ptr_inp += time_sn_stride; |
840 | | |
841 | 35.3M | *ptr_qmf_states++ = tmp2; |
842 | 35.3M | *ptr_qmf_states++ = tmp3; |
843 | 35.3M | *ptr_qmf_states++ = tmp4; |
844 | 35.3M | } |
845 | 2.21M | } else { |
846 | 0 | memset(&ptr_qmf_states_curr_pos[0], 0, |
847 | 0 | sizeof(ptr_qmf_states_curr_pos[0]) * IXHEAACE_QMF_CHANNELS); |
848 | 0 | } |
849 | | |
850 | 2.21M | ia_enhaacplus_enc_sbr_cld_analysis_win_add(&ptr_qmf_states_curr_pos[0], |
851 | 2.21M | pstr_qmf_bank->ptr_filter, syn_buffer, |
852 | 2.21M | IXHEAACE_QMF_CHANNELS, time_sn_stride); |
853 | | |
854 | 2.21M | ia_enhaacplus_enc_forward_modulation(syn_buffer, &(ptr_ana_r[i][0]), &(ptr_ana_i[i][0]), |
855 | 2.21M | pstr_qmf_tab, is_ld_sbr, ptr_sbr_scratch); |
856 | | |
857 | 1.27G | for (k = 0; k < offset; k++) { |
858 | 1.27G | pstr_qmf_bank->ptr_qmf_states_curr_pos[k] = |
859 | 1.27G | pstr_qmf_bank->ptr_qmf_states_curr_pos[64 + k]; |
860 | 1.27G | } |
861 | | |
862 | 2.21M | i++; |
863 | 2.21M | } |
864 | 469k | } else { |
865 | 469k | flag = pstr_qmf_bank->flag; |
866 | 469k | ptr_fp1 = pstr_qmf_bank->ptr_qmf_states_buf; |
867 | 469k | ptr_fp2 = pstr_qmf_bank->ptr_qmf_states_buf + 64; |
868 | 469k | pstr_qmf_bank->ptr_qmf_states_curr_pos = |
869 | 469k | ((FLOAT32 *)(pstr_qmf_bank->ptr_qmf_states_buf) + (pstr_qmf_bank->offset * 64)); |
870 | | |
871 | 469k | if (pstr_qmf_bank->offset == 8) { |
872 | 90.8k | pstr_qmf_bank->offset = 0; |
873 | 378k | } else { |
874 | 378k | pstr_qmf_bank->offset += 2; |
875 | 378k | } |
876 | | |
877 | 469k | ptr_start_coeff_l = pstr_qmf_bank->ptr_ref_coeff_l + pstr_qmf_bank->offset_l; |
878 | 469k | ptr_start_coeff_r = pstr_qmf_bank->ptr_ref_coeff_r - pstr_qmf_bank->offset_r; |
879 | | |
880 | 17.5M | for (i = 0; i < num_qmf_subsamp; i++) { |
881 | 17.1M | ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos; |
882 | 17.1M | ptr_tmp = ptr_fp1; |
883 | 17.1M | ptr_fp1 = ptr_fp2; |
884 | 17.1M | ptr_fp2 = ptr_tmp; |
885 | 17.1M | if (((1 == is_ld_sbr) && start_coeff_cnt) || ((0 == is_ld_sbr) && (i % 2))) { |
886 | 8.56M | ptr_start_coeff_l--; |
887 | 8.56M | if (ptr_start_coeff_l == pstr_qmf_bank->ptr_ref_coeff_l) { |
888 | 1.70M | ptr_start_coeff_l += 5; |
889 | 1.70M | } |
890 | 8.56M | } else { |
891 | 8.56M | ptr_start_coeff_r++; |
892 | 8.56M | if (ptr_start_coeff_r == pstr_qmf_bank->ptr_ref_coeff_r) { |
893 | 1.70M | ptr_start_coeff_r -= 5; |
894 | 1.70M | } |
895 | 8.56M | } |
896 | | |
897 | 17.1M | if (ptr_time_in) { |
898 | 17.1M | FLOAT32 *ptr_qmf_states = &ptr_qmf_states_curr_pos[0]; |
899 | 17.1M | const FLOAT32 *ptr_inp = &ptr_time_in[(i * 64 * time_sn_stride)]; |
900 | 17.1M | FLOAT32 tmp1, tmp2, tmp3, tmp4; |
901 | 291M | for (k = 15; k >= 0; k--) { |
902 | 273M | tmp1 = *ptr_inp; |
903 | 273M | ptr_inp += time_sn_stride; |
904 | | |
905 | 273M | tmp2 = *ptr_inp; |
906 | 273M | ptr_inp += time_sn_stride; |
907 | | |
908 | 273M | tmp3 = *ptr_inp; |
909 | 273M | ptr_inp += time_sn_stride; |
910 | | |
911 | 273M | *ptr_qmf_states++ = tmp1; |
912 | 273M | tmp4 = *ptr_inp; |
913 | 273M | ptr_inp += time_sn_stride; |
914 | | |
915 | 273M | *ptr_qmf_states++ = tmp2; |
916 | 273M | *ptr_qmf_states++ = tmp3; |
917 | 273M | *ptr_qmf_states++ = tmp4; |
918 | 273M | } |
919 | 17.1M | } else { |
920 | 0 | memset(&ptr_qmf_states_curr_pos[0], 0, |
921 | 0 | sizeof(ptr_qmf_states_curr_pos[0]) * IXHEAACE_QMF_CHANNELS); |
922 | 0 | } |
923 | | |
924 | 17.1M | ptr_pf_l = ptr_start_coeff_l; |
925 | 17.1M | ptr_pf_r = ptr_start_coeff_r; |
926 | | |
927 | 17.1M | ia_enhaacplus_enc_sbr_qmf_analysis_win_add(ptr_pf_l, ptr_pf_r, ptr_fp1, ptr_fp2, |
928 | 17.1M | syn_buffer); |
929 | | |
930 | 17.1M | ia_enhaacplus_enc_forward_modulation(syn_buffer, &(ptr_ana_r[i][0]), &(ptr_ana_i[i][0]), |
931 | 17.1M | pstr_qmf_tab, is_ld_sbr, ptr_sbr_scratch); |
932 | | |
933 | 17.1M | pstr_qmf_bank->ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos + 64; |
934 | 17.1M | if (pstr_qmf_bank->ptr_qmf_states_curr_pos == pstr_qmf_bank->ptr_qmf_states_buf + 640) { |
935 | 1.70M | pstr_qmf_bank->ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_buf; |
936 | 1.70M | } |
937 | 17.1M | } |
938 | | |
939 | 469k | pstr_qmf_bank->offset_l = ptr_start_coeff_l - pstr_qmf_bank->ptr_ref_coeff_l; |
940 | 469k | pstr_qmf_bank->offset_r = pstr_qmf_bank->ptr_ref_coeff_r - ptr_start_coeff_r; |
941 | 469k | pstr_qmf_bank->flag = flag; |
942 | 469k | } |
943 | 612k | if (is_ps_960 == 1) { |
944 | 17.0k | memset(&ptr_ana_r[num_qmf_subsamp][0], 0, sizeof(ptr_ana_r[num_qmf_subsamp][0]) * |
945 | 17.0k | IXHEAACE_QMF_CHANNELS * (IXHEAACE_QMF_TIME_SLOTS - num_qmf_subsamp)); |
946 | 17.0k | memset(&ptr_ana_i[num_qmf_subsamp][0], 0, sizeof(ptr_ana_i[num_qmf_subsamp][0]) * |
947 | 17.0k | IXHEAACE_QMF_CHANNELS * (IXHEAACE_QMF_TIME_SLOTS - num_qmf_subsamp)); |
948 | 17.0k | } |
949 | 612k | } |
950 | | |
951 | | VOID ixheaace_get_energy_from_cplx_qmf( |
952 | | FLOAT32 **ptr_energy_vals, FLOAT32 **ptr_real_values, FLOAT32 **ptr_imag_values, |
953 | | WORD32 is_ld_sbr, WORD32 num_time_slots, WORD32 samp_ratio_fac, |
954 | | ixheaace_str_hbe_enc *pstr_hbe_enc, WORD32 op_delay, WORD32 harmonic_sbr) |
955 | | |
956 | 572k | { |
957 | 572k | WORD32 j, k; |
958 | 572k | FLOAT32 avg_fac = 0.5f; |
959 | 572k | if (samp_ratio_fac == 4) { |
960 | 62.6k | avg_fac = 0.25f; |
961 | 62.6k | } |
962 | 572k | if (0 == is_ld_sbr) { |
963 | 429k | FLOAT32 *ptr_energy_val = &ptr_energy_vals[0][0]; |
964 | 429k | FLOAT32 *ptr_hbe_real = NULL; |
965 | 429k | FLOAT32 *ptr_hbe_imag = NULL; |
966 | 429k | if (harmonic_sbr == 1) { |
967 | 108k | ptr_hbe_real = &pstr_hbe_enc->qmf_buf_real[op_delay][0]; |
968 | 108k | ptr_hbe_imag = &pstr_hbe_enc->qmf_buf_imag[op_delay][0]; |
969 | 108k | } |
970 | 7.23M | for (k = 0; k < num_time_slots; k++) { |
971 | 442M | for (j = 0; j < IXHEAACE_QMF_CHANNELS; j++) { |
972 | 435M | FLOAT32 tmp = 0.0f; |
973 | 435M | if (harmonic_sbr == 1) { |
974 | 111M | FLOAT32 real_hbe, imag_hbe; |
975 | 111M | real_hbe = *(ptr_hbe_real); |
976 | 111M | imag_hbe = *(ptr_hbe_imag); |
977 | 111M | tmp += (real_hbe * real_hbe) + (imag_hbe * imag_hbe); |
978 | 111M | *ptr_energy_val = tmp; |
979 | 111M | ptr_hbe_real++; |
980 | 111M | ptr_hbe_imag++; |
981 | 111M | ptr_energy_val++; |
982 | 324M | } else { |
983 | 324M | FLOAT32 real, imag; |
984 | 324M | WORD32 i, subband; |
985 | 324M | subband = samp_ratio_fac * k; |
986 | 1.01G | for (i = 0; i < samp_ratio_fac; i++) { |
987 | 687M | real = ptr_real_values[subband + i][j]; |
988 | 687M | imag = ptr_imag_values[subband + i][j]; |
989 | 687M | tmp += (real * real) + (imag * imag); |
990 | 687M | } |
991 | 324M | ptr_energy_vals[k][j] = tmp * avg_fac; |
992 | 324M | } |
993 | 435M | } |
994 | 6.80M | if (harmonic_sbr == 1) { |
995 | 1.73M | ptr_hbe_real += 64; |
996 | 1.73M | ptr_hbe_imag += 64; |
997 | 1.73M | } |
998 | 6.80M | } |
999 | 429k | } else { |
1000 | 143k | FLOAT32 *ptr_real = &ptr_real_values[0][0]; |
1001 | 143k | FLOAT32 *ptr_imag = &ptr_imag_values[0][0]; |
1002 | 2.35M | for (k = 0; k < num_time_slots; k++) { |
1003 | 2.21M | FLOAT32 *ptr_energy_val = &ptr_energy_vals[k][0]; |
1004 | 143M | for (j = 0; j < 64; j++) { |
1005 | 141M | FLOAT32 real, imag, tmp; |
1006 | 141M | real = *ptr_real; |
1007 | 141M | ptr_real++; |
1008 | 141M | imag = *ptr_imag; |
1009 | 141M | ptr_imag++; |
1010 | | |
1011 | 141M | tmp = (real * real) + (imag * imag); |
1012 | 141M | *ptr_energy_val = tmp; |
1013 | 141M | ptr_energy_val++; |
1014 | 141M | } |
1015 | 2.21M | } |
1016 | 143k | } |
1017 | 572k | } |
1018 | | |
1019 | 1.62M | VOID ixheaace_fft16(FLOAT32 *vector) { |
1020 | 1.62M | FLOAT32 var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var110, var111, |
1021 | 1.62M | var112, var113, var114, var115; |
1022 | 1.62M | FLOAT32 var20, var21, var22, var23, var24, var25, var26, var27, var28, var29, var210, var211, |
1023 | 1.62M | var212, var213, var214, var215; |
1024 | 1.62M | FLOAT32 arr0, arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8, arr9, arr10, arr11, arr12, arr13, |
1025 | 1.62M | arr14, arr15; |
1026 | | |
1027 | 1.62M | arr0 = vector[0] + vector[16]; |
1028 | 1.62M | arr8 = vector[8] + vector[24]; |
1029 | 1.62M | var10 = arr0 + arr8; |
1030 | 1.62M | var12 = arr0 - arr8; |
1031 | 1.62M | arr1 = vector[1] + vector[17]; |
1032 | 1.62M | arr9 = vector[9] + vector[25]; |
1033 | 1.62M | var11 = arr1 + arr9; |
1034 | 1.62M | var13 = arr1 - arr9; |
1035 | 1.62M | arr2 = vector[2] + vector[18]; |
1036 | 1.62M | arr10 = vector[10] + vector[26]; |
1037 | 1.62M | var14 = arr2 + arr10; |
1038 | 1.62M | var16 = arr2 - arr10; |
1039 | 1.62M | arr3 = vector[3] + vector[19]; |
1040 | 1.62M | arr11 = vector[11] + vector[27]; |
1041 | 1.62M | var15 = arr3 + arr11; |
1042 | 1.62M | var17 = arr3 - arr11; |
1043 | 1.62M | arr4 = vector[4] + vector[20]; |
1044 | 1.62M | arr12 = vector[12] + vector[28]; |
1045 | 1.62M | var18 = arr4 + arr12; |
1046 | 1.62M | var110 = arr4 - arr12; |
1047 | 1.62M | arr5 = vector[5] + vector[21]; |
1048 | 1.62M | arr13 = vector[13] + vector[29]; |
1049 | 1.62M | var19 = arr5 + arr13; |
1050 | 1.62M | var111 = arr5 - arr13; |
1051 | 1.62M | arr6 = vector[6] + vector[22]; |
1052 | 1.62M | arr14 = vector[14] + vector[30]; |
1053 | 1.62M | var112 = arr6 + arr14; |
1054 | 1.62M | var114 = arr6 - arr14; |
1055 | 1.62M | arr7 = vector[7] + vector[23]; |
1056 | 1.62M | arr15 = vector[15] + vector[31]; |
1057 | 1.62M | var113 = arr7 + arr15; |
1058 | 1.62M | var115 = arr7 - arr15; |
1059 | | |
1060 | 1.62M | var20 = var10 + var18; |
1061 | 1.62M | var24 = var10 - var18; |
1062 | 1.62M | var21 = var11 + var19; |
1063 | 1.62M | var25 = var11 - var19; |
1064 | 1.62M | var28 = var12 - var111; |
1065 | 1.62M | var210 = var12 + var111; |
1066 | 1.62M | var29 = var13 + var110; |
1067 | 1.62M | var211 = var13 - var110; |
1068 | 1.62M | var22 = var14 + var112; |
1069 | 1.62M | var27 = var14 - var112; |
1070 | 1.62M | var23 = var15 + var113; |
1071 | 1.62M | var26 = var113 - var15; |
1072 | | |
1073 | 1.62M | var11 = var16 + var114; |
1074 | 1.62M | var12 = var16 - var114; |
1075 | 1.62M | var10 = var17 + var115; |
1076 | 1.62M | var13 = var17 - var115; |
1077 | | |
1078 | 1.62M | var212 = (var10 + var12) * IXHEAACE_INV_SQRT2; |
1079 | 1.62M | var214 = (var10 - var12) * IXHEAACE_INV_SQRT2; |
1080 | 1.62M | var213 = (var13 - var11) * IXHEAACE_INV_SQRT2; |
1081 | 1.62M | var215 = (var11 + var13) * -IXHEAACE_INV_SQRT2; |
1082 | | |
1083 | 1.62M | arr0 = vector[0] - vector[16]; |
1084 | 1.62M | arr1 = vector[1] - vector[17]; |
1085 | 1.62M | arr2 = vector[2] - vector[18]; |
1086 | 1.62M | arr3 = vector[3] - vector[19]; |
1087 | 1.62M | arr4 = vector[4] - vector[20]; |
1088 | 1.62M | arr5 = vector[5] - vector[21]; |
1089 | 1.62M | arr6 = vector[6] - vector[22]; |
1090 | 1.62M | arr7 = vector[7] - vector[23]; |
1091 | 1.62M | arr8 = vector[8] - vector[24]; |
1092 | 1.62M | arr9 = vector[9] - vector[25]; |
1093 | 1.62M | arr10 = vector[10] - vector[26]; |
1094 | 1.62M | arr11 = vector[11] - vector[27]; |
1095 | 1.62M | arr12 = vector[12] - vector[28]; |
1096 | 1.62M | arr13 = vector[13] - vector[29]; |
1097 | 1.62M | arr14 = vector[14] - vector[30]; |
1098 | 1.62M | arr15 = vector[15] - vector[31]; |
1099 | | |
1100 | 1.62M | var19 = ((arr2 + arr14) * -IXHEAACE_COS_3PI_DIV8); |
1101 | 1.62M | var110 = ((arr2 - arr14) * IXHEAACE_COS_PI_DIV8); |
1102 | 1.62M | var18 = ((arr3 + arr15) * IXHEAACE_COS_3PI_DIV8); |
1103 | 1.62M | var111 = ((arr3 - arr15) * IXHEAACE_COS_PI_DIV8); |
1104 | 1.62M | var15 = ((arr4 + arr12) * -IXHEAACE_INV_SQRT2); |
1105 | 1.62M | var16 = ((arr4 - arr12) * IXHEAACE_INV_SQRT2); |
1106 | 1.62M | var14 = ((arr5 + arr13) * IXHEAACE_INV_SQRT2); |
1107 | 1.62M | var17 = ((arr5 - arr13) * IXHEAACE_INV_SQRT2); |
1108 | 1.62M | var113 = ((arr6 + arr10) * -IXHEAACE_COS_PI_DIV8); |
1109 | 1.62M | var114 = ((arr6 - arr10) * IXHEAACE_COS_3PI_DIV8); |
1110 | 1.62M | var112 = ((arr7 + arr11) * IXHEAACE_COS_PI_DIV8); |
1111 | 1.62M | var115 = ((arr7 - arr11) * IXHEAACE_COS_3PI_DIV8); |
1112 | | |
1113 | 1.62M | arr2 = (var18 * IXHEAACE_SQRT2PLUS1) - (var112 * IXHEAACE_SQRT2MINUS1); |
1114 | 1.62M | arr3 = (var19 * IXHEAACE_SQRT2PLUS1) - (var113 * IXHEAACE_SQRT2MINUS1); |
1115 | 1.62M | arr4 = (var110 * IXHEAACE_SQRT2MINUS1) - (var114 * IXHEAACE_SQRT2PLUS1); |
1116 | 1.62M | arr5 = (var111 * IXHEAACE_SQRT2MINUS1) - (var115 * IXHEAACE_SQRT2PLUS1); |
1117 | | |
1118 | 1.62M | var18 = var18 + var112; |
1119 | 1.62M | var19 = var19 + var113; |
1120 | 1.62M | var110 = var110 + var114; |
1121 | 1.62M | var111 = var111 + var115; |
1122 | | |
1123 | 1.62M | arr6 = arr0 + var14; |
1124 | 1.62M | arr10 = arr0 - var14; |
1125 | 1.62M | arr7 = arr1 + var15; |
1126 | 1.62M | arr11 = arr1 - var15; |
1127 | | |
1128 | 1.62M | arr12 = var16 - arr9; |
1129 | 1.62M | arr14 = var16 + arr9; |
1130 | 1.62M | arr13 = arr8 + var17; |
1131 | 1.62M | arr15 = arr8 - var17; |
1132 | | |
1133 | 1.62M | var10 = arr6 - arr14; |
1134 | 1.62M | var12 = arr6 + arr14; |
1135 | 1.62M | var11 = arr7 + arr15; |
1136 | 1.62M | var13 = arr7 - arr15; |
1137 | 1.62M | var14 = arr10 + arr12; |
1138 | 1.62M | var16 = arr10 - arr12; |
1139 | 1.62M | var15 = arr11 + arr13; |
1140 | 1.62M | var17 = arr11 - arr13; |
1141 | | |
1142 | 1.62M | arr10 = var18 + var110; |
1143 | 1.62M | var110 = var18 - var110; |
1144 | 1.62M | arr11 = var19 + var111; |
1145 | 1.62M | var111 = var19 - var111; |
1146 | | |
1147 | 1.62M | var112 = (arr2 + arr4); |
1148 | 1.62M | var114 = (arr2 - arr4); |
1149 | 1.62M | var113 = (arr3 + arr5); |
1150 | 1.62M | var115 = (arr3 - arr5); |
1151 | | |
1152 | 1.62M | vector[0] = var20 + var22; |
1153 | 1.62M | vector[1] = var21 + var23; |
1154 | 1.62M | vector[2] = var12 + arr10; |
1155 | 1.62M | vector[3] = var13 + arr11; |
1156 | 1.62M | vector[4] = var210 + var212; |
1157 | 1.62M | vector[5] = var211 + var213; |
1158 | 1.62M | vector[6] = var10 + var112; |
1159 | 1.62M | vector[7] = var11 + var113; |
1160 | 1.62M | vector[8] = var24 - var26; |
1161 | 1.62M | vector[9] = var25 - var27; |
1162 | 1.62M | vector[10] = var16 + var114; |
1163 | 1.62M | vector[11] = var17 + var115; |
1164 | 1.62M | vector[12] = var28 + var214; |
1165 | 1.62M | vector[13] = var29 + var215; |
1166 | 1.62M | vector[14] = var14 + var110; |
1167 | 1.62M | vector[15] = var15 + var111; |
1168 | 1.62M | vector[16] = var20 - var22; |
1169 | 1.62M | vector[17] = var21 - var23; |
1170 | 1.62M | vector[18] = var12 - arr10; |
1171 | 1.62M | vector[19] = var13 - arr11; |
1172 | 1.62M | vector[20] = var210 - var212; |
1173 | 1.62M | vector[21] = var211 - var213; |
1174 | 1.62M | vector[22] = var10 - var112; |
1175 | 1.62M | vector[23] = var11 - var113; |
1176 | 1.62M | vector[24] = var24 + var26; |
1177 | 1.62M | vector[25] = var25 + var27; |
1178 | 1.62M | vector[26] = var16 - var114; |
1179 | 1.62M | vector[27] = var17 - var115; |
1180 | 1.62M | vector[28] = var28 - var214; |
1181 | 1.62M | vector[29] = var29 - var215; |
1182 | 1.62M | vector[30] = var14 - var110; |
1183 | 1.62M | vector[31] = var15 - var111; |
1184 | 1.62M | } |
1185 | | |
1186 | | static VOID ixheaace_cos_sim_mod(FLOAT32 *ptr_subband, |
1187 | 812k | ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) { |
1188 | 812k | WORD32 i; |
1189 | 812k | FLOAT32 re1, im1, re2, im2, re3, im3; |
1190 | 812k | const FLOAT32 *ptr_cos_sin_tab = pstr_qmf_bank->ptr_flt_cos_twiddle; |
1191 | 812k | const FLOAT32 *ptr_cos_sin_tab2 = &pstr_qmf_bank->ptr_flt_cos_twiddle[31]; |
1192 | 812k | const FLOAT32 *ptr_alt_sin_tab; |
1193 | 812k | FLOAT32 wim, wre; |
1194 | 812k | FLOAT32 *ptr_subband2 = ptr_subband + 32; |
1195 | | |
1196 | 7.30M | for (i = 0; i < 8; i++) { |
1197 | 6.49M | wre = *ptr_cos_sin_tab++; |
1198 | 6.49M | wim = *ptr_cos_sin_tab++; |
1199 | 6.49M | re1 = ptr_subband[2 * i]; |
1200 | 6.49M | im1 = ptr_subband[31 - 2 * i]; |
1201 | 6.49M | re3 = ptr_subband[30 - 2 * i]; |
1202 | 6.49M | im3 = ptr_subband[2 * i + 1]; |
1203 | 6.49M | ptr_subband[2 * i] = (im1 * wim) + (re1 * wre); |
1204 | 6.49M | ptr_subband[2 * i + 1] = (im1 * wre) - (re1 * wim); |
1205 | 6.49M | re1 = ptr_subband2[2 * i]; |
1206 | 6.49M | im1 = ptr_subband2[31 - 2 * i]; |
1207 | 6.49M | re2 = ptr_subband2[30 - 2 * i]; |
1208 | 6.49M | im2 = ptr_subband2[2 * i + 1]; |
1209 | 6.49M | ptr_subband2[2 * i + 1] = (im1 * wre) + (re1 * wim); |
1210 | 6.49M | ptr_subband2[2 * i] = (im1 * wim) - (re1 * wre); |
1211 | 6.49M | wim = *ptr_cos_sin_tab2--; |
1212 | 6.49M | wre = *ptr_cos_sin_tab2--; |
1213 | 6.49M | ptr_subband[30 - 2 * i] = (im3 * wim) + (re3 * wre); |
1214 | 6.49M | ptr_subband[31 - 2 * i] = (im3 * wre) - (re3 * wim); |
1215 | 6.49M | ptr_subband2[31 - 2 * i] = (im2 * wre) + (re2 * wim); |
1216 | 6.49M | ptr_subband2[30 - 2 * i] = (im2 * wim) - (re2 * wre); |
1217 | 6.49M | } |
1218 | | |
1219 | 812k | ixheaace_fft16(ptr_subband); |
1220 | 812k | ixheaace_fft16(ptr_subband2); |
1221 | | |
1222 | 812k | ptr_alt_sin_tab = &pstr_qmf_bank->ptr_flt_alt_sin_twiddle[0]; |
1223 | 812k | wim = *ptr_alt_sin_tab++; |
1224 | 812k | wre = *ptr_alt_sin_tab++; |
1225 | 7.30M | for (i = 0; i < 8; i++) { |
1226 | 6.49M | re1 = ptr_subband[2 * i]; |
1227 | 6.49M | im1 = ptr_subband[2 * i + 1]; |
1228 | 6.49M | re3 = ptr_subband[30 - 2 * i]; |
1229 | 6.49M | im3 = ptr_subband[31 - 2 * i]; |
1230 | 6.49M | ptr_subband[2 * i] = (re1 * wre) + (im1 * wim); |
1231 | 6.49M | ptr_subband[31 - 2 * i] = (re1 * wim) - (im1 * wre); |
1232 | 6.49M | re1 = ptr_subband2[2 * i]; |
1233 | 6.49M | im1 = ptr_subband2[2 * i + 1]; |
1234 | 6.49M | re2 = ptr_subband2[30 - 2 * i]; |
1235 | 6.49M | im2 = ptr_subband2[31 - 2 * i]; |
1236 | 6.49M | ptr_subband2[31 - 2 * i] = -((re1 * wre) + (im1 * wim)); |
1237 | 6.49M | ptr_subband2[2 * i] = -((re1 * wim) - (im1 * wre)); |
1238 | 6.49M | wim = *ptr_alt_sin_tab++; |
1239 | 6.49M | wre = *ptr_alt_sin_tab++; |
1240 | 6.49M | ptr_subband[30 - 2 * i] = (re3 * wim) + (im3 * wre); |
1241 | 6.49M | ptr_subband[2 * i + 1] = (re3 * wre) - (im3 * wim); |
1242 | 6.49M | ptr_subband2[2 * i + 1] = -((re2 * wim) + (im2 * wre)); |
1243 | 6.49M | ptr_subband2[30 - 2 * i] = -(re2 * wre) + (im2 * wim); |
1244 | 6.49M | } |
1245 | 812k | } |
1246 | | |
1247 | | static VOID ixheaace_inverse_modulation(const FLOAT32 *ptr_sbr_real, const FLOAT32 *ptr_sbr_imag, |
1248 | | FLOAT32 *ptr_time_out, |
1249 | 812k | ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) { |
1250 | 812k | WORD32 i; |
1251 | 812k | FLOAT32 gain = 0.015625f; |
1252 | 812k | FLOAT32 r1, i1, r2, i2; |
1253 | 812k | FLOAT32 *ptr_time1, *ptr_time2; |
1254 | 812k | FLOAT32 *ptr_time3, *ptr_time4; |
1255 | 812k | const FLOAT32 *ptr_re; |
1256 | 812k | const FLOAT32 *ptr_im; |
1257 | | |
1258 | 812k | ptr_time1 = &ptr_time_out[0]; |
1259 | 812k | ptr_time2 = &ptr_time_out[32]; |
1260 | 812k | ptr_re = &ptr_sbr_real[0]; |
1261 | 812k | ptr_im = &ptr_sbr_imag[0]; |
1262 | | |
1263 | 26.7M | for (i = 31; i >= 0; i--) { |
1264 | 25.9M | r1 = *ptr_re++; |
1265 | 25.9M | i1 = *ptr_im++; |
1266 | | |
1267 | 25.9M | *ptr_time1++ = r1 * gain; |
1268 | 25.9M | *ptr_time2++ = i1 * gain; |
1269 | 25.9M | } |
1270 | | |
1271 | 812k | ixheaace_cos_sim_mod(ptr_time_out, pstr_qmf_bank); |
1272 | | |
1273 | 812k | ptr_time1 = &ptr_time_out[63]; |
1274 | 812k | ptr_time2 = &ptr_time_out[31]; |
1275 | 812k | ptr_time3 = &ptr_time_out[0]; |
1276 | 812k | ptr_time4 = &ptr_time_out[32]; |
1277 | 13.8M | for (i = 15; i >= 0; i--) { |
1278 | 12.9M | r1 = *ptr_time3; |
1279 | 12.9M | i2 = *ptr_time1; |
1280 | 12.9M | r2 = *ptr_time2; |
1281 | 12.9M | i1 = *ptr_time4; |
1282 | | |
1283 | 12.9M | *ptr_time3++ = r1 - i1; |
1284 | | |
1285 | 12.9M | *ptr_time1-- = -(r1 + i1); |
1286 | | |
1287 | 12.9M | *ptr_time2-- = r2 - i2; |
1288 | | |
1289 | 12.9M | *ptr_time4++ = -(r2 + i2); |
1290 | 12.9M | } |
1291 | 812k | } |
1292 | | |
1293 | | static VOID ixheaace_win_add(FLOAT32 *ptr_time_buf, FLOAT32 *ptr_work_buffer, |
1294 | 812k | const FLOAT32 *ptr_filter) { |
1295 | 812k | WORD32 j, k; |
1296 | 812k | FLOAT32 *ptr_work_buf = &ptr_work_buffer[63]; |
1297 | 26.7M | for (j = 0, k = 0; j < 64; j += 2, k++) { |
1298 | 25.9M | FLOAT32 tmp_var = *ptr_work_buf--; |
1299 | 25.9M | FLOAT32 temp_a = ptr_filter[2 * k]; |
1300 | 25.9M | FLOAT32 temp_b = ptr_filter[2 * k + 1]; |
1301 | 25.9M | FLOAT32 temp1 = *ptr_work_buf--; |
1302 | 25.9M | ptr_time_buf[j] += tmp_var * temp_a; |
1303 | 25.9M | ptr_time_buf[j + 1] += temp1 * temp_b; |
1304 | | |
1305 | 25.9M | temp_a = ptr_filter[64 + 2 * k]; |
1306 | 25.9M | temp_b = ptr_filter[64 + 2 * k + 1]; |
1307 | 25.9M | ptr_time_buf[64 + j] += tmp_var * temp_a; |
1308 | 25.9M | ptr_time_buf[64 + j + 1] += temp1 * temp_b; |
1309 | | |
1310 | 25.9M | temp_a = ptr_filter[128 + 2 * k]; |
1311 | 25.9M | temp_b = ptr_filter[128 + 2 * k + 1]; |
1312 | 25.9M | ptr_time_buf[128 + j] += tmp_var * temp_a; |
1313 | 25.9M | ptr_time_buf[128 + j + 1] += temp1 * temp_b; |
1314 | | |
1315 | 25.9M | temp_a = ptr_filter[192 + 2 * k]; |
1316 | 25.9M | temp_b = ptr_filter[192 + 2 * k + 1]; |
1317 | 25.9M | ptr_time_buf[192 + j] += tmp_var * temp_a; |
1318 | 25.9M | ptr_time_buf[192 + j + 1] += temp1 * temp_b; |
1319 | | |
1320 | 25.9M | temp_a = ptr_filter[256 + 2 * k]; |
1321 | 25.9M | temp_b = ptr_filter[256 + 2 * k + 1]; |
1322 | 25.9M | ptr_time_buf[256 + j] += tmp_var * temp_a; |
1323 | 25.9M | ptr_time_buf[256 + j + 1] += temp1 * temp_b; |
1324 | 25.9M | } |
1325 | 812k | } |
1326 | | |
1327 | | VOID ixheaace_enc_synthesis_qmf_filtering(FLOAT32 **ptr_sbr_re, FLOAT32 **ptr_sbr_im, |
1328 | | FLOAT32 *time_float, |
1329 | 25.3k | ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) { |
1330 | 25.3k | WORD32 k, j; |
1331 | 25.3k | FLOAT32 *timeBuf_flt; |
1332 | 25.3k | const FLOAT32 *ptr_filter = pstr_qmf_bank->ptr_flt_filter; |
1333 | 837k | for (k = 0; k < 32; k++) { |
1334 | 812k | ixheaace_inverse_modulation(*(ptr_sbr_re + k), *(ptr_sbr_im + k), |
1335 | 812k | pstr_qmf_bank->ptr_flt_work_buf, pstr_qmf_bank); |
1336 | 812k | ixheaace_win_add(pstr_qmf_bank->ptr_flt_time_buf, pstr_qmf_bank->ptr_flt_work_buf, |
1337 | 812k | ptr_filter); |
1338 | 812k | timeBuf_flt = &pstr_qmf_bank->ptr_flt_time_buf[288]; |
1339 | 812k | { |
1340 | 812k | FLOAT32 temp1_flt, temp2_flt; |
1341 | 812k | FLOAT32 *ptr_time_out_flt = &time_float[31], temp_out_flt; |
1342 | 13.8M | for (j = 15; j >= 0; j--) { |
1343 | 12.9M | temp1_flt = *timeBuf_flt++; |
1344 | 12.9M | temp2_flt = *timeBuf_flt++; |
1345 | 12.9M | temp_out_flt = temp1_flt; |
1346 | 12.9M | *ptr_time_out_flt-- = temp_out_flt * -1; |
1347 | 12.9M | temp_out_flt = temp2_flt; |
1348 | 12.9M | *ptr_time_out_flt-- = temp_out_flt * -1; |
1349 | 12.9M | } |
1350 | 812k | } |
1351 | 812k | time_float += 32; |
1352 | 812k | memmove(pstr_qmf_bank->ptr_flt_time_buf + 32, pstr_qmf_bank->ptr_flt_time_buf, |
1353 | 812k | 288 * sizeof(pstr_qmf_bank->ptr_flt_time_buf[0])); |
1354 | 812k | memset(pstr_qmf_bank->ptr_flt_time_buf, 0, 32 * sizeof(pstr_qmf_bank->ptr_flt_time_buf[0])); |
1355 | 812k | } |
1356 | 25.3k | } |