xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_hybrid.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_fft(complex *out, WORD32 N, ixheaace_common_tables *);
35*15dc779aSAndroid Build Coastguard Worker 
ixheaace_four_chan_filtering(const FLOAT32 * ptr_qmf_real,const FLOAT32 * ptr_qmf_imag,FLOAT32 ** ptr_hyb_real,FLOAT32 ** ptr_hyb_imag,WORD32 ch_offset,const FLOAT32 * ptr_p4_13,ixheaace_common_tables * pstr_common_tab)36*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_four_chan_filtering(const FLOAT32 *ptr_qmf_real, const FLOAT32 *ptr_qmf_imag,
37*15dc779aSAndroid Build Coastguard Worker                                          FLOAT32 **ptr_hyb_real, FLOAT32 **ptr_hyb_imag,
38*15dc779aSAndroid Build Coastguard Worker                                          WORD32 ch_offset, const FLOAT32 *ptr_p4_13,
39*15dc779aSAndroid Build Coastguard Worker                                          ixheaace_common_tables *pstr_common_tab) {
40*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k, n;
41*15dc779aSAndroid Build Coastguard Worker   WORD32 mid_tap = IXHEAACE_HYBRID_FILTER_DELAY;
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker   FLOAT32 cum[8], *ptr_cum;
44*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp1, tmp2, tmp_p4;
45*15dc779aSAndroid Build Coastguard Worker   FLOAT32 real, imag;
46*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_re, *ptr_im;
47*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_hy_im, *ptr_hy_re;
48*15dc779aSAndroid Build Coastguard Worker   ptr_re = &ptr_qmf_real[0];
49*15dc779aSAndroid Build Coastguard Worker   ptr_im = &ptr_qmf_imag[0];
50*15dc779aSAndroid Build Coastguard Worker   ptr_hy_re = &ptr_hyb_real[0][ch_offset];
51*15dc779aSAndroid Build Coastguard Worker   ptr_hy_im = &ptr_hyb_imag[0][ch_offset];
52*15dc779aSAndroid Build Coastguard Worker 
53*15dc779aSAndroid Build Coastguard Worker   for (i = IXHEAACE_QMF_TIME_SLOTS - 1; i >= 0; i--) {
54*15dc779aSAndroid Build Coastguard Worker     real = imag = 0;
55*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 16; k += 4) {
56*15dc779aSAndroid Build Coastguard Worker       tmp_p4 = ptr_p4_13[k];
57*15dc779aSAndroid Build Coastguard Worker       tmp1 = ptr_re[k];
58*15dc779aSAndroid Build Coastguard Worker       tmp2 = ptr_im[k];
59*15dc779aSAndroid Build Coastguard Worker 
60*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp1;
61*15dc779aSAndroid Build Coastguard Worker       real = real - tmp1;
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp2;
64*15dc779aSAndroid Build Coastguard Worker       imag = imag + tmp1;
65*15dc779aSAndroid Build Coastguard Worker     }
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker     cum[3] = imag;
68*15dc779aSAndroid Build Coastguard Worker     cum[2] = real;
69*15dc779aSAndroid Build Coastguard Worker     real = imag = 0;
70*15dc779aSAndroid Build Coastguard Worker 
71*15dc779aSAndroid Build Coastguard Worker     for (k = 3; k < 15; k += 4) {
72*15dc779aSAndroid Build Coastguard Worker       tmp_p4 = ptr_p4_13[k];
73*15dc779aSAndroid Build Coastguard Worker       tmp1 = ptr_re[k];
74*15dc779aSAndroid Build Coastguard Worker       tmp2 = ptr_im[k];
75*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp1;
76*15dc779aSAndroid Build Coastguard Worker       real = real + tmp1;
77*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp2;
78*15dc779aSAndroid Build Coastguard Worker       imag = imag + tmp1;
79*15dc779aSAndroid Build Coastguard Worker     }
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag + real;
82*15dc779aSAndroid Build Coastguard Worker     cum[7] = tmp1 * IXHEAACE_COS_PI_BY_4;
83*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag - real;
84*15dc779aSAndroid Build Coastguard Worker     cum[6] = tmp1 * IXHEAACE_COS_PI_BY_4;
85*15dc779aSAndroid Build Coastguard Worker 
86*15dc779aSAndroid Build Coastguard Worker     cum[1] = ptr_p4_13[mid_tap] * ptr_re[mid_tap];
87*15dc779aSAndroid Build Coastguard Worker     cum[0] = ptr_p4_13[mid_tap] * ptr_im[mid_tap];
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker     real = imag = 0;
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker     for (k = 1; k < 13; k += 4) {
92*15dc779aSAndroid Build Coastguard Worker       tmp_p4 = ptr_p4_13[k];
93*15dc779aSAndroid Build Coastguard Worker       tmp1 = ptr_re[k];
94*15dc779aSAndroid Build Coastguard Worker       tmp2 = ptr_im[k];
95*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp1;
96*15dc779aSAndroid Build Coastguard Worker       real = real + tmp1;
97*15dc779aSAndroid Build Coastguard Worker       tmp1 = tmp_p4 * tmp2;
98*15dc779aSAndroid Build Coastguard Worker       imag = imag + tmp1;
99*15dc779aSAndroid Build Coastguard Worker     }
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker     tmp1 = real - imag;
102*15dc779aSAndroid Build Coastguard Worker     cum[5] = tmp1 * IXHEAACE_COS_PI_BY_4;
103*15dc779aSAndroid Build Coastguard Worker     tmp1 = real + imag;
104*15dc779aSAndroid Build Coastguard Worker     cum[4] = tmp1 * IXHEAACE_COS_PI_BY_4;
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_fft((complex *)cum, 4, pstr_common_tab);
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker     ptr_cum = &cum[0];
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker     for (n = 3; n >= 0; n--) {
111*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_cum++;
112*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_cum++;
113*15dc779aSAndroid Build Coastguard Worker       *ptr_hy_im++ = tmp1;
114*15dc779aSAndroid Build Coastguard Worker       *ptr_hy_re++ = tmp2;
115*15dc779aSAndroid Build Coastguard Worker     }
116*15dc779aSAndroid Build Coastguard Worker     ptr_re++;
117*15dc779aSAndroid Build Coastguard Worker     ptr_im++;
118*15dc779aSAndroid Build Coastguard Worker     ptr_hy_re += IXHEAACE_QMF_TIME_SLOTS - 4;
119*15dc779aSAndroid Build Coastguard Worker     ptr_hy_im += IXHEAACE_QMF_TIME_SLOTS - 4;
120*15dc779aSAndroid Build Coastguard Worker   }
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker 
ixheaace_eight_chan_filtering(const FLOAT32 * ptr_qmf_real,const FLOAT32 * ptr_qmf_imag,FLOAT32 ** ptr_hyb_real,FLOAT32 ** ptr_hyb_imag,const FLOAT32 * ptr_p8_13,ixheaace_common_tables * pstr_common_tab)123*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_eight_chan_filtering(const FLOAT32 *ptr_qmf_real,
124*15dc779aSAndroid Build Coastguard Worker                                           const FLOAT32 *ptr_qmf_imag, FLOAT32 **ptr_hyb_real,
125*15dc779aSAndroid Build Coastguard Worker                                           FLOAT32 **ptr_hyb_imag, const FLOAT32 *ptr_p8_13,
126*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_common_tables *pstr_common_tab)
127*15dc779aSAndroid Build Coastguard Worker 
128*15dc779aSAndroid Build Coastguard Worker {
129*15dc779aSAndroid Build Coastguard Worker   LOOPINDEX i, n;
130*15dc779aSAndroid Build Coastguard Worker   LOOPINDEX mid_tap = IXHEAACE_HYBRID_FILTER_DELAY;
131*15dc779aSAndroid Build Coastguard Worker   FLOAT32 real, imag;
132*15dc779aSAndroid Build Coastguard Worker   FLOAT32 cum[16], *ptr_cum;
133*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp1, tmp2, tmp3;
134*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_re, *ptr_im;
135*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_hy_re, *ptr_hy_im;
136*15dc779aSAndroid Build Coastguard Worker   ptr_re = &ptr_qmf_real[0];
137*15dc779aSAndroid Build Coastguard Worker   ptr_im = &ptr_qmf_imag[0];
138*15dc779aSAndroid Build Coastguard Worker   ptr_hy_re = &ptr_hyb_real[0][0];
139*15dc779aSAndroid Build Coastguard Worker   ptr_hy_im = &ptr_hyb_imag[0][0];
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker   for (i = IXHEAACE_QMF_TIME_SLOTS - 1; i >= 0; i--) {
142*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[4] * ptr_re[4];
143*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[12] * ptr_re[12];
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker     tmp3 = ptr_im[4];
146*15dc779aSAndroid Build Coastguard Worker     real = tmp1 + tmp2;
147*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_im[12];
148*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[4] * tmp3;
149*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[12] * tmp2;
150*15dc779aSAndroid Build Coastguard Worker     imag = tmp1 + tmp2;
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag - real;
153*15dc779aSAndroid Build Coastguard Worker     cum[5] = tmp1 * IXHEAACE_COS_PI_BY_4;
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag + real;
156*15dc779aSAndroid Build Coastguard Worker     tmp3 = ptr_re[3];
157*15dc779aSAndroid Build Coastguard Worker     cum[4] = -tmp1 * IXHEAACE_COS_PI_BY_4;
158*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_re[11];
159*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[3] * tmp3;
160*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[11] * tmp2;
161*15dc779aSAndroid Build Coastguard Worker     tmp3 = ptr_im[3];
162*15dc779aSAndroid Build Coastguard Worker     real = tmp1 + tmp2;
163*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_im[11];
164*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[3] * tmp3;
165*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[11] * tmp2;
166*15dc779aSAndroid Build Coastguard Worker     imag = tmp1 + tmp2;
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_COS_PI_BY_8;
169*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_SIN_PI_BY_8;
170*15dc779aSAndroid Build Coastguard Worker     cum[13] = tmp1 - tmp2;
171*15dc779aSAndroid Build Coastguard Worker 
172*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_SIN_PI_BY_8;
173*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_COS_PI_BY_8;
174*15dc779aSAndroid Build Coastguard Worker     tmp3 = ptr_re[2];
175*15dc779aSAndroid Build Coastguard Worker     cum[12] = -tmp1 - tmp2;
176*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_re[10];
177*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[2] * tmp3;
178*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[10] * tmp2;
179*15dc779aSAndroid Build Coastguard Worker     tmp3 = ptr_im[2];
180*15dc779aSAndroid Build Coastguard Worker     cum[2] = -tmp1 - tmp2;
181*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_im[10];
182*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[2] * tmp3;
183*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[10] * tmp2;
184*15dc779aSAndroid Build Coastguard Worker     cum[3] = tmp1 + tmp2;
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[1] * ptr_re[1];
187*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[9] * ptr_re[9];
188*15dc779aSAndroid Build Coastguard Worker     real = tmp1 + tmp2;
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[1] * ptr_im[1];
191*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[9] * ptr_im[9];
192*15dc779aSAndroid Build Coastguard Worker     imag = tmp1 + tmp2;
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_COS_PI_BY_8;
195*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_SIN_PI_BY_8;
196*15dc779aSAndroid Build Coastguard Worker     cum[11] = tmp1 + tmp2;
197*15dc779aSAndroid Build Coastguard Worker 
198*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_SIN_PI_BY_8;
199*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_COS_PI_BY_8;
200*15dc779aSAndroid Build Coastguard Worker     cum[10] = tmp1 - tmp2;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[0] * ptr_re[0];
203*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[8] * ptr_re[8];
204*15dc779aSAndroid Build Coastguard Worker     real = tmp1 + tmp2;
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker     tmp1 = ptr_p8_13[0] * ptr_im[0];
207*15dc779aSAndroid Build Coastguard Worker     tmp2 = ptr_p8_13[8] * ptr_im[8];
208*15dc779aSAndroid Build Coastguard Worker     imag = tmp1 + tmp2;
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag + real;
211*15dc779aSAndroid Build Coastguard Worker     cum[7] = tmp1 * IXHEAACE_COS_PI_BY_4;
212*15dc779aSAndroid Build Coastguard Worker 
213*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag - real;
214*15dc779aSAndroid Build Coastguard Worker     cum[6] = tmp1 * IXHEAACE_COS_PI_BY_4;
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker     real = ptr_p8_13[7] * ptr_re[7];
217*15dc779aSAndroid Build Coastguard Worker     imag = ptr_p8_13[7] * ptr_im[7];
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_SIN_PI_BY_8;
220*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_COS_PI_BY_8;
221*15dc779aSAndroid Build Coastguard Worker     cum[15] = tmp1 + tmp2;
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker     tmp1 = imag * IXHEAACE_COS_PI_BY_8;
224*15dc779aSAndroid Build Coastguard Worker     tmp2 = real * IXHEAACE_SIN_PI_BY_8;
225*15dc779aSAndroid Build Coastguard Worker     cum[14] = tmp1 - tmp2;
226*15dc779aSAndroid Build Coastguard Worker 
227*15dc779aSAndroid Build Coastguard Worker     cum[1] = ptr_p8_13[mid_tap] * ptr_re[mid_tap];
228*15dc779aSAndroid Build Coastguard Worker     cum[0] = ptr_p8_13[mid_tap] * ptr_im[mid_tap];
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker     real = ptr_p8_13[5] * ptr_re[5];
231*15dc779aSAndroid Build Coastguard Worker     imag = ptr_p8_13[5] * ptr_im[5];
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker     tmp1 = real * IXHEAACE_COS_PI_BY_8;
234*15dc779aSAndroid Build Coastguard Worker     tmp2 = imag * IXHEAACE_SIN_PI_BY_8;
235*15dc779aSAndroid Build Coastguard Worker     cum[9] = tmp1 - tmp2;
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker     tmp1 = real * IXHEAACE_SIN_PI_BY_8;
238*15dc779aSAndroid Build Coastguard Worker     tmp2 = imag * IXHEAACE_COS_PI_BY_8;
239*15dc779aSAndroid Build Coastguard Worker     cum[8] = tmp1 + tmp2;
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_fft((complex *)cum, 8, pstr_common_tab);
242*15dc779aSAndroid Build Coastguard Worker 
243*15dc779aSAndroid Build Coastguard Worker     ptr_cum = &cum[0];
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker     for (n = 7; n >= 0; n--) {
246*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_cum++;
247*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_cum++;
248*15dc779aSAndroid Build Coastguard Worker       *ptr_hy_im++ = tmp1;
249*15dc779aSAndroid Build Coastguard Worker       *ptr_hy_re++ = tmp2;
250*15dc779aSAndroid Build Coastguard Worker     }
251*15dc779aSAndroid Build Coastguard Worker     ptr_re++;
252*15dc779aSAndroid Build Coastguard Worker     ptr_im++;
253*15dc779aSAndroid Build Coastguard Worker     ptr_hy_re += IXHEAACE_QMF_TIME_SLOTS - 8;
254*15dc779aSAndroid Build Coastguard Worker     ptr_hy_im += IXHEAACE_QMF_TIME_SLOTS - 8;
255*15dc779aSAndroid Build Coastguard Worker   }
256*15dc779aSAndroid Build Coastguard Worker }
257*15dc779aSAndroid Build Coastguard Worker 
ixheaace_hybrid_analysis(const FLOAT32 ** ptr_qmf_real_in,const FLOAT32 ** ptr_qmf_imag_in,FLOAT32 ** ptr_hyb_real_in,FLOAT32 ** ptr_hyb_imag_in,ixheaace_pstr_hybrid pstr_hybrid,ixheaace_str_ps_tab * pstr_ps_tab,ixheaace_common_tables * pstr_common_tab)258*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_hybrid_analysis(const FLOAT32 **ptr_qmf_real_in,
259*15dc779aSAndroid Build Coastguard Worker                                       const FLOAT32 **ptr_qmf_imag_in, FLOAT32 **ptr_hyb_real_in,
260*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 **ptr_hyb_imag_in, ixheaace_pstr_hybrid pstr_hybrid,
261*15dc779aSAndroid Build Coastguard Worker                                       ixheaace_str_ps_tab *pstr_ps_tab,
262*15dc779aSAndroid Build Coastguard Worker                                       ixheaace_common_tables *pstr_common_tab) {
263*15dc779aSAndroid Build Coastguard Worker   WORD32 band, i;
264*15dc779aSAndroid Build Coastguard Worker   ixheaace_hybrid_res hybrid_res;
265*15dc779aSAndroid Build Coastguard Worker   WORD32 ch_offset = 0;
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_re, *ptr_im;
268*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_qmf_real, *ptr_qmf_imag;
269*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp1, tmp2;
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < IXHEAACE_NUM_QMF_BANDS_IN_HYBRID; band++) {
272*15dc779aSAndroid Build Coastguard Worker     hybrid_res = (ixheaace_hybrid_res)pstr_ps_tab->a_hyb_res[band];
273*15dc779aSAndroid Build Coastguard Worker 
274*15dc779aSAndroid Build Coastguard Worker     memcpy(pstr_hybrid->ptr_work_real, pstr_hybrid->ptr_qmf_buf_real[band],
275*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_QMF_BUFFER_MOVE * sizeof(FLOAT32));
276*15dc779aSAndroid Build Coastguard Worker     memcpy(pstr_hybrid->ptr_work_imag, pstr_hybrid->ptr_qmf_buf_imag[band],
277*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_QMF_BUFFER_MOVE * sizeof(FLOAT32));
278*15dc779aSAndroid Build Coastguard Worker     ptr_re = &pstr_hybrid->ptr_work_real[IXHEAACE_QMF_BUFFER_MOVE];
279*15dc779aSAndroid Build Coastguard Worker     ptr_im = &pstr_hybrid->ptr_work_imag[IXHEAACE_QMF_BUFFER_MOVE];
280*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_real = &ptr_qmf_real_in[0][band];
281*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_imag = &ptr_qmf_imag_in[0][band];
282*15dc779aSAndroid Build Coastguard Worker 
283*15dc779aSAndroid Build Coastguard Worker     for (i = IXHEAACE_QMF_TIME_SLOTS - 1; i >= 0; i--) {
284*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_qmf_real;
285*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_qmf_imag;
286*15dc779aSAndroid Build Coastguard Worker 
287*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_real += IXHEAACE_QMF_CHANNELS;
288*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_imag += IXHEAACE_QMF_CHANNELS;
289*15dc779aSAndroid Build Coastguard Worker 
290*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = tmp2;
291*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = tmp1;
292*15dc779aSAndroid Build Coastguard Worker     }
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker     ptr_re = &pstr_hybrid->ptr_qmf_buf_real[band][0];
295*15dc779aSAndroid Build Coastguard Worker     ptr_im = &pstr_hybrid->ptr_qmf_buf_imag[band][0];
296*15dc779aSAndroid Build Coastguard Worker 
297*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_real = &ptr_qmf_real_in[IXHEAACE_QMF_TIME_SLOTS - IXHEAACE_QMF_BUFFER_MOVE][band];
298*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_imag = &ptr_qmf_imag_in[IXHEAACE_QMF_TIME_SLOTS - IXHEAACE_QMF_BUFFER_MOVE][band];
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < IXHEAACE_QMF_BUFFER_MOVE; i++) {
301*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_qmf_real;
302*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_real += IXHEAACE_QMF_CHANNELS;
303*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_qmf_imag;
304*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_imag += IXHEAACE_QMF_CHANNELS;
305*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = tmp1;
306*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = tmp2;
307*15dc779aSAndroid Build Coastguard Worker     }
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker     switch (hybrid_res) {
310*15dc779aSAndroid Build Coastguard Worker       case IXHEAACE_HYBRID_4_CPLX:
311*15dc779aSAndroid Build Coastguard Worker         ixheaace_four_chan_filtering(pstr_hybrid->ptr_work_real, pstr_hybrid->ptr_work_imag,
312*15dc779aSAndroid Build Coastguard Worker                                      ptr_hyb_real_in, ptr_hyb_imag_in, ch_offset,
313*15dc779aSAndroid Build Coastguard Worker                                      pstr_ps_tab->p4_13, pstr_common_tab);
314*15dc779aSAndroid Build Coastguard Worker         break;
315*15dc779aSAndroid Build Coastguard Worker       case IXHEAACE_HYBRID_8_CPLX:
316*15dc779aSAndroid Build Coastguard Worker         ixheaace_eight_chan_filtering(pstr_hybrid->ptr_work_real, pstr_hybrid->ptr_work_imag,
317*15dc779aSAndroid Build Coastguard Worker                                       ptr_hyb_real_in, ptr_hyb_imag_in, pstr_ps_tab->p8_13,
318*15dc779aSAndroid Build Coastguard Worker                                       pstr_common_tab);
319*15dc779aSAndroid Build Coastguard Worker         break;
320*15dc779aSAndroid Build Coastguard Worker       default:
321*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_FATAL_PS_INVALID_HYBRID_RES_VAL;
322*15dc779aSAndroid Build Coastguard Worker         break;
323*15dc779aSAndroid Build Coastguard Worker     }
324*15dc779aSAndroid Build Coastguard Worker     ch_offset += hybrid_res;
325*15dc779aSAndroid Build Coastguard Worker   }
326*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
327*15dc779aSAndroid Build Coastguard Worker }
328*15dc779aSAndroid Build Coastguard Worker 
ixheaace_hybrid_synthesis(const FLOAT32 ** ptr_hybrid_real_flt,const FLOAT32 ** ptr_hybrid_imag_flt,FLOAT32 ** ptr_qmf_real_flt,FLOAT32 ** ptr_qmf_imag_flt,const WORD32 * ptr_hyb_res)329*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_hybrid_synthesis(const FLOAT32 **ptr_hybrid_real_flt,
330*15dc779aSAndroid Build Coastguard Worker                                const FLOAT32 **ptr_hybrid_imag_flt, FLOAT32 **ptr_qmf_real_flt,
331*15dc779aSAndroid Build Coastguard Worker                                FLOAT32 **ptr_qmf_imag_flt, const WORD32 *ptr_hyb_res) {
332*15dc779aSAndroid Build Coastguard Worker   WORD32 k, n, band;
333*15dc779aSAndroid Build Coastguard Worker   ixheaace_hybrid_res hybrid_res;
334*15dc779aSAndroid Build Coastguard Worker   WORD32 ch_offset = 0;
335*15dc779aSAndroid Build Coastguard Worker 
336*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp1, temp2;
337*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_qmf_real;
338*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_qmf_imag;
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < IXHEAACE_NUM_QMF_BANDS_IN_HYBRID; band++) {
341*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_hybrid_real = &ptr_hybrid_real_flt[0][ch_offset];
342*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_hybrid_imag = &ptr_hybrid_imag_flt[0][ch_offset];
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker     hybrid_res = (ixheaace_hybrid_res)ptr_hyb_res[band];
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_real = &ptr_qmf_real_flt[0][band];
347*15dc779aSAndroid Build Coastguard Worker     ptr_qmf_imag = &ptr_qmf_imag_flt[0][band];
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker     for (n = 0; n < IXHEAACE_QMF_TIME_SLOTS; n++) {
350*15dc779aSAndroid Build Coastguard Worker       FLOAT32 temo_real = 0, temo_imag = 0;
351*15dc779aSAndroid Build Coastguard Worker 
352*15dc779aSAndroid Build Coastguard Worker       for (k = hybrid_res - 1; k >= 0; k--) {
353*15dc779aSAndroid Build Coastguard Worker         temp1 = *ptr_hybrid_real++;
354*15dc779aSAndroid Build Coastguard Worker         temp2 = *ptr_hybrid_imag++;
355*15dc779aSAndroid Build Coastguard Worker         temo_real += temp1;
356*15dc779aSAndroid Build Coastguard Worker         temo_imag += temp2;
357*15dc779aSAndroid Build Coastguard Worker       }
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker       ptr_hybrid_real += IXHEAACE_QMF_TIME_SLOTS - hybrid_res;
360*15dc779aSAndroid Build Coastguard Worker       ptr_hybrid_imag += IXHEAACE_QMF_TIME_SLOTS - hybrid_res;
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker       *ptr_qmf_real = temo_real;
363*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_real += IXHEAACE_QMF_CHANNELS;
364*15dc779aSAndroid Build Coastguard Worker 
365*15dc779aSAndroid Build Coastguard Worker       *ptr_qmf_imag = temo_imag;
366*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_imag += IXHEAACE_QMF_CHANNELS;
367*15dc779aSAndroid Build Coastguard Worker     }
368*15dc779aSAndroid Build Coastguard Worker     ch_offset += hybrid_res;
369*15dc779aSAndroid Build Coastguard Worker   }
370*15dc779aSAndroid Build Coastguard Worker }
371