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