Coverage Report

Created: 2026-10-17 07:12

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