Coverage Report

Created: 2025-07-18 06:38

/src/libxaac/decoder/ixheaacd_qmf_dec.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 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
#include <string.h>
21
22
#include "ixheaacd_sbr_common.h"
23
#include "ixheaac_type_def.h"
24
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops16.h"
28
#include "ixheaac_basic_ops40.h"
29
#include "ixheaac_basic_ops.h"
30
31
#include "ixheaacd_intrinsics.h"
32
#include "ixheaacd_common_rom.h"
33
#include "ixheaacd_bitbuffer.h"
34
#include "ixheaacd_sbrdecsettings.h"
35
#include "ixheaacd_sbr_scale.h"
36
#include "ixheaacd_lpp_tran.h"
37
#include "ixheaacd_env_extr_part.h"
38
#include "ixheaacd_sbr_rom.h"
39
#include "ixheaacd_hybrid.h"
40
#include "ixheaacd_ps_dec.h"
41
#include "ixheaacd_env_extr.h"
42
#include "ixheaacd_qmf_dec.h"
43
44
#include "ixheaac_basic_op.h"
45
#include "ixheaacd_env_calc.h"
46
#include "ixheaacd_interface.h"
47
48
#include "ixheaacd_function_selector.h"
49
#include "ixheaacd_audioobjtypes.h"
50
51
#define DCT3_LEN (32)
52
0
#define DCT2_LEN (64)
53
54
#define LP_SHIFT_VAL 7
55
#define HQ_SHIFT_64 4
56
#define RADIXSHIFT 1
57
#define ROUNDING_SPECTRA 1
58
#define HQ_SHIFT_VAL 4
59
60
static PLATFORM_INLINE WORD32 ixheaacd_mult32x32in32_shift25(WORD32 a,
61
110M
                                                             WORD32 b) {
62
110M
  WORD32 result;
63
110M
  WORD64 temp_result;
64
65
110M
  temp_result = (WORD64)a * (WORD64)b;
66
67
110M
  result = (WORD32)(temp_result >> 25);
68
69
110M
  return (result);
70
110M
}
71
72
0
VOID ixheaacd_pretwdct2(WORD32 *inp, WORD32 *out_fwd) {
73
0
  WORD32 n;
74
0
  WORD32 *out_rev = out_fwd + DCT2_LEN - 1;
75
76
0
  for (n = 0; n < DCT2_LEN / 2; n++) {
77
0
    *out_fwd = *inp;
78
0
    inp++;
79
0
    *out_rev = *inp;
80
0
    out_fwd++;
81
82
0
    out_rev--;
83
0
    inp++;
84
0
  }
85
86
0
  return;
87
0
}
88
89
static PLATFORM_INLINE VOID ixheaacd_pretwdct2_32(WORD32 *inp, WORD32 *out_fwd,
90
0
                                                  int dct2_len) {
91
0
  WORD32 n;
92
93
0
  WORD32 *out_rev = out_fwd + dct2_len - 1;
94
0
  for (n = dct2_len / 2 - 1; n >= 0; n--) {
95
0
    *out_fwd = *inp;
96
0
    inp++;
97
0
    *out_rev = *inp;
98
0
    out_fwd++;
99
100
0
    out_rev--;
101
0
    inp++;
102
0
  }
103
104
0
  return;
105
0
}
106
107
VOID ixheaacd_fftposttw(WORD32 *out,
108
0
                        ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
109
0
  int k;
110
0
  WORD32 *p_out_fwd, *ptr_out_rev;
111
0
  const WORD16 *twidle_fwd, *twidle_rev;
112
0
  WORD32 in1, in2, val1, val2;
113
114
0
  twidle_fwd = qmf_dec_tables_ptr->post_fft_tbl + 1;
115
0
  twidle_rev = qmf_dec_tables_ptr->post_fft_tbl + 15;
116
117
0
  p_out_fwd = out;
118
0
  ptr_out_rev = out + DCT2_LEN - 1;
119
120
0
  in1 = ((*p_out_fwd++) << 1);
121
0
  val1 = ((*p_out_fwd--) << 1);
122
123
0
  *p_out_fwd++ = in1;
124
0
  *p_out_fwd++ = val1;
125
126
0
  for (k = 1; k <= DCT2_LEN / 4; k++) {
127
0
    WORD32 temp[4];
128
0
    WORD16 twid_re, twid_im;
129
130
0
    temp[0] = *p_out_fwd++;
131
0
    temp[1] = *p_out_fwd--;
132
0
    temp[3] = *ptr_out_rev--;
133
0
    temp[2] = *ptr_out_rev++;
134
135
0
    in2 = ixheaac_sub32_sat(temp[3], temp[1]);
136
0
    in1 = ixheaac_add32_sat(temp[3], temp[1]);
137
138
0
    temp[1] = ixheaac_sub32_sat(temp[0], temp[2]);
139
0
    temp[3] = ixheaac_add32_sat(temp[0], temp[2]);
140
141
0
    twid_re = *twidle_fwd++;
142
0
    twid_im = *twidle_rev--;
143
0
    val1 = ixheaac_mult32x16in32(in1, twid_re) -
144
0
           ixheaac_mult32x16in32(temp[1], twid_im);
145
0
    val2 = ixheaac_mult32x16in32(temp[1], twid_re) +
146
0
           ixheaac_mult32x16in32(in1, twid_im);
147
0
    val1 = val1 << 1;
148
0
    val2 = val2 << 1;
149
150
0
    *p_out_fwd++ = ixheaac_add32_sat(temp[3], val1);
151
0
    *p_out_fwd++ = ixheaac_add32_sat(in2, val2);
152
153
0
    *ptr_out_rev-- = ixheaac_sub32_sat(val2, in2);
154
0
    *ptr_out_rev-- = ixheaac_sub32_sat(temp[3], val1);
155
0
  }
156
157
0
  return;
158
0
}
159
160
VOID ixheaacd_posttwdct2(WORD32 *inp, WORD16 *out_fwd,
161
0
                         ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
162
0
  WORD32 k;
163
0
  WORD32 inp_re, inp_im, out_re, out_im, last_val, out_re1;
164
0
  WORD16 *out_fwd2, *out_rev2, *out_rev;
165
0
  WORD16 twid_re, twid_im;
166
0
  const WORD16 *twidle_fwd;
167
0
  WORD16 re1, im1, im2;
168
169
0
  out_rev = out_fwd + DCT2_LEN - 1;
170
0
  out_rev2 = out_fwd - 1;
171
0
  out_fwd2 = out_fwd + 65;
172
0
  out_re = *inp++;
173
0
  out_im = *inp++;
174
0
  out_re1 =
175
0
      ixheaac_sat64_32(ixheaac_add64((WORD64)out_re, (WORD64)out_im) >> 1);
176
0
  re1 = ixheaac_round16(ixheaac_shl32(out_re1, (5 - 1)));
177
178
0
  *out_fwd++ = re1;
179
180
0
  last_val = ixheaac_sub32_sat(out_re, out_im);
181
182
0
  twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 2;
183
0
  for (k = DCT2_LEN / 2 - 2; k >= 0; k--) {
184
0
    inp_re = *inp++;
185
0
    inp_im = *inp++;
186
187
0
    twid_re = *twidle_fwd++;
188
0
    twid_im = *twidle_fwd++;
189
0
    out_re = ixheaac_sub32_sat(ixheaac_mult32x16in32(inp_re, twid_re),
190
0
                                ixheaac_mult32x16in32(inp_im, twid_im));
191
0
    out_im = ixheaac_add32_sat(ixheaac_mult32x16in32(inp_im, twid_re),
192
0
                                ixheaac_mult32x16in32(inp_re, twid_im));
193
0
    re1 = ixheaac_round16(ixheaac_shl32(out_re, (5 - 1)));
194
0
    im1 = ixheaac_round16(ixheaac_shl32(out_im, (5 - 1)));
195
0
    im2 = ixheaac_negate16(im1);
196
197
0
    *out_fwd++ = re1;
198
0
    *out_rev2-- = re1;
199
0
    *out_rev-- = im1;
200
0
    *out_fwd2++ = im2;
201
0
  }
202
0
  twid_re = *twidle_fwd++;
203
204
0
  out_re = ixheaac_mult32x16in32(last_val, twid_re);
205
0
  re1 = ixheaac_round16(ixheaac_shl32(out_re, (5 - 1)));
206
207
0
  *out_fwd++ = re1;
208
0
  *out_rev2-- = re1;
209
210
0
  return;
211
0
}
212
213
static PLATFORM_INLINE VOID ixheaacd_fftposttw_32(
214
0
    WORD32 *out, int dct2_len, ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
215
0
  int k;
216
0
  WORD32 *ptr_out_fwd, *ptr_out_rev;
217
0
  const WORD16 *twidle_fwd, *twidle_rev;
218
0
  WORD32 in1, in2, val1, val2;
219
220
0
  twidle_fwd = qmf_dec_tables_ptr->post_fft_tbl + 2;
221
0
  twidle_rev = qmf_dec_tables_ptr->post_fft_tbl + 14;
222
223
0
  ptr_out_fwd = out;
224
0
  ptr_out_rev = out + dct2_len - 1;
225
226
0
  in1 = ((*ptr_out_fwd++) << 1);
227
0
  val1 = ((*ptr_out_fwd--) << 1);
228
229
0
  *ptr_out_fwd++ = in1;
230
0
  *ptr_out_fwd++ = val1;
231
232
0
  for (k = dct2_len / 4 - 1; k >= 0; k--) {
233
0
    WORD32 temp0, temp1, temp2, temp3;
234
0
    WORD16 twid_re, twid_im;
235
236
0
    temp0 = *ptr_out_fwd++;
237
0
    temp1 = *ptr_out_fwd--;
238
0
    temp3 = *ptr_out_rev--;
239
0
    temp2 = *ptr_out_rev++;
240
241
0
    in1 = ixheaac_add32_sat(temp1, temp3);
242
0
    in2 = ixheaac_sub32_sat(temp3, temp1);
243
244
0
    temp1 = ixheaac_sub32_sat(temp0, temp2);
245
0
    temp3 = ixheaac_add32_sat(temp0, temp2);
246
247
0
    twid_re = *twidle_fwd;
248
0
    twidle_fwd += 2;
249
250
0
    twid_im = *twidle_rev;
251
0
    twidle_rev -= 2;
252
253
0
    val1 = ixheaac_mult32x16in32(in1, twid_re) -
254
0
           ixheaac_mult32x16in32(temp1, twid_im);
255
0
    val2 = ixheaac_mult32x16in32(temp1, twid_re) +
256
0
           ixheaac_mult32x16in32(in1, twid_im);
257
258
0
    val1 = val1 << 1;
259
0
    val2 = val2 << 1;
260
261
0
    *ptr_out_fwd++ = ixheaac_add32_sat(temp3, val1);
262
0
    *ptr_out_fwd++ = ixheaac_add32_sat(in2, val2);
263
264
0
    *ptr_out_rev-- = ixheaac_sub32_sat(val2, in2);
265
0
    *ptr_out_rev-- = ixheaac_sub32_sat(temp3, val1);
266
0
  }
267
268
0
  return;
269
0
}
270
271
static PLATFORM_INLINE VOID
272
ixheaacd_posttwdct2_32(WORD32 *inp, WORD16 *out_fwd,
273
0
                       ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
274
0
  int k;
275
0
  WORD32 inp_re, out_re, out_im, last_val, out_re1;
276
0
  WORD16 *out_rev, *out_rev2, *out_fwd2;
277
0
  WORD16 twid_re, twid_im;
278
0
  const WORD16 *twidle_fwd;
279
0
  WORD16 re1, im1, im2;
280
0
  WORD32 rounding_fac = 0x8000;
281
282
0
  out_rev = out_fwd + 32 - 1;
283
0
  out_rev2 = out_fwd - 1;
284
0
  out_fwd2 = out_fwd + 32 + 1;
285
0
  out_fwd[32] = 0;
286
287
0
  out_re = *inp++;
288
0
  out_im = *inp++;
289
290
0
  out_re1 =
291
0
      ixheaac_sat64_32(ixheaac_add64((WORD64)out_re, (WORD64)out_im) >> 1);
292
0
  re1 = ixheaac_round16(ixheaac_shl32_sat(out_re1, (5 - 1)));
293
0
  *out_fwd++ = re1;
294
0
  last_val = ixheaac_sub32_sat(out_re, out_im);
295
296
0
  twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 4;
297
0
  for (k = 14; k >= 0; k--) {
298
0
    WORD32 temp1, temp2;
299
0
    inp_re = *inp++;
300
0
    twid_re = *twidle_fwd++;
301
0
    twid_im = *twidle_fwd;
302
0
    twidle_fwd += 3;
303
304
0
    temp1 = ixheaac_mult32x16in32(inp_re, twid_re);
305
0
    temp2 = ixheaac_mult32x16in32(inp_re, twid_im);
306
307
0
    inp_re = *inp++;
308
309
0
    out_re = ixheaac_sub32_sat(temp1, ixheaac_mult32x16in32(inp_re, twid_im));
310
0
    out_im = ixheaac_add32_sat(ixheaac_mult32x16in32(inp_re, twid_re), temp2);
311
312
0
    out_re = ixheaac_add32_sat(out_re, out_re);
313
0
    out_im = ixheaac_add32_sat(out_im, out_im);
314
0
    out_re = ixheaac_add32_sat(out_re, out_re);
315
0
    out_im = ixheaac_add32_sat(out_im, out_im);
316
0
    out_re = ixheaac_add32_sat(out_re, out_re);
317
0
    out_im = ixheaac_add32_sat(out_im, out_im);
318
0
    out_re = ixheaac_add32_sat(out_re, out_re);
319
0
    out_im = ixheaac_add32_sat(out_im, out_im);
320
0
    out_re = ixheaac_add32_sat(out_re, rounding_fac);
321
0
    out_im = ixheaac_add32_sat(out_im, rounding_fac);
322
0
    re1 = (out_re >> 16);
323
0
    im1 = (out_im >> 16);
324
0
    im2 = ixheaac_negate16(im1);
325
326
0
    *out_fwd++ = re1;
327
0
    *out_rev2-- = re1;
328
0
    *out_rev-- = im1;
329
0
    *out_fwd2++ = im2;
330
0
  }
331
0
  twid_re = *twidle_fwd++;
332
333
0
  out_re = ixheaac_mult32x16in32(last_val, twid_re);
334
0
  re1 = ixheaac_round16(ixheaac_shl32_sat(out_re, (5 - 1)));
335
0
  *out_fwd++ = re1;
336
0
  *out_rev2-- = re1;
337
338
0
  return;
339
0
}
340
341
VOID ixheaacd_dct2_32(WORD32 *inp, WORD32 *out,
342
                      ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
343
0
                      WORD16 *filter_states) {
344
0
  WORD32 *output;
345
346
0
  output = out + 16;
347
0
  filter_states = filter_states + 16;
348
0
  ixheaacd_pretwdct2_32(inp, output, 32);
349
350
0
  ixheaacd_radix4bfly(qmf_dec_tables_ptr->w_16, output, 1, 4);
351
0
  ixheaacd_postradixcompute4(inp, output, qmf_dec_tables_ptr->dig_rev_table4_16,
352
0
                             16);
353
0
  ixheaacd_fftposttw_32(inp, 32, qmf_dec_tables_ptr);
354
355
0
  ixheaacd_posttwdct2_32(inp, filter_states, qmf_dec_tables_ptr);
356
357
0
  return;
358
0
}
359
360
VOID ixheaacd_sbr_qmfanal32_winadd_eld_mps(WORD32 *inp1, WORD32 *inp2,
361
                                           const WORD32 *p_qmf1,
362
                                           const WORD32 *p_qmf2,
363
792
                                           WORD32 *p_out) {
364
792
  WORD32 n;
365
792
  WORD32 resolution = 64;
366
367
26.1k
  for (n = 0; n < 64; n += 2) {
368
25.3k
    WORD32 accu;
369
25.3k
    accu = ixheaac_mul32_sh(inp1[n + 0], p_qmf1[(n + 0)], 31);
370
25.3k
    accu = ixheaac_add32_sat(
371
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 2 * resolution],
372
25.3k
                                p_qmf1[(n + 2 * resolution)], 31));
373
25.3k
    accu = ixheaac_add32_sat(
374
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 4 * resolution],
375
25.3k
                                p_qmf1[(n + 4 * resolution)], 31));
376
25.3k
    accu = ixheaac_add32_sat(
377
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 6 * resolution],
378
25.3k
                                p_qmf1[(n + 6 * resolution)], 31));
379
25.3k
    accu = ixheaac_add32_sat(
380
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 8 * resolution],
381
25.3k
                                p_qmf1[(n + 8 * resolution)], 31));
382
25.3k
    p_out[n] = accu;
383
384
25.3k
    accu = ixheaac_mul32_sh(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)], 31);
385
25.3k
    accu = ixheaac_add32_sat(
386
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 1 + 2 * resolution],
387
25.3k
                                p_qmf1[(n + 1 + 2 * resolution)], 31));
388
25.3k
    accu = ixheaac_add32_sat(
389
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 1 + 4 * resolution],
390
25.3k
                                p_qmf1[(n + 1 + 4 * resolution)], 31));
391
25.3k
    accu = ixheaac_add32_sat(
392
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 1 + 6 * resolution],
393
25.3k
                                p_qmf1[(n + 1 + 6 * resolution)], 31));
394
25.3k
    accu = ixheaac_add32_sat(
395
25.3k
        accu, ixheaac_mul32_sh(inp1[n + 1 + 8 * resolution],
396
25.3k
                                p_qmf1[(n + 1 + 8 * resolution)], 31));
397
25.3k
    p_out[n + 1] = accu;
398
399
25.3k
    accu = ixheaac_mul32_sh(inp2[n + 0], p_qmf2[(n + 0)], 31);
400
25.3k
    accu = ixheaac_add32_sat(
401
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 2 * resolution],
402
25.3k
                                p_qmf2[(n + 2 * resolution)], 31));
403
25.3k
    accu = ixheaac_add32_sat(
404
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 4 * resolution],
405
25.3k
                                p_qmf2[(n + 4 * resolution)], 31));
406
25.3k
    accu = ixheaac_add32_sat(
407
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 6 * resolution],
408
25.3k
                                p_qmf2[(n + 6 * resolution)], 31));
409
25.3k
    accu = ixheaac_add32_sat(
410
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 8 * resolution],
411
25.3k
                                p_qmf2[(n + 8 * resolution)], 31));
412
25.3k
    p_out[n + 64] = accu;
413
414
25.3k
    accu = ixheaac_mul32_sh(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)], 31);
415
25.3k
    accu = ixheaac_add32_sat(
416
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 1 + 2 * resolution],
417
25.3k
                                p_qmf2[(n + 1 + 2 * resolution)], 31));
418
25.3k
    accu = ixheaac_add32_sat(
419
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 1 + 4 * resolution],
420
25.3k
                                p_qmf2[(n + 1 + 4 * resolution)], 31));
421
25.3k
    accu = ixheaac_add32_sat(
422
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 1 + 6 * resolution],
423
25.3k
                                p_qmf2[(n + 1 + 6 * resolution)], 31));
424
25.3k
    accu = ixheaac_add32_sat(
425
25.3k
        accu, ixheaac_mul32_sh(inp2[n + 1 + 8 * resolution],
426
25.3k
                                p_qmf2[(n + 1 + 8 * resolution)], 31));
427
25.3k
    p_out[n + 1 + 64] = accu;
428
25.3k
  }
429
792
}
430
431
VOID ixheaacd_sbr_qmfanal32_winadd_eld_32(WORD32 *inp1, WORD32 *inp2,
432
                                          const WORD32 *p_qmf1,
433
77.4k
                                          const WORD32 *p_qmf2, WORD32 *p_out) {
434
77.4k
  WORD32 n;
435
436
1.31M
  for (n = 0; n < 32; n += 2) {
437
1.23M
    WORD32 accu;
438
1.23M
    accu = ixheaac_mul32_sh(inp1[n + 0], p_qmf1[(n + 0)], 31);
439
1.23M
    accu = ixheaac_add32_sat(
440
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 64], p_qmf1[(n + 64)], 31));
441
1.23M
    accu = ixheaac_add32_sat(
442
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 128], p_qmf1[(n + 128)], 31));
443
1.23M
    accu = ixheaac_add32_sat(
444
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 192], p_qmf1[(n + 192)], 31));
445
1.23M
    accu = ixheaac_add32_sat(
446
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 256], p_qmf1[(n + 256)], 31));
447
1.23M
    p_out[n] = accu;
448
449
1.23M
    accu = ixheaac_mul32_sh(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)], 31);
450
1.23M
    accu = ixheaac_add32_sat(
451
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 1 + 64], p_qmf1[(n + 1 + 64)], 31));
452
1.23M
    accu = ixheaac_add32_sat(
453
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 1 + 128], p_qmf1[(n + 1 + 128)], 31));
454
1.23M
    accu = ixheaac_add32_sat(
455
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 1 + 192], p_qmf1[(n + 1 + 192)], 31));
456
1.23M
    accu = ixheaac_add32_sat(
457
1.23M
        accu, ixheaac_mul32_sh(inp1[n + 1 + 256], p_qmf1[(n + 1 + 256)], 31));
458
1.23M
    p_out[n + 1] = accu;
459
460
1.23M
    accu = ixheaac_mul32_sh(inp2[n + 0], p_qmf2[(n + 0)], 31);
461
1.23M
    accu = ixheaac_add32_sat(
462
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 64], p_qmf2[(n + 64)], 31));
463
1.23M
    accu = ixheaac_add32_sat(
464
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 128], p_qmf2[(n + 128)], 31));
465
1.23M
    accu = ixheaac_add32_sat(
466
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 192], p_qmf2[(n + 192)], 31));
467
1.23M
    accu = ixheaac_add32_sat(
468
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 256], p_qmf2[(n + 256)], 31));
469
1.23M
    p_out[n + 32] = accu;
470
471
1.23M
    accu = ixheaac_mul32_sh(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)], 31);
472
1.23M
    accu = ixheaac_add32_sat(
473
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 1 + 64], p_qmf2[(n + 1 + 64)], 31));
474
1.23M
    accu = ixheaac_add32_sat(
475
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 1 + 128], p_qmf2[(n + 1 + 128)], 31));
476
1.23M
    accu = ixheaac_add32_sat(
477
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 1 + 192], p_qmf2[(n + 1 + 192)], 31));
478
1.23M
    accu = ixheaac_add32_sat(
479
1.23M
        accu, ixheaac_mul32_sh(inp2[n + 1 + 256], p_qmf2[(n + 1 + 256)], 31));
480
1.23M
    p_out[n + 1 + 32] = accu;
481
1.23M
  }
482
77.4k
}
483
484
VOID ixheaacd_sbr_qmfanal32_winadd_eld(WORD16 *inp1, WORD16 *inp2,
485
                                       const WORD16 *p_qmf1,
486
838k
                                       const WORD16 *p_qmf2, WORD32 *p_out) {
487
838k
  WORD32 n;
488
489
14.2M
  for (n = 0; n < 32; n += 2) {
490
13.4M
    WORD32 accu;
491
13.4M
    accu = ixheaac_mult16x16in32(inp1[n + 0], p_qmf1[(n + 0)]);
492
13.4M
    accu = ixheaac_add32_sat(
493
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 64], p_qmf1[(n + 64)]));
494
13.4M
    accu = ixheaac_add32_sat(
495
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 128], p_qmf1[(n + 128)]));
496
13.4M
    accu = ixheaac_add32_sat(
497
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 192], p_qmf1[(n + 192)]));
498
13.4M
    accu = ixheaac_add32_sat(
499
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 256], p_qmf1[(n + 256)]));
500
13.4M
    p_out[n] = accu;
501
502
13.4M
    accu = ixheaac_mult16x16in32(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)]);
503
13.4M
    accu = ixheaac_add32_sat(
504
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 1 + 64], p_qmf1[(n + 1 + 64)]));
505
13.4M
    accu = ixheaac_add32_sat(
506
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 1 + 128], p_qmf1[(n + 1 + 128)]));
507
13.4M
    accu = ixheaac_add32_sat(
508
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 1 + 192], p_qmf1[(n + 1 + 192)]));
509
13.4M
    accu = ixheaac_add32_sat(
510
13.4M
        accu, ixheaac_mult16x16in32(inp1[n + 1 + 256], p_qmf1[(n + 1 + 256)]));
511
13.4M
    p_out[n + 1] = accu;
512
513
13.4M
    accu = ixheaac_mult16x16in32(inp2[n + 0], p_qmf2[(n + 0)]);
514
13.4M
    accu = ixheaac_add32_sat(
515
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 64], p_qmf2[(n + 64)]));
516
13.4M
    accu = ixheaac_add32_sat(
517
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 128], p_qmf2[(n + 128)]));
518
13.4M
    accu = ixheaac_add32_sat(
519
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 192], p_qmf2[(n + 192)]));
520
13.4M
    accu = ixheaac_add32_sat(
521
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 256], p_qmf2[(n + 256)]));
522
13.4M
    p_out[n + 32] = accu;
523
524
13.4M
    accu = ixheaac_mult16x16in32(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)]);
525
13.4M
    accu = ixheaac_add32_sat(
526
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 1 + 64], p_qmf2[(n + 1 + 64)]));
527
13.4M
    accu = ixheaac_add32_sat(
528
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 1 + 128], p_qmf2[(n + 1 + 128)]));
529
13.4M
    accu = ixheaac_add32_sat(
530
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 1 + 192], p_qmf2[(n + 1 + 192)]));
531
13.4M
    accu = ixheaac_add32_sat(
532
13.4M
        accu, ixheaac_mult16x16in32(inp2[n + 1 + 256], p_qmf2[(n + 1 + 256)]));
533
13.4M
    p_out[n + 1 + 32] = accu;
534
13.4M
  }
535
838k
}
536
537
VOID ixheaacd_esbr_qmfanal32_winadd(WORD32 *inp1, WORD32 *inp2, WORD32 *p_qmf1,
538
                                    WORD32 *p_qmf2, WORD32 *p_out,
539
12.5M
                                    WORD32 num_band_anal_qmf) {
540
12.5M
  WORD32 n;
541
12.5M
  WORD64 accu;
542
543
12.5M
  if (num_band_anal_qmf == 32) {
544
146M
    for (n = 0; n < num_band_anal_qmf; n += 2) {
545
138M
      accu = ixheaac_mult64(inp1[n + 0], p_qmf1[2 * (n + 0)]);
546
138M
      accu = ixheaac_add64(
547
138M
          accu, ixheaac_mult64(inp1[n + 2 * num_band_anal_qmf],
548
138M
                                p_qmf1[2 * (n + 2 * num_band_anal_qmf)]));
549
138M
      accu = ixheaac_add64(
550
138M
          accu, ixheaac_mult64(inp1[n + 4 * num_band_anal_qmf],
551
138M
                                p_qmf1[2 * (n + 4 * num_band_anal_qmf)]));
552
138M
      accu = ixheaac_add64(
553
138M
          accu, ixheaac_mult64(inp1[n + 6 * num_band_anal_qmf],
554
138M
                                p_qmf1[2 * (n + 6 * num_band_anal_qmf)]));
555
138M
      accu = ixheaac_add64(
556
138M
          accu, ixheaac_mult64(inp1[n + 8 * num_band_anal_qmf],
557
138M
                                p_qmf1[2 * (n + 8 * num_band_anal_qmf)]));
558
138M
      p_out[n] = (WORD32)(accu >> 31);
559
560
138M
      accu = ixheaac_mult64(inp1[n + 1 + 0], p_qmf1[2 * (n + 1 + 0)]);
561
138M
      accu = ixheaac_add64(
562
138M
          accu, ixheaac_mult64(inp1[n + 1 + 2 * num_band_anal_qmf],
563
138M
                                p_qmf1[2 * (n + 1 + 2 * num_band_anal_qmf)]));
564
138M
      accu = ixheaac_add64(
565
138M
          accu, ixheaac_mult64(inp1[n + 1 + 4 * num_band_anal_qmf],
566
138M
                                p_qmf1[2 * (n + 1 + 4 * num_band_anal_qmf)]));
567
138M
      accu = ixheaac_add64(
568
138M
          accu, ixheaac_mult64(inp1[n + 1 + 6 * num_band_anal_qmf],
569
138M
                                p_qmf1[2 * (n + 1 + 6 * num_band_anal_qmf)]));
570
138M
      accu = ixheaac_add64(
571
138M
          accu, ixheaac_mult64(inp1[n + 1 + 8 * num_band_anal_qmf],
572
138M
                                p_qmf1[2 * (n + 1 + 8 * num_band_anal_qmf)]));
573
138M
      p_out[n + 1] = (WORD32)(accu >> 31);
574
575
138M
      accu = ixheaac_mult64(inp2[n + 0], p_qmf2[2 * (n + 0)]);
576
138M
      accu = ixheaac_add64(
577
138M
          accu, ixheaac_mult64(inp2[n + 2 * num_band_anal_qmf],
578
138M
                                p_qmf2[2 * (n + 2 * num_band_anal_qmf)]));
579
138M
      accu = ixheaac_add64(
580
138M
          accu, ixheaac_mult64(inp2[n + 4 * num_band_anal_qmf],
581
138M
                                p_qmf2[2 * (n + 4 * num_band_anal_qmf)]));
582
138M
      accu = ixheaac_add64(
583
138M
          accu, ixheaac_mult64(inp2[n + 6 * num_band_anal_qmf],
584
138M
                                p_qmf2[2 * (n + 6 * num_band_anal_qmf)]));
585
138M
      accu = ixheaac_add64(
586
138M
          accu, ixheaac_mult64(inp2[n + 8 * num_band_anal_qmf],
587
138M
                                p_qmf2[2 * (n + 8 * num_band_anal_qmf)]));
588
138M
      p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31);
589
590
138M
      accu = ixheaac_mult64(inp2[n + 1 + 0], p_qmf2[2 * (n + 1 + 0)]);
591
138M
      accu = ixheaac_add64(
592
138M
          accu, ixheaac_mult64(inp2[n + 1 + 2 * num_band_anal_qmf],
593
138M
                                p_qmf2[2 * (n + 1 + 2 * num_band_anal_qmf)]));
594
138M
      accu = ixheaac_add64(
595
138M
          accu, ixheaac_mult64(inp2[n + 1 + 4 * num_band_anal_qmf],
596
138M
                                p_qmf2[2 * (n + 1 + 4 * num_band_anal_qmf)]));
597
138M
      accu = ixheaac_add64(
598
138M
          accu, ixheaac_mult64(inp2[n + 1 + 6 * num_band_anal_qmf],
599
138M
                                p_qmf2[2 * (n + 1 + 6 * num_band_anal_qmf)]));
600
138M
      accu = ixheaac_add64(
601
138M
          accu, ixheaac_mult64(inp2[n + 1 + 8 * num_band_anal_qmf],
602
138M
                                p_qmf2[2 * (n + 1 + 8 * num_band_anal_qmf)]));
603
138M
      p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31);
604
138M
    }
605
8.62M
  } else if (num_band_anal_qmf == 24) {
606
14.1M
    for (n = 0; n < num_band_anal_qmf; n += 2) {
607
13.1M
      accu = ixheaac_mult64(inp1[n + 0], p_qmf1[(n + 0)]);
608
13.1M
      accu = ixheaac_add64(
609
13.1M
          accu, ixheaac_mult64(inp1[n + 2 * num_band_anal_qmf],
610
13.1M
                                p_qmf1[(n + 2 * num_band_anal_qmf)]));
611
13.1M
      accu = ixheaac_add64(
612
13.1M
          accu, ixheaac_mult64(inp1[n + 4 * num_band_anal_qmf],
613
13.1M
                                p_qmf1[(n + 4 * num_band_anal_qmf)]));
614
13.1M
      accu = ixheaac_add64(
615
13.1M
          accu, ixheaac_mult64(inp1[n + 6 * num_band_anal_qmf],
616
13.1M
                                p_qmf1[(n + 6 * num_band_anal_qmf)]));
617
13.1M
      accu = ixheaac_add64(
618
13.1M
          accu, ixheaac_mult64(inp1[n + 8 * num_band_anal_qmf],
619
13.1M
                                p_qmf1[(n + 8 * num_band_anal_qmf)]));
620
13.1M
      p_out[n] = (WORD32)(accu >> 31);
621
622
13.1M
      accu = ixheaac_mult64(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)]);
623
13.1M
      accu = ixheaac_add64(
624
13.1M
          accu, ixheaac_mult64(inp1[n + 1 + 2 * num_band_anal_qmf],
625
13.1M
                                p_qmf1[(n + 1 + 2 * num_band_anal_qmf)]));
626
13.1M
      accu = ixheaac_add64(
627
13.1M
          accu, ixheaac_mult64(inp1[n + 1 + 4 * num_band_anal_qmf],
628
13.1M
                                p_qmf1[(n + 1 + 4 * num_band_anal_qmf)]));
629
13.1M
      accu = ixheaac_add64(
630
13.1M
          accu, ixheaac_mult64(inp1[n + 1 + 6 * num_band_anal_qmf],
631
13.1M
                                p_qmf1[(n + 1 + 6 * num_band_anal_qmf)]));
632
13.1M
      accu = ixheaac_add64(
633
13.1M
          accu, ixheaac_mult64(inp1[n + 1 + 8 * num_band_anal_qmf],
634
13.1M
                                p_qmf1[(n + 1 + 8 * num_band_anal_qmf)]));
635
13.1M
      p_out[n + 1] = (WORD32)(accu >> 31);
636
637
13.1M
      accu = ixheaac_mult64(inp2[n + 0], p_qmf2[(n + 0)]);
638
13.1M
      accu = ixheaac_add64(
639
13.1M
          accu, ixheaac_mult64(inp2[n + 2 * num_band_anal_qmf],
640
13.1M
                                p_qmf2[(n + 2 * num_band_anal_qmf)]));
641
13.1M
      accu = ixheaac_add64(
642
13.1M
          accu, ixheaac_mult64(inp2[n + 4 * num_band_anal_qmf],
643
13.1M
                                p_qmf2[(n + 4 * num_band_anal_qmf)]));
644
13.1M
      accu = ixheaac_add64(
645
13.1M
          accu, ixheaac_mult64(inp2[n + 6 * num_band_anal_qmf],
646
13.1M
                                p_qmf2[(n + 6 * num_band_anal_qmf)]));
647
13.1M
      accu = ixheaac_add64(
648
13.1M
          accu, ixheaac_mult64(inp2[n + 8 * num_band_anal_qmf],
649
13.1M
                                p_qmf2[(n + 8 * num_band_anal_qmf)]));
650
13.1M
      p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31);
651
652
13.1M
      accu = ixheaac_mult64(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)]);
653
13.1M
      accu = ixheaac_add64(
654
13.1M
          accu, ixheaac_mult64(inp2[n + 1 + 2 * num_band_anal_qmf],
655
13.1M
                                p_qmf2[(n + 1 + 2 * num_band_anal_qmf)]));
656
13.1M
      accu = ixheaac_add64(
657
13.1M
          accu, ixheaac_mult64(inp2[n + 1 + 4 * num_band_anal_qmf],
658
13.1M
                                p_qmf2[(n + 1 + 4 * num_band_anal_qmf)]));
659
13.1M
      accu = ixheaac_add64(
660
13.1M
          accu, ixheaac_mult64(inp2[n + 1 + 6 * num_band_anal_qmf],
661
13.1M
                                p_qmf2[(n + 1 + 6 * num_band_anal_qmf)]));
662
13.1M
      accu = ixheaac_add64(
663
13.1M
          accu, ixheaac_mult64(inp2[n + 1 + 8 * num_band_anal_qmf],
664
13.1M
                                p_qmf2[(n + 1 + 8 * num_band_anal_qmf)]));
665
13.1M
      p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31);
666
13.1M
    }
667
668
2.87M
  } else {
669
25.8M
    for (n = 0; n < num_band_anal_qmf; n += 2) {
670
22.9M
      accu = ixheaac_mult64(inp1[n + 0], p_qmf1[4 * (n + 0)]);
671
22.9M
      accu = ixheaac_add64(
672
22.9M
          accu, ixheaac_mult64(inp1[n + 2 * num_band_anal_qmf],
673
22.9M
                                p_qmf1[4 * (n + 2 * num_band_anal_qmf)]));
674
22.9M
      accu = ixheaac_add64(
675
22.9M
          accu, ixheaac_mult64(inp1[n + 4 * num_band_anal_qmf],
676
22.9M
                                p_qmf1[4 * (n + 4 * num_band_anal_qmf)]));
677
22.9M
      accu = ixheaac_add64(
678
22.9M
          accu, ixheaac_mult64(inp1[n + 6 * num_band_anal_qmf],
679
22.9M
                                p_qmf1[4 * (n + 6 * num_band_anal_qmf)]));
680
22.9M
      accu = ixheaac_add64(
681
22.9M
          accu, ixheaac_mult64(inp1[n + 8 * num_band_anal_qmf],
682
22.9M
                                p_qmf1[4 * (n + 8 * num_band_anal_qmf)]));
683
22.9M
      p_out[n] = (WORD32)(accu >> 31);
684
685
22.9M
      accu = ixheaac_mult64(inp1[n + 1 + 0], p_qmf1[4 * (n + 1 + 0)]);
686
22.9M
      accu = ixheaac_add64(
687
22.9M
          accu, ixheaac_mult64(inp1[n + 1 + 2 * num_band_anal_qmf],
688
22.9M
                                p_qmf1[4 * (n + 1 + 2 * num_band_anal_qmf)]));
689
22.9M
      accu = ixheaac_add64(
690
22.9M
          accu, ixheaac_mult64(inp1[n + 1 + 4 * num_band_anal_qmf],
691
22.9M
                                p_qmf1[4 * (n + 1 + 4 * num_band_anal_qmf)]));
692
22.9M
      accu = ixheaac_add64(
693
22.9M
          accu, ixheaac_mult64(inp1[n + 1 + 6 * num_band_anal_qmf],
694
22.9M
                                p_qmf1[4 * (n + 1 + 6 * num_band_anal_qmf)]));
695
22.9M
      accu = ixheaac_add64(
696
22.9M
          accu, ixheaac_mult64(inp1[n + 1 + 8 * num_band_anal_qmf],
697
22.9M
                                p_qmf1[4 * (n + 1 + 8 * num_band_anal_qmf)]));
698
22.9M
      p_out[n + 1] = (WORD32)(accu >> 31);
699
700
22.9M
      accu = ixheaac_mult64(inp2[n + 0], p_qmf2[4 * (n + 0)]);
701
22.9M
      accu = ixheaac_add64(
702
22.9M
          accu, ixheaac_mult64(inp2[n + 2 * num_band_anal_qmf],
703
22.9M
                                p_qmf2[4 * (n + 2 * num_band_anal_qmf)]));
704
22.9M
      accu = ixheaac_add64(
705
22.9M
          accu, ixheaac_mult64(inp2[n + 4 * num_band_anal_qmf],
706
22.9M
                                p_qmf2[4 * (n + 4 * num_band_anal_qmf)]));
707
22.9M
      accu = ixheaac_add64(
708
22.9M
          accu, ixheaac_mult64(inp2[n + 6 * num_band_anal_qmf],
709
22.9M
                                p_qmf2[4 * (n + 6 * num_band_anal_qmf)]));
710
22.9M
      accu = ixheaac_add64(
711
22.9M
          accu, ixheaac_mult64(inp2[n + 8 * num_band_anal_qmf],
712
22.9M
                                p_qmf2[4 * (n + 8 * num_band_anal_qmf)]));
713
22.9M
      p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31);
714
715
22.9M
      accu = ixheaac_mult64(inp2[n + 1 + 0], p_qmf2[4 * (n + 1 + 0)]);
716
22.9M
      accu = ixheaac_add64(
717
22.9M
          accu, ixheaac_mult64(inp2[n + 1 + 2 * num_band_anal_qmf],
718
22.9M
                                p_qmf2[4 * (n + 1 + 2 * num_band_anal_qmf)]));
719
22.9M
      accu = ixheaac_add64(
720
22.9M
          accu, ixheaac_mult64(inp2[n + 1 + 4 * num_band_anal_qmf],
721
22.9M
                                p_qmf2[4 * (n + 1 + 4 * num_band_anal_qmf)]));
722
22.9M
      accu = ixheaac_add64(
723
22.9M
          accu, ixheaac_mult64(inp2[n + 1 + 6 * num_band_anal_qmf],
724
22.9M
                                p_qmf2[4 * (n + 1 + 6 * num_band_anal_qmf)]));
725
22.9M
      accu = ixheaac_add64(
726
22.9M
          accu, ixheaac_mult64(inp2[n + 1 + 8 * num_band_anal_qmf],
727
22.9M
                                p_qmf2[4 * (n + 1 + 8 * num_band_anal_qmf)]));
728
22.9M
      p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31);
729
22.9M
    }
730
2.87M
  }
731
12.5M
}
732
733
VOID ixheaacd_esbr_inv_modulation(
734
    WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf,
735
6.76M
    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 no_synthesis_channels) {
736
737
6.76M
    if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
738
9.23k
    {
739
9.23k
      ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_16,
740
9.23k
        qmf_dec_tables_ptr->dig_rev_table4_16);
741
9.23k
    }
742
6.75M
    else
743
6.75M
    {
744
6.75M
      ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_32,
745
6.75M
        qmf_dec_tables_ptr->dig_rev_table2_32);
746
6.75M
    }
747
6.76M
}
748
749
VOID ixheaacd_sbr_qmfsyn32_winadd(WORD16 *tmp1, WORD16 *tmp2, WORD16 *inp1,
750
                                  WORD16 *sample_buffer, FLAG shift,
751
525k
                                  WORD32 ch_fac) {
752
525k
  WORD32 k;
753
525k
  WORD32 rounding_fac = 0x8000;
754
525k
  rounding_fac = rounding_fac >> shift;
755
756
17.3M
  for (k = 0; k < 32; k++) {
757
16.8M
    WORD32 syn_out = rounding_fac;
758
759
16.8M
    syn_out = ixheaac_add32(
760
16.8M
        syn_out, ixheaac_mult16x16in32(tmp1[0 + k], inp1[2 * (k + 0)]));
761
16.8M
    syn_out = ixheaac_add32(
762
16.8M
        syn_out, ixheaac_mult16x16in32(tmp1[128 + k], inp1[2 * (k + 64)]));
763
16.8M
    syn_out = ixheaac_add32(
764
16.8M
        syn_out, ixheaac_mult16x16in32(tmp1[256 + k], inp1[2 * (k + 128)]));
765
16.8M
    syn_out = ixheaac_add32(
766
16.8M
        syn_out, ixheaac_mult16x16in32(tmp1[384 + k], inp1[2 * (k + 192)]));
767
16.8M
    syn_out = ixheaac_add32(
768
16.8M
        syn_out, ixheaac_mult16x16in32(tmp1[512 + k], inp1[2 * (k + 256)]));
769
770
16.8M
    syn_out = ixheaac_add32(
771
16.8M
        syn_out, ixheaac_mult16x16in32(tmp2[64 + k], inp1[2 * (k + 32)]));
772
16.8M
    syn_out = ixheaac_add32(
773
16.8M
        syn_out, ixheaac_mult16x16in32(tmp2[192 + k], inp1[2 * (k + 96)]));
774
16.8M
    syn_out = ixheaac_add32(
775
16.8M
        syn_out, ixheaac_mult16x16in32(tmp2[320 + k], inp1[2 * (k + 160)]));
776
16.8M
    syn_out = ixheaac_add32(
777
16.8M
        syn_out, ixheaac_mult16x16in32(tmp2[448 + k], inp1[2 * (k + 224)]));
778
16.8M
    syn_out = ixheaac_add32(
779
16.8M
        syn_out, ixheaac_mult16x16in32(tmp2[576 + k], inp1[2 * (k + 288)]));
780
16.8M
    syn_out = ixheaac_add32_sat(syn_out, syn_out);
781
16.8M
    if (shift == 2) {
782
16.8M
      syn_out = ixheaac_add32_sat(syn_out, syn_out);
783
16.8M
    }
784
16.8M
    sample_buffer[ch_fac * k] = (syn_out >> 16);
785
16.8M
  }
786
525k
}
787
788
void ixheaacd_sbr_pre_twiddle(WORD32 *p_xre, WORD32 *p_xim,
789
915k
                              WORD16 *p_twiddles) {
790
915k
  int k;
791
792
58.5M
  for (k = 62; k >= 0; k--) {
793
57.6M
    WORD32 x_re = *p_xre;
794
57.6M
    WORD32 x_im = *p_xim;
795
796
57.6M
    WORD16 ixheaacd_cosine = *p_twiddles++;
797
57.6M
    WORD16 ixheaacd_sine = *p_twiddles++;
798
799
57.6M
    WORD32 re, im;
800
801
57.6M
    re = ixheaac_mac32x16in32_shl_sat(
802
57.6M
        ixheaac_mult32x16in32_shl(x_re, ixheaacd_cosine), x_im, ixheaacd_sine);
803
57.6M
    im = ixheaac_sub32_sat(ixheaac_mult32x16in32_shl(x_im, ixheaacd_cosine),
804
57.6M
                            ixheaac_mult32x16in32_shl(x_re, ixheaacd_sine));
805
806
57.6M
    *p_xre++ = re;
807
57.6M
    *p_xim++ = im;
808
57.6M
  }
809
915k
}
810
811
VOID ixheaacd_cplx_synt_qmffilt(
812
    WORD32 **qmf_real, WORD32 **qmf_imag, WORD32 split,
813
    WORD32 *qmf_real_out[MAX_ENV_COLS], WORD32 *qmf_imag_out[MAX_ENV_COLS],
814
    ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 *time_out,
815
    ia_sbr_qmf_filter_bank_struct *qmf_bank, ia_ps_dec_struct *ptr_ps_dec,
816
    FLAG active, FLAG low_pow_flag, ia_sbr_tables_struct *sbr_tables_ptr,
817
    ixheaacd_misc_tables *pstr_common_tables, WORD32 ch_fac, FLAG drc_on,
818
58.8k
    WORD32 drc_sbr_factors[][64], WORD32 audio_object_type) {
819
58.8k
  WORD32 i, j;
820
821
58.8k
  WORD32 code_scale_factor;
822
58.8k
  WORD32 scale_factor;
823
58.8k
  WORD32 out_scale_factor;
824
58.8k
  WORD32 low_band_scale_factor;
825
58.8k
  WORD32 high_band_scale_factor;
826
58.8k
  WORD16 *filter_states = qmf_bank->filter_states;
827
58.8k
  WORD32 **ptr_qmf_imag_temp;
828
58.8k
  WORD32 qmf_real2[2 * NO_SYNTHESIS_CHANNELS];
829
830
58.8k
  WORD32 no_synthesis_channels = qmf_bank->no_channels;
831
58.8k
  WORD32 p1;
832
833
58.8k
  WORD16 *fp1;
834
58.8k
  WORD16 *fp2;
835
836
58.8k
  WORD32 sixty4 = NO_SYNTHESIS_CHANNELS;
837
58.8k
  WORD32 thirty2 = qmf_bank->no_channels;
838
839
58.8k
  WORD16 *filter_coeff;
840
58.8k
  WORD32 num_time_slots = qmf_bank->num_time_slots;
841
58.8k
  WORD32 ixheaacd_drc_offset;
842
58.8k
  WORD32 ov_lb_scale = sbr_scale_factor->ov_lb_scale;
843
58.8k
  WORD32 lb_scale = sbr_scale_factor->lb_scale;
844
58.8k
  WORD32 st_syn_scale = sbr_scale_factor->st_syn_scale;
845
58.8k
  WORD32 ov_lb_shift, lb_shift, hb_shift;
846
847
58.8k
  WORD32 *qmf_real_tmp = qmf_real2;
848
58.8k
  WORD32 *qmf_imag_tmp = &qmf_real2[NO_SYNTHESIS_CHANNELS];
849
58.8k
  WORD32 env = 0;
850
851
58.8k
  WORD32 common_shift = 0;
852
853
58.8k
  if (no_synthesis_channels == 32) {
854
33.7k
    qmf_bank->cos_twiddle =
855
33.7k
        (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
856
33.7k
    qmf_bank->alt_sin_twiddle =
857
33.7k
        (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
858
33.7k
    qmf_bank->t_cos =
859
33.7k
        (WORD16 *)
860
33.7k
            sbr_tables_ptr->qmf_dec_tables_ptr->sbr_cos_sin_twiddle_ds_l32;
861
33.7k
  } else {
862
25.0k
    qmf_bank->cos_twiddle =
863
25.0k
        (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64;
864
25.0k
    qmf_bank->alt_sin_twiddle =
865
25.0k
        (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64;
866
25.0k
  }
867
58.8k
  if (audio_object_type != AOT_ER_AAC_ELD &&
868
58.8k
      audio_object_type != AOT_ER_AAC_LD) {
869
0
    qmf_bank->filter_pos_syn +=
870
0
        (sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c - qmf_bank->p_filter);
871
0
    qmf_bank->p_filter = sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c;
872
58.8k
  } else {
873
58.8k
    qmf_bank->filter_pos_syn +=
874
58.8k
        (sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c_eld - qmf_bank->p_filter);
875
58.8k
    qmf_bank->p_filter = sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c_eld;
876
58.8k
  }
877
878
58.8k
  fp1 = &filter_states[0];
879
58.8k
  fp2 = fp1 + no_synthesis_channels;
880
881
58.8k
  if (audio_object_type == AOT_ER_AAC_ELD ||
882
58.8k
      audio_object_type == AOT_ER_AAC_LD) {
883
58.8k
    fp1 = qmf_bank->fp1_syn;
884
58.8k
    fp2 = qmf_bank->fp2_syn;
885
58.8k
    sixty4 = qmf_bank->sixty4;
886
58.8k
  }
887
888
58.8k
  filter_coeff = qmf_bank->filter_pos_syn;
889
890
58.8k
  if (active) {
891
0
    code_scale_factor = scale_factor = sbr_scale_factor->ps_scale;
892
58.8k
  } else {
893
58.8k
    code_scale_factor = ixheaac_min32(lb_scale, ov_lb_scale);
894
58.8k
    scale_factor = sbr_scale_factor->hb_scale;
895
58.8k
  }
896
897
58.8k
  low_band_scale_factor = (st_syn_scale - code_scale_factor);
898
58.8k
  high_band_scale_factor = (st_syn_scale - scale_factor);
899
900
58.8k
  p1 = 0;
901
902
58.8k
  if (low_pow_flag)
903
904
0
  {
905
0
    ov_lb_shift = (st_syn_scale - ov_lb_scale) - 4;
906
0
    lb_shift = (st_syn_scale - lb_scale) - 4;
907
0
    hb_shift = high_band_scale_factor - 4;
908
0
    out_scale_factor = -((sbr_scale_factor->st_syn_scale - 1));
909
0
    ptr_qmf_imag_temp = 0;
910
911
0
  }
912
913
58.8k
  else {
914
58.8k
    out_scale_factor = -((sbr_scale_factor->st_syn_scale - 3));
915
58.8k
    if (active) {
916
0
      ov_lb_shift = (sbr_scale_factor->ps_scale - ov_lb_scale);
917
0
      lb_shift = (sbr_scale_factor->ps_scale - lb_scale);
918
0
      hb_shift = (sbr_scale_factor->ps_scale - sbr_scale_factor->hb_scale);
919
0
      common_shift = low_band_scale_factor - 8;
920
921
58.8k
    } else {
922
58.8k
      if (audio_object_type != AOT_ER_AAC_ELD &&
923
58.8k
          audio_object_type != AOT_ER_AAC_LD) {
924
0
        ov_lb_shift = (st_syn_scale - ov_lb_scale) - 8;
925
0
        lb_shift = (st_syn_scale - lb_scale) - 8;
926
0
        hb_shift = high_band_scale_factor - 8;
927
58.8k
      } else {
928
58.8k
        ov_lb_shift = (st_syn_scale - ov_lb_scale) - 7;
929
58.8k
        lb_shift = (st_syn_scale - lb_scale) - 7;
930
58.8k
        hb_shift = high_band_scale_factor - 7;
931
58.8k
      }
932
58.8k
      common_shift = 0;
933
58.8k
    }
934
58.8k
    ptr_qmf_imag_temp = qmf_imag;
935
58.8k
  }
936
937
58.8k
  {
938
58.8k
    if (ov_lb_shift == lb_shift) {
939
58.8k
      (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb, 0,
940
58.8k
                               num_time_slots, ov_lb_shift, low_pow_flag);
941
942
58.8k
    } else {
943
0
      (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb, 0,
944
0
                               split, ov_lb_shift, low_pow_flag);
945
946
0
      (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb,
947
0
                               split, num_time_slots, lb_shift, low_pow_flag);
948
0
    }
949
950
58.8k
    (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, qmf_bank->lsb,
951
58.8k
                             qmf_bank->usb, 0, num_time_slots, hb_shift,
952
58.8k
                             low_pow_flag);
953
58.8k
  }
954
955
58.8k
  ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
956
957
58.8k
  if (1 == drc_on) {
958
914k
    for (i = 0; i < num_time_slots; i++) {
959
859k
      WORD32 loop_val;
960
55.8M
      for (loop_val = 0; loop_val < 64; loop_val++) {
961
55.0M
        qmf_real[i][loop_val] = ixheaacd_mult32x32in32_shift25(
962
55.0M
            qmf_real[i][loop_val], drc_sbr_factors[6 + i][loop_val]);
963
55.0M
      }
964
859k
    }
965
55.2k
  }
966
974k
  for (i = 0; i < num_time_slots; i++)
967
915k
  {
968
42.6M
    for (j = 0; j < no_synthesis_channels; j++)
969
41.7M
    {
970
41.7M
      qmf_real_out[i][j] = qmf_real[i][j];
971
41.7M
      if (!low_pow_flag)
972
41.7M
      {
973
41.7M
        qmf_imag_out[i][j] = qmf_imag[i][j];
974
41.7M
      }
975
41.7M
    }
976
915k
  }
977
58.8k
  if (low_pow_flag)
978
0
  {
979
0
    WORD16 *fptemp;
980
981
0
    VOID(*sbr_qmf_syn_winadd)
982
0
    (WORD16 *, WORD16 *, WORD16 *, WORD16 *, FLAG, WORD32);
983
0
    ia_qmf_dec_tables_struct *qmf_tab_ptr = sbr_tables_ptr->qmf_dec_tables_ptr;
984
985
0
    if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
986
0
      sbr_qmf_syn_winadd = ixheaacd_sbr_qmfsyn32_winadd;
987
0
    else
988
0
      sbr_qmf_syn_winadd = ixheaacd_sbr_qmfsyn64_winadd;
989
990
0
    for (i = 0; i < num_time_slots; i++) {
991
0
      ixheaacd_inv_modulation_lp(qmf_real[i],
992
0
                                 &filter_states[ixheaacd_drc_offset], qmf_bank,
993
0
                                 qmf_tab_ptr);
994
995
0
      sbr_qmf_syn_winadd(fp1, fp2, filter_coeff, &time_out[ch_fac * p1], 2,
996
0
                         ch_fac);
997
998
0
      ixheaacd_drc_offset -= no_synthesis_channels << 1;
999
1000
0
      if (ixheaacd_drc_offset < 0)
1001
0
        ixheaacd_drc_offset += ((no_synthesis_channels << 1) * 10);
1002
1003
0
      fptemp = fp1;
1004
0
      fp1 = fp2;
1005
0
      fp2 = fptemp;
1006
1007
0
      filter_coeff += 64;
1008
1009
0
      if (filter_coeff == qmf_bank->p_filter + 640)
1010
0
        filter_coeff = (WORD16 *)qmf_bank->p_filter;
1011
1012
0
      p1 += no_synthesis_channels;
1013
0
    }
1014
1015
58.8k
  } else {
1016
974k
    for (i = 0; i < num_time_slots; i++) {
1017
915k
      WORD32 *t_qmf_imag;
1018
915k
      t_qmf_imag = qmf_imag[i];
1019
1020
915k
      if (active) {
1021
0
        if (i == ptr_ps_dec->border_position[env]) {
1022
0
          ixheaacd_init_rot_env(ptr_ps_dec, (WORD16)env, qmf_bank->usb,
1023
0
                                sbr_tables_ptr, pstr_common_tables->trig_data);
1024
0
          env++;
1025
0
        }
1026
1027
0
        ixheaacd_apply_ps(ptr_ps_dec, &qmf_real[i], &qmf_imag[i], qmf_real_tmp,
1028
0
                          qmf_imag_tmp, sbr_scale_factor, (WORD16)i,
1029
0
                          sbr_tables_ptr, num_time_slots);
1030
0
      }
1031
915k
      if (1 == drc_on) {
1032
859k
        WORD32 loop_val;
1033
55.8M
        for (loop_val = 0; loop_val < 64; loop_val++) {
1034
55.0M
          qmf_real[i][loop_val] = ixheaacd_mult32x32in32_shift25(
1035
55.0M
              qmf_real[i][loop_val], drc_sbr_factors[6 + i][loop_val]);
1036
55.0M
        }
1037
859k
      }
1038
1039
915k
      if (active) {
1040
0
        if (common_shift)
1041
0
          ixheaacd_shiftrountine(qmf_real[i], t_qmf_imag, no_synthesis_channels,
1042
0
                                 common_shift);
1043
0
      }
1044
1045
915k
      if (audio_object_type == AOT_ER_AAC_ELD ||
1046
915k
          audio_object_type == AOT_ER_AAC_LD)
1047
915k
        ixheaacd_sbr_pre_twiddle(
1048
915k
            qmf_real[i], t_qmf_imag,
1049
915k
            sbr_tables_ptr->qmf_dec_tables_ptr->ixheaacd_sbr_synth_cos_sin_l32);
1050
1051
915k
      ixheaacd_inv_emodulation(qmf_real[i], qmf_bank,
1052
915k
                               sbr_tables_ptr->qmf_dec_tables_ptr);
1053
1054
915k
      {
1055
915k
        WORD32 temp_out_scale_fac = out_scale_factor + 1;
1056
915k
        if (audio_object_type == AOT_ER_AAC_LD ||
1057
915k
            audio_object_type == AOT_ER_AAC_ELD) {
1058
915k
          temp_out_scale_fac = temp_out_scale_fac - 1;
1059
1060
915k
          ixheaacd_shiftrountine_with_rnd_eld(
1061
915k
              qmf_real[i], t_qmf_imag, &filter_states[ixheaacd_drc_offset],
1062
915k
              no_synthesis_channels, temp_out_scale_fac);
1063
1064
915k
        }
1065
1066
0
        else {
1067
0
          ixheaacd_shiftrountine_with_rnd(
1068
0
              qmf_real[i], t_qmf_imag, &filter_states[ixheaacd_drc_offset],
1069
0
              no_synthesis_channels, temp_out_scale_fac);
1070
0
        }
1071
915k
      }
1072
1073
915k
      if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) {
1074
525k
        WORD32 temp = 1;
1075
525k
        if (audio_object_type == AOT_ER_AAC_LD ||
1076
525k
            audio_object_type == AOT_ER_AAC_ELD) {
1077
525k
          temp = 2;
1078
525k
        }
1079
525k
        ixheaacd_sbr_qmfsyn32_winadd(fp1, fp2, filter_coeff,
1080
525k
                                     &time_out[ch_fac * p1], temp, ch_fac);
1081
1082
525k
        fp1 += thirty2;
1083
525k
        fp2 -= thirty2;
1084
525k
        thirty2 = -thirty2;
1085
1086
525k
        ixheaacd_drc_offset -= 64;
1087
1088
525k
        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640;
1089
1090
525k
      } else {
1091
389k
        WORD32 temp = 1;
1092
389k
        if (audio_object_type == AOT_ER_AAC_LD ||
1093
389k
            audio_object_type == AOT_ER_AAC_ELD) {
1094
389k
          temp = 2;
1095
389k
        }
1096
389k
        ixheaacd_sbr_qmfsyn64_winadd(fp1, fp2, filter_coeff,
1097
389k
                                     &time_out[ch_fac * p1], temp, ch_fac);
1098
1099
389k
        fp1 += sixty4;
1100
389k
        fp2 -= sixty4;
1101
389k
        sixty4 = -sixty4;
1102
389k
        ixheaacd_drc_offset -= 128;
1103
1104
389k
        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
1105
389k
      }
1106
1107
915k
      filter_coeff += 64;
1108
1109
915k
      if (filter_coeff == qmf_bank->p_filter + 640)
1110
88.2k
        filter_coeff = (WORD16 *)qmf_bank->p_filter;
1111
1112
915k
      p1 += no_synthesis_channels;
1113
1114
915k
      if (active)
1115
0
        memcpy(qmf_real[i], qmf_real_tmp,
1116
0
               2 * no_synthesis_channels * sizeof(WORD32));
1117
915k
    }
1118
58.8k
  }
1119
1120
58.8k
  if (audio_object_type == AOT_ER_AAC_LD ||
1121
58.8k
      audio_object_type == AOT_ER_AAC_ELD) {
1122
58.8k
    qmf_bank->fp1_syn = fp1;
1123
58.8k
    qmf_bank->fp2_syn = fp2;
1124
58.8k
    qmf_bank->sixty4 = sixty4;
1125
58.8k
  }
1126
1127
58.8k
  qmf_bank->filter_pos_syn = filter_coeff;
1128
58.8k
  qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset;
1129
58.8k
}