xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_lpfuncs.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 #include "ixheaacd_sbr_common.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker 
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_definitions.h"
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_payload.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
74*15dc779aSAndroid Build Coastguard Worker 
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
86*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
87*15dc779aSAndroid Build Coastguard Worker 
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns.h"
89*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_imdct.h"
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_multichannel.h"
92*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
93*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_process_win_seq(WORD32 * coef,WORD32 * prev,WORD32 * out,const WORD16 * window_long,const WORD16 * window_short,WORD16 q_shift,WORD16 ch_fac,WORD16 flag,WORD16 size_01)94*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD32 *out,
95*15dc779aSAndroid Build Coastguard Worker                               const WORD16 *window_long,
96*15dc779aSAndroid Build Coastguard Worker                               const WORD16 *window_short, WORD16 q_shift,
97*15dc779aSAndroid Build Coastguard Worker                               WORD16 ch_fac, WORD16 flag, WORD16 size_01) {
98*15dc779aSAndroid Build Coastguard Worker   WORD32 i, accu;
99*15dc779aSAndroid Build Coastguard Worker   WORD32 *coef_1;
100*15dc779aSAndroid Build Coastguard Worker   const WORD16 *temp_win_sh, *temp_win_long;
101*15dc779aSAndroid Build Coastguard Worker   WORD32 *out1, *out2;
102*15dc779aSAndroid Build Coastguard Worker   WORD32 *temp_prev;
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker   WORD16 size_07 = 7 * size_01;
105*15dc779aSAndroid Build Coastguard Worker   WORD16 size_08 = 8 * size_01;
106*15dc779aSAndroid Build Coastguard Worker   WORD16 size_09 = 9 * size_01;
107*15dc779aSAndroid Build Coastguard Worker   WORD16 size_14 = 14 * size_01;
108*15dc779aSAndroid Build Coastguard Worker   WORD16 size_15 = 15 * size_01;
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker   if (flag == 1) {
111*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < size_07; i++) {
112*15dc779aSAndroid Build Coastguard Worker       WORD32 temp1 = ixheaac_shl32_dir_sat_limit(
113*15dc779aSAndroid Build Coastguard Worker           ixheaac_mult32x16in32(coef[size_08 + i], window_long[2 * i]),
114*15dc779aSAndroid Build Coastguard Worker           (q_shift + 1));
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_add32_sat(temp1, ((WORD32)prev[i] << 16));
117*15dc779aSAndroid Build Coastguard Worker       out[ch_fac * i] = accu;
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_shl32_dir_sat_limit(
120*15dc779aSAndroid Build Coastguard Worker           ixheaac_mult32x16in32(-(coef[size_15 - 1 - i]),
121*15dc779aSAndroid Build Coastguard Worker                                  window_long[2 * (size_07 - i) - 1]),
122*15dc779aSAndroid Build Coastguard Worker           q_shift);
123*15dc779aSAndroid Build Coastguard Worker       out[ch_fac * (i + size_09)] = (accu << 1);
124*15dc779aSAndroid Build Coastguard Worker     }
125*15dc779aSAndroid Build Coastguard Worker 
126*15dc779aSAndroid Build Coastguard Worker     temp_win_sh = &(window_short[0]);
127*15dc779aSAndroid Build Coastguard Worker     coef_1 = &(coef[size_15]);
128*15dc779aSAndroid Build Coastguard Worker     temp_win_long = &(window_long[size_14]);
129*15dc779aSAndroid Build Coastguard Worker     temp_prev = &(prev[size_08 - 1]);
130*15dc779aSAndroid Build Coastguard Worker     out1 = &(out[ch_fac * (size_07)]);
131*15dc779aSAndroid Build Coastguard Worker     out2 = &(out[ch_fac * (size_09 - 1)]);
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker   } else {
134*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < size_07; i++) {
135*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_mult32x16in32_sat(
136*15dc779aSAndroid Build Coastguard Worker           prev[size_08 - 1 - i], ixheaac_negate16(window_long[2 * i + 1]));
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker       out[ch_fac * i] = accu;
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
141*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_dir_sat_limit(-(coef[size_15 - 1 - i]), (q_shift - 1)),
142*15dc779aSAndroid Build Coastguard Worker           ixheaac_mult32x16in32_sat(prev[i + size_01],
143*15dc779aSAndroid Build Coastguard Worker                                      window_long[2 * size_07 - 2 - 2 * i]));
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker       out[ch_fac * (size_09 + i)] = accu;
146*15dc779aSAndroid Build Coastguard Worker     }
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker     temp_win_sh = &(window_long[size_14]);
149*15dc779aSAndroid Build Coastguard Worker     coef_1 = &(coef[size_15]);
150*15dc779aSAndroid Build Coastguard Worker     temp_win_long = &(window_short[0]);
151*15dc779aSAndroid Build Coastguard Worker     temp_prev = &(prev[size_01 - 1]);
152*15dc779aSAndroid Build Coastguard Worker     out1 = &(out[ch_fac * (size_07)]);
153*15dc779aSAndroid Build Coastguard Worker     out2 = &(out[ch_fac * (size_09 - 1)]);
154*15dc779aSAndroid Build Coastguard Worker   }
155*15dc779aSAndroid Build Coastguard Worker 
156*15dc779aSAndroid Build Coastguard Worker   for (i = size_01 - 1; i >= 0; i--) {
157*15dc779aSAndroid Build Coastguard Worker     WORD32 temp_coef = *coef_1++;
158*15dc779aSAndroid Build Coastguard Worker     WORD16 win1 = *temp_win_long++;
159*15dc779aSAndroid Build Coastguard Worker     WORD16 win2 = *temp_win_long++;
160*15dc779aSAndroid Build Coastguard Worker     WORD32 prev1 = *temp_prev--;
161*15dc779aSAndroid Build Coastguard Worker     WORD16 win4 = *temp_win_sh++;
162*15dc779aSAndroid Build Coastguard Worker     WORD16 win3 = *temp_win_sh++;
163*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
164*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_dir_sat_limit(ixheaac_mult32x16in32(temp_coef, win1),
165*15dc779aSAndroid Build Coastguard Worker                                      q_shift),
166*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_sat(prev1, win3));
167*15dc779aSAndroid Build Coastguard Worker     *out1 = accu << flag;
168*15dc779aSAndroid Build Coastguard Worker     out1 += ch_fac;
169*15dc779aSAndroid Build Coastguard Worker 
170*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
171*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_dir_sat_limit(
172*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(ixheaac_negate32_sat(temp_coef), win2),
173*15dc779aSAndroid Build Coastguard Worker             q_shift),
174*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_sat(prev1, win4));
175*15dc779aSAndroid Build Coastguard Worker     *out2 = accu << flag;
176*15dc779aSAndroid Build Coastguard Worker     out2 -= ch_fac;
177*15dc779aSAndroid Build Coastguard Worker   }
178*15dc779aSAndroid Build Coastguard Worker }
179*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_long_short_win_process(WORD32 * current,WORD32 * prev,WORD32 * out,const WORD16 * short_window,const WORD16 * long_window_prev,WORD16 q_shift,WORD16 ch_fac,WORD32 flag,WORD16 size_01)180*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID ixheaacd_long_short_win_process(
181*15dc779aSAndroid Build Coastguard Worker     WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window,
182*15dc779aSAndroid Build Coastguard Worker     const WORD16 *long_window_prev, WORD16 q_shift, WORD16 ch_fac,
183*15dc779aSAndroid Build Coastguard Worker     WORD32 flag, WORD16 size_01) {
184*15dc779aSAndroid Build Coastguard Worker 
185*15dc779aSAndroid Build Coastguard Worker   WORD16 size_02 = 2 * size_01;
186*15dc779aSAndroid Build Coastguard Worker   WORD16 size_03 = 3 * size_01;
187*15dc779aSAndroid Build Coastguard Worker   WORD i;
188*15dc779aSAndroid Build Coastguard Worker   WORD32 accu;
189*15dc779aSAndroid Build Coastguard Worker   WORD32 *current_tmp1 = &(current[(size_03 - 1)]);
190*15dc779aSAndroid Build Coastguard Worker   WORD32 *current_tmp2 = &(current[-size_01]);
191*15dc779aSAndroid Build Coastguard Worker   const WORD16 *short_ptr = &(short_window[size_02 - 1]);
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker   for (i = size_01 - 1; i >= 0; i--) {
194*15dc779aSAndroid Build Coastguard Worker     WORD32 tmp1_cur = *current_tmp1--;
195*15dc779aSAndroid Build Coastguard Worker     WORD32 tmp2_cur = *current_tmp2++;
196*15dc779aSAndroid Build Coastguard Worker     WORD16 short1 = *short_ptr--;
197*15dc779aSAndroid Build Coastguard Worker     WORD16 short2 = *short_ptr--;
198*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
199*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_dir_sat_limit((ixheaac_mult32x16in32(tmp1_cur, short2) -
200*15dc779aSAndroid Build Coastguard Worker                                       ixheaac_mult32x16in32(tmp2_cur, short1)),
201*15dc779aSAndroid Build Coastguard Worker                                      q_shift),
202*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_sat(prev[i], long_window_prev[0 - 2 - 2 * i]));
203*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * (0 + i)] = accu;
204*15dc779aSAndroid Build Coastguard Worker 
205*15dc779aSAndroid Build Coastguard Worker     if (flag) {
206*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
207*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_dir_sat_limit(
208*15dc779aSAndroid Build Coastguard Worker               (ixheaac_mult32x16in32(ixheaac_negate32_sat(tmp1_cur), short1) -
209*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16in32(tmp2_cur, short2)),
210*15dc779aSAndroid Build Coastguard Worker               q_shift),
211*15dc779aSAndroid Build Coastguard Worker           ixheaac_mult32x16in32_sat(prev[size_02 - 1 - i],
212*15dc779aSAndroid Build Coastguard Worker                                      long_window_prev[-2 * size_02 + 2 * i]));
213*15dc779aSAndroid Build Coastguard Worker       out[ch_fac * (size_02 - 1 - i)] = accu;
214*15dc779aSAndroid Build Coastguard Worker     }
215*15dc779aSAndroid Build Coastguard Worker   }
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_long_short_win_seq(WORD32 * current,WORD32 * prev,WORD32 * out,const WORD16 * short_window,const WORD16 * short_window_prev,const WORD16 * long_window_prev,WORD16 q_shift,WORD16 ch_fac,WORD16 size_01)218*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out,
219*15dc779aSAndroid Build Coastguard Worker                                  const WORD16 *short_window,
220*15dc779aSAndroid Build Coastguard Worker                                  const WORD16 *short_window_prev,
221*15dc779aSAndroid Build Coastguard Worker                                  const WORD16 *long_window_prev, WORD16 q_shift,
222*15dc779aSAndroid Build Coastguard Worker                                  WORD16 ch_fac, WORD16 size_01) {
223*15dc779aSAndroid Build Coastguard Worker 
224*15dc779aSAndroid Build Coastguard Worker   WORD16 size_02 = 2 * size_01;
225*15dc779aSAndroid Build Coastguard Worker   WORD16 size_06 = 6 * size_01;
226*15dc779aSAndroid Build Coastguard Worker   WORD16 size_07 = 7 * size_01;
227*15dc779aSAndroid Build Coastguard Worker   WORD16 size_08 = 8 * size_01;
228*15dc779aSAndroid Build Coastguard Worker   WORD16 size_09 = 9 * size_01;
229*15dc779aSAndroid Build Coastguard Worker   WORD16 size_10 = 10 * size_01;
230*15dc779aSAndroid Build Coastguard Worker   WORD16 size_16 = 16 * size_01;
231*15dc779aSAndroid Build Coastguard Worker 
232*15dc779aSAndroid Build Coastguard Worker   WORD32 i, flag;
233*15dc779aSAndroid Build Coastguard Worker   WORD32 accu;
234*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_07; i++) {
235*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_mult32x16in32_sat(
236*15dc779aSAndroid Build Coastguard Worker         prev[size_08 - 1 - i], ixheaac_negate16(long_window_prev[2 * i + 1]));
237*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * i] = accu;
238*15dc779aSAndroid Build Coastguard Worker   }
239*15dc779aSAndroid Build Coastguard Worker 
240*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_01; i++) {
241*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
242*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_dir_sat_limit(
243*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(current[size_01 + i],
244*15dc779aSAndroid Build Coastguard Worker                                    short_window_prev[2 * i]),
245*15dc779aSAndroid Build Coastguard Worker             q_shift),
246*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_sat(prev[size_01 - 1 - i],
247*15dc779aSAndroid Build Coastguard Worker                                    long_window_prev[2 * size_07 + 1 + 2 * i]));
248*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * (size_07 + i)] = accu;
249*15dc779aSAndroid Build Coastguard Worker   }
250*15dc779aSAndroid Build Coastguard Worker 
251*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_01; i++) {
252*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
253*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_dir_sat_limit(
254*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(ixheaac_negate32_sat(current[size_02 - 1 - i]),
255*15dc779aSAndroid Build Coastguard Worker                                    short_window_prev[size_02 - 2 * i - 1]),
256*15dc779aSAndroid Build Coastguard Worker             q_shift),
257*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_sat(prev[i],
258*15dc779aSAndroid Build Coastguard Worker                                    long_window_prev[size_16 - 2 - (2 * i)]));
259*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * (size_08 + i)] = accu;
260*15dc779aSAndroid Build Coastguard Worker   }
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker   flag = 1;
263*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 4; i++) {
264*15dc779aSAndroid Build Coastguard Worker     WORD32 inc = i * size_02;
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker     if (i == 3) {
267*15dc779aSAndroid Build Coastguard Worker       flag = 0;
268*15dc779aSAndroid Build Coastguard Worker     }
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker     ixheaacd_long_short_win_process(&current[size_01 + inc], &prev[size_01 + inc],
271*15dc779aSAndroid Build Coastguard Worker                                     &out[ch_fac * (size_09 + inc)], short_window,
272*15dc779aSAndroid Build Coastguard Worker                                     &long_window_prev[2 * (size_07 - inc)],
273*15dc779aSAndroid Build Coastguard Worker                                     q_shift, ch_fac, flag, size_01);
274*15dc779aSAndroid Build Coastguard Worker   }
275*15dc779aSAndroid Build Coastguard Worker 
276*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_01; i++) {
277*15dc779aSAndroid Build Coastguard Worker     accu = (ixheaac_mult32x16in32(-(current[size_10 - 1 - i]),
278*15dc779aSAndroid Build Coastguard Worker                                    short_window[size_02 - 2 * i - 1]) -
279*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(current[size_06 + i],
280*15dc779aSAndroid Build Coastguard Worker                                    short_window[size_02 - 2 * i - 2]));
281*15dc779aSAndroid Build Coastguard Worker     prev[i] =
282*15dc779aSAndroid Build Coastguard Worker         ixheaac_round16(ixheaac_shl32_dir_sat_limit(accu, (q_shift + 1)));
283*15dc779aSAndroid Build Coastguard Worker   }
284*15dc779aSAndroid Build Coastguard Worker }
285*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_nolap1_32(WORD32 * coef,WORD32 * out,WORD16 q_shift,WORD16 ch_fac,WORD16 size_01)286*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_nolap1_32(WORD32 *coef, WORD32 *out, WORD16 q_shift,
287*15dc779aSAndroid Build Coastguard Worker                         WORD16 ch_fac, WORD16 size_01) {
288*15dc779aSAndroid Build Coastguard Worker   WORD16 size_07 = 7 * size_01;
289*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
290*15dc779aSAndroid Build Coastguard Worker 
291*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_07; i++) {
292*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * i] = ixheaac_shr32_sat(
293*15dc779aSAndroid Build Coastguard Worker         ixheaac_negate32_sat(coef[size_07 - 1 - i]), 16 - q_shift);
294*15dc779aSAndroid Build Coastguard Worker   }
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_neg_shift_spec_dec(WORD32 * coef,WORD32 * out,WORD16 q_shift,WORD16 ch_fac)297*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
298*15dc779aSAndroid Build Coastguard Worker                                  WORD16 ch_fac) {
299*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
300*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < SIZE07; i++) {
301*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * i] = (ixheaac_shl32_dir_sat_limit(
302*15dc779aSAndroid Build Coastguard Worker         ixheaac_negate32_sat(coef[SIZE07 - 1 - i]), q_shift));
303*15dc779aSAndroid Build Coastguard Worker   }
304*15dc779aSAndroid Build Coastguard Worker }
305*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_Nolap_dec(WORD32 * coef,WORD32 * out,WORD16 q_shift,WORD16 ch_fac,WORD16 size_01)306*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_Nolap_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
307*15dc779aSAndroid Build Coastguard Worker                         WORD16 ch_fac, WORD16 size_01) {
308*15dc779aSAndroid Build Coastguard Worker   WORD16 size_07 = 7 * size_01;
309*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
310*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_07; i++) {
311*15dc779aSAndroid Build Coastguard Worker     out[ch_fac * i] = ixheaac_shl32_dir_sat_limit(
312*15dc779aSAndroid Build Coastguard Worker         ixheaac_negate32_sat(coef[size_07 - 1 - i]), q_shift);
313*15dc779aSAndroid Build Coastguard Worker   }
314*15dc779aSAndroid Build Coastguard Worker }
315*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_spec_to_overlapbuf_dec(WORD32 * ptr_overlap_buf,WORD32 * ptr_spec_coeff,WORD32 q_shift,WORD32 size)316*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_spec_to_overlapbuf_dec(WORD32 *ptr_overlap_buf,
317*15dc779aSAndroid Build Coastguard Worker                                      WORD32 *ptr_spec_coeff, WORD32 q_shift,
318*15dc779aSAndroid Build Coastguard Worker                                      WORD32 size) {
319*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
320*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size; i++) {
321*15dc779aSAndroid Build Coastguard Worker     ptr_overlap_buf[i] = ixheaac_shr32_sat(ptr_spec_coeff[i], 16 - q_shift);
322*15dc779aSAndroid Build Coastguard Worker   }
323*15dc779aSAndroid Build Coastguard Worker }
324*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_overlap_buf_out_dec(WORD32 * out_samples,WORD32 * ptr_overlap_buf,WORD32 size,const WORD16 ch_fac)325*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
326*15dc779aSAndroid Build Coastguard Worker                                   WORD32 size, const WORD16 ch_fac) {
327*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
328*15dc779aSAndroid Build Coastguard Worker 
329*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size; i++) {
330*15dc779aSAndroid Build Coastguard Worker     out_samples[ch_fac * i] =
331*15dc779aSAndroid Build Coastguard Worker         (ixheaac_shl32_sat((WORD16)ptr_overlap_buf[i], 15));
332*15dc779aSAndroid Build Coastguard Worker   }
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_overlap_out_copy_dec(WORD32 * out_samples,WORD32 * ptr_overlap_buf,WORD32 * ptr_overlap_buf1,const WORD16 ch_fac,WORD16 size_01)335*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
336*15dc779aSAndroid Build Coastguard Worker                                    WORD32 *ptr_overlap_buf1,
337*15dc779aSAndroid Build Coastguard Worker                                    const WORD16 ch_fac, WORD16 size_01) {
338*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < size_01; i++) {
341*15dc779aSAndroid Build Coastguard Worker     out_samples[ch_fac * i] =
342*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_sat((WORD16)ptr_overlap_buf[i], 15);
343*15dc779aSAndroid Build Coastguard Worker     ptr_overlap_buf[i] = ptr_overlap_buf1[i];
344*15dc779aSAndroid Build Coastguard Worker   }
345*15dc779aSAndroid Build Coastguard Worker }
346*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_imdct_process(ia_aac_dec_overlap_info * ptr_aac_dec_overlap_info,WORD32 * ptr_spec_coeff,ia_ics_info_struct * ptr_ics_info,VOID * out_samples,const WORD16 ch_fac,WORD32 * scratch,ia_aac_dec_tables_struct * ptr_aac_tables,WORD32 object_type,WORD32 ld_mps_present,WORD slot_element)347*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info,
348*15dc779aSAndroid Build Coastguard Worker                             WORD32 *ptr_spec_coeff,
349*15dc779aSAndroid Build Coastguard Worker                             ia_ics_info_struct *ptr_ics_info, VOID *out_samples,
350*15dc779aSAndroid Build Coastguard Worker                             const WORD16 ch_fac, WORD32 *scratch,
351*15dc779aSAndroid Build Coastguard Worker                             ia_aac_dec_tables_struct *ptr_aac_tables,
352*15dc779aSAndroid Build Coastguard Worker                             WORD32 object_type, WORD32 ld_mps_present,
353*15dc779aSAndroid Build Coastguard Worker                             WORD slot_element) {
354*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_overlap_buf;
355*15dc779aSAndroid Build Coastguard Worker   const WORD16 *ptr_long_window;
356*15dc779aSAndroid Build Coastguard Worker   const WORD16 *ptr_short_window;
357*15dc779aSAndroid Build Coastguard Worker   WORD16 max_bin_long = ptr_ics_info->frame_length;
358*15dc779aSAndroid Build Coastguard Worker   WORD16 size_01;
359*15dc779aSAndroid Build Coastguard Worker   if (max_bin_long == 960)
360*15dc779aSAndroid Build Coastguard Worker     size_01 = (max_bin_long / 16);
361*15dc779aSAndroid Build Coastguard Worker   else
362*15dc779aSAndroid Build Coastguard Worker     size_01 = (MAX_BINS_LONG / 16);
363*15dc779aSAndroid Build Coastguard Worker   WORD16 size_02 = 2 * size_01;
364*15dc779aSAndroid Build Coastguard Worker   WORD16 size_04 = 4 * size_01;
365*15dc779aSAndroid Build Coastguard Worker   WORD16 size_06 = 6 * size_01;
366*15dc779aSAndroid Build Coastguard Worker   WORD16 size_07 = 7 * size_01;
367*15dc779aSAndroid Build Coastguard Worker   WORD16 size_08 = 8 * size_01;
368*15dc779aSAndroid Build Coastguard Worker   WORD16 size_09 = 9 * size_01;
369*15dc779aSAndroid Build Coastguard Worker   WORD16 size_10 = 10 * size_01;
370*15dc779aSAndroid Build Coastguard Worker   WORD16 size_14 = 14 * size_01;
371*15dc779aSAndroid Build Coastguard Worker   WORD16 size_15 = 15 * size_01;
372*15dc779aSAndroid Build Coastguard Worker 
373*15dc779aSAndroid Build Coastguard Worker   ptr_overlap_buf = ptr_aac_dec_overlap_info->ptr_overlap_buf;
374*15dc779aSAndroid Build Coastguard Worker   ptr_long_window =
375*15dc779aSAndroid Build Coastguard Worker       ptr_aac_dec_overlap_info
376*15dc779aSAndroid Build Coastguard Worker           ->ptr_long_window[(WORD32)ptr_aac_dec_overlap_info->window_shape];
377*15dc779aSAndroid Build Coastguard Worker   ptr_short_window =
378*15dc779aSAndroid Build Coastguard Worker       ptr_aac_dec_overlap_info
379*15dc779aSAndroid Build Coastguard Worker           ->ptr_short_window[(WORD32)ptr_aac_dec_overlap_info->window_shape];
380*15dc779aSAndroid Build Coastguard Worker 
381*15dc779aSAndroid Build Coastguard Worker   if (ptr_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
382*15dc779aSAndroid Build Coastguard Worker     WORD16 q_shift;
383*15dc779aSAndroid Build Coastguard Worker     WORD32 expo, imdct_scale;
384*15dc779aSAndroid Build Coastguard Worker 
385*15dc779aSAndroid Build Coastguard Worker     if ((512 == ptr_ics_info->frame_length) ||
386*15dc779aSAndroid Build Coastguard Worker         (480 == ptr_ics_info->frame_length)) {
387*15dc779aSAndroid Build Coastguard Worker       ptr_ics_info->qshift_adj = -2;
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker       if (512 == ptr_ics_info->frame_length) {
390*15dc779aSAndroid Build Coastguard Worker         WORD32 *ld_cos_sin_ptr =
391*15dc779aSAndroid Build Coastguard Worker             (WORD32 *)ptr_aac_tables->pstr_imdct_tables->cosine_array_1024;
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker         ixheaacd_inverse_transform_512(
394*15dc779aSAndroid Build Coastguard Worker             ptr_spec_coeff, scratch, &imdct_scale, ld_cos_sin_ptr,
395*15dc779aSAndroid Build Coastguard Worker             ptr_aac_tables->pstr_imdct_tables, object_type);
396*15dc779aSAndroid Build Coastguard Worker 
397*15dc779aSAndroid Build Coastguard Worker       } else {
398*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mdct_480_ld(ptr_spec_coeff, scratch, &imdct_scale, 0,
399*15dc779aSAndroid Build Coastguard Worker                              ptr_aac_tables->pstr_imdct_tables, object_type);
400*15dc779aSAndroid Build Coastguard Worker       }
401*15dc779aSAndroid Build Coastguard Worker 
402*15dc779aSAndroid Build Coastguard Worker       if (object_type == AOT_ER_AAC_ELD) {
403*15dc779aSAndroid Build Coastguard Worker         int i, N = (ptr_ics_info->frame_length << 1);
404*15dc779aSAndroid Build Coastguard Worker 
405*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < N / 2; i++) {
406*15dc779aSAndroid Build Coastguard Worker           ptr_spec_coeff[i] = -ptr_spec_coeff[i + N];
407*15dc779aSAndroid Build Coastguard Worker           ptr_spec_coeff[i + N + N / 2] = -ptr_spec_coeff[i + N / 2];
408*15dc779aSAndroid Build Coastguard Worker         }
409*15dc779aSAndroid Build Coastguard Worker       }
410*15dc779aSAndroid Build Coastguard Worker     } else if (960 == ptr_ics_info->frame_length) {
411*15dc779aSAndroid Build Coastguard Worker       ixheaacd_mdct_960(ptr_spec_coeff, scratch, &imdct_scale, 0,
412*15dc779aSAndroid Build Coastguard Worker                         ptr_aac_tables->pstr_imdct_tables);
413*15dc779aSAndroid Build Coastguard Worker     } else {
414*15dc779aSAndroid Build Coastguard Worker       expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 1024) - 1;
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker       expo = 8 - expo;
417*15dc779aSAndroid Build Coastguard Worker 
418*15dc779aSAndroid Build Coastguard Worker       imdct_scale = ixheaacd_inverse_transform(
419*15dc779aSAndroid Build Coastguard Worker           ptr_spec_coeff, scratch, ptr_aac_tables->pstr_imdct_tables, expo,
420*15dc779aSAndroid Build Coastguard Worker           1024);
421*15dc779aSAndroid Build Coastguard Worker     }
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker     q_shift = (31 + imdct_scale) + (-1 - 16 - 9);
424*15dc779aSAndroid Build Coastguard Worker 
425*15dc779aSAndroid Build Coastguard Worker     switch (ptr_ics_info->window_sequence) {
426*15dc779aSAndroid Build Coastguard Worker       case ONLY_LONG_SEQUENCE:
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker         switch (ptr_aac_dec_overlap_info->window_sequence) {
429*15dc779aSAndroid Build Coastguard Worker           case ONLY_LONG_SEQUENCE:
430*15dc779aSAndroid Build Coastguard Worker           case LONG_STOP_SEQUENCE:
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker             if (1024 == ptr_ics_info->frame_length) {
433*15dc779aSAndroid Build Coastguard Worker               ia_ics_info_struct *tmp_ptr_ics_info = ptr_ics_info;
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_post_twid_overlap_add)(
436*15dc779aSAndroid Build Coastguard Worker                   (WORD32 *)out_samples, ptr_spec_coeff,
437*15dc779aSAndroid Build Coastguard Worker                   ptr_aac_tables->pstr_imdct_tables, 1024, ptr_overlap_buf,
438*15dc779aSAndroid Build Coastguard Worker                   q_shift, ptr_long_window, ch_fac);
439*15dc779aSAndroid Build Coastguard Worker 
440*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info->qshift_adj = 2;
441*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info = tmp_ptr_ics_info;
442*15dc779aSAndroid Build Coastguard Worker             }
443*15dc779aSAndroid Build Coastguard Worker 
444*15dc779aSAndroid Build Coastguard Worker             if (960 == ptr_ics_info->frame_length)
445*15dc779aSAndroid Build Coastguard Worker             {
446*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_over_lap_add1_dec(ptr_spec_coeff, ptr_overlap_buf,
447*15dc779aSAndroid Build Coastguard Worker                     (WORD32*)out_samples, ptr_long_window, q_shift,
448*15dc779aSAndroid Build Coastguard Worker                     480, ch_fac);
449*15dc779aSAndroid Build Coastguard Worker 
450*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
451*15dc779aSAndroid Build Coastguard Worker                                             q_shift, 480);
452*15dc779aSAndroid Build Coastguard Worker 
453*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->qshift_adj = 2;
454*15dc779aSAndroid Build Coastguard Worker             }
455*15dc779aSAndroid Build Coastguard Worker 
456*15dc779aSAndroid Build Coastguard Worker             if ((512 == ptr_ics_info->frame_length) ||
457*15dc779aSAndroid Build Coastguard Worker                 (480 == ptr_ics_info->frame_length)) {
458*15dc779aSAndroid Build Coastguard Worker               if (object_type != AOT_ER_AAC_ELD) {
459*15dc779aSAndroid Build Coastguard Worker                 if (512 == ptr_ics_info->frame_length) {
460*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
461*15dc779aSAndroid Build Coastguard Worker                                         (WORD16 *)out_samples, ptr_long_window,
462*15dc779aSAndroid Build Coastguard Worker                                         q_shift, size_04, ch_fac, slot_element);
463*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
464*15dc779aSAndroid Build Coastguard Worker                                               q_shift, size_04);
465*15dc779aSAndroid Build Coastguard Worker                 } else if (480 == ptr_ics_info->frame_length) {
466*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
467*15dc779aSAndroid Build Coastguard Worker                                         (WORD16 *)out_samples, ptr_long_window,
468*15dc779aSAndroid Build Coastguard Worker                                         q_shift, 240, ch_fac, slot_element);
469*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
470*15dc779aSAndroid Build Coastguard Worker                                               q_shift, 240);
471*15dc779aSAndroid Build Coastguard Worker                 }
472*15dc779aSAndroid Build Coastguard Worker               } else {
473*15dc779aSAndroid Build Coastguard Worker                 if (ld_mps_present == 1) {
474*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_eld_dec_windowing_32bit(
475*15dc779aSAndroid Build Coastguard Worker                       ptr_spec_coeff, ptr_long_window,
476*15dc779aSAndroid Build Coastguard Worker                       ptr_ics_info->frame_length, q_shift, ptr_overlap_buf,
477*15dc779aSAndroid Build Coastguard Worker                       ch_fac, (WORD32 *)out_samples);
478*15dc779aSAndroid Build Coastguard Worker                 } else {
479*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_eld_dec_windowing(
480*15dc779aSAndroid Build Coastguard Worker                       ptr_spec_coeff, ptr_long_window,
481*15dc779aSAndroid Build Coastguard Worker                       ptr_ics_info->frame_length, q_shift, ptr_overlap_buf,
482*15dc779aSAndroid Build Coastguard Worker                       ch_fac, (WORD16 *)out_samples, slot_element);
483*15dc779aSAndroid Build Coastguard Worker                 }
484*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->qshift_adj = -2;
485*15dc779aSAndroid Build Coastguard Worker               }
486*15dc779aSAndroid Build Coastguard Worker             }
487*15dc779aSAndroid Build Coastguard Worker             break;
488*15dc779aSAndroid Build Coastguard Worker 
489*15dc779aSAndroid Build Coastguard Worker           case LONG_START_SEQUENCE:
490*15dc779aSAndroid Build Coastguard Worker           case EIGHT_SHORT_SEQUENCE:
491*15dc779aSAndroid Build Coastguard Worker             if (1024 == ptr_ics_info->frame_length) {
492*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_post_twiddle)(scratch, ptr_spec_coeff,
493*15dc779aSAndroid Build Coastguard Worker                                        ptr_aac_tables->pstr_imdct_tables, 1024);
494*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
495*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
496*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 1,
497*15dc779aSAndroid Build Coastguard Worker                                        size_01);
498*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
499*15dc779aSAndroid Build Coastguard Worker                                              size_08);
500*15dc779aSAndroid Build Coastguard Worker             }
501*15dc779aSAndroid Build Coastguard Worker 
502*15dc779aSAndroid Build Coastguard Worker             if (960 == ptr_ics_info->frame_length) {
503*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
504*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
505*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 1,
506*15dc779aSAndroid Build Coastguard Worker                                        size_01);
507*15dc779aSAndroid Build Coastguard Worker               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
508*15dc779aSAndroid Build Coastguard Worker                                           q_shift, 480);
509*15dc779aSAndroid Build Coastguard Worker             }
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker             ptr_ics_info->qshift_adj = 1;
512*15dc779aSAndroid Build Coastguard Worker 
513*15dc779aSAndroid Build Coastguard Worker             if (512 == ptr_ics_info->frame_length) {
514*15dc779aSAndroid Build Coastguard Worker               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
515*15dc779aSAndroid Build Coastguard Worker                                           q_shift, size_04);
516*15dc779aSAndroid Build Coastguard Worker             }
517*15dc779aSAndroid Build Coastguard Worker             if (480 == ptr_ics_info->frame_length) {
518*15dc779aSAndroid Build Coastguard Worker               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
519*15dc779aSAndroid Build Coastguard Worker                                           q_shift, 240);
520*15dc779aSAndroid Build Coastguard Worker             }
521*15dc779aSAndroid Build Coastguard Worker             break;
522*15dc779aSAndroid Build Coastguard Worker         }
523*15dc779aSAndroid Build Coastguard Worker 
524*15dc779aSAndroid Build Coastguard Worker         break;
525*15dc779aSAndroid Build Coastguard Worker 
526*15dc779aSAndroid Build Coastguard Worker       case LONG_START_SEQUENCE:
527*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
528*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_post_twiddle)(scratch, ptr_spec_coeff,
529*15dc779aSAndroid Build Coastguard Worker                                    ptr_aac_tables->pstr_imdct_tables, 1024);
530*15dc779aSAndroid Build Coastguard Worker         }
531*15dc779aSAndroid Build Coastguard Worker         switch (ptr_aac_dec_overlap_info->window_sequence) {
532*15dc779aSAndroid Build Coastguard Worker           case ONLY_LONG_SEQUENCE:
533*15dc779aSAndroid Build Coastguard Worker           case LONG_STOP_SEQUENCE:
534*15dc779aSAndroid Build Coastguard Worker 
535*15dc779aSAndroid Build Coastguard Worker             if (1024 == ptr_ics_info->frame_length) {
536*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf,
537*15dc779aSAndroid Build Coastguard Worker                                         (WORD32*)out_samples, ptr_long_window,
538*15dc779aSAndroid Build Coastguard Worker                                         q_shift, size_08, ch_fac);
539*15dc779aSAndroid Build Coastguard Worker             } else {
540*15dc779aSAndroid Build Coastguard Worker               ixheaacd_over_lap_add1_dec(ptr_spec_coeff, ptr_overlap_buf,
541*15dc779aSAndroid Build Coastguard Worker                                          (WORD32*)out_samples, ptr_long_window,
542*15dc779aSAndroid Build Coastguard Worker                                          q_shift, size_08, ch_fac);
543*15dc779aSAndroid Build Coastguard Worker             }
544*15dc779aSAndroid Build Coastguard Worker             ptr_ics_info->qshift_adj = 2;
545*15dc779aSAndroid Build Coastguard Worker             break;
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker           case LONG_START_SEQUENCE:
548*15dc779aSAndroid Build Coastguard Worker           case EIGHT_SHORT_SEQUENCE:
549*15dc779aSAndroid Build Coastguard Worker 
550*15dc779aSAndroid Build Coastguard Worker             if (1024 == ptr_ics_info->frame_length) {
551*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
552*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
553*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 1,
554*15dc779aSAndroid Build Coastguard Worker                                        size_01);
555*15dc779aSAndroid Build Coastguard Worker             } else {
556*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
557*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
558*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 1,
559*15dc779aSAndroid Build Coastguard Worker                                        size_01);
560*15dc779aSAndroid Build Coastguard Worker             }
561*15dc779aSAndroid Build Coastguard Worker 
562*15dc779aSAndroid Build Coastguard Worker             ptr_ics_info->qshift_adj = 1;
563*15dc779aSAndroid Build Coastguard Worker 
564*15dc779aSAndroid Build Coastguard Worker             break;
565*15dc779aSAndroid Build Coastguard Worker         }
566*15dc779aSAndroid Build Coastguard Worker 
567*15dc779aSAndroid Build Coastguard Worker         if (960 != ptr_ics_info->frame_length) {
568*15dc779aSAndroid Build Coastguard Worker           ixheaacd_nolap1_32(&scratch[size_01], ptr_overlap_buf, q_shift, 1,
569*15dc779aSAndroid Build Coastguard Worker                              size_01);
570*15dc779aSAndroid Build Coastguard Worker 
571*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], scratch,
572*15dc779aSAndroid Build Coastguard Worker                                          q_shift, size_01);
573*15dc779aSAndroid Build Coastguard Worker         } else {
574*15dc779aSAndroid Build Coastguard Worker           ixheaacd_nolap1_32(&ptr_spec_coeff[size_01], ptr_overlap_buf,
575*15dc779aSAndroid Build Coastguard Worker                              q_shift, 1, size_01);
576*15dc779aSAndroid Build Coastguard Worker 
577*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07],
578*15dc779aSAndroid Build Coastguard Worker                                          ptr_spec_coeff, q_shift, size_01);
579*15dc779aSAndroid Build Coastguard Worker         }
580*15dc779aSAndroid Build Coastguard Worker 
581*15dc779aSAndroid Build Coastguard Worker         break;
582*15dc779aSAndroid Build Coastguard Worker 
583*15dc779aSAndroid Build Coastguard Worker       case LONG_STOP_SEQUENCE:
584*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
585*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_post_twiddle)(scratch, ptr_spec_coeff,
586*15dc779aSAndroid Build Coastguard Worker                                    ptr_aac_tables->pstr_imdct_tables, 1024);
587*15dc779aSAndroid Build Coastguard Worker         }
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker         switch (ptr_aac_dec_overlap_info->window_sequence) {
590*15dc779aSAndroid Build Coastguard Worker           case EIGHT_SHORT_SEQUENCE:
591*15dc779aSAndroid Build Coastguard Worker           case LONG_START_SEQUENCE:
592*15dc779aSAndroid Build Coastguard Worker 
593*15dc779aSAndroid Build Coastguard Worker             if (960 != ptr_ics_info->frame_length) {
594*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_overlap_buf_out)((WORD32*)out_samples,
595*15dc779aSAndroid Build Coastguard Worker                                           ptr_overlap_buf, size_07, ch_fac);
596*15dc779aSAndroid Build Coastguard Worker               (*ixheaacd_over_lap_add1)(
597*15dc779aSAndroid Build Coastguard Worker                   &scratch[size_14], &ptr_overlap_buf[size_07],
598*15dc779aSAndroid Build Coastguard Worker                   ((WORD32*)out_samples + ch_fac * (size_07)),
599*15dc779aSAndroid Build Coastguard Worker                   ptr_short_window, q_shift, size_01, ch_fac);
600*15dc779aSAndroid Build Coastguard Worker             } else {
601*15dc779aSAndroid Build Coastguard Worker               ixheaacd_dec_copy_outsample((WORD32*)out_samples,
602*15dc779aSAndroid Build Coastguard Worker                                           ptr_overlap_buf, size_07, ch_fac);
603*15dc779aSAndroid Build Coastguard Worker               ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[size_14],
604*15dc779aSAndroid Build Coastguard Worker                                          &ptr_overlap_buf[size_07],
605*15dc779aSAndroid Build Coastguard Worker                                          ((WORD32*)out_samples + ch_fac * (size_07)),
606*15dc779aSAndroid Build Coastguard Worker                                          ptr_short_window, q_shift, size_01,
607*15dc779aSAndroid Build Coastguard Worker                                          ch_fac);
608*15dc779aSAndroid Build Coastguard Worker             }
609*15dc779aSAndroid Build Coastguard Worker 
610*15dc779aSAndroid Build Coastguard Worker             {
611*15dc779aSAndroid Build Coastguard Worker               if (960 != ptr_ics_info->frame_length) {
612*15dc779aSAndroid Build Coastguard Worker 
613*15dc779aSAndroid Build Coastguard Worker                 WORD16 q_shift1 = q_shift - 1;
614*15dc779aSAndroid Build Coastguard Worker                 (*ixheaacd_neg_shift_spec)(&scratch[size_08],
615*15dc779aSAndroid Build Coastguard Worker                                            ((WORD32*)out_samples + ch_fac * size_09),
616*15dc779aSAndroid Build Coastguard Worker                                            q_shift1, ch_fac);
617*15dc779aSAndroid Build Coastguard Worker               } else {
618*15dc779aSAndroid Build Coastguard Worker                 WORD16 q_shift1 = q_shift - 1;
619*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_Nolap_dec(&ptr_spec_coeff[size_08],
620*15dc779aSAndroid Build Coastguard Worker                                    ((WORD32*)out_samples + ch_fac * size_09),
621*15dc779aSAndroid Build Coastguard Worker                                    q_shift1, ch_fac, size_01);
622*15dc779aSAndroid Build Coastguard Worker               }
623*15dc779aSAndroid Build Coastguard Worker             }
624*15dc779aSAndroid Build Coastguard Worker             ptr_ics_info->qshift_adj = 2;
625*15dc779aSAndroid Build Coastguard Worker 
626*15dc779aSAndroid Build Coastguard Worker             break;
627*15dc779aSAndroid Build Coastguard Worker           case ONLY_LONG_SEQUENCE:
628*15dc779aSAndroid Build Coastguard Worker           case LONG_STOP_SEQUENCE:
629*15dc779aSAndroid Build Coastguard Worker 
630*15dc779aSAndroid Build Coastguard Worker             if (1024 == ptr_ics_info->frame_length) {
631*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
632*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
633*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 0,
634*15dc779aSAndroid Build Coastguard Worker                                        size_01);
635*15dc779aSAndroid Build Coastguard Worker             } else {
636*15dc779aSAndroid Build Coastguard Worker               ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
637*15dc779aSAndroid Build Coastguard Worker                                        (WORD32*)out_samples, ptr_long_window,
638*15dc779aSAndroid Build Coastguard Worker                                        ptr_short_window, q_shift, ch_fac, 0,
639*15dc779aSAndroid Build Coastguard Worker                                        size_01);
640*15dc779aSAndroid Build Coastguard Worker             }
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker             ptr_ics_info->qshift_adj = 2;
643*15dc779aSAndroid Build Coastguard Worker             break;
644*15dc779aSAndroid Build Coastguard Worker         }
645*15dc779aSAndroid Build Coastguard Worker 
646*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
647*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
648*15dc779aSAndroid Build Coastguard Worker                                          size_08);
649*15dc779aSAndroid Build Coastguard Worker         } else {
650*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, ptr_spec_coeff,
651*15dc779aSAndroid Build Coastguard Worker                                          q_shift, size_08);
652*15dc779aSAndroid Build Coastguard Worker         }
653*15dc779aSAndroid Build Coastguard Worker 
654*15dc779aSAndroid Build Coastguard Worker         break;
655*15dc779aSAndroid Build Coastguard Worker     }
656*15dc779aSAndroid Build Coastguard Worker 
657*15dc779aSAndroid Build Coastguard Worker   } else {
658*15dc779aSAndroid Build Coastguard Worker     WORD16 q_shift, max_scale;
659*15dc779aSAndroid Build Coastguard Worker     WORD32 imdct_scale[8], i;
660*15dc779aSAndroid Build Coastguard Worker     const WORD16 *short_window;
661*15dc779aSAndroid Build Coastguard Worker 
662*15dc779aSAndroid Build Coastguard Worker     short_window = ptr_aac_dec_overlap_info
663*15dc779aSAndroid Build Coastguard Worker                        ->ptr_short_window[(WORD32)ptr_ics_info->window_shape];
664*15dc779aSAndroid Build Coastguard Worker 
665*15dc779aSAndroid Build Coastguard Worker     {
666*15dc779aSAndroid Build Coastguard Worker       WORD32 expo;
667*15dc779aSAndroid Build Coastguard Worker 
668*15dc779aSAndroid Build Coastguard Worker       if (1024 == ptr_ics_info->frame_length) {
669*15dc779aSAndroid Build Coastguard Worker         expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 1024) - 1;
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker         expo = 5 - expo;
672*15dc779aSAndroid Build Coastguard Worker 
673*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < MAX_WINDOWS; i++) {
674*15dc779aSAndroid Build Coastguard Worker           imdct_scale[i] = ixheaacd_inverse_transform(
675*15dc779aSAndroid Build Coastguard Worker               &ptr_spec_coeff[i * size_02], &scratch[i * size_02],
676*15dc779aSAndroid Build Coastguard Worker               ptr_aac_tables->pstr_imdct_tables, expo, 128);
677*15dc779aSAndroid Build Coastguard Worker 
678*15dc779aSAndroid Build Coastguard Worker         (*ixheaacd_post_twiddle)(&scratch[i * size_02],
679*15dc779aSAndroid Build Coastguard Worker                                  &ptr_spec_coeff[i * size_02],
680*15dc779aSAndroid Build Coastguard Worker                                  ptr_aac_tables->pstr_imdct_tables, 128);
681*15dc779aSAndroid Build Coastguard Worker         }
682*15dc779aSAndroid Build Coastguard Worker         max_scale = 31 + imdct_scale[0];
683*15dc779aSAndroid Build Coastguard Worker         q_shift = max_scale + (-16 - 6 - 1);
684*15dc779aSAndroid Build Coastguard Worker       } else {
685*15dc779aSAndroid Build Coastguard Worker         expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 960) - 1;
686*15dc779aSAndroid Build Coastguard Worker         memcpy(scratch, ptr_spec_coeff, sizeof(WORD32) * 960);
687*15dc779aSAndroid Build Coastguard Worker 
688*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < MAX_WINDOWS; i++) {
689*15dc779aSAndroid Build Coastguard Worker             ixheaacd_inverse_transform_960(
690*15dc779aSAndroid Build Coastguard Worker                 &ptr_spec_coeff[i * size_02], &scratch[i * size_02],
691*15dc779aSAndroid Build Coastguard Worker                 ptr_aac_tables->pstr_imdct_tables, expo, &imdct_scale[i]);
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker                 imdct_scale[i] -= expo;
694*15dc779aSAndroid Build Coastguard Worker         }
695*15dc779aSAndroid Build Coastguard Worker         max_scale = 31 + imdct_scale[0];
696*15dc779aSAndroid Build Coastguard Worker         q_shift = max_scale + (-16 - 6 - 1);
697*15dc779aSAndroid Build Coastguard Worker 
698*15dc779aSAndroid Build Coastguard Worker       }
699*15dc779aSAndroid Build Coastguard Worker     }
700*15dc779aSAndroid Build Coastguard Worker     switch (ptr_aac_dec_overlap_info->window_sequence) {
701*15dc779aSAndroid Build Coastguard Worker       WORD32 overlap_buf_loc[64];
702*15dc779aSAndroid Build Coastguard Worker 
703*15dc779aSAndroid Build Coastguard Worker       case EIGHT_SHORT_SEQUENCE:
704*15dc779aSAndroid Build Coastguard Worker       case LONG_START_SEQUENCE:
705*15dc779aSAndroid Build Coastguard Worker 
706*15dc779aSAndroid Build Coastguard Worker         (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf,
707*15dc779aSAndroid Build Coastguard Worker                                     size_07, ch_fac);
708*15dc779aSAndroid Build Coastguard Worker 
709*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
710*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_over_lap_add1)(&scratch[0], &ptr_overlap_buf[size_07],
711*15dc779aSAndroid Build Coastguard Worker                                     ((WORD32*)out_samples + ch_fac * size_07),
712*15dc779aSAndroid Build Coastguard Worker                                     ptr_short_window, q_shift, size_01, ch_fac);
713*15dc779aSAndroid Build Coastguard Worker         } else {
714*15dc779aSAndroid Build Coastguard Worker           ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[0], &ptr_overlap_buf[size_07],
715*15dc779aSAndroid Build Coastguard Worker                                      ((WORD32*)out_samples + ch_fac * size_07),
716*15dc779aSAndroid Build Coastguard Worker                                      ptr_short_window, q_shift, size_01, ch_fac);
717*15dc779aSAndroid Build Coastguard Worker         }
718*15dc779aSAndroid Build Coastguard Worker 
719*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < 3; i++) {
720*15dc779aSAndroid Build Coastguard Worker           WORD32 inc = (i * size_02);
721*15dc779aSAndroid Build Coastguard Worker 
722*15dc779aSAndroid Build Coastguard Worker           if (1024 == ptr_ics_info->frame_length) {
723*15dc779aSAndroid Build Coastguard Worker             (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &scratch[inc],
724*15dc779aSAndroid Build Coastguard Worker                                            q_shift, size_01);
725*15dc779aSAndroid Build Coastguard Worker 
726*15dc779aSAndroid Build Coastguard Worker             (*ixheaacd_over_lap_add1)(&scratch[size_02 + inc], overlap_buf_loc,
727*15dc779aSAndroid Build Coastguard Worker                                       ((WORD32*)out_samples + ch_fac * (size_09 + inc)),
728*15dc779aSAndroid Build Coastguard Worker                                       short_window, q_shift, size_01, ch_fac);
729*15dc779aSAndroid Build Coastguard Worker           } else {
730*15dc779aSAndroid Build Coastguard Worker             (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &ptr_spec_coeff[inc],
731*15dc779aSAndroid Build Coastguard Worker                                            q_shift, size_01);
732*15dc779aSAndroid Build Coastguard Worker 
733*15dc779aSAndroid Build Coastguard Worker             ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[size_02 + inc], overlap_buf_loc,
734*15dc779aSAndroid Build Coastguard Worker                                        ((WORD32*)out_samples + ch_fac * (size_09 + inc)),
735*15dc779aSAndroid Build Coastguard Worker                                        short_window, q_shift, size_01, ch_fac);
736*15dc779aSAndroid Build Coastguard Worker           }
737*15dc779aSAndroid Build Coastguard Worker         }
738*15dc779aSAndroid Build Coastguard Worker 
739*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
740*15dc779aSAndroid Build Coastguard Worker           (*ixheaacd_over_lap_add2)(&scratch[size_08], &scratch[size_06],
741*15dc779aSAndroid Build Coastguard Worker                                     ptr_overlap_buf, short_window, q_shift,
742*15dc779aSAndroid Build Coastguard Worker                                     size_01, 1);
743*15dc779aSAndroid Build Coastguard Worker         } else {
744*15dc779aSAndroid Build Coastguard Worker           ixheaacd_over_lap_add2_dec(&ptr_spec_coeff[size_08], &ptr_spec_coeff[size_06],
745*15dc779aSAndroid Build Coastguard Worker                                      ptr_overlap_buf, short_window, q_shift,
746*15dc779aSAndroid Build Coastguard Worker                                      size_01, 1);
747*15dc779aSAndroid Build Coastguard Worker         }
748*15dc779aSAndroid Build Coastguard Worker 
749*15dc779aSAndroid Build Coastguard Worker 
750*15dc779aSAndroid Build Coastguard Worker         (*ixheaacd_overlap_out_copy)(((WORD32 *)out_samples + ch_fac * size_15),
751*15dc779aSAndroid Build Coastguard Worker                                      ptr_overlap_buf, &ptr_overlap_buf[size_01],
752*15dc779aSAndroid Build Coastguard Worker                                      ch_fac, size_01);
753*15dc779aSAndroid Build Coastguard Worker 
754*15dc779aSAndroid Build Coastguard Worker         ptr_ics_info->qshift_adj = 2;
755*15dc779aSAndroid Build Coastguard Worker 
756*15dc779aSAndroid Build Coastguard Worker         break;
757*15dc779aSAndroid Build Coastguard Worker 
758*15dc779aSAndroid Build Coastguard Worker       case ONLY_LONG_SEQUENCE:
759*15dc779aSAndroid Build Coastguard Worker       case LONG_STOP_SEQUENCE:
760*15dc779aSAndroid Build Coastguard Worker 
761*15dc779aSAndroid Build Coastguard Worker         if (1024 == ptr_ics_info->frame_length) {
762*15dc779aSAndroid Build Coastguard Worker 
763*15dc779aSAndroid Build Coastguard Worker           ixheaacd_long_short_win_seq(
764*15dc779aSAndroid Build Coastguard Worker               scratch, ptr_overlap_buf, (WORD32*)out_samples, short_window,
765*15dc779aSAndroid Build Coastguard Worker               ptr_short_window, ptr_long_window, q_shift, ch_fac, size_01);
766*15dc779aSAndroid Build Coastguard Worker         } else {
767*15dc779aSAndroid Build Coastguard Worker           ixheaacd_long_short_win_seq(
768*15dc779aSAndroid Build Coastguard Worker               ptr_spec_coeff, ptr_overlap_buf, (WORD32*)out_samples, short_window,
769*15dc779aSAndroid Build Coastguard Worker               ptr_short_window, ptr_long_window, q_shift, ch_fac, size_01);
770*15dc779aSAndroid Build Coastguard Worker         }
771*15dc779aSAndroid Build Coastguard Worker 
772*15dc779aSAndroid Build Coastguard Worker         ptr_ics_info->qshift_adj = 2;
773*15dc779aSAndroid Build Coastguard Worker         break;
774*15dc779aSAndroid Build Coastguard Worker     }
775*15dc779aSAndroid Build Coastguard Worker 
776*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 3; i++) {
777*15dc779aSAndroid Build Coastguard Worker       WORD32 inc = (i * size_02);
778*15dc779aSAndroid Build Coastguard Worker 
779*15dc779aSAndroid Build Coastguard Worker       if (1024 == ptr_ics_info->frame_length) {
780*15dc779aSAndroid Build Coastguard Worker         (*ixheaacd_over_lap_add2)(&scratch[size_10 + inc], &scratch[size_08 + inc],
781*15dc779aSAndroid Build Coastguard Worker                                   &ptr_overlap_buf[size_01 + inc], short_window,
782*15dc779aSAndroid Build Coastguard Worker                                   q_shift, size_01, 1);
783*15dc779aSAndroid Build Coastguard Worker       } else {
784*15dc779aSAndroid Build Coastguard Worker         ixheaacd_over_lap_add2_dec(&ptr_spec_coeff[size_10 + inc],
785*15dc779aSAndroid Build Coastguard Worker                                    &ptr_spec_coeff[size_08 + inc],
786*15dc779aSAndroid Build Coastguard Worker                                    &ptr_overlap_buf[size_01 + inc],
787*15dc779aSAndroid Build Coastguard Worker                                    short_window, q_shift, size_01, 1);
788*15dc779aSAndroid Build Coastguard Worker       }
789*15dc779aSAndroid Build Coastguard Worker     }
790*15dc779aSAndroid Build Coastguard Worker 
791*15dc779aSAndroid Build Coastguard Worker     if (1024 == ptr_ics_info->frame_length) {
792*15dc779aSAndroid Build Coastguard Worker       (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], &scratch[size_14],
793*15dc779aSAndroid Build Coastguard Worker                                      q_shift, size_01);
794*15dc779aSAndroid Build Coastguard Worker     } else {
795*15dc779aSAndroid Build Coastguard Worker       (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], &ptr_spec_coeff[size_14],
796*15dc779aSAndroid Build Coastguard Worker                                      q_shift, size_01);
797*15dc779aSAndroid Build Coastguard Worker     }
798*15dc779aSAndroid Build Coastguard Worker   }
799*15dc779aSAndroid Build Coastguard Worker 
800*15dc779aSAndroid Build Coastguard Worker   ptr_aac_dec_overlap_info->window_shape = ptr_ics_info->window_shape;
801*15dc779aSAndroid Build Coastguard Worker   ptr_aac_dec_overlap_info->window_sequence = ptr_ics_info->window_sequence;
802*15dc779aSAndroid Build Coastguard Worker }
803*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_eld_dec_windowing(WORD32 * ptr_spect_coeff,const WORD16 * p_win,WORD32 framesize,WORD16 q_shift,WORD32 * p_overlap_buffer,const WORD16 stride,VOID * out_samples_t,WORD slot_element)804*15dc779aSAndroid Build Coastguard Worker void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *p_win,
805*15dc779aSAndroid Build Coastguard Worker                                 WORD32 framesize, WORD16 q_shift,
806*15dc779aSAndroid Build Coastguard Worker                                 WORD32 *p_overlap_buffer, const WORD16 stride,
807*15dc779aSAndroid Build Coastguard Worker                                 VOID *out_samples_t, WORD slot_element) {
808*15dc779aSAndroid Build Coastguard Worker   int i = 0;
809*15dc779aSAndroid Build Coastguard Worker   int loop_size;
810*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_z = ptr_spect_coeff;
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out, *p_out2;
813*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer;
814*15dc779aSAndroid Build Coastguard Worker   WORD32 delay = framesize >> 2;
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker   WORD16 *out_samples = (WORD16 *)out_samples_t - slot_element;
817*15dc779aSAndroid Build Coastguard Worker 
818*15dc779aSAndroid Build Coastguard Worker   ptr_z = ptr_spect_coeff + delay;
819*15dc779aSAndroid Build Coastguard Worker   p_win += delay;
820*15dc779aSAndroid Build Coastguard Worker   ptr_out = p_overlap_buffer32;
821*15dc779aSAndroid Build Coastguard Worker 
822*15dc779aSAndroid Build Coastguard Worker   q_shift = q_shift + 2;
823*15dc779aSAndroid Build Coastguard Worker 
824*15dc779aSAndroid Build Coastguard Worker   if (q_shift >= 0) {
825*15dc779aSAndroid Build Coastguard Worker     for (i = (delay)-1; i >= 0; i--) {
826*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
827*15dc779aSAndroid Build Coastguard Worker       WORD32 win_ovadd_op;
828*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
829*15dc779aSAndroid Build Coastguard Worker 
830*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
831*15dc779aSAndroid Build Coastguard Worker 
832*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
833*15dc779aSAndroid Build Coastguard Worker 
834*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
835*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
836*15dc779aSAndroid Build Coastguard Worker 
837*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32_sat(win_ovadd_op, 1));
838*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
839*15dc779aSAndroid Build Coastguard Worker 
840*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
843*15dc779aSAndroid Build Coastguard Worker 
844*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
845*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
846*15dc779aSAndroid Build Coastguard Worker 
847*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32_sat(win_ovadd_op, 1));
848*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
849*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
850*15dc779aSAndroid Build Coastguard Worker 
851*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
852*15dc779aSAndroid Build Coastguard Worker 
853*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
854*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
855*15dc779aSAndroid Build Coastguard Worker 
856*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32_sat(win_ovadd_op, 1));
857*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
858*15dc779aSAndroid Build Coastguard Worker 
859*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
860*15dc779aSAndroid Build Coastguard Worker 
861*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
862*15dc779aSAndroid Build Coastguard Worker 
863*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
864*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
865*15dc779aSAndroid Build Coastguard Worker 
866*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32_sat(win_ovadd_op, 1));
867*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
868*15dc779aSAndroid Build Coastguard Worker     }
869*15dc779aSAndroid Build Coastguard Worker 
870*15dc779aSAndroid Build Coastguard Worker     p_out2 = p_overlap_buffer32;
871*15dc779aSAndroid Build Coastguard Worker     loop_size = (((framesize * 3) - framesize) >> 2) - 1;
872*15dc779aSAndroid Build Coastguard Worker 
873*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
874*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
875*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
876*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
877*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
878*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
879*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
882*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
883*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
884*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
885*15dc779aSAndroid Build Coastguard Worker 
886*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
887*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
888*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
889*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
890*15dc779aSAndroid Build Coastguard Worker 
891*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
892*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
893*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
894*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
895*15dc779aSAndroid Build Coastguard Worker     }
896*15dc779aSAndroid Build Coastguard Worker 
897*15dc779aSAndroid Build Coastguard Worker     loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
898*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
899*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
900*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
901*15dc779aSAndroid Build Coastguard Worker 
902*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
903*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
904*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
905*15dc779aSAndroid Build Coastguard Worker 
906*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
907*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
908*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
909*15dc779aSAndroid Build Coastguard Worker 
910*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
911*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
912*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
913*15dc779aSAndroid Build Coastguard Worker 
914*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
915*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
916*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
917*15dc779aSAndroid Build Coastguard Worker     }
918*15dc779aSAndroid Build Coastguard Worker   } else {
919*15dc779aSAndroid Build Coastguard Worker     q_shift = -q_shift;
920*15dc779aSAndroid Build Coastguard Worker 
921*15dc779aSAndroid Build Coastguard Worker     for (i = (delay)-1; i >= 0; i--) {
922*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
923*15dc779aSAndroid Build Coastguard Worker       WORD32 win_ovadd_op;
924*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
925*15dc779aSAndroid Build Coastguard Worker 
926*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
927*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
928*15dc779aSAndroid Build Coastguard Worker 
929*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
930*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
931*15dc779aSAndroid Build Coastguard Worker 
932*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32(win_ovadd_op, 1));
933*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
934*15dc779aSAndroid Build Coastguard Worker 
935*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
936*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
937*15dc779aSAndroid Build Coastguard Worker 
938*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
939*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
940*15dc779aSAndroid Build Coastguard Worker 
941*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32(win_ovadd_op, 1));
942*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
943*15dc779aSAndroid Build Coastguard Worker 
944*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
945*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
946*15dc779aSAndroid Build Coastguard Worker 
947*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
948*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
949*15dc779aSAndroid Build Coastguard Worker 
950*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32(win_ovadd_op, 1));
951*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
952*15dc779aSAndroid Build Coastguard Worker 
953*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
954*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
955*15dc779aSAndroid Build Coastguard Worker 
956*15dc779aSAndroid Build Coastguard Worker       win_ovadd_op =
957*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
958*15dc779aSAndroid Build Coastguard Worker 
959*15dc779aSAndroid Build Coastguard Worker       *out_samples = ixheaac_round16(ixheaac_shl32(win_ovadd_op, 1));
960*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
961*15dc779aSAndroid Build Coastguard Worker     }
962*15dc779aSAndroid Build Coastguard Worker 
963*15dc779aSAndroid Build Coastguard Worker     p_out2 = p_overlap_buffer32;
964*15dc779aSAndroid Build Coastguard Worker     loop_size = (((framesize * 3) - framesize) >> 2) - 1;
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
967*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
968*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
969*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
970*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
971*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
972*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
973*15dc779aSAndroid Build Coastguard Worker 
974*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
975*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
976*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
977*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
978*15dc779aSAndroid Build Coastguard Worker 
979*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
980*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
981*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
982*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
983*15dc779aSAndroid Build Coastguard Worker 
984*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
985*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
986*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
987*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
988*15dc779aSAndroid Build Coastguard Worker     }
989*15dc779aSAndroid Build Coastguard Worker     loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
990*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
991*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
992*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
993*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
994*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
995*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
996*15dc779aSAndroid Build Coastguard Worker 
997*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
998*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
999*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1000*15dc779aSAndroid Build Coastguard Worker 
1001*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1002*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1003*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1004*15dc779aSAndroid Build Coastguard Worker 
1005*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1006*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1007*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1008*15dc779aSAndroid Build Coastguard Worker     }
1009*15dc779aSAndroid Build Coastguard Worker   }
1010*15dc779aSAndroid Build Coastguard Worker }
1011*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_eld_dec_windowing_32bit(WORD32 * ptr_spect_coeff,const WORD16 * p_win,WORD32 framesize,WORD16 q_shift,WORD32 * p_overlap_buffer,const WORD16 stride,WORD32 * out_samples)1012*15dc779aSAndroid Build Coastguard Worker void ixheaacd_eld_dec_windowing_32bit(WORD32 *ptr_spect_coeff,
1013*15dc779aSAndroid Build Coastguard Worker                                       const WORD16 *p_win, WORD32 framesize,
1014*15dc779aSAndroid Build Coastguard Worker                                       WORD16 q_shift, WORD32 *p_overlap_buffer,
1015*15dc779aSAndroid Build Coastguard Worker                                       const WORD16 stride, WORD32 *out_samples)
1016*15dc779aSAndroid Build Coastguard Worker 
1017*15dc779aSAndroid Build Coastguard Worker {
1018*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
1019*15dc779aSAndroid Build Coastguard Worker   WORD32 loop_size;
1020*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_z = ptr_spect_coeff;
1021*15dc779aSAndroid Build Coastguard Worker 
1022*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out, *p_out2;
1023*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer;
1024*15dc779aSAndroid Build Coastguard Worker   WORD32 delay = framesize >> 2;
1025*15dc779aSAndroid Build Coastguard Worker 
1026*15dc779aSAndroid Build Coastguard Worker   ptr_z = ptr_spect_coeff + delay;
1027*15dc779aSAndroid Build Coastguard Worker   p_win += delay;
1028*15dc779aSAndroid Build Coastguard Worker   ptr_out = p_overlap_buffer32;
1029*15dc779aSAndroid Build Coastguard Worker 
1030*15dc779aSAndroid Build Coastguard Worker   q_shift = q_shift + 2;
1031*15dc779aSAndroid Build Coastguard Worker 
1032*15dc779aSAndroid Build Coastguard Worker   if (q_shift >= 0) {
1033*15dc779aSAndroid Build Coastguard Worker     for (i = (delay)-1; i >= 0; i--) {
1034*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1035*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1036*15dc779aSAndroid Build Coastguard Worker 
1037*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1038*15dc779aSAndroid Build Coastguard Worker 
1039*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1040*15dc779aSAndroid Build Coastguard Worker 
1041*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1042*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1043*15dc779aSAndroid Build Coastguard Worker 
1044*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1045*15dc779aSAndroid Build Coastguard Worker 
1046*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1047*15dc779aSAndroid Build Coastguard Worker 
1048*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1049*15dc779aSAndroid Build Coastguard Worker 
1050*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1051*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1052*15dc779aSAndroid Build Coastguard Worker 
1053*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1054*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1055*15dc779aSAndroid Build Coastguard Worker 
1056*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1057*15dc779aSAndroid Build Coastguard Worker 
1058*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1059*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1060*15dc779aSAndroid Build Coastguard Worker 
1061*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1062*15dc779aSAndroid Build Coastguard Worker 
1063*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1064*15dc779aSAndroid Build Coastguard Worker 
1065*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1066*15dc779aSAndroid Build Coastguard Worker 
1067*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1068*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1069*15dc779aSAndroid Build Coastguard Worker 
1070*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1071*15dc779aSAndroid Build Coastguard Worker     }
1072*15dc779aSAndroid Build Coastguard Worker 
1073*15dc779aSAndroid Build Coastguard Worker     p_out2 = p_overlap_buffer32;
1074*15dc779aSAndroid Build Coastguard Worker     loop_size = (((framesize * 3) - framesize) >> 2) - 1;
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
1077*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1078*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1079*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1080*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1081*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1082*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1083*15dc779aSAndroid Build Coastguard Worker 
1084*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1085*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1086*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1087*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1088*15dc779aSAndroid Build Coastguard Worker 
1089*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1090*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1091*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1092*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1093*15dc779aSAndroid Build Coastguard Worker 
1094*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1095*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1096*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1097*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shl32(win_op, q_shift), *ptr_out++);
1098*15dc779aSAndroid Build Coastguard Worker     }
1099*15dc779aSAndroid Build Coastguard Worker 
1100*15dc779aSAndroid Build Coastguard Worker     loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
1101*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
1102*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1103*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1104*15dc779aSAndroid Build Coastguard Worker 
1105*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1106*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1107*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
1108*15dc779aSAndroid Build Coastguard Worker 
1109*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1110*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1111*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
1112*15dc779aSAndroid Build Coastguard Worker 
1113*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1114*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1115*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
1116*15dc779aSAndroid Build Coastguard Worker 
1117*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1118*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1119*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shl32(win_op, q_shift);
1120*15dc779aSAndroid Build Coastguard Worker     }
1121*15dc779aSAndroid Build Coastguard Worker   } else {
1122*15dc779aSAndroid Build Coastguard Worker     q_shift = -q_shift;
1123*15dc779aSAndroid Build Coastguard Worker 
1124*15dc779aSAndroid Build Coastguard Worker     for (i = (delay)-1; i >= 0; i--) {
1125*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1126*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1127*15dc779aSAndroid Build Coastguard Worker 
1128*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1129*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1130*15dc779aSAndroid Build Coastguard Worker 
1131*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1132*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1133*15dc779aSAndroid Build Coastguard Worker 
1134*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1135*15dc779aSAndroid Build Coastguard Worker 
1136*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1137*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1138*15dc779aSAndroid Build Coastguard Worker 
1139*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1140*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1141*15dc779aSAndroid Build Coastguard Worker 
1142*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1143*15dc779aSAndroid Build Coastguard Worker 
1144*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1145*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1146*15dc779aSAndroid Build Coastguard Worker 
1147*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1148*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1149*15dc779aSAndroid Build Coastguard Worker 
1150*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1151*15dc779aSAndroid Build Coastguard Worker 
1152*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1153*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1154*15dc779aSAndroid Build Coastguard Worker 
1155*15dc779aSAndroid Build Coastguard Worker       *out_samples =
1156*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1157*15dc779aSAndroid Build Coastguard Worker 
1158*15dc779aSAndroid Build Coastguard Worker       out_samples += stride;
1159*15dc779aSAndroid Build Coastguard Worker     }
1160*15dc779aSAndroid Build Coastguard Worker 
1161*15dc779aSAndroid Build Coastguard Worker     p_out2 = p_overlap_buffer32;
1162*15dc779aSAndroid Build Coastguard Worker     loop_size = (((framesize * 3) - framesize) >> 2) - 1;
1163*15dc779aSAndroid Build Coastguard Worker 
1164*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
1165*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1166*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1167*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1168*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1169*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1170*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1171*15dc779aSAndroid Build Coastguard Worker 
1172*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1173*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1174*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1175*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1176*15dc779aSAndroid Build Coastguard Worker 
1177*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1178*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1179*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1180*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1181*15dc779aSAndroid Build Coastguard Worker 
1182*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1183*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1184*15dc779aSAndroid Build Coastguard Worker       *p_out2++ =
1185*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_shr32(win_op, q_shift), *ptr_out++);
1186*15dc779aSAndroid Build Coastguard Worker     }
1187*15dc779aSAndroid Build Coastguard Worker     loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
1188*15dc779aSAndroid Build Coastguard Worker     for (i = loop_size; i >= 0; i--) {
1189*15dc779aSAndroid Build Coastguard Worker       WORD32 win_op;
1190*15dc779aSAndroid Build Coastguard Worker       WORD16 win_val;
1191*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1192*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1193*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1194*15dc779aSAndroid Build Coastguard Worker 
1195*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1196*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1197*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1198*15dc779aSAndroid Build Coastguard Worker 
1199*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1200*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1201*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1202*15dc779aSAndroid Build Coastguard Worker 
1203*15dc779aSAndroid Build Coastguard Worker       win_val = *p_win++;
1204*15dc779aSAndroid Build Coastguard Worker       win_op = ixheaac_mult32x16in32(*ptr_z++, (win_val));
1205*15dc779aSAndroid Build Coastguard Worker       *p_out2++ = ixheaac_shr32(win_op, q_shift);
1206*15dc779aSAndroid Build Coastguard Worker     }
1207*15dc779aSAndroid Build Coastguard Worker   }
1208*15dc779aSAndroid Build Coastguard Worker }
1209