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