xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_basic_ops.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 "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_windows.h"
27*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mult32_sh1(WORD32 a,WORD32 b)28*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
30*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
33*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 31);
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker   return (result);
36*15dc779aSAndroid Build Coastguard Worker }
37*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_memset(FLOAT32 * x,WORD32 n)38*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39*15dc779aSAndroid Build Coastguard Worker   memset(x, 0, n * sizeof(FLOAT32));
40*15dc779aSAndroid Build Coastguard Worker   return;
41*15dc779aSAndroid Build Coastguard Worker }
42*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mem_cpy(const FLOAT32 x[],FLOAT32 y[],WORD32 n)43*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44*15dc779aSAndroid Build Coastguard Worker   memcpy(y, x, n * sizeof(FLOAT32));
45*15dc779aSAndroid Build Coastguard Worker   return;
46*15dc779aSAndroid Build Coastguard Worker }
47*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_vec_cnst_mul(FLOAT32 a,FLOAT32 x[],FLOAT32 z[],WORD32 n)48*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
50*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n; i++) {
51*15dc779aSAndroid Build Coastguard Worker     z[i] = (FLOAT32)a * x[i];
52*15dc779aSAndroid Build Coastguard Worker   }
53*15dc779aSAndroid Build Coastguard Worker   return;
54*15dc779aSAndroid Build Coastguard Worker }
55*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_combine_fac(WORD32 * src1,WORD32 * src2,WORD32 * dest,WORD32 len,WORD8 output_q,WORD8 fac_q)56*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57*15dc779aSAndroid Build Coastguard Worker                           WORD8 output_q, WORD8 fac_q) {
58*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
59*15dc779aSAndroid Build Coastguard Worker   if (fac_q > output_q) {
60*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
61*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62*15dc779aSAndroid Build Coastguard Worker       dest++;
63*15dc779aSAndroid Build Coastguard Worker       src1++;
64*15dc779aSAndroid Build Coastguard Worker       src2++;
65*15dc779aSAndroid Build Coastguard Worker     }
66*15dc779aSAndroid Build Coastguard Worker   } else {
67*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
68*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat(
69*15dc779aSAndroid Build Coastguard Worker           *src1, ixheaac_shl32_sat((*src2), (output_q - fac_q)));
70*15dc779aSAndroid Build Coastguard Worker       dest++;
71*15dc779aSAndroid Build Coastguard Worker       src1++;
72*15dc779aSAndroid Build Coastguard Worker       src2++;
73*15dc779aSAndroid Build Coastguard Worker     }
74*15dc779aSAndroid Build Coastguard Worker   }
75*15dc779aSAndroid Build Coastguard Worker }
76*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_long1(WORD32 * src1,WORD32 * src2,const WORD32 * win_fwd,const WORD32 * win_rev,WORD32 * dest,WORD32 vlen,WORD8 shift1,WORD8 shift2)77*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_windowing_long1(WORD32 *src1, WORD32 *src2,
78*15dc779aSAndroid Build Coastguard Worker                                const WORD32 *win_fwd, const WORD32 *win_rev,
79*15dc779aSAndroid Build Coastguard Worker                                WORD32 *dest, WORD32 vlen, WORD8 shift1,
80*15dc779aSAndroid Build Coastguard Worker                                WORD8 shift2) {
81*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
82*15dc779aSAndroid Build Coastguard Worker   WORD32 *rsrc2 = src2 + vlen - 1;
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker   if (shift1 > shift2) {
85*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < vlen / 2; i++) {
86*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat(
87*15dc779aSAndroid Build Coastguard Worker           ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
88*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(*src2, *win_rev));
89*15dc779aSAndroid Build Coastguard Worker       *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
90*15dc779aSAndroid Build Coastguard Worker           ((ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev)) >>
91*15dc779aSAndroid Build Coastguard Worker            (shift1 - shift2)),
92*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker       src1++;
95*15dc779aSAndroid Build Coastguard Worker       src2++;
96*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
97*15dc779aSAndroid Build Coastguard Worker       win_rev--;
98*15dc779aSAndroid Build Coastguard Worker       rsrc2--;
99*15dc779aSAndroid Build Coastguard Worker       dest++;
100*15dc779aSAndroid Build Coastguard Worker     }
101*15dc779aSAndroid Build Coastguard Worker     return (shift2);
102*15dc779aSAndroid Build Coastguard Worker   } else {
103*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < vlen / 2; i++) {
104*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat(
105*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(*src1, *win_fwd),
106*15dc779aSAndroid Build Coastguard Worker           ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker       *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
109*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev),
110*15dc779aSAndroid Build Coastguard Worker           ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
111*15dc779aSAndroid Build Coastguard Worker       src1++;
112*15dc779aSAndroid Build Coastguard Worker       src2++;
113*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
114*15dc779aSAndroid Build Coastguard Worker       win_rev--;
115*15dc779aSAndroid Build Coastguard Worker       rsrc2--;
116*15dc779aSAndroid Build Coastguard Worker       dest++;
117*15dc779aSAndroid Build Coastguard Worker     }
118*15dc779aSAndroid Build Coastguard Worker     return (shift1);
119*15dc779aSAndroid Build Coastguard Worker   }
120*15dc779aSAndroid Build Coastguard Worker }
121*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_long2(WORD32 * src1,const WORD32 * win_fwd,WORD32 * fac_data_out,WORD32 * over_lap,WORD32 * p_out_buffer,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap,WORD8 fac_q)122*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd,
123*15dc779aSAndroid Build Coastguard Worker                                WORD32 *fac_data_out, WORD32 *over_lap,
124*15dc779aSAndroid Build Coastguard Worker                                WORD32 *p_out_buffer,
125*15dc779aSAndroid Build Coastguard Worker                                offset_lengths *ixheaacd_drc_offset,
126*15dc779aSAndroid Build Coastguard Worker                                WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
127*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
128*15dc779aSAndroid Build Coastguard Worker   WORD32 *dest = p_out_buffer;
129*15dc779aSAndroid Build Coastguard Worker 
130*15dc779aSAndroid Build Coastguard Worker   win_fwd += ixheaacd_drc_offset->lfac;
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker   if (shiftp > fac_q) {
133*15dc779aSAndroid Build Coastguard Worker     if (shift_olap > fac_q) {
134*15dc779aSAndroid Build Coastguard Worker       for (i = 0;
135*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
136*15dc779aSAndroid Build Coastguard Worker            i++) {
137*15dc779aSAndroid Build Coastguard Worker         dest[i] = over_lap[i] >> (shift_olap - fac_q);
138*15dc779aSAndroid Build Coastguard Worker       }
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
141*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
142*15dc779aSAndroid Build Coastguard Worker            i++) {
143*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
144*15dc779aSAndroid Build Coastguard Worker             (ixheaacd_mult32_sh1(
145*15dc779aSAndroid Build Coastguard Worker                  ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
146*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->n_flat_ls +
147*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->lfac - i - 1]),
148*15dc779aSAndroid Build Coastguard Worker                  *win_fwd) >>
149*15dc779aSAndroid Build Coastguard Worker              (shiftp - fac_q)),
150*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out));
151*15dc779aSAndroid Build Coastguard Worker         win_fwd++;
152*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
153*15dc779aSAndroid Build Coastguard Worker       }
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker       for (;
156*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
157*15dc779aSAndroid Build Coastguard Worker            i++) {
158*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
159*15dc779aSAndroid Build Coastguard Worker             (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
160*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->n_flat_ls +
161*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->lfac - i - 1]) >>
162*15dc779aSAndroid Build Coastguard Worker              (shiftp - fac_q)),
163*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out));
164*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
165*15dc779aSAndroid Build Coastguard Worker       }
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_long; i++) {
168*15dc779aSAndroid Build Coastguard Worker         dest[i] =
169*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
170*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->n_flat_ls +
171*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->lfac - i - 1]) >>
172*15dc779aSAndroid Build Coastguard Worker             (shiftp - fac_q);
173*15dc779aSAndroid Build Coastguard Worker       }
174*15dc779aSAndroid Build Coastguard Worker       return (fac_q);
175*15dc779aSAndroid Build Coastguard Worker     } else {
176*15dc779aSAndroid Build Coastguard Worker       memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
177*15dc779aSAndroid Build Coastguard Worker                                                ixheaacd_drc_offset->lfac));
178*15dc779aSAndroid Build Coastguard Worker 
179*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
180*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
181*15dc779aSAndroid Build Coastguard Worker            i++) {
182*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
183*15dc779aSAndroid Build Coastguard Worker             (ixheaacd_mult32_sh1(
184*15dc779aSAndroid Build Coastguard Worker                  ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
185*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->n_flat_ls +
186*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->lfac - i - 1]),
187*15dc779aSAndroid Build Coastguard Worker                  *win_fwd) >>
188*15dc779aSAndroid Build Coastguard Worker              (shiftp - shift_olap)),
189*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shift_olap));
190*15dc779aSAndroid Build Coastguard Worker         win_fwd++;
191*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
192*15dc779aSAndroid Build Coastguard Worker       }
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker       for (;
195*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
196*15dc779aSAndroid Build Coastguard Worker            i++) {
197*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
198*15dc779aSAndroid Build Coastguard Worker             (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
199*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->n_flat_ls +
200*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->lfac - i - 1]) >>
201*15dc779aSAndroid Build Coastguard Worker              (shiftp - shift_olap)),
202*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shift_olap));
203*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
204*15dc779aSAndroid Build Coastguard Worker       }
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_long; i++) {
207*15dc779aSAndroid Build Coastguard Worker         dest[i] =
208*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
209*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->n_flat_ls +
210*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->lfac - i - 1]) >>
211*15dc779aSAndroid Build Coastguard Worker             (shiftp - shift_olap);
212*15dc779aSAndroid Build Coastguard Worker       }
213*15dc779aSAndroid Build Coastguard Worker       return (shift_olap);
214*15dc779aSAndroid Build Coastguard Worker     }
215*15dc779aSAndroid Build Coastguard Worker   } else {
216*15dc779aSAndroid Build Coastguard Worker     if (shift_olap > shiftp) {
217*15dc779aSAndroid Build Coastguard Worker       for (i = 0;
218*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
219*15dc779aSAndroid Build Coastguard Worker            i++) {
220*15dc779aSAndroid Build Coastguard Worker         dest[i] = over_lap[i] >> (shift_olap - shiftp);
221*15dc779aSAndroid Build Coastguard Worker       }
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
224*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
225*15dc779aSAndroid Build Coastguard Worker            i++) {
226*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
227*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(
228*15dc779aSAndroid Build Coastguard Worker                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
229*15dc779aSAndroid Build Coastguard Worker                                            ixheaacd_drc_offset->n_flat_ls +
230*15dc779aSAndroid Build Coastguard Worker                                            ixheaacd_drc_offset->lfac - i - 1]),
231*15dc779aSAndroid Build Coastguard Worker                 *win_fwd),
232*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shiftp));
233*15dc779aSAndroid Build Coastguard Worker         win_fwd++;
234*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
235*15dc779aSAndroid Build Coastguard Worker       }
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker       for (;
238*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
239*15dc779aSAndroid Build Coastguard Worker            i++) {
240*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
241*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
242*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->n_flat_ls +
243*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->lfac - i - 1]),
244*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shiftp));
245*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
246*15dc779aSAndroid Build Coastguard Worker       }
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_long; i++) {
249*15dc779aSAndroid Build Coastguard Worker         dest[i] =
250*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
251*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->n_flat_ls +
252*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->lfac - i - 1]);
253*15dc779aSAndroid Build Coastguard Worker       }
254*15dc779aSAndroid Build Coastguard Worker       return (shiftp);
255*15dc779aSAndroid Build Coastguard Worker     } else {
256*15dc779aSAndroid Build Coastguard Worker       memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
257*15dc779aSAndroid Build Coastguard Worker                                                ixheaacd_drc_offset->lfac));
258*15dc779aSAndroid Build Coastguard Worker 
259*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
260*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
261*15dc779aSAndroid Build Coastguard Worker            i++) {
262*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
263*15dc779aSAndroid Build Coastguard Worker             (ixheaacd_mult32_sh1(
264*15dc779aSAndroid Build Coastguard Worker                  ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
265*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->n_flat_ls +
266*15dc779aSAndroid Build Coastguard Worker                                             ixheaacd_drc_offset->lfac - i - 1]),
267*15dc779aSAndroid Build Coastguard Worker                  *win_fwd) >>
268*15dc779aSAndroid Build Coastguard Worker              (shiftp - shift_olap)),
269*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shift_olap));
270*15dc779aSAndroid Build Coastguard Worker         win_fwd++;
271*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
272*15dc779aSAndroid Build Coastguard Worker       }
273*15dc779aSAndroid Build Coastguard Worker 
274*15dc779aSAndroid Build Coastguard Worker       for (;
275*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
276*15dc779aSAndroid Build Coastguard Worker            i++) {
277*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaac_add32_sat(
278*15dc779aSAndroid Build Coastguard Worker             (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
279*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->n_flat_ls +
280*15dc779aSAndroid Build Coastguard Worker                                         ixheaacd_drc_offset->lfac - i - 1]) >>
281*15dc779aSAndroid Build Coastguard Worker              (shiftp - shift_olap)),
282*15dc779aSAndroid Build Coastguard Worker             (*fac_data_out) >> (fac_q - shift_olap));
283*15dc779aSAndroid Build Coastguard Worker         fac_data_out++;
284*15dc779aSAndroid Build Coastguard Worker       }
285*15dc779aSAndroid Build Coastguard Worker 
286*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_long; i++) {
287*15dc779aSAndroid Build Coastguard Worker         dest[i] =
288*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
289*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->n_flat_ls +
290*15dc779aSAndroid Build Coastguard Worker                                        ixheaacd_drc_offset->lfac - i - 1]) >>
291*15dc779aSAndroid Build Coastguard Worker             (shiftp - shift_olap);
292*15dc779aSAndroid Build Coastguard Worker       }
293*15dc779aSAndroid Build Coastguard Worker       return (shift_olap);
294*15dc779aSAndroid Build Coastguard Worker     }
295*15dc779aSAndroid Build Coastguard Worker   }
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_long3(WORD32 * src1,const WORD32 * win_fwd,WORD32 * over_lap,WORD32 * p_out_buffer,const WORD32 * win_rev,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)298*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd,
299*15dc779aSAndroid Build Coastguard Worker                                WORD32 *over_lap, WORD32 *p_out_buffer,
300*15dc779aSAndroid Build Coastguard Worker                                const WORD32 *win_rev,
301*15dc779aSAndroid Build Coastguard Worker                                offset_lengths *ixheaacd_drc_offset,
302*15dc779aSAndroid Build Coastguard Worker                                WORD8 shiftp, WORD8 shift_olap) {
303*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
304*15dc779aSAndroid Build Coastguard Worker   WORD32 *dest = p_out_buffer;
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker   if (shiftp > shift_olap) {
307*15dc779aSAndroid Build Coastguard Worker     memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_flat_ls;
310*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_long / 2; i++) {
311*15dc779aSAndroid Build Coastguard Worker       dest[i] = ixheaac_add32_sat(
312*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
313*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(over_lap[i], *win_rev));
314*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
315*15dc779aSAndroid Build Coastguard Worker       win_rev--;
316*15dc779aSAndroid Build Coastguard Worker     }
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_long / 2;
319*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
320*15dc779aSAndroid Build Coastguard Worker          i++) {
321*15dc779aSAndroid Build Coastguard Worker       dest[i] = ixheaac_add32_sat(
322*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(
323*15dc779aSAndroid Build Coastguard Worker                ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
324*15dc779aSAndroid Build Coastguard Worker                *win_fwd) >>
325*15dc779aSAndroid Build Coastguard Worker            (shiftp - shift_olap)),
326*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(over_lap[i], *win_rev));
327*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
328*15dc779aSAndroid Build Coastguard Worker       win_rev--;
329*15dc779aSAndroid Build Coastguard Worker     }
330*15dc779aSAndroid Build Coastguard Worker 
331*15dc779aSAndroid Build Coastguard Worker     for (; i < ixheaacd_drc_offset->n_long; i++) {
332*15dc779aSAndroid Build Coastguard Worker       dest[i] =
333*15dc779aSAndroid Build Coastguard Worker           ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >>
334*15dc779aSAndroid Build Coastguard Worker           (shiftp - shift_olap);
335*15dc779aSAndroid Build Coastguard Worker     }
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker     return (shift_olap);
338*15dc779aSAndroid Build Coastguard Worker   } else {
339*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
340*15dc779aSAndroid Build Coastguard Worker       dest[i] = over_lap[i] >> (shift_olap - shiftp);
341*15dc779aSAndroid Build Coastguard Worker     }
342*15dc779aSAndroid Build Coastguard Worker 
343*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_flat_ls;
344*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_long / 2; i++) {
345*15dc779aSAndroid Build Coastguard Worker       dest[i] = ixheaac_add32_sat(
346*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(src1[i], *win_fwd),
347*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
348*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
349*15dc779aSAndroid Build Coastguard Worker       win_rev--;
350*15dc779aSAndroid Build Coastguard Worker     }
351*15dc779aSAndroid Build Coastguard Worker 
352*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_long / 2;
353*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
354*15dc779aSAndroid Build Coastguard Worker          i++) {
355*15dc779aSAndroid Build Coastguard Worker       dest[i] = ixheaac_add32_sat(
356*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(
357*15dc779aSAndroid Build Coastguard Worker               ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
358*15dc779aSAndroid Build Coastguard Worker               *win_fwd),
359*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
360*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
361*15dc779aSAndroid Build Coastguard Worker       win_rev--;
362*15dc779aSAndroid Build Coastguard Worker     }
363*15dc779aSAndroid Build Coastguard Worker 
364*15dc779aSAndroid Build Coastguard Worker     for (; i < ixheaacd_drc_offset->n_long; i++) {
365*15dc779aSAndroid Build Coastguard Worker       dest[i] =
366*15dc779aSAndroid Build Coastguard Worker           ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]);
367*15dc779aSAndroid Build Coastguard Worker     }
368*15dc779aSAndroid Build Coastguard Worker 
369*15dc779aSAndroid Build Coastguard Worker     return (shiftp);
370*15dc779aSAndroid Build Coastguard Worker   }
371*15dc779aSAndroid Build Coastguard Worker }
372*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_short1(WORD32 * src1,WORD32 * src2,WORD32 * fp,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)373*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
374*15dc779aSAndroid Build Coastguard Worker                                offset_lengths *ixheaacd_drc_offset,
375*15dc779aSAndroid Build Coastguard Worker                                WORD8 shiftp, WORD8 shift_olap) {
376*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
377*15dc779aSAndroid Build Coastguard Worker   WORD32 *dest = fp;
378*15dc779aSAndroid Build Coastguard Worker 
379*15dc779aSAndroid Build Coastguard Worker   if (shift_olap > shiftp) {
380*15dc779aSAndroid Build Coastguard Worker     if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
381*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
382*15dc779aSAndroid Build Coastguard Worker         dest[i] = dest[i] >> (shift_olap - shiftp);
383*15dc779aSAndroid Build Coastguard Worker       }
384*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
385*15dc779aSAndroid Build Coastguard Worker            i++) {
386*15dc779aSAndroid Build Coastguard Worker         dest[i] = ixheaacd_mult32_sh1(
387*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]),
388*15dc779aSAndroid Build Coastguard Worker             src2[i]);
389*15dc779aSAndroid Build Coastguard Worker       }
390*15dc779aSAndroid Build Coastguard Worker 
391*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
392*15dc779aSAndroid Build Coastguard Worker            i++) {
393*15dc779aSAndroid Build Coastguard Worker         dest[i] = 0;
394*15dc779aSAndroid Build Coastguard Worker       }
395*15dc779aSAndroid Build Coastguard Worker     } else {
396*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
397*15dc779aSAndroid Build Coastguard Worker         dest[i] = dest[i] >> (shift_olap - shiftp);
398*15dc779aSAndroid Build Coastguard Worker       }
399*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->lfac;
400*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
401*15dc779aSAndroid Build Coastguard Worker            i++) {
402*15dc779aSAndroid Build Coastguard Worker         dest[i] = 0;
403*15dc779aSAndroid Build Coastguard Worker       }
404*15dc779aSAndroid Build Coastguard Worker     }
405*15dc779aSAndroid Build Coastguard Worker   } else {
406*15dc779aSAndroid Build Coastguard Worker     if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
407*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
408*15dc779aSAndroid Build Coastguard Worker            i++) {
409*15dc779aSAndroid Build Coastguard Worker         dest[i] =
410*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(ixheaac_negate32_sat(
411*15dc779aSAndroid Build Coastguard Worker                                     src1[ixheaacd_drc_offset->n_short - i - 1]),
412*15dc779aSAndroid Build Coastguard Worker                                 src2[i]) >>
413*15dc779aSAndroid Build Coastguard Worker             (shiftp - shift_olap);
414*15dc779aSAndroid Build Coastguard Worker       }
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker       for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
417*15dc779aSAndroid Build Coastguard Worker            i++) {
418*15dc779aSAndroid Build Coastguard Worker         dest[i] = 0;
419*15dc779aSAndroid Build Coastguard Worker       }
420*15dc779aSAndroid Build Coastguard Worker     } else {
421*15dc779aSAndroid Build Coastguard Worker       for (i = ixheaacd_drc_offset->lfac;
422*15dc779aSAndroid Build Coastguard Worker            i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
423*15dc779aSAndroid Build Coastguard Worker            i++) {
424*15dc779aSAndroid Build Coastguard Worker         dest[i] = 0;
425*15dc779aSAndroid Build Coastguard Worker       }
426*15dc779aSAndroid Build Coastguard Worker     }
427*15dc779aSAndroid Build Coastguard Worker   }
428*15dc779aSAndroid Build Coastguard Worker }
429*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_short2(WORD32 * src1,WORD32 * win_fwd,WORD32 * fp,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)430*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
431*15dc779aSAndroid Build Coastguard Worker                                offset_lengths *ixheaacd_drc_offset,
432*15dc779aSAndroid Build Coastguard Worker                                WORD8 shiftp, WORD8 shift_olap) {
433*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker   WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
436*15dc779aSAndroid Build Coastguard Worker 
437*15dc779aSAndroid Build Coastguard Worker   if (shift_olap > shiftp) {
438*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
439*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
440*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(src1[i], *win_fwd),
441*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
442*15dc779aSAndroid Build Coastguard Worker 
443*15dc779aSAndroid Build Coastguard Worker       fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
444*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev),
445*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
446*15dc779aSAndroid Build Coastguard Worker                                *win_fwd) >>
447*15dc779aSAndroid Build Coastguard Worker            (shift_olap - shiftp)));
448*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
449*15dc779aSAndroid Build Coastguard Worker       win_rev--;
450*15dc779aSAndroid Build Coastguard Worker     }
451*15dc779aSAndroid Build Coastguard Worker 
452*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_short;
453*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
454*15dc779aSAndroid Build Coastguard Worker          i++) {
455*15dc779aSAndroid Build Coastguard Worker       fp[i] = 0;
456*15dc779aSAndroid Build Coastguard Worker     }
457*15dc779aSAndroid Build Coastguard Worker   } else {
458*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
459*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
460*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
461*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(fp[i], *win_rev));
462*15dc779aSAndroid Build Coastguard Worker 
463*15dc779aSAndroid Build Coastguard Worker       fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
464*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev) >>
465*15dc779aSAndroid Build Coastguard Worker            (shiftp - shift_olap)),
466*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
467*15dc779aSAndroid Build Coastguard Worker                               *win_fwd));
468*15dc779aSAndroid Build Coastguard Worker 
469*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
470*15dc779aSAndroid Build Coastguard Worker       win_rev--;
471*15dc779aSAndroid Build Coastguard Worker     }
472*15dc779aSAndroid Build Coastguard Worker 
473*15dc779aSAndroid Build Coastguard Worker     for (i = ixheaacd_drc_offset->n_short;
474*15dc779aSAndroid Build Coastguard Worker          i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
475*15dc779aSAndroid Build Coastguard Worker          i++) {
476*15dc779aSAndroid Build Coastguard Worker       fp[i] = 0;
477*15dc779aSAndroid Build Coastguard Worker     }
478*15dc779aSAndroid Build Coastguard Worker   }
479*15dc779aSAndroid Build Coastguard Worker }
480*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_short3(WORD32 * src1,WORD32 * win_rev,WORD32 * fp,WORD32 n_short,WORD8 shiftp,WORD8 shift_olap)481*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp,
482*15dc779aSAndroid Build Coastguard Worker                                 WORD32 n_short, WORD8 shiftp,
483*15dc779aSAndroid Build Coastguard Worker                                 WORD8 shift_olap) {
484*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
485*15dc779aSAndroid Build Coastguard Worker   const WORD32 *win_fwd = win_rev - n_short + 1;
486*15dc779aSAndroid Build Coastguard Worker   if (shift_olap > shiftp) {
487*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n_short / 2; i++) {
488*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
489*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
490*15dc779aSAndroid Build Coastguard Worker                               *win_rev),
491*15dc779aSAndroid Build Coastguard Worker           (fp[i] >> (shift_olap - shiftp)));
492*15dc779aSAndroid Build Coastguard Worker 
493*15dc779aSAndroid Build Coastguard Worker       fp[n_short - i - 1] = ixheaac_add32_sat(
494*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
495*15dc779aSAndroid Build Coastguard Worker                               *win_fwd),
496*15dc779aSAndroid Build Coastguard Worker           (fp[n_short - i - 1] >> (shift_olap - shiftp)));
497*15dc779aSAndroid Build Coastguard Worker       win_rev--;
498*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
499*15dc779aSAndroid Build Coastguard Worker     }
500*15dc779aSAndroid Build Coastguard Worker     return (shiftp);
501*15dc779aSAndroid Build Coastguard Worker   } else {
502*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n_short / 2; i++) {
503*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
504*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
505*15dc779aSAndroid Build Coastguard Worker                                *win_rev) >>
506*15dc779aSAndroid Build Coastguard Worker            (shiftp - shift_olap)),
507*15dc779aSAndroid Build Coastguard Worker           fp[i]);
508*15dc779aSAndroid Build Coastguard Worker 
509*15dc779aSAndroid Build Coastguard Worker       fp[n_short - i - 1] = ixheaac_add32_sat(
510*15dc779aSAndroid Build Coastguard Worker           (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
511*15dc779aSAndroid Build Coastguard Worker                                *win_fwd) >>
512*15dc779aSAndroid Build Coastguard Worker            (shiftp - shift_olap)),
513*15dc779aSAndroid Build Coastguard Worker           fp[n_short - i - 1]);
514*15dc779aSAndroid Build Coastguard Worker 
515*15dc779aSAndroid Build Coastguard Worker       win_rev--;
516*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
517*15dc779aSAndroid Build Coastguard Worker     }
518*15dc779aSAndroid Build Coastguard Worker     return (shift_olap);
519*15dc779aSAndroid Build Coastguard Worker   }
520*15dc779aSAndroid Build Coastguard Worker }
521*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_windowing_short4(WORD32 * src1,WORD32 * win_fwd,WORD32 * fp,WORD32 * win_fwd1,WORD32 n_short,WORD32 flag,WORD8 shiftp,WORD8 shift_olap,WORD8 output_q)522*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
523*15dc779aSAndroid Build Coastguard Worker                                 WORD32 *win_fwd1, WORD32 n_short, WORD32 flag,
524*15dc779aSAndroid Build Coastguard Worker                                 WORD8 shiftp, WORD8 shift_olap,
525*15dc779aSAndroid Build Coastguard Worker                                 WORD8 output_q) {
526*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
527*15dc779aSAndroid Build Coastguard Worker   const WORD32 *win_rev = win_fwd + n_short - 1;
528*15dc779aSAndroid Build Coastguard Worker   const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
529*15dc779aSAndroid Build Coastguard Worker   if (shift_olap > output_q) {
530*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n_short / 2; i++) {
531*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
532*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
533*15dc779aSAndroid Build Coastguard Worker               (shiftp - output_q),
534*15dc779aSAndroid Build Coastguard Worker           fp[i]);
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker       fp[n_short - i - 1] = ixheaac_add32_sat(
537*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
538*15dc779aSAndroid Build Coastguard Worker                               *win_rev) >>
539*15dc779aSAndroid Build Coastguard Worker               (shiftp - output_q),
540*15dc779aSAndroid Build Coastguard Worker           fp[n_short - i - 1]);
541*15dc779aSAndroid Build Coastguard Worker 
542*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
543*15dc779aSAndroid Build Coastguard Worker       win_rev--;
544*15dc779aSAndroid Build Coastguard Worker     }
545*15dc779aSAndroid Build Coastguard Worker     if (flag == 1) {
546*15dc779aSAndroid Build Coastguard Worker       for (; i < n_short; i++) {
547*15dc779aSAndroid Build Coastguard Worker         fp[i + n_short / 2] = ixheaac_add32_sat(
548*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
549*15dc779aSAndroid Build Coastguard Worker                                 *win_fwd1) >>
550*15dc779aSAndroid Build Coastguard Worker                 (shiftp - output_q),
551*15dc779aSAndroid Build Coastguard Worker             (fp[i + n_short / 2] >> (shift_olap - output_q)));
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker         fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
554*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
555*15dc779aSAndroid Build Coastguard Worker                                 *win_rev1) >>
556*15dc779aSAndroid Build Coastguard Worker                 (shiftp - output_q),
557*15dc779aSAndroid Build Coastguard Worker             (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker         win_fwd1--;
560*15dc779aSAndroid Build Coastguard Worker         win_rev1++;
561*15dc779aSAndroid Build Coastguard Worker       }
562*15dc779aSAndroid Build Coastguard Worker     } else {
563*15dc779aSAndroid Build Coastguard Worker       for (; i < n_short; i++) {
564*15dc779aSAndroid Build Coastguard Worker         fp[i + n_short / 2] = ixheaac_add32_sat(
565*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
566*15dc779aSAndroid Build Coastguard Worker             fp[i + n_short / 2] >> (shift_olap - output_q));
567*15dc779aSAndroid Build Coastguard Worker         fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
568*15dc779aSAndroid Build Coastguard Worker             ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
569*15dc779aSAndroid Build Coastguard Worker             fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
570*15dc779aSAndroid Build Coastguard Worker       }
571*15dc779aSAndroid Build Coastguard Worker     }
572*15dc779aSAndroid Build Coastguard Worker     return (output_q);
573*15dc779aSAndroid Build Coastguard Worker   } else {
574*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n_short / 2; i++) {
575*15dc779aSAndroid Build Coastguard Worker       fp[i] = ixheaac_add32_sat(
576*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
577*15dc779aSAndroid Build Coastguard Worker               (shiftp - shift_olap),
578*15dc779aSAndroid Build Coastguard Worker           fp[i] >> (output_q - shift_olap));
579*15dc779aSAndroid Build Coastguard Worker 
580*15dc779aSAndroid Build Coastguard Worker       fp[n_short - i - 1] = ixheaac_add32_sat(
581*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
582*15dc779aSAndroid Build Coastguard Worker                               *win_rev) >>
583*15dc779aSAndroid Build Coastguard Worker               (shiftp - shift_olap),
584*15dc779aSAndroid Build Coastguard Worker           fp[n_short - i - 1]);
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker       win_fwd++;
587*15dc779aSAndroid Build Coastguard Worker       win_rev--;
588*15dc779aSAndroid Build Coastguard Worker     }
589*15dc779aSAndroid Build Coastguard Worker     if (flag == 1) {
590*15dc779aSAndroid Build Coastguard Worker       for (; i < n_short; i++) {
591*15dc779aSAndroid Build Coastguard Worker         fp[i + n_short / 2] = ixheaac_add32_sat(
592*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
593*15dc779aSAndroid Build Coastguard Worker                                 *win_fwd1) >>
594*15dc779aSAndroid Build Coastguard Worker                 (shiftp - shift_olap),
595*15dc779aSAndroid Build Coastguard Worker             fp[i + n_short / 2]);
596*15dc779aSAndroid Build Coastguard Worker 
597*15dc779aSAndroid Build Coastguard Worker         fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
598*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
599*15dc779aSAndroid Build Coastguard Worker                                 *win_rev1) >>
600*15dc779aSAndroid Build Coastguard Worker                 (shiftp - shift_olap),
601*15dc779aSAndroid Build Coastguard Worker             fp[3 * n_short - n_short / 2 - i - 1]);
602*15dc779aSAndroid Build Coastguard Worker 
603*15dc779aSAndroid Build Coastguard Worker         win_fwd1--;
604*15dc779aSAndroid Build Coastguard Worker         win_rev1++;
605*15dc779aSAndroid Build Coastguard Worker       }
606*15dc779aSAndroid Build Coastguard Worker     } else {
607*15dc779aSAndroid Build Coastguard Worker       for (; i < n_short; i++) {
608*15dc779aSAndroid Build Coastguard Worker         fp[i + n_short / 2] =
609*15dc779aSAndroid Build Coastguard Worker             ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
610*15dc779aSAndroid Build Coastguard Worker                                    (shiftp - shift_olap),
611*15dc779aSAndroid Build Coastguard Worker                                fp[i + n_short / 2]);
612*15dc779aSAndroid Build Coastguard Worker         fp[3 * n_short - n_short / 2 - i - 1] =
613*15dc779aSAndroid Build Coastguard Worker             ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
614*15dc779aSAndroid Build Coastguard Worker                                    (shiftp - shift_olap),
615*15dc779aSAndroid Build Coastguard Worker                                fp[3 * n_short - n_short / 2 - i - 1]);
616*15dc779aSAndroid Build Coastguard Worker       }
617*15dc779aSAndroid Build Coastguard Worker     }
618*15dc779aSAndroid Build Coastguard Worker     return (shift_olap);
619*15dc779aSAndroid Build Coastguard Worker   }
620*15dc779aSAndroid Build Coastguard Worker }
621*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_scale_down(WORD32 * dest,WORD32 * src,WORD32 len,WORD8 shift1,WORD8 shift2)622*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1,
623*15dc779aSAndroid Build Coastguard Worker                          WORD8 shift2) {
624*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
625*15dc779aSAndroid Build Coastguard Worker   if (shift1 > shift2) {
626*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
627*15dc779aSAndroid Build Coastguard Worker       *dest = *src >> (shift1 - shift2);
628*15dc779aSAndroid Build Coastguard Worker       src++;
629*15dc779aSAndroid Build Coastguard Worker       dest++;
630*15dc779aSAndroid Build Coastguard Worker     }
631*15dc779aSAndroid Build Coastguard Worker   } else {
632*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
633*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_shl32_sat((*src), (shift2 - shift1));
634*15dc779aSAndroid Build Coastguard Worker       src++;
635*15dc779aSAndroid Build Coastguard Worker       dest++;
636*15dc779aSAndroid Build Coastguard Worker     }
637*15dc779aSAndroid Build Coastguard Worker   }
638*15dc779aSAndroid Build Coastguard Worker }
639*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_scale_down_adj(WORD32 * dest,WORD32 * src,WORD32 len,WORD8 shift1,WORD8 shift2)640*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len,
641*15dc779aSAndroid Build Coastguard Worker                              WORD8 shift1, WORD8 shift2) {
642*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
643*15dc779aSAndroid Build Coastguard Worker   if (shift1 > shift2) {
644*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
645*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat((*src >> (shift1 - shift2)), ADJ_SCALE);
646*15dc779aSAndroid Build Coastguard Worker       src++;
647*15dc779aSAndroid Build Coastguard Worker       dest++;
648*15dc779aSAndroid Build Coastguard Worker     }
649*15dc779aSAndroid Build Coastguard Worker   } else {
650*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
651*15dc779aSAndroid Build Coastguard Worker       *dest = ixheaac_add32_sat(ixheaac_shl32_sat((*src), (shift2 - shift1)),
652*15dc779aSAndroid Build Coastguard Worker                                  ADJ_SCALE);
653*15dc779aSAndroid Build Coastguard Worker       src++;
654*15dc779aSAndroid Build Coastguard Worker       dest++;
655*15dc779aSAndroid Build Coastguard Worker     }
656*15dc779aSAndroid Build Coastguard Worker   }
657*15dc779aSAndroid Build Coastguard Worker }
658