xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_ps_dec_flt.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 <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops_arr.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
40*15dc779aSAndroid Build Coastguard Worker 
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
45*15dc779aSAndroid Build Coastguard Worker 
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
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 #include "ixheaacd_sbr_scale.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
59*15dc779aSAndroid Build Coastguard Worker 
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
70*15dc779aSAndroid Build Coastguard Worker 
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
74*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_k_chan_filt(const FLOAT32 * ptr_qmf_re,const FLOAT32 * ptr_qmf_im,FLOAT32 (* ptr_tmp_hyb_re)[MAX_NUM_QMF_CHANNELS],FLOAT32 (* ptr_tmp_hyb_im)[MAX_NUM_QMF_CHANNELS],WORD32 nSamples,WORD32 k,WORD32 bCplx,const FLOAT32 * p,FLOAT32 * cos_sin_mod_tbl)75*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_k_chan_filt(const FLOAT32 *ptr_qmf_re, const FLOAT32 *ptr_qmf_im,
76*15dc779aSAndroid Build Coastguard Worker                           FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_QMF_CHANNELS],
77*15dc779aSAndroid Build Coastguard Worker                           FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_QMF_CHANNELS], WORD32 nSamples,
78*15dc779aSAndroid Build Coastguard Worker                           WORD32 k, WORD32 bCplx, const FLOAT32 *p,
79*15dc779aSAndroid Build Coastguard Worker                           FLOAT32 *cos_sin_mod_tbl) {
80*15dc779aSAndroid Build Coastguard Worker   WORD32 i, n, q;
81*15dc779aSAndroid Build Coastguard Worker   FLOAT32 real, imag;
82*15dc779aSAndroid Build Coastguard Worker   FLOAT32 cos_val, sin_val;
83*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p_real_imag = cos_sin_mod_tbl;
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker   if (bCplx) {
86*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < nSamples; i++) {
87*15dc779aSAndroid Build Coastguard Worker       for (q = 0; q < k; q++) {
88*15dc779aSAndroid Build Coastguard Worker         real = 0;
89*15dc779aSAndroid Build Coastguard Worker         imag = 0;
90*15dc779aSAndroid Build Coastguard Worker         for (n = 0; n < 13; n++) {
91*15dc779aSAndroid Build Coastguard Worker           cos_val = *p_real_imag++;
92*15dc779aSAndroid Build Coastguard Worker           sin_val = *p_real_imag++;
93*15dc779aSAndroid Build Coastguard Worker           real += p[n] * (ptr_qmf_re[n + i] * cos_val - ptr_qmf_im[n + i] * sin_val);
94*15dc779aSAndroid Build Coastguard Worker           imag += p[n] * (ptr_qmf_im[n + i] * cos_val + ptr_qmf_re[n + i] * sin_val);
95*15dc779aSAndroid Build Coastguard Worker         }
96*15dc779aSAndroid Build Coastguard Worker         ptr_tmp_hyb_re[i][q] = real;
97*15dc779aSAndroid Build Coastguard Worker         ptr_tmp_hyb_im[i][q] = imag;
98*15dc779aSAndroid Build Coastguard Worker       }
99*15dc779aSAndroid Build Coastguard Worker       p_real_imag -= (13 * k * 2);
100*15dc779aSAndroid Build Coastguard Worker     }
101*15dc779aSAndroid Build Coastguard Worker   } else {
102*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < nSamples; i++) {
103*15dc779aSAndroid Build Coastguard Worker       for (q = 0; q < k; q++) {
104*15dc779aSAndroid Build Coastguard Worker         real = 0;
105*15dc779aSAndroid Build Coastguard Worker         imag = 0;
106*15dc779aSAndroid Build Coastguard Worker         for (n = 0; n < 13; n++) {
107*15dc779aSAndroid Build Coastguard Worker           cos_val = *p_real_imag++;
108*15dc779aSAndroid Build Coastguard Worker           real += p[n] * (ptr_qmf_re[n + i] * cos_val);
109*15dc779aSAndroid Build Coastguard Worker           imag += p[n] * (ptr_qmf_im[n + i] * cos_val);
110*15dc779aSAndroid Build Coastguard Worker         }
111*15dc779aSAndroid Build Coastguard Worker         ptr_tmp_hyb_re[i][q] = real;
112*15dc779aSAndroid Build Coastguard Worker         ptr_tmp_hyb_im[i][q] = imag;
113*15dc779aSAndroid Build Coastguard Worker       }
114*15dc779aSAndroid Build Coastguard Worker       p_real_imag -= (13 * k);
115*15dc779aSAndroid Build Coastguard Worker     }
116*15dc779aSAndroid Build Coastguard Worker   }
117*15dc779aSAndroid Build Coastguard Worker }
118*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hyb_anal(const FLOAT32 ** ptr_qmf_re,const FLOAT32 ** ptr_qmf_im,ia_ps_dec_struct * ptr_ps_dec,ia_ps_tables_struct * ptr_ps_tables,WORD32 use_34_st_bands)119*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hyb_anal(const FLOAT32 **ptr_qmf_re, const FLOAT32 **ptr_qmf_im,
120*15dc779aSAndroid Build Coastguard Worker                        ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ptr_ps_tables,
121*15dc779aSAndroid Build Coastguard Worker                        WORD32 use_34_st_bands) {
122*15dc779aSAndroid Build Coastguard Worker   WORD32 k, n, band;
123*15dc779aSAndroid Build Coastguard Worker   WORD32 band_res;
124*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_size;
125*15dc779aSAndroid Build Coastguard Worker   WORD32 ch_offset = 0;
126*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS];
127*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS];
128*15dc779aSAndroid Build Coastguard Worker   ia_hybrid_flt_struct *ptr_hybrid;
129*15dc779aSAndroid Build Coastguard Worker   if (!use_34_st_bands) {
130*15dc779aSAndroid Build Coastguard Worker     ptr_tmp_hyb_re = ptr_ps_dec->hyb_left_re;
131*15dc779aSAndroid Build Coastguard Worker     ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
132*15dc779aSAndroid Build Coastguard Worker     ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
133*15dc779aSAndroid Build Coastguard Worker   } else {
134*15dc779aSAndroid Build Coastguard Worker     ptr_tmp_hyb_re = NULL;
135*15dc779aSAndroid Build Coastguard Worker     ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
136*15dc779aSAndroid Build Coastguard Worker     ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
137*15dc779aSAndroid Build Coastguard Worker   }
138*15dc779aSAndroid Build Coastguard Worker   frame_size = ptr_hybrid->frame_size;
139*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
140*15dc779aSAndroid Build Coastguard Worker     band_res = ptr_hybrid->ptr_resol[band];
141*15dc779aSAndroid Build Coastguard Worker 
142*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_qmf_buf_re[band],
143*15dc779aSAndroid Build Coastguard Worker            (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_re[0]));
144*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_qmf_buf_im[band],
145*15dc779aSAndroid Build Coastguard Worker            (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_im[0]));
146*15dc779aSAndroid Build Coastguard Worker 
147*15dc779aSAndroid Build Coastguard Worker     for (n = 0; n < frame_size; n++) {
148*15dc779aSAndroid Build Coastguard Worker       ptr_hybrid->ptr_work_re[(HYBRID_FILTER_LENGTH - 1) + n] =
149*15dc779aSAndroid Build Coastguard Worker           ptr_qmf_re[n + HYBRID_FILTER_DELAY][band];
150*15dc779aSAndroid Build Coastguard Worker       ptr_hybrid->ptr_work_im[(HYBRID_FILTER_LENGTH - 1) + n] =
151*15dc779aSAndroid Build Coastguard Worker           ptr_qmf_im[n + HYBRID_FILTER_DELAY][band];
152*15dc779aSAndroid Build Coastguard Worker     }
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hybrid->ptr_qmf_buf_re[band], ptr_hybrid->ptr_work_re + frame_size,
155*15dc779aSAndroid Build Coastguard Worker            (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_re[band][0]));
156*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hybrid->ptr_qmf_buf_im[band], ptr_hybrid->ptr_work_im + frame_size,
157*15dc779aSAndroid Build Coastguard Worker            (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_im[band][0]));
158*15dc779aSAndroid Build Coastguard Worker 
159*15dc779aSAndroid Build Coastguard Worker     if (ptr_tmp_hyb_re) {
160*15dc779aSAndroid Build Coastguard Worker       switch (band_res) {
161*15dc779aSAndroid Build Coastguard Worker         case NO_HYBRID_CHANNELS_2:
162*15dc779aSAndroid Build Coastguard Worker           ixheaacd_k_chan_filt(
163*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
164*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_2, REAL,
165*15dc779aSAndroid Build Coastguard Worker               ptr_ps_tables->p2_13_20,
166*15dc779aSAndroid Build Coastguard Worker               &ptr_ps_tables->cos_mod_2channel[0][0]);
167*15dc779aSAndroid Build Coastguard Worker           break;
168*15dc779aSAndroid Build Coastguard Worker         case NO_HYBRID_CHANNELS_4:
169*15dc779aSAndroid Build Coastguard Worker           ixheaacd_k_chan_filt(
170*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
171*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_4, CPLX,
172*15dc779aSAndroid Build Coastguard Worker               ptr_ps_tables->p4_13_34,
173*15dc779aSAndroid Build Coastguard Worker               &ptr_ps_tables->cos_sin_mod_4channel[0][0]);
174*15dc779aSAndroid Build Coastguard Worker           break;
175*15dc779aSAndroid Build Coastguard Worker         case NO_HYBRID_CHANNELS_8:
176*15dc779aSAndroid Build Coastguard Worker           ixheaacd_k_chan_filt(
177*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
178*15dc779aSAndroid Build Coastguard Worker               ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_8, CPLX,
179*15dc779aSAndroid Build Coastguard Worker               use_34_st_bands ? ptr_ps_tables->p8_13_34 : ptr_ps_tables->p8_13_20,
180*15dc779aSAndroid Build Coastguard Worker               &ptr_ps_tables->cos_sin_mod_8channel[0][0]);
181*15dc779aSAndroid Build Coastguard Worker           break;
182*15dc779aSAndroid Build Coastguard Worker         case NO_HYBRID_CHANNELS_12:
183*15dc779aSAndroid Build Coastguard Worker           ixheaacd_k_chan_filt(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im,
184*15dc779aSAndroid Build Coastguard Worker                                ptr_hybrid->ptr_temp_re, ptr_hybrid->ptr_temp_im, frame_size,
185*15dc779aSAndroid Build Coastguard Worker                                NO_HYBRID_CHANNELS_12, CPLX, ptr_ps_tables->p12_13_34,
186*15dc779aSAndroid Build Coastguard Worker                                &ptr_ps_tables->cos_sin_mod_12channel[0][0]);
187*15dc779aSAndroid Build Coastguard Worker           break;
188*15dc779aSAndroid Build Coastguard Worker         default:
189*15dc779aSAndroid Build Coastguard Worker           break;
190*15dc779aSAndroid Build Coastguard Worker       }
191*15dc779aSAndroid Build Coastguard Worker 
192*15dc779aSAndroid Build Coastguard Worker       for (n = 0; n < frame_size; n++) {
193*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (WORD32)band_res; k++) {
194*15dc779aSAndroid Build Coastguard Worker           ptr_tmp_hyb_re[n][ch_offset + k] = ptr_hybrid->ptr_temp_re[n][k];
195*15dc779aSAndroid Build Coastguard Worker           ptr_tmp_hyb_im[n][ch_offset + k] = ptr_hybrid->ptr_temp_im[n][k];
196*15dc779aSAndroid Build Coastguard Worker         }
197*15dc779aSAndroid Build Coastguard Worker       }
198*15dc779aSAndroid Build Coastguard Worker       ch_offset += band_res;
199*15dc779aSAndroid Build Coastguard Worker     }
200*15dc779aSAndroid Build Coastguard Worker   }
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hyb_synth(FLOAT32 (* ptr_tmp_hyb_re)[MAX_NUM_COLUMNS],FLOAT32 (* ptr_tmp_hyb_im)[MAX_NUM_COLUMNS],FLOAT32 ** ptr_qmf_re,FLOAT32 ** ptr_qmf_im,ia_hybrid_flt_struct * ptr_hybrid)203*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hyb_synth(
204*15dc779aSAndroid Build Coastguard Worker     FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS],
205*15dc779aSAndroid Build Coastguard Worker     FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS],
206*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **ptr_qmf_re,
207*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **ptr_qmf_im,
208*15dc779aSAndroid Build Coastguard Worker     ia_hybrid_flt_struct *ptr_hybrid) {
209*15dc779aSAndroid Build Coastguard Worker   WORD32 k, n, band;
210*15dc779aSAndroid Build Coastguard Worker   WORD16 band_res;
211*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_size = ptr_hybrid->frame_size;
212*15dc779aSAndroid Build Coastguard Worker   WORD32 ch_offset = 0;
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
215*15dc779aSAndroid Build Coastguard Worker     band_res = ptr_hybrid->ptr_resol[band];
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker     for (n = 0; n < frame_size; n++) {
218*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_re[n][band] = ptr_qmf_im[n][band] = 0;
219*15dc779aSAndroid Build Coastguard Worker 
220*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < (WORD32)band_res; k++) {
221*15dc779aSAndroid Build Coastguard Worker         ptr_qmf_re[n][band] += ptr_tmp_hyb_re[n][ch_offset + k];
222*15dc779aSAndroid Build Coastguard Worker         ptr_qmf_im[n][band] += ptr_tmp_hyb_im[n][ch_offset + k];
223*15dc779aSAndroid Build Coastguard Worker       }
224*15dc779aSAndroid Build Coastguard Worker     }
225*15dc779aSAndroid Build Coastguard Worker     ch_offset += band_res;
226*15dc779aSAndroid Build Coastguard Worker   }
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_34_float_to_20(FLOAT32 * ptr_index)229*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_map_34_float_to_20(FLOAT32 *ptr_index) {
230*15dc779aSAndroid Build Coastguard Worker   ptr_index[0] = (2 * ptr_index[0] + ptr_index[1]) / 3.0f;
231*15dc779aSAndroid Build Coastguard Worker   ptr_index[1] = (ptr_index[1] + 2 * ptr_index[2]) / 3.0f;
232*15dc779aSAndroid Build Coastguard Worker   ptr_index[2] = (2 * ptr_index[3] + ptr_index[4]) / 3.0f;
233*15dc779aSAndroid Build Coastguard Worker   ptr_index[3] = (ptr_index[4] + 2 * ptr_index[5]) / 3.0f;
234*15dc779aSAndroid Build Coastguard Worker   ptr_index[4] = (ptr_index[6] + ptr_index[7]) / 2.0f;
235*15dc779aSAndroid Build Coastguard Worker   ptr_index[5] = (ptr_index[8] + ptr_index[9]) / 2.0f;
236*15dc779aSAndroid Build Coastguard Worker   ptr_index[6] = ptr_index[10];
237*15dc779aSAndroid Build Coastguard Worker   ptr_index[7] = ptr_index[11];
238*15dc779aSAndroid Build Coastguard Worker   ptr_index[8] = (ptr_index[12] + ptr_index[13]) / 2.0f;
239*15dc779aSAndroid Build Coastguard Worker   ptr_index[9] = (ptr_index[14] + ptr_index[15]) / 2.0f;
240*15dc779aSAndroid Build Coastguard Worker   ptr_index[10] = ptr_index[16];
241*15dc779aSAndroid Build Coastguard Worker   ptr_index[11] = ptr_index[17];
242*15dc779aSAndroid Build Coastguard Worker   ptr_index[12] = ptr_index[18];
243*15dc779aSAndroid Build Coastguard Worker   ptr_index[13] = ptr_index[19];
244*15dc779aSAndroid Build Coastguard Worker   ptr_index[14] = (ptr_index[20] + ptr_index[21]) / 2.0f;
245*15dc779aSAndroid Build Coastguard Worker   ptr_index[15] = (ptr_index[22] + ptr_index[23]) / 2.0f;
246*15dc779aSAndroid Build Coastguard Worker   ptr_index[16] = (ptr_index[24] + ptr_index[25]) / 2.0f;
247*15dc779aSAndroid Build Coastguard Worker   ptr_index[17] = (ptr_index[26] + ptr_index[27]) / 2.0f;
248*15dc779aSAndroid Build Coastguard Worker   ptr_index[18] = (ptr_index[28] + ptr_index[29] + ptr_index[30] + ptr_index[31]) / 4.0f;
249*15dc779aSAndroid Build Coastguard Worker   ptr_index[19] = (ptr_index[32] + ptr_index[33]) / 2.0f;
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_20_float_to_34(FLOAT32 * ptr_index)252*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_map_20_float_to_34(FLOAT32 *ptr_index) {
253*15dc779aSAndroid Build Coastguard Worker   FLOAT32 arr_temp[NUM_HI_RES_BINS];
254*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
255*15dc779aSAndroid Build Coastguard Worker 
256*15dc779aSAndroid Build Coastguard Worker   arr_temp[0] = ptr_index[0];
257*15dc779aSAndroid Build Coastguard Worker   arr_temp[1] = (ptr_index[0] + ptr_index[1]) / 2.0f;
258*15dc779aSAndroid Build Coastguard Worker   arr_temp[2] = ptr_index[1];
259*15dc779aSAndroid Build Coastguard Worker   arr_temp[3] = ptr_index[2];
260*15dc779aSAndroid Build Coastguard Worker   arr_temp[4] = (ptr_index[2] + ptr_index[3]) / 2.0f;
261*15dc779aSAndroid Build Coastguard Worker   arr_temp[5] = ptr_index[3];
262*15dc779aSAndroid Build Coastguard Worker   arr_temp[6] = ptr_index[4];
263*15dc779aSAndroid Build Coastguard Worker   arr_temp[7] = ptr_index[4];
264*15dc779aSAndroid Build Coastguard Worker   arr_temp[8] = ptr_index[5];
265*15dc779aSAndroid Build Coastguard Worker   arr_temp[9] = ptr_index[5];
266*15dc779aSAndroid Build Coastguard Worker   arr_temp[10] = ptr_index[6];
267*15dc779aSAndroid Build Coastguard Worker   arr_temp[11] = ptr_index[7];
268*15dc779aSAndroid Build Coastguard Worker   arr_temp[12] = ptr_index[8];
269*15dc779aSAndroid Build Coastguard Worker   arr_temp[13] = ptr_index[8];
270*15dc779aSAndroid Build Coastguard Worker   arr_temp[14] = ptr_index[9];
271*15dc779aSAndroid Build Coastguard Worker   arr_temp[15] = ptr_index[9];
272*15dc779aSAndroid Build Coastguard Worker   arr_temp[16] = ptr_index[10];
273*15dc779aSAndroid Build Coastguard Worker   arr_temp[17] = ptr_index[11];
274*15dc779aSAndroid Build Coastguard Worker   arr_temp[18] = ptr_index[12];
275*15dc779aSAndroid Build Coastguard Worker   arr_temp[19] = ptr_index[13];
276*15dc779aSAndroid Build Coastguard Worker   arr_temp[20] = ptr_index[14];
277*15dc779aSAndroid Build Coastguard Worker   arr_temp[21] = ptr_index[14];
278*15dc779aSAndroid Build Coastguard Worker   arr_temp[22] = ptr_index[15];
279*15dc779aSAndroid Build Coastguard Worker   arr_temp[23] = ptr_index[15];
280*15dc779aSAndroid Build Coastguard Worker   arr_temp[24] = ptr_index[16];
281*15dc779aSAndroid Build Coastguard Worker   arr_temp[25] = ptr_index[16];
282*15dc779aSAndroid Build Coastguard Worker   arr_temp[26] = ptr_index[17];
283*15dc779aSAndroid Build Coastguard Worker   arr_temp[27] = ptr_index[17];
284*15dc779aSAndroid Build Coastguard Worker   arr_temp[28] = ptr_index[18];
285*15dc779aSAndroid Build Coastguard Worker   arr_temp[29] = ptr_index[18];
286*15dc779aSAndroid Build Coastguard Worker   arr_temp[30] = ptr_index[18];
287*15dc779aSAndroid Build Coastguard Worker   arr_temp[31] = ptr_index[18];
288*15dc779aSAndroid Build Coastguard Worker   arr_temp[32] = ptr_index[19];
289*15dc779aSAndroid Build Coastguard Worker   arr_temp[33] = ptr_index[19];
290*15dc779aSAndroid Build Coastguard Worker 
291*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 34; i++) {
292*15dc779aSAndroid Build Coastguard Worker     ptr_index[i] = arr_temp[i];
293*15dc779aSAndroid Build Coastguard Worker   }
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct * ptr_ps_dec_struct,ia_ps_tables_struct * ptr_ps_tables,UWORD32 noQmfChans,UWORD32 num_sub_samples,WORD32 ps_mode)296*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct,
297*15dc779aSAndroid Build Coastguard Worker                                    ia_ps_tables_struct *ptr_ps_tables, UWORD32 noQmfChans,
298*15dc779aSAndroid Build Coastguard Worker                                    UWORD32 num_sub_samples, WORD32 ps_mode) {
299*15dc779aSAndroid Build Coastguard Worker   UWORD32 i;
300*15dc779aSAndroid Build Coastguard Worker   ia_ps_dec_struct *ptr_ps_dec = ptr_ps_dec_struct;
301*15dc779aSAndroid Build Coastguard Worker 
302*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec = ptr_ps_dec_struct;
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->num_sub_samples = num_sub_samples;
305*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->num_chans = noQmfChans;
306*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->ps_mode = ps_mode;
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->ps_data_present = 0;
309*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->enable_iid = 0;
310*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->iid_mode = 0;
311*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->enable_icc = 0;
312*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->icc_mode = 0;
313*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->enable_ext = 0;
314*15dc779aSAndroid Build Coastguard Worker 
315*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_pca_rot_flg = 0;
316*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->freq_res_ipd = 0;
317*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_34_st_bands = 0;
318*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_34_st_bands_prev = 0;
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.frame_size = ptr_ps_dec->num_sub_samples;
321*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID20;
322*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb20[0];
323*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_work_re = &ptr_ps_dec->hyb_work_re_20[0];
324*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_work_im = &ptr_ps_dec->hyb_work_im_20[0];
325*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_20;
326*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_20;
327*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_temp_re = ptr_ps_dec->hyb_temp_re_20;
328*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid20.ptr_temp_im = ptr_ps_dec->hyb_temp_im_20;
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.frame_size = ptr_ps_dec->num_sub_samples;
331*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID34;
332*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb34[0];
333*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_work_re = &ptr_ps_dec->hyb_work_re_34[0];
334*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_work_im = &ptr_ps_dec->hyb_work_im_34[0];
335*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_34;
336*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_34;
337*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_temp_re = ptr_ps_dec->hyb_temp_re_34;
338*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->str_flt_hybrid34.ptr_temp_im = ptr_ps_dec->hyb_temp_im_34;
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->delay_buf_idx = 0;
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; i++) {
343*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->delay_qmf_delay_buf_idx[i] = 0;
344*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->delay_qmf_delay_num_samp[i] = ptr_ps_tables->qmf_delay_idx_tbl[i];
345*15dc779aSAndroid Build Coastguard Worker   }
346*15dc779aSAndroid Build Coastguard Worker 
347*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUM_HI_RES_BINS; i++) {
348*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->h11_re_prev[i] = 1.0f;
349*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->h12_re_prev[i] = 1.0f;
350*15dc779aSAndroid Build Coastguard Worker   }
351*15dc779aSAndroid Build Coastguard Worker 
352*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h11_im_prev, 0, sizeof(ptr_ps_dec->h11_im_prev));
353*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h12_im_prev, 0, sizeof(ptr_ps_dec->h12_im_prev));
354*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h21_re_prev, 0, sizeof(ptr_ps_dec->h21_re_prev));
355*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h22_re_prev, 0, sizeof(ptr_ps_dec->h22_re_prev));
356*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h21_im_prev, 0, sizeof(ptr_ps_dec->h21_im_prev));
357*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->h22_im_prev, 0, sizeof(ptr_ps_dec->h22_im_prev));
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
360*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
361*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
362*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
363*15dc779aSAndroid Build Coastguard Worker 
364*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUM_HI_RES_BINS; i++) {
365*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->peak_decay_fast_bin[i] = 0.0f;
366*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->prev_nrg_bin[i] = 0.0f;
367*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->prev_peak_diff_bin[i] = 0.0f;
368*15dc779aSAndroid Build Coastguard Worker   }
369*15dc779aSAndroid Build Coastguard Worker 
370*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->qmf_delay_buf_re));
371*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->qmf_delay_buf_im));
372*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->sub_qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_re));
373*15dc779aSAndroid Build Coastguard Worker   memset(ptr_ps_dec->sub_qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_im));
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUM_SER_AP_LINKS; i++) {
376*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
377*15dc779aSAndroid Build Coastguard Worker            sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
378*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
379*15dc779aSAndroid Build Coastguard Worker            sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
380*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
381*15dc779aSAndroid Build Coastguard Worker            sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
382*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
383*15dc779aSAndroid Build Coastguard Worker            sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
384*15dc779aSAndroid Build Coastguard Worker   }
385*15dc779aSAndroid Build Coastguard Worker 
386*15dc779aSAndroid Build Coastguard Worker   return 0;
387*15dc779aSAndroid Build Coastguard Worker }
388*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_apply_ps(ia_ps_dec_struct * ptr_ps_dec,FLOAT32 ** pp_qmf_buf_re_left,FLOAT32 ** pp_qmf_buf_im_left,FLOAT32 ** pp_qmf_buf_re_right,FLOAT32 ** pp_qmf_buf_im_right,WORD32 usb,ia_ps_tables_struct * ptr_ps_tables,WORD32 num_time_slot)389*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_apply_ps(ia_ps_dec_struct *ptr_ps_dec,
390*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 **pp_qmf_buf_re_left,
391*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 **pp_qmf_buf_im_left,
392*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 **pp_qmf_buf_re_right,
393*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 **pp_qmf_buf_im_right,
394*15dc779aSAndroid Build Coastguard Worker                             WORD32 usb, ia_ps_tables_struct *ptr_ps_tables,
395*15dc779aSAndroid Build Coastguard Worker                             WORD32 num_time_slot) {
396*15dc779aSAndroid Build Coastguard Worker   WORD32 sb;
397*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
398*15dc779aSAndroid Build Coastguard Worker 
399*15dc779aSAndroid Build Coastguard Worker   WORD32 max_num_column;
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker   if (num_time_slot == 15)
402*15dc779aSAndroid Build Coastguard Worker     max_num_column = MAX_NUM_COLUMNS_960;
403*15dc779aSAndroid Build Coastguard Worker   else
404*15dc779aSAndroid Build Coastguard Worker     max_num_column = MAX_NUM_COLUMNS;
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->use_34_st_bands) {
407*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_34_tbl[0];
408*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_34[0];
409*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
410*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_groups = NUM_IID_GROUPS_HI_RES;
411*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS_HI_RES;
412*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_bins = NUM_HI_RES_BINS;
413*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS_HI_RES;
414*15dc779aSAndroid Build Coastguard Worker   } else {
415*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_20_tbl[0];
416*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_20[0];
417*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
418*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_groups = NUM_IID_GROUPS;
419*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS;
420*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_bins = NUM_MID_RES_BINS;
421*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS;
422*15dc779aSAndroid Build Coastguard Worker   }
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker   for (sb = usb; sb < ptr_ps_dec->num_chans; sb++) {
425*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < NUM_SER_AP_LINKS; i++) {
426*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < ptr_ps_dec->delay_sample_ser[i]; k++) {
427*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->ser_qmf_delay_buf_re[i][k][sb] = 0;
428*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->ser_qmf_delay_buf_im[i][k][sb] = 0;
429*15dc779aSAndroid Build Coastguard Worker       }
430*15dc779aSAndroid Build Coastguard Worker     }
431*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < HIGH_DEL; k++) {
432*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->qmf_delay_buf_re[k][sb] = 0;
433*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->qmf_delay_buf_im[k][sb] = 0;
434*15dc779aSAndroid Build Coastguard Worker     }
435*15dc779aSAndroid Build Coastguard Worker   }
436*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
437*15dc779aSAndroid Build Coastguard Worker                     (const FLOAT32 **)pp_qmf_buf_im_left,
438*15dc779aSAndroid Build Coastguard Worker                     ptr_ps_dec, ptr_ps_tables, 0);
439*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
440*15dc779aSAndroid Build Coastguard Worker                     (const FLOAT32 **)pp_qmf_buf_im_left,
441*15dc779aSAndroid Build Coastguard Worker                     ptr_ps_dec, ptr_ps_tables, 1);
442*15dc779aSAndroid Build Coastguard Worker 
443*15dc779aSAndroid Build Coastguard Worker   if (!ptr_ps_dec->use_34_st_bands) {
444*15dc779aSAndroid Build Coastguard Worker     WORD32 k;
445*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < (WORD32)ptr_ps_dec->num_sub_samples; k++) {
446*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_re[k][3] += ptr_ps_dec->hyb_left_re[k][4];
447*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_im[k][3] += ptr_ps_dec->hyb_left_im[k][4];
448*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_re[k][4] = 0.;
449*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_im[k][4] = 0.;
450*15dc779aSAndroid Build Coastguard Worker 
451*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_re[k][2] += ptr_ps_dec->hyb_left_re[k][5];
452*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_im[k][2] += ptr_ps_dec->hyb_left_im[k][5];
453*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_re[k][5] = 0.;
454*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->hyb_left_im[k][5] = 0.;
455*15dc779aSAndroid Build Coastguard Worker     }
456*15dc779aSAndroid Build Coastguard Worker   }
457*15dc779aSAndroid Build Coastguard Worker 
458*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->ps_mode & 0x0080) {
459*15dc779aSAndroid Build Coastguard Worker     WORD32 i, j;
460*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < max_num_column; i++) {
461*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
462*15dc779aSAndroid Build Coastguard Worker         pp_qmf_buf_im_right[i][j] = pp_qmf_buf_im_left[i][j];
463*15dc779aSAndroid Build Coastguard Worker         pp_qmf_buf_re_right[i][j] = pp_qmf_buf_re_left[i][j];
464*15dc779aSAndroid Build Coastguard Worker       }
465*15dc779aSAndroid Build Coastguard Worker     }
466*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < max_num_column; i++) {
467*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
468*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->hyb_right_re[i][j] = ptr_ps_dec->hyb_left_re[i][j];
469*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->hyb_right_im[i][j] = ptr_ps_dec->hyb_left_im[i][j];
470*15dc779aSAndroid Build Coastguard Worker       }
471*15dc779aSAndroid Build Coastguard Worker     }
472*15dc779aSAndroid Build Coastguard Worker   } else {
473*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->ps_mode & 0x0002) {
474*15dc779aSAndroid Build Coastguard Worker       WORD32 i, j;
475*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < max_num_column; i++) {
476*15dc779aSAndroid Build Coastguard Worker         for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
477*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_im_right[i][j] = 0.;
478*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_re_right[i][j] = 0.;
479*15dc779aSAndroid Build Coastguard Worker         }
480*15dc779aSAndroid Build Coastguard Worker       }
481*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < max_num_column; i++) {
482*15dc779aSAndroid Build Coastguard Worker         for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
483*15dc779aSAndroid Build Coastguard Worker           ptr_ps_dec->hyb_right_re[i][j] = 0.;
484*15dc779aSAndroid Build Coastguard Worker           ptr_ps_dec->hyb_right_im[i][j] = 0.;
485*15dc779aSAndroid Build Coastguard Worker         }
486*15dc779aSAndroid Build Coastguard Worker       }
487*15dc779aSAndroid Build Coastguard Worker     } else {
488*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_ps_de_correlate(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
489*15dc779aSAndroid Build Coastguard Worker                                     pp_qmf_buf_re_right, pp_qmf_buf_im_right,
490*15dc779aSAndroid Build Coastguard Worker                                     ptr_ps_tables);
491*15dc779aSAndroid Build Coastguard Worker     }
492*15dc779aSAndroid Build Coastguard Worker 
493*15dc779aSAndroid Build Coastguard Worker     if (!(ptr_ps_dec->ps_mode & 0x0040)) {
494*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_ps_apply_rotation(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
495*15dc779aSAndroid Build Coastguard Worker                                       pp_qmf_buf_re_right, pp_qmf_buf_im_right,
496*15dc779aSAndroid Build Coastguard Worker                                       ptr_ps_tables);
497*15dc779aSAndroid Build Coastguard Worker     }
498*15dc779aSAndroid Build Coastguard Worker   }
499*15dc779aSAndroid Build Coastguard Worker 
500*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hyb_synth(ptr_ps_dec->hyb_left_re, ptr_ps_dec->hyb_left_im,
501*15dc779aSAndroid Build Coastguard Worker                      pp_qmf_buf_re_left, pp_qmf_buf_im_left, ptr_ps_dec->ptr_hybrid);
502*15dc779aSAndroid Build Coastguard Worker 
503*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hyb_synth(ptr_ps_dec->hyb_right_re, ptr_ps_dec->hyb_right_im,
504*15dc779aSAndroid Build Coastguard Worker                      pp_qmf_buf_re_right, pp_qmf_buf_im_right, ptr_ps_dec->ptr_hybrid);
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_34_st_bands_prev = ptr_ps_dec->use_34_st_bands;
507*15dc779aSAndroid Build Coastguard Worker 
508*15dc779aSAndroid Build Coastguard Worker }
509*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_ps_de_correlate(ia_ps_dec_struct * ptr_ps_dec,FLOAT32 ** pp_qmf_buf_re_left,FLOAT32 ** pp_qmf_buf_im_left,FLOAT32 ** pp_qmf_buf_re_right,FLOAT32 ** pp_qmf_buf_im_right,ia_ps_tables_struct * ptr_ps_tables)510*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_ps_de_correlate(
511*15dc779aSAndroid Build Coastguard Worker     ia_ps_dec_struct *ptr_ps_dec,
512*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_re_left,
513*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_im_left,
514*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_re_right,
515*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_im_right,
516*15dc779aSAndroid Build Coastguard Worker     ia_ps_tables_struct *ptr_ps_tables) {
517*15dc779aSAndroid Build Coastguard Worker   WORD32 sb, maxsb, gr, k;
518*15dc779aSAndroid Build Coastguard Worker   WORD32 m;
519*15dc779aSAndroid Build Coastguard Worker   WORD32 l_delay = 0;
520*15dc779aSAndroid Build Coastguard Worker   WORD32 l_ser_delay_arr[NUM_SER_AP_LINKS] = {0};
521*15dc779aSAndroid Build Coastguard Worker   FLOAT32 re_left;
522*15dc779aSAndroid Build Coastguard Worker   FLOAT32 im_left;
523*15dc779aSAndroid Build Coastguard Worker   FLOAT32 peak_diff, nrg, trans_ratio;
524*15dc779aSAndroid Build Coastguard Worker 
525*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_hyb_left_re)[MAX_NUM_COLUMNS];
526*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_hyb_left_im)[MAX_NUM_COLUMNS];
527*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_hyb_right_re)[MAX_NUM_COLUMNS];
528*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_hyb_right_im)[MAX_NUM_COLUMNS];
529*15dc779aSAndroid Build Coastguard Worker 
530*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*ppp_ser_sub_qmf_dealy_buf_re)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
531*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*ppp_ser_sub_qmf_dealy_buf_im)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
532*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_sub_qmf_delay_buf_re)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
533*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_sub_qmf_delay_buf_im)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
534*15dc779aSAndroid Build Coastguard Worker 
535*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *pp_frac_delay_phase_fac_re;
536*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *pp_frac_delay_phase_fac_im;
537*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_frac_delay_phase_fac_ser_re)[NUM_SER_AP_LINKS];
538*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*pp_frac_delay_phase_fac_ser_im)[NUM_SER_AP_LINKS];
539*15dc779aSAndroid Build Coastguard Worker 
540*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_delay_qmf_delay_num_samp = NULL;
541*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_delay_qmf_delay_buf_idx = NULL;
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker   FLOAT32 pow_arr[32][NUM_HI_RES_BINS];
544*15dc779aSAndroid Build Coastguard Worker   FLOAT32 trans_ratio_arr[32][NUM_HI_RES_BINS];
545*15dc779aSAndroid Build Coastguard Worker   WORD32 bin;
546*15dc779aSAndroid Build Coastguard Worker   FLOAT32 decay_cutoff;
547*15dc779aSAndroid Build Coastguard Worker 
548*15dc779aSAndroid Build Coastguard Worker   pp_hyb_left_re = ptr_ps_dec->hyb_left_re;
549*15dc779aSAndroid Build Coastguard Worker   pp_hyb_left_im = ptr_ps_dec->hyb_left_im;
550*15dc779aSAndroid Build Coastguard Worker   pp_hyb_right_re = ptr_ps_dec->hyb_right_re;
551*15dc779aSAndroid Build Coastguard Worker   pp_hyb_right_im = ptr_ps_dec->hyb_right_im;
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker   ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_sub_qmf_dealy_buf_re;
554*15dc779aSAndroid Build Coastguard Worker   ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_sub_qmf_dealy_buf_im;
555*15dc779aSAndroid Build Coastguard Worker 
556*15dc779aSAndroid Build Coastguard Worker   pp_sub_qmf_delay_buf_re = ptr_ps_dec->sub_qmf_delay_buf_re;
557*15dc779aSAndroid Build Coastguard Worker   pp_sub_qmf_delay_buf_im = ptr_ps_dec->sub_qmf_delay_buf_im;
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
560*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->use_34_st_bands) {
561*15dc779aSAndroid Build Coastguard Worker       WORD32 i;
562*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < NUM_SER_AP_LINKS; i++) {
563*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
564*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
565*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
566*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
567*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
568*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
569*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
570*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
571*15dc779aSAndroid Build Coastguard Worker       }
572*15dc779aSAndroid Build Coastguard Worker       return;
573*15dc779aSAndroid Build Coastguard Worker     } else {
574*15dc779aSAndroid Build Coastguard Worker       WORD32 i;
575*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < NUM_SER_AP_LINKS; i++) {
576*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
577*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
578*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
579*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
580*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
581*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
582*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
583*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
584*15dc779aSAndroid Build Coastguard Worker       }
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker       return;
587*15dc779aSAndroid Build Coastguard Worker     }
588*15dc779aSAndroid Build Coastguard Worker   }
589*15dc779aSAndroid Build Coastguard Worker 
590*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->use_34_st_bands) {
591*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_34;
592*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_34;
593*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_34;
594*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_34;
595*15dc779aSAndroid Build Coastguard Worker   } else {
596*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_20;
597*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_20;
598*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_20;
599*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_20;
600*15dc779aSAndroid Build Coastguard Worker   }
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 32; k++) {
603*15dc779aSAndroid Build Coastguard Worker     for (bin = 0; bin < NUM_HI_RES_BINS; bin++) {
604*15dc779aSAndroid Build Coastguard Worker       pow_arr[k][bin] = 0;
605*15dc779aSAndroid Build Coastguard Worker     }
606*15dc779aSAndroid Build Coastguard Worker   }
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker   for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
609*15dc779aSAndroid Build Coastguard Worker     bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
610*15dc779aSAndroid Build Coastguard Worker     maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
611*15dc779aSAndroid Build Coastguard Worker     for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
612*15dc779aSAndroid Build Coastguard Worker       for (k = ptr_ps_dec->border_position[0];
613*15dc779aSAndroid Build Coastguard Worker            k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
614*15dc779aSAndroid Build Coastguard Worker         im_left = pp_hyb_left_re[k][sb];
615*15dc779aSAndroid Build Coastguard Worker         re_left = pp_hyb_left_im[k][sb];
616*15dc779aSAndroid Build Coastguard Worker         pow_arr[k][bin] += im_left * im_left + re_left * re_left;
617*15dc779aSAndroid Build Coastguard Worker       }
618*15dc779aSAndroid Build Coastguard Worker     }
619*15dc779aSAndroid Build Coastguard Worker   }
620*15dc779aSAndroid Build Coastguard Worker   for (; gr < ptr_ps_dec->num_groups; gr++) {
621*15dc779aSAndroid Build Coastguard Worker     bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
622*15dc779aSAndroid Build Coastguard Worker     maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
623*15dc779aSAndroid Build Coastguard Worker     for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
624*15dc779aSAndroid Build Coastguard Worker       for (k = ptr_ps_dec->border_position[0];
625*15dc779aSAndroid Build Coastguard Worker            k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
626*15dc779aSAndroid Build Coastguard Worker         im_left = pp_qmf_buf_re_left[k][sb];
627*15dc779aSAndroid Build Coastguard Worker         re_left = pp_qmf_buf_im_left[k][sb];
628*15dc779aSAndroid Build Coastguard Worker         pow_arr[k][bin] += im_left * im_left + re_left * re_left;
629*15dc779aSAndroid Build Coastguard Worker       }
630*15dc779aSAndroid Build Coastguard Worker     }
631*15dc779aSAndroid Build Coastguard Worker   }
632*15dc779aSAndroid Build Coastguard Worker 
633*15dc779aSAndroid Build Coastguard Worker   for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
634*15dc779aSAndroid Build Coastguard Worker     for (k = ptr_ps_dec->border_position[0];
635*15dc779aSAndroid Build Coastguard Worker          k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
636*15dc779aSAndroid Build Coastguard Worker       FLOAT32 q = 1.5f;
637*15dc779aSAndroid Build Coastguard Worker 
638*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->peak_decay_fast_bin[bin] *= PEAK_DECAY_FACTOR_FAST;
639*15dc779aSAndroid Build Coastguard Worker       if (ptr_ps_dec->peak_decay_fast_bin[bin] < pow_arr[k][bin])
640*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->peak_decay_fast_bin[bin] = pow_arr[k][bin];
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker       peak_diff = ptr_ps_dec->prev_peak_diff_bin[bin];
643*15dc779aSAndroid Build Coastguard Worker       peak_diff += INIT_FILT_COEFF * (ptr_ps_dec->peak_decay_fast_bin[bin] -
644*15dc779aSAndroid Build Coastguard Worker                                       pow_arr[k][bin] -
645*15dc779aSAndroid Build Coastguard Worker                                       ptr_ps_dec->prev_peak_diff_bin[bin]);
646*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->prev_peak_diff_bin[bin] = peak_diff;
647*15dc779aSAndroid Build Coastguard Worker 
648*15dc779aSAndroid Build Coastguard Worker       nrg = ptr_ps_dec->prev_nrg_bin[bin];
649*15dc779aSAndroid Build Coastguard Worker       nrg += INIT_FILT_COEFF * (pow_arr[k][bin] - ptr_ps_dec->prev_nrg_bin[bin]);
650*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->prev_nrg_bin[bin] = nrg;
651*15dc779aSAndroid Build Coastguard Worker       if (q * peak_diff <= nrg) {
652*15dc779aSAndroid Build Coastguard Worker         trans_ratio_arr[k][bin] = 1.0f;
653*15dc779aSAndroid Build Coastguard Worker       } else {
654*15dc779aSAndroid Build Coastguard Worker         trans_ratio_arr[k][bin] = nrg / (q * peak_diff);
655*15dc779aSAndroid Build Coastguard Worker       }
656*15dc779aSAndroid Build Coastguard Worker     }
657*15dc779aSAndroid Build Coastguard Worker   }
658*15dc779aSAndroid Build Coastguard Worker 
659*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->use_34_st_bands) {
660*15dc779aSAndroid Build Coastguard Worker     decay_cutoff = DECAY_CUTOFF_HI_RES;
661*15dc779aSAndroid Build Coastguard Worker   } else {
662*15dc779aSAndroid Build Coastguard Worker     decay_cutoff = DECAY_CUTOFF;
663*15dc779aSAndroid Build Coastguard Worker   }
664*15dc779aSAndroid Build Coastguard Worker 
665*15dc779aSAndroid Build Coastguard Worker   for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
666*15dc779aSAndroid Build Coastguard Worker     maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
667*15dc779aSAndroid Build Coastguard Worker 
668*15dc779aSAndroid Build Coastguard Worker     for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
669*15dc779aSAndroid Build Coastguard Worker       FLOAT32 decay_scale_factor;
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker       decay_scale_factor = 1.0f;
672*15dc779aSAndroid Build Coastguard Worker 
673*15dc779aSAndroid Build Coastguard Worker       decay_scale_factor = max(decay_scale_factor, 0.0f);
674*15dc779aSAndroid Build Coastguard Worker 
675*15dc779aSAndroid Build Coastguard Worker       l_delay = ptr_ps_dec->delay_buf_idx;
676*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < NUM_SER_AP_LINKS; k++)
677*15dc779aSAndroid Build Coastguard Worker         l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
678*15dc779aSAndroid Build Coastguard Worker 
679*15dc779aSAndroid Build Coastguard Worker       for (k = ptr_ps_dec->border_position[0];
680*15dc779aSAndroid Build Coastguard Worker            k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
681*15dc779aSAndroid Build Coastguard Worker         FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
682*15dc779aSAndroid Build Coastguard Worker 
683*15dc779aSAndroid Build Coastguard Worker         im_left = pp_hyb_left_re[k][sb];
684*15dc779aSAndroid Build Coastguard Worker         re_left = pp_hyb_left_im[k][sb];
685*15dc779aSAndroid Build Coastguard Worker 
686*15dc779aSAndroid Build Coastguard Worker         {
687*15dc779aSAndroid Build Coastguard Worker           real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
688*15dc779aSAndroid Build Coastguard Worker           imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
689*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
690*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
691*15dc779aSAndroid Build Coastguard Worker 
692*15dc779aSAndroid Build Coastguard Worker           real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
693*15dc779aSAndroid Build Coastguard Worker                  pp_frac_delay_phase_fac_im[sb];
694*15dc779aSAndroid Build Coastguard Worker           imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
695*15dc779aSAndroid Build Coastguard Worker                  pp_frac_delay_phase_fac_re[sb];
696*15dc779aSAndroid Build Coastguard Worker 
697*15dc779aSAndroid Build Coastguard Worker           r_r0 = real;
698*15dc779aSAndroid Build Coastguard Worker           i_r0 = imag;
699*15dc779aSAndroid Build Coastguard Worker           for (m = 0; m < NUM_SER_AP_LINKS; m++) {
700*15dc779aSAndroid Build Coastguard Worker             real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
701*15dc779aSAndroid Build Coastguard Worker             imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
702*15dc779aSAndroid Build Coastguard Worker             real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
703*15dc779aSAndroid Build Coastguard Worker                    imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
704*15dc779aSAndroid Build Coastguard Worker             imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
705*15dc779aSAndroid Build Coastguard Worker                    imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
706*15dc779aSAndroid Build Coastguard Worker 
707*15dc779aSAndroid Build Coastguard Worker             real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
708*15dc779aSAndroid Build Coastguard Worker             imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
709*15dc779aSAndroid Build Coastguard Worker             ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
710*15dc779aSAndroid Build Coastguard Worker                 r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
711*15dc779aSAndroid Build Coastguard Worker             ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
712*15dc779aSAndroid Build Coastguard Worker                 i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
713*15dc779aSAndroid Build Coastguard Worker             r_r0 = real;
714*15dc779aSAndroid Build Coastguard Worker             i_r0 = imag;
715*15dc779aSAndroid Build Coastguard Worker           }
716*15dc779aSAndroid Build Coastguard Worker         }
717*15dc779aSAndroid Build Coastguard Worker 
718*15dc779aSAndroid Build Coastguard Worker         bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
719*15dc779aSAndroid Build Coastguard Worker         trans_ratio = trans_ratio_arr[k][bin];
720*15dc779aSAndroid Build Coastguard Worker 
721*15dc779aSAndroid Build Coastguard Worker         pp_hyb_right_re[k][sb] = trans_ratio * r_r0;
722*15dc779aSAndroid Build Coastguard Worker         pp_hyb_right_im[k][sb] = trans_ratio * i_r0;
723*15dc779aSAndroid Build Coastguard Worker 
724*15dc779aSAndroid Build Coastguard Worker         if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
725*15dc779aSAndroid Build Coastguard Worker 
726*15dc779aSAndroid Build Coastguard Worker         for (m = 0; m < NUM_SER_AP_LINKS; m++) {
727*15dc779aSAndroid Build Coastguard Worker           if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
728*15dc779aSAndroid Build Coastguard Worker             l_ser_delay_arr[m] = 0;
729*15dc779aSAndroid Build Coastguard Worker           }
730*15dc779aSAndroid Build Coastguard Worker         }
731*15dc779aSAndroid Build Coastguard Worker       }
732*15dc779aSAndroid Build Coastguard Worker     }
733*15dc779aSAndroid Build Coastguard Worker   }
734*15dc779aSAndroid Build Coastguard Worker   {
735*15dc779aSAndroid Build Coastguard Worker     ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_qmf_delay_buf_re;
736*15dc779aSAndroid Build Coastguard Worker     ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_qmf_delay_buf_im;
737*15dc779aSAndroid Build Coastguard Worker 
738*15dc779aSAndroid Build Coastguard Worker     pp_sub_qmf_delay_buf_re = ptr_ps_dec->qmf_delay_buf_re;
739*15dc779aSAndroid Build Coastguard Worker     pp_sub_qmf_delay_buf_im = ptr_ps_dec->qmf_delay_buf_im;
740*15dc779aSAndroid Build Coastguard Worker 
741*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_re = ptr_ps_tables->qmf_fract_delay_phase_factor_re;
742*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_im = ptr_ps_tables->qmf_fract_delay_phase_factor_im;
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_re;
745*15dc779aSAndroid Build Coastguard Worker     pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_im;
746*15dc779aSAndroid Build Coastguard Worker 
747*15dc779aSAndroid Build Coastguard Worker     p_delay_qmf_delay_buf_idx = ptr_ps_dec->delay_qmf_delay_buf_idx;
748*15dc779aSAndroid Build Coastguard Worker     p_delay_qmf_delay_num_samp = ptr_ps_dec->delay_qmf_delay_num_samp;
749*15dc779aSAndroid Build Coastguard Worker   }
750*15dc779aSAndroid Build Coastguard Worker   for (; gr < ptr_ps_dec->num_groups; gr++) {
751*15dc779aSAndroid Build Coastguard Worker     maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
752*15dc779aSAndroid Build Coastguard Worker 
753*15dc779aSAndroid Build Coastguard Worker     for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
754*15dc779aSAndroid Build Coastguard Worker       FLOAT32 decay_scale_factor;
755*15dc779aSAndroid Build Coastguard Worker       if (sb <= decay_cutoff)
756*15dc779aSAndroid Build Coastguard Worker         decay_scale_factor = 1.0f;
757*15dc779aSAndroid Build Coastguard Worker       else
758*15dc779aSAndroid Build Coastguard Worker         decay_scale_factor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb;
759*15dc779aSAndroid Build Coastguard Worker 
760*15dc779aSAndroid Build Coastguard Worker       decay_scale_factor = max(decay_scale_factor, 0.0f);
761*15dc779aSAndroid Build Coastguard Worker 
762*15dc779aSAndroid Build Coastguard Worker       l_delay = ptr_ps_dec->delay_buf_idx;
763*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < NUM_SER_AP_LINKS; k++)
764*15dc779aSAndroid Build Coastguard Worker         l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
765*15dc779aSAndroid Build Coastguard Worker 
766*15dc779aSAndroid Build Coastguard Worker       for (k = ptr_ps_dec->border_position[0];
767*15dc779aSAndroid Build Coastguard Worker            k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
768*15dc779aSAndroid Build Coastguard Worker         FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
769*15dc779aSAndroid Build Coastguard Worker 
770*15dc779aSAndroid Build Coastguard Worker         im_left = pp_qmf_buf_re_left[k][sb];
771*15dc779aSAndroid Build Coastguard Worker         re_left = pp_qmf_buf_im_left[k][sb];
772*15dc779aSAndroid Build Coastguard Worker 
773*15dc779aSAndroid Build Coastguard Worker         if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
774*15dc779aSAndroid Build Coastguard Worker           real = pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb];
775*15dc779aSAndroid Build Coastguard Worker           imag = pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb];
776*15dc779aSAndroid Build Coastguard Worker           r_r0 = real;
777*15dc779aSAndroid Build Coastguard Worker           i_r0 = imag;
778*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb] = im_left;
779*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb] = re_left;
780*15dc779aSAndroid Build Coastguard Worker         } else {
781*15dc779aSAndroid Build Coastguard Worker           real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
782*15dc779aSAndroid Build Coastguard Worker           imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
783*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
784*15dc779aSAndroid Build Coastguard Worker           pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker           real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
787*15dc779aSAndroid Build Coastguard Worker                  pp_frac_delay_phase_fac_im[sb];
788*15dc779aSAndroid Build Coastguard Worker           imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
789*15dc779aSAndroid Build Coastguard Worker                  pp_frac_delay_phase_fac_re[sb];
790*15dc779aSAndroid Build Coastguard Worker 
791*15dc779aSAndroid Build Coastguard Worker           r_r0 = real;
792*15dc779aSAndroid Build Coastguard Worker           i_r0 = imag;
793*15dc779aSAndroid Build Coastguard Worker           for (m = 0; m < NUM_SER_AP_LINKS; m++) {
794*15dc779aSAndroid Build Coastguard Worker             real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
795*15dc779aSAndroid Build Coastguard Worker             imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
796*15dc779aSAndroid Build Coastguard Worker             real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
797*15dc779aSAndroid Build Coastguard Worker                    imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
798*15dc779aSAndroid Build Coastguard Worker             imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
799*15dc779aSAndroid Build Coastguard Worker                    imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker             real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
802*15dc779aSAndroid Build Coastguard Worker             imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
803*15dc779aSAndroid Build Coastguard Worker             ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
804*15dc779aSAndroid Build Coastguard Worker                 r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
805*15dc779aSAndroid Build Coastguard Worker             ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
806*15dc779aSAndroid Build Coastguard Worker                 i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
807*15dc779aSAndroid Build Coastguard Worker             r_r0 = real;
808*15dc779aSAndroid Build Coastguard Worker             i_r0 = imag;
809*15dc779aSAndroid Build Coastguard Worker           }
810*15dc779aSAndroid Build Coastguard Worker         }
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker         bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
813*15dc779aSAndroid Build Coastguard Worker         trans_ratio = trans_ratio_arr[k][bin];
814*15dc779aSAndroid Build Coastguard Worker 
815*15dc779aSAndroid Build Coastguard Worker         pp_qmf_buf_re_right[k][sb] = trans_ratio * r_r0;
816*15dc779aSAndroid Build Coastguard Worker         pp_qmf_buf_im_right[k][sb] = trans_ratio * i_r0;
817*15dc779aSAndroid Build Coastguard Worker 
818*15dc779aSAndroid Build Coastguard Worker         if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
819*15dc779aSAndroid Build Coastguard Worker 
820*15dc779aSAndroid Build Coastguard Worker         if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
821*15dc779aSAndroid Build Coastguard Worker           if (++p_delay_qmf_delay_buf_idx[sb] >= p_delay_qmf_delay_num_samp[sb]) {
822*15dc779aSAndroid Build Coastguard Worker             p_delay_qmf_delay_buf_idx[sb] = 0;
823*15dc779aSAndroid Build Coastguard Worker           }
824*15dc779aSAndroid Build Coastguard Worker         }
825*15dc779aSAndroid Build Coastguard Worker 
826*15dc779aSAndroid Build Coastguard Worker         for (m = 0; m < NUM_SER_AP_LINKS; m++) {
827*15dc779aSAndroid Build Coastguard Worker           if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
828*15dc779aSAndroid Build Coastguard Worker             l_ser_delay_arr[m] = 0;
829*15dc779aSAndroid Build Coastguard Worker           }
830*15dc779aSAndroid Build Coastguard Worker         }
831*15dc779aSAndroid Build Coastguard Worker       }
832*15dc779aSAndroid Build Coastguard Worker     }
833*15dc779aSAndroid Build Coastguard Worker   }
834*15dc779aSAndroid Build Coastguard Worker 
835*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->delay_buf_idx = l_delay;
836*15dc779aSAndroid Build Coastguard Worker   for (m = 0; m < NUM_SER_AP_LINKS; m++) {
837*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->delay_buf_idx_ser[m] = l_ser_delay_arr[m];
838*15dc779aSAndroid Build Coastguard Worker   }
839*15dc779aSAndroid Build Coastguard Worker }
840*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_ps_apply_rotation(ia_ps_dec_struct * ptr_ps_dec,FLOAT32 ** pp_qmf_buf_re_left,FLOAT32 ** pp_qmf_buf_im_left,FLOAT32 ** pp_qmf_buf_re_right,FLOAT32 ** pp_qmf_buf_im_right,ia_ps_tables_struct * ptr_ps_tables)841*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_ps_apply_rotation(
842*15dc779aSAndroid Build Coastguard Worker     ia_ps_dec_struct *ptr_ps_dec,
843*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_re_left,
844*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_im_left,
845*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_re_right,
846*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **pp_qmf_buf_im_right,
847*15dc779aSAndroid Build Coastguard Worker     ia_ps_tables_struct *ptr_ps_tables) {
848*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
849*15dc779aSAndroid Build Coastguard Worker   WORD32 group;
850*15dc779aSAndroid Build Coastguard Worker   WORD32 bin = 0;
851*15dc779aSAndroid Build Coastguard Worker   WORD32 subband, max_subband;
852*15dc779aSAndroid Build Coastguard Worker   WORD32 env;
853*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*p_hyb_left_re)[MAX_NUM_COLUMNS];
854*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*p_hyb_left_im)[MAX_NUM_COLUMNS];
855*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*p_hyb_rigth_re)[MAX_NUM_COLUMNS];
856*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*p_hyb_rigth_im)[MAX_NUM_COLUMNS];
857*15dc779aSAndroid Build Coastguard Worker   FLOAT32 scale_fac_l, scale_fac_r;
858*15dc779aSAndroid Build Coastguard Worker   FLOAT32 alpha, beta;
859*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ipd, opd;
860*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ipd1, opd1;
861*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ipd2, opd2;
862*15dc779aSAndroid Build Coastguard Worker 
863*15dc779aSAndroid Build Coastguard Worker   FLOAT32 h11r, h12r, h21r, h22r;
864*15dc779aSAndroid Build Coastguard Worker   FLOAT32 h11i, h12i, h21i, h22i;
865*15dc779aSAndroid Build Coastguard Worker   FLOAT32 H11r, H12r, H21r, H22r;
866*15dc779aSAndroid Build Coastguard Worker   FLOAT32 H11i, H12i, H21i, H22i;
867*15dc779aSAndroid Build Coastguard Worker   FLOAT32 deltaH11r, deltaH12r, deltaH21r, deltaH22r;
868*15dc779aSAndroid Build Coastguard Worker   FLOAT32 deltaH11i, deltaH12i, deltaH21i, deltaH22i;
869*15dc779aSAndroid Build Coastguard Worker   FLOAT32 l_left_re, l_left_im;
870*15dc779aSAndroid Build Coastguard Worker   FLOAT32 l_right_re, l_right_im;
871*15dc779aSAndroid Build Coastguard Worker 
872*15dc779aSAndroid Build Coastguard Worker   WORD32 L;
873*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_scale_factors;
874*15dc779aSAndroid Build Coastguard Worker   const WORD32 *ptr_quantized_iids;
875*15dc779aSAndroid Build Coastguard Worker   WORD32 num_iid_steps;
876*15dc779aSAndroid Build Coastguard Worker 
877*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->iid_quant) {
878*15dc779aSAndroid Build Coastguard Worker     num_iid_steps = NUM_IID_STEPS_FINE;
879*15dc779aSAndroid Build Coastguard Worker     ptr_scale_factors = ptr_ps_tables->scale_factors_fine_flt;
880*15dc779aSAndroid Build Coastguard Worker     ptr_quantized_iids = ptr_ps_tables->quantized_iids_fine;
881*15dc779aSAndroid Build Coastguard Worker   } else {
882*15dc779aSAndroid Build Coastguard Worker     num_iid_steps = NUM_IID_STEPS;
883*15dc779aSAndroid Build Coastguard Worker     ptr_scale_factors = ptr_ps_tables->scale_factors_flt;
884*15dc779aSAndroid Build Coastguard Worker     ptr_quantized_iids = ptr_ps_tables->quantized_iids;
885*15dc779aSAndroid Build Coastguard Worker   }
886*15dc779aSAndroid Build Coastguard Worker 
887*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
888*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->use_34_st_bands) {
889*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_re_prev);
890*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_re_prev);
891*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_re_prev);
892*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_re_prev);
893*15dc779aSAndroid Build Coastguard Worker 
894*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_im_prev);
895*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_im_prev);
896*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_im_prev);
897*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_im_prev);
898*15dc779aSAndroid Build Coastguard Worker 
899*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
900*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
901*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
902*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
903*15dc779aSAndroid Build Coastguard Worker     } else {
904*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_re_prev);
905*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_re_prev);
906*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_re_prev);
907*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_re_prev);
908*15dc779aSAndroid Build Coastguard Worker 
909*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_im_prev);
910*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_im_prev);
911*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_im_prev);
912*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_im_prev);
913*15dc779aSAndroid Build Coastguard Worker 
914*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
915*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
916*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
917*15dc779aSAndroid Build Coastguard Worker       memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
918*15dc779aSAndroid Build Coastguard Worker     }
919*15dc779aSAndroid Build Coastguard Worker   }
920*15dc779aSAndroid Build Coastguard Worker 
921*15dc779aSAndroid Build Coastguard Worker   for (env = 0; env < ptr_ps_dec->num_env; env++) {
922*15dc779aSAndroid Build Coastguard Worker     for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
923*15dc779aSAndroid Build Coastguard Worker       if (!ptr_ps_dec->use_pca_rot_flg) {
924*15dc779aSAndroid Build Coastguard Worker         scale_fac_r = ptr_scale_factors[num_iid_steps +
925*15dc779aSAndroid Build Coastguard Worker                       ptr_ps_dec->iid_par_table[env][bin]];
926*15dc779aSAndroid Build Coastguard Worker         scale_fac_l = ptr_scale_factors[num_iid_steps -
927*15dc779aSAndroid Build Coastguard Worker                       ptr_ps_dec->iid_par_table[env][bin]];
928*15dc779aSAndroid Build Coastguard Worker 
929*15dc779aSAndroid Build Coastguard Worker         alpha = ptr_ps_tables->alphas[ptr_ps_dec->icc_par_table[env][bin]];
930*15dc779aSAndroid Build Coastguard Worker 
931*15dc779aSAndroid Build Coastguard Worker         beta = alpha * (scale_fac_r - scale_fac_l) / PSC_SQRT2F;
932*15dc779aSAndroid Build Coastguard Worker 
933*15dc779aSAndroid Build Coastguard Worker         h11r = (FLOAT32)(scale_fac_l * cos(beta + alpha));
934*15dc779aSAndroid Build Coastguard Worker         h12r = (FLOAT32)(scale_fac_r * cos(beta - alpha));
935*15dc779aSAndroid Build Coastguard Worker         h21r = (FLOAT32)(scale_fac_l * sin(beta + alpha));
936*15dc779aSAndroid Build Coastguard Worker         h22r = (FLOAT32)(scale_fac_r * sin(beta - alpha));
937*15dc779aSAndroid Build Coastguard Worker       } else {
938*15dc779aSAndroid Build Coastguard Worker         FLOAT32 c, rho, mu, alpha, gamma;
939*15dc779aSAndroid Build Coastguard Worker         WORD32 i;
940*15dc779aSAndroid Build Coastguard Worker 
941*15dc779aSAndroid Build Coastguard Worker         i = ptr_ps_dec->iid_par_table[env][bin];
942*15dc779aSAndroid Build Coastguard Worker         c = (FLOAT32)pow(
943*15dc779aSAndroid Build Coastguard Worker             10.0,
944*15dc779aSAndroid Build Coastguard Worker             ((i) ? (((i > 0) ? 1 : -1) * ptr_quantized_iids[((i > 0) ? i : -i) - 1]) : 0.) /
945*15dc779aSAndroid Build Coastguard Worker                 20.0);
946*15dc779aSAndroid Build Coastguard Worker         rho = ptr_ps_tables->quantized_rhos[ptr_ps_dec->icc_par_table[env][bin]];
947*15dc779aSAndroid Build Coastguard Worker         rho = max(rho, 0.05f);
948*15dc779aSAndroid Build Coastguard Worker 
949*15dc779aSAndroid Build Coastguard Worker         if (rho == 0.0f && c == 1.) {
950*15dc779aSAndroid Build Coastguard Worker           alpha = (FLOAT32)PI / 4.0f;
951*15dc779aSAndroid Build Coastguard Worker         } else {
952*15dc779aSAndroid Build Coastguard Worker           if (rho <= 0.05f) {
953*15dc779aSAndroid Build Coastguard Worker             rho = 0.05f;
954*15dc779aSAndroid Build Coastguard Worker           }
955*15dc779aSAndroid Build Coastguard Worker           alpha = 0.5f * (FLOAT32)atan((2.0f * c * rho) / (c * c - 1.0f));
956*15dc779aSAndroid Build Coastguard Worker 
957*15dc779aSAndroid Build Coastguard Worker           if (alpha < 0.) {
958*15dc779aSAndroid Build Coastguard Worker             alpha += (FLOAT32)PI / 2.0f;
959*15dc779aSAndroid Build Coastguard Worker           }
960*15dc779aSAndroid Build Coastguard Worker         }
961*15dc779aSAndroid Build Coastguard Worker         mu = c + 1.0f / c;
962*15dc779aSAndroid Build Coastguard Worker         mu = 1 + (4.0f * rho * rho - 4.0f) / (mu * mu);
963*15dc779aSAndroid Build Coastguard Worker         gamma = (FLOAT32)atan(sqrt((1.0f - sqrt(mu)) / (1.0f + sqrt(mu))));
964*15dc779aSAndroid Build Coastguard Worker 
965*15dc779aSAndroid Build Coastguard Worker         h11r = (FLOAT32)(sqrt(2.) * cos(alpha) * cos(gamma));
966*15dc779aSAndroid Build Coastguard Worker         h12r = (FLOAT32)(sqrt(2.) * sin(alpha) * cos(gamma));
967*15dc779aSAndroid Build Coastguard Worker         h21r = (FLOAT32)(sqrt(2.) * -sin(alpha) * sin(gamma));
968*15dc779aSAndroid Build Coastguard Worker         h22r = (FLOAT32)(sqrt(2.) * cos(alpha) * sin(gamma));
969*15dc779aSAndroid Build Coastguard Worker       }
970*15dc779aSAndroid Build Coastguard Worker 
971*15dc779aSAndroid Build Coastguard Worker       if (bin >= ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]) {
972*15dc779aSAndroid Build Coastguard Worker         h11i = h12i = h21i = h22i = 0.0f;
973*15dc779aSAndroid Build Coastguard Worker       } else {
974*15dc779aSAndroid Build Coastguard Worker         ipd = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map[env][bin];
975*15dc779aSAndroid Build Coastguard Worker         opd = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map[env][bin];
976*15dc779aSAndroid Build Coastguard Worker         ipd1 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_1[bin];
977*15dc779aSAndroid Build Coastguard Worker         opd1 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_1[bin];
978*15dc779aSAndroid Build Coastguard Worker         ipd2 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_2[bin];
979*15dc779aSAndroid Build Coastguard Worker         opd2 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_2[bin];
980*15dc779aSAndroid Build Coastguard Worker 
981*15dc779aSAndroid Build Coastguard Worker         l_left_re = (FLOAT32)cos(ipd);
982*15dc779aSAndroid Build Coastguard Worker         l_left_im = (FLOAT32)sin(ipd);
983*15dc779aSAndroid Build Coastguard Worker         l_right_re = (FLOAT32)cos(opd);
984*15dc779aSAndroid Build Coastguard Worker         l_right_im = (FLOAT32)sin(opd);
985*15dc779aSAndroid Build Coastguard Worker 
986*15dc779aSAndroid Build Coastguard Worker         l_left_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(ipd1);
987*15dc779aSAndroid Build Coastguard Worker         l_left_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(ipd1);
988*15dc779aSAndroid Build Coastguard Worker         l_right_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(opd1);
989*15dc779aSAndroid Build Coastguard Worker         l_right_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(opd1);
990*15dc779aSAndroid Build Coastguard Worker 
991*15dc779aSAndroid Build Coastguard Worker         l_left_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(ipd2);
992*15dc779aSAndroid Build Coastguard Worker         l_left_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(ipd2);
993*15dc779aSAndroid Build Coastguard Worker         l_right_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(opd2);
994*15dc779aSAndroid Build Coastguard Worker         l_right_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(opd2);
995*15dc779aSAndroid Build Coastguard Worker 
996*15dc779aSAndroid Build Coastguard Worker         ipd = (FLOAT32)atan2(l_left_im, l_left_re);
997*15dc779aSAndroid Build Coastguard Worker         opd = (FLOAT32)atan2(l_right_im, l_right_re);
998*15dc779aSAndroid Build Coastguard Worker 
999*15dc779aSAndroid Build Coastguard Worker         l_left_re = (FLOAT32)cos(opd);
1000*15dc779aSAndroid Build Coastguard Worker         l_left_im = (FLOAT32)sin(opd);
1001*15dc779aSAndroid Build Coastguard Worker         opd -= ipd;
1002*15dc779aSAndroid Build Coastguard Worker         l_right_re = (FLOAT32)cos(opd);
1003*15dc779aSAndroid Build Coastguard Worker         l_right_im = (FLOAT32)sin(opd);
1004*15dc779aSAndroid Build Coastguard Worker 
1005*15dc779aSAndroid Build Coastguard Worker         h11i = h11r * l_left_im;
1006*15dc779aSAndroid Build Coastguard Worker         h12i = h12r * l_right_im;
1007*15dc779aSAndroid Build Coastguard Worker         h21i = h21r * l_left_im;
1008*15dc779aSAndroid Build Coastguard Worker         h22i = h22r * l_right_im;
1009*15dc779aSAndroid Build Coastguard Worker 
1010*15dc779aSAndroid Build Coastguard Worker         h11r *= l_left_re;
1011*15dc779aSAndroid Build Coastguard Worker         h12r *= l_right_re;
1012*15dc779aSAndroid Build Coastguard Worker         h21r *= l_left_re;
1013*15dc779aSAndroid Build Coastguard Worker         h22r *= l_right_re;
1014*15dc779aSAndroid Build Coastguard Worker       }
1015*15dc779aSAndroid Build Coastguard Worker 
1016*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h11_re_vec[bin] = h11r;
1017*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h12_re_vec[bin] = h12r;
1018*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h21_re_vec[bin] = h21r;
1019*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h22_re_vec[bin] = h22r;
1020*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h11_im_vec[bin] = h11i;
1021*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h12_im_vec[bin] = h12i;
1022*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h21_im_vec[bin] = h21i;
1023*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h22_im_vec[bin] = h22i;
1024*15dc779aSAndroid Build Coastguard Worker 
1025*15dc779aSAndroid Build Coastguard Worker     }
1026*15dc779aSAndroid Build Coastguard Worker 
1027*15dc779aSAndroid Build Coastguard Worker     p_hyb_left_re = ptr_ps_dec->hyb_left_re;
1028*15dc779aSAndroid Build Coastguard Worker     p_hyb_left_im = ptr_ps_dec->hyb_left_im;
1029*15dc779aSAndroid Build Coastguard Worker     p_hyb_rigth_re = ptr_ps_dec->hyb_right_re;
1030*15dc779aSAndroid Build Coastguard Worker     p_hyb_rigth_im = ptr_ps_dec->hyb_right_im;
1031*15dc779aSAndroid Build Coastguard Worker 
1032*15dc779aSAndroid Build Coastguard Worker     for (group = 0; group < ptr_ps_dec->num_sub_qmf_groups; group++) {
1033*15dc779aSAndroid Build Coastguard Worker       bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
1034*15dc779aSAndroid Build Coastguard Worker 
1035*15dc779aSAndroid Build Coastguard Worker       max_subband = ptr_ps_dec->ptr_group_borders[group] + 1;
1036*15dc779aSAndroid Build Coastguard Worker 
1037*15dc779aSAndroid Build Coastguard Worker       L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
1038*15dc779aSAndroid Build Coastguard Worker 
1039*15dc779aSAndroid Build Coastguard Worker       H11r = ptr_ps_dec->h11_re_prev[bin];
1040*15dc779aSAndroid Build Coastguard Worker       H12r = ptr_ps_dec->h12_re_prev[bin];
1041*15dc779aSAndroid Build Coastguard Worker       H21r = ptr_ps_dec->h21_re_prev[bin];
1042*15dc779aSAndroid Build Coastguard Worker       H22r = ptr_ps_dec->h22_re_prev[bin];
1043*15dc779aSAndroid Build Coastguard Worker       if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1044*15dc779aSAndroid Build Coastguard Worker         H11i = -ptr_ps_dec->h11_im_prev[bin];
1045*15dc779aSAndroid Build Coastguard Worker         H12i = -ptr_ps_dec->h12_im_prev[bin];
1046*15dc779aSAndroid Build Coastguard Worker         H21i = -ptr_ps_dec->h21_im_prev[bin];
1047*15dc779aSAndroid Build Coastguard Worker         H22i = -ptr_ps_dec->h22_im_prev[bin];
1048*15dc779aSAndroid Build Coastguard Worker       } else {
1049*15dc779aSAndroid Build Coastguard Worker         H11i = ptr_ps_dec->h11_im_prev[bin];
1050*15dc779aSAndroid Build Coastguard Worker         H12i = ptr_ps_dec->h12_im_prev[bin];
1051*15dc779aSAndroid Build Coastguard Worker         H21i = ptr_ps_dec->h21_im_prev[bin];
1052*15dc779aSAndroid Build Coastguard Worker         H22i = ptr_ps_dec->h22_im_prev[bin];
1053*15dc779aSAndroid Build Coastguard Worker       }
1054*15dc779aSAndroid Build Coastguard Worker 
1055*15dc779aSAndroid Build Coastguard Worker       h11r = ptr_ps_dec->h11_re_vec[bin];
1056*15dc779aSAndroid Build Coastguard Worker       h12r = ptr_ps_dec->h12_re_vec[bin];
1057*15dc779aSAndroid Build Coastguard Worker       h21r = ptr_ps_dec->h21_re_vec[bin];
1058*15dc779aSAndroid Build Coastguard Worker       h22r = ptr_ps_dec->h22_re_vec[bin];
1059*15dc779aSAndroid Build Coastguard Worker       if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1060*15dc779aSAndroid Build Coastguard Worker         h11i = -ptr_ps_dec->h11_im_vec[bin];
1061*15dc779aSAndroid Build Coastguard Worker         h12i = -ptr_ps_dec->h12_im_vec[bin];
1062*15dc779aSAndroid Build Coastguard Worker         h21i = -ptr_ps_dec->h21_im_vec[bin];
1063*15dc779aSAndroid Build Coastguard Worker         h22i = -ptr_ps_dec->h22_im_vec[bin];
1064*15dc779aSAndroid Build Coastguard Worker       } else {
1065*15dc779aSAndroid Build Coastguard Worker         h11i = ptr_ps_dec->h11_im_vec[bin];
1066*15dc779aSAndroid Build Coastguard Worker         h12i = ptr_ps_dec->h12_im_vec[bin];
1067*15dc779aSAndroid Build Coastguard Worker         h21i = ptr_ps_dec->h21_im_vec[bin];
1068*15dc779aSAndroid Build Coastguard Worker         h22i = ptr_ps_dec->h22_im_vec[bin];
1069*15dc779aSAndroid Build Coastguard Worker       }
1070*15dc779aSAndroid Build Coastguard Worker 
1071*15dc779aSAndroid Build Coastguard Worker       deltaH11r = (h11r - H11r) / L;
1072*15dc779aSAndroid Build Coastguard Worker       deltaH12r = (h12r - H12r) / L;
1073*15dc779aSAndroid Build Coastguard Worker       deltaH21r = (h21r - H21r) / L;
1074*15dc779aSAndroid Build Coastguard Worker       deltaH22r = (h22r - H22r) / L;
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker       deltaH11i = (h11i - H11i) / L;
1077*15dc779aSAndroid Build Coastguard Worker       deltaH12i = (h12i - H12i) / L;
1078*15dc779aSAndroid Build Coastguard Worker       deltaH21i = (h21i - H21i) / L;
1079*15dc779aSAndroid Build Coastguard Worker       deltaH22i = (h22i - H22i) / L;
1080*15dc779aSAndroid Build Coastguard Worker 
1081*15dc779aSAndroid Build Coastguard Worker       for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
1082*15dc779aSAndroid Build Coastguard Worker            i++) {
1083*15dc779aSAndroid Build Coastguard Worker         H11r += deltaH11r;
1084*15dc779aSAndroid Build Coastguard Worker         H12r += deltaH12r;
1085*15dc779aSAndroid Build Coastguard Worker         H21r += deltaH21r;
1086*15dc779aSAndroid Build Coastguard Worker         H22r += deltaH22r;
1087*15dc779aSAndroid Build Coastguard Worker 
1088*15dc779aSAndroid Build Coastguard Worker         H11i += deltaH11i;
1089*15dc779aSAndroid Build Coastguard Worker         H12i += deltaH12i;
1090*15dc779aSAndroid Build Coastguard Worker         H21i += deltaH21i;
1091*15dc779aSAndroid Build Coastguard Worker         H22i += deltaH22i;
1092*15dc779aSAndroid Build Coastguard Worker 
1093*15dc779aSAndroid Build Coastguard Worker         for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
1094*15dc779aSAndroid Build Coastguard Worker              subband++) {
1095*15dc779aSAndroid Build Coastguard Worker           l_left_re = H11r * p_hyb_left_re[i][subband] - H11i * p_hyb_left_im[i][subband] +
1096*15dc779aSAndroid Build Coastguard Worker                       H21r * p_hyb_rigth_re[i][subband] - H21i * p_hyb_rigth_im[i][subband];
1097*15dc779aSAndroid Build Coastguard Worker 
1098*15dc779aSAndroid Build Coastguard Worker           l_left_im = H11i * p_hyb_left_re[i][subband] + H11r * p_hyb_left_im[i][subband] +
1099*15dc779aSAndroid Build Coastguard Worker                       H21i * p_hyb_rigth_re[i][subband] + H21r * p_hyb_rigth_im[i][subband];
1100*15dc779aSAndroid Build Coastguard Worker 
1101*15dc779aSAndroid Build Coastguard Worker           l_right_re = H12r * p_hyb_left_re[i][subband] - H12i * p_hyb_left_im[i][subband] +
1102*15dc779aSAndroid Build Coastguard Worker                        H22r * p_hyb_rigth_re[i][subband] - H22i * p_hyb_rigth_im[i][subband];
1103*15dc779aSAndroid Build Coastguard Worker 
1104*15dc779aSAndroid Build Coastguard Worker           l_right_im = H12i * p_hyb_left_re[i][subband] + H12r * p_hyb_left_im[i][subband] +
1105*15dc779aSAndroid Build Coastguard Worker                        H22i * p_hyb_rigth_re[i][subband] + H22r * p_hyb_rigth_im[i][subband];
1106*15dc779aSAndroid Build Coastguard Worker 
1107*15dc779aSAndroid Build Coastguard Worker           p_hyb_left_re[i][subband] = l_left_re;
1108*15dc779aSAndroid Build Coastguard Worker           p_hyb_left_im[i][subband] = l_left_im;
1109*15dc779aSAndroid Build Coastguard Worker           p_hyb_rigth_re[i][subband] = l_right_re;
1110*15dc779aSAndroid Build Coastguard Worker           p_hyb_rigth_im[i][subband] = l_right_im;
1111*15dc779aSAndroid Build Coastguard Worker         }
1112*15dc779aSAndroid Build Coastguard Worker       }
1113*15dc779aSAndroid Build Coastguard Worker     }
1114*15dc779aSAndroid Build Coastguard Worker 
1115*15dc779aSAndroid Build Coastguard Worker     for (; group < ptr_ps_dec->num_groups; group++) {
1116*15dc779aSAndroid Build Coastguard Worker       bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
1117*15dc779aSAndroid Build Coastguard Worker 
1118*15dc779aSAndroid Build Coastguard Worker       max_subband = ptr_ps_dec->ptr_group_borders[group + 1];
1119*15dc779aSAndroid Build Coastguard Worker 
1120*15dc779aSAndroid Build Coastguard Worker       L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
1121*15dc779aSAndroid Build Coastguard Worker 
1122*15dc779aSAndroid Build Coastguard Worker       H11r = ptr_ps_dec->h11_re_prev[bin];
1123*15dc779aSAndroid Build Coastguard Worker       H12r = ptr_ps_dec->h12_re_prev[bin];
1124*15dc779aSAndroid Build Coastguard Worker       H21r = ptr_ps_dec->h21_re_prev[bin];
1125*15dc779aSAndroid Build Coastguard Worker       H22r = ptr_ps_dec->h22_re_prev[bin];
1126*15dc779aSAndroid Build Coastguard Worker       if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1127*15dc779aSAndroid Build Coastguard Worker         H11i = -ptr_ps_dec->h11_im_prev[bin];
1128*15dc779aSAndroid Build Coastguard Worker         H12i = -ptr_ps_dec->h12_im_prev[bin];
1129*15dc779aSAndroid Build Coastguard Worker         H21i = -ptr_ps_dec->h21_im_prev[bin];
1130*15dc779aSAndroid Build Coastguard Worker         H22i = -ptr_ps_dec->h22_im_prev[bin];
1131*15dc779aSAndroid Build Coastguard Worker       } else {
1132*15dc779aSAndroid Build Coastguard Worker         H11i = ptr_ps_dec->h11_im_prev[bin];
1133*15dc779aSAndroid Build Coastguard Worker         H12i = ptr_ps_dec->h12_im_prev[bin];
1134*15dc779aSAndroid Build Coastguard Worker         H21i = ptr_ps_dec->h21_im_prev[bin];
1135*15dc779aSAndroid Build Coastguard Worker         H22i = ptr_ps_dec->h22_im_prev[bin];
1136*15dc779aSAndroid Build Coastguard Worker       }
1137*15dc779aSAndroid Build Coastguard Worker 
1138*15dc779aSAndroid Build Coastguard Worker       h11r = ptr_ps_dec->h11_re_vec[bin];
1139*15dc779aSAndroid Build Coastguard Worker       h12r = ptr_ps_dec->h12_re_vec[bin];
1140*15dc779aSAndroid Build Coastguard Worker       h21r = ptr_ps_dec->h21_re_vec[bin];
1141*15dc779aSAndroid Build Coastguard Worker       h22r = ptr_ps_dec->h22_re_vec[bin];
1142*15dc779aSAndroid Build Coastguard Worker       if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1143*15dc779aSAndroid Build Coastguard Worker         h11i = -ptr_ps_dec->h11_im_vec[bin];
1144*15dc779aSAndroid Build Coastguard Worker         h12i = -ptr_ps_dec->h12_im_vec[bin];
1145*15dc779aSAndroid Build Coastguard Worker         h21i = -ptr_ps_dec->h21_im_vec[bin];
1146*15dc779aSAndroid Build Coastguard Worker         h22i = -ptr_ps_dec->h22_im_vec[bin];
1147*15dc779aSAndroid Build Coastguard Worker       } else {
1148*15dc779aSAndroid Build Coastguard Worker         h11i = ptr_ps_dec->h11_im_vec[bin];
1149*15dc779aSAndroid Build Coastguard Worker         h12i = ptr_ps_dec->h12_im_vec[bin];
1150*15dc779aSAndroid Build Coastguard Worker         h21i = ptr_ps_dec->h21_im_vec[bin];
1151*15dc779aSAndroid Build Coastguard Worker         h22i = ptr_ps_dec->h22_im_vec[bin];
1152*15dc779aSAndroid Build Coastguard Worker       }
1153*15dc779aSAndroid Build Coastguard Worker 
1154*15dc779aSAndroid Build Coastguard Worker       deltaH11r = (h11r - H11r) / L;
1155*15dc779aSAndroid Build Coastguard Worker       deltaH12r = (h12r - H12r) / L;
1156*15dc779aSAndroid Build Coastguard Worker       deltaH21r = (h21r - H21r) / L;
1157*15dc779aSAndroid Build Coastguard Worker       deltaH22r = (h22r - H22r) / L;
1158*15dc779aSAndroid Build Coastguard Worker 
1159*15dc779aSAndroid Build Coastguard Worker       deltaH11i = (h11i - H11i) / L;
1160*15dc779aSAndroid Build Coastguard Worker       deltaH12i = (h12i - H12i) / L;
1161*15dc779aSAndroid Build Coastguard Worker       deltaH21i = (h21i - H21i) / L;
1162*15dc779aSAndroid Build Coastguard Worker       deltaH22i = (h22i - H22i) / L;
1163*15dc779aSAndroid Build Coastguard Worker 
1164*15dc779aSAndroid Build Coastguard Worker       for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
1165*15dc779aSAndroid Build Coastguard Worker            i++) {
1166*15dc779aSAndroid Build Coastguard Worker         H11r += deltaH11r;
1167*15dc779aSAndroid Build Coastguard Worker         H12r += deltaH12r;
1168*15dc779aSAndroid Build Coastguard Worker         H21r += deltaH21r;
1169*15dc779aSAndroid Build Coastguard Worker         H22r += deltaH22r;
1170*15dc779aSAndroid Build Coastguard Worker 
1171*15dc779aSAndroid Build Coastguard Worker         H11i += deltaH11i;
1172*15dc779aSAndroid Build Coastguard Worker         H12i += deltaH12i;
1173*15dc779aSAndroid Build Coastguard Worker         H21i += deltaH21i;
1174*15dc779aSAndroid Build Coastguard Worker         H22i += deltaH22i;
1175*15dc779aSAndroid Build Coastguard Worker 
1176*15dc779aSAndroid Build Coastguard Worker         for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
1177*15dc779aSAndroid Build Coastguard Worker              subband++) {
1178*15dc779aSAndroid Build Coastguard Worker           l_left_re = H11r * pp_qmf_buf_re_left[i][subband] - H11i *
1179*15dc779aSAndroid Build Coastguard Worker                       pp_qmf_buf_im_left[i][subband] +
1180*15dc779aSAndroid Build Coastguard Worker                       H21r * pp_qmf_buf_re_right[i][subband] - H21i *
1181*15dc779aSAndroid Build Coastguard Worker                       pp_qmf_buf_im_right[i][subband];
1182*15dc779aSAndroid Build Coastguard Worker 
1183*15dc779aSAndroid Build Coastguard Worker           l_left_im = H11i * pp_qmf_buf_re_left[i][subband] + H11r *
1184*15dc779aSAndroid Build Coastguard Worker                       pp_qmf_buf_im_left[i][subband] +
1185*15dc779aSAndroid Build Coastguard Worker                       H21i * pp_qmf_buf_re_right[i][subband] + H21r *
1186*15dc779aSAndroid Build Coastguard Worker                       pp_qmf_buf_im_right[i][subband];
1187*15dc779aSAndroid Build Coastguard Worker 
1188*15dc779aSAndroid Build Coastguard Worker           l_right_re = H12r * pp_qmf_buf_re_left[i][subband] - H12i *
1189*15dc779aSAndroid Build Coastguard Worker                        pp_qmf_buf_im_left[i][subband] +
1190*15dc779aSAndroid Build Coastguard Worker                        H22r * pp_qmf_buf_re_right[i][subband] - H22i *
1191*15dc779aSAndroid Build Coastguard Worker                        pp_qmf_buf_im_right[i][subband];
1192*15dc779aSAndroid Build Coastguard Worker 
1193*15dc779aSAndroid Build Coastguard Worker           l_right_im = H12i * pp_qmf_buf_re_left[i][subband] + H12r *
1194*15dc779aSAndroid Build Coastguard Worker                        pp_qmf_buf_im_left[i][subband] +
1195*15dc779aSAndroid Build Coastguard Worker                        H22i * pp_qmf_buf_re_right[i][subband] + H22r *
1196*15dc779aSAndroid Build Coastguard Worker                        pp_qmf_buf_im_right[i][subband];
1197*15dc779aSAndroid Build Coastguard Worker 
1198*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_re_left[i][subband] = l_left_re;
1199*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_im_left[i][subband] = l_left_im;
1200*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_re_right[i][subband] = l_right_re;
1201*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_im_right[i][subband] = l_right_im;
1202*15dc779aSAndroid Build Coastguard Worker         }
1203*15dc779aSAndroid Build Coastguard Worker       }
1204*15dc779aSAndroid Build Coastguard Worker     }
1205*15dc779aSAndroid Build Coastguard Worker     for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
1206*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h11_re_prev[bin] = ptr_ps_dec->h11_re_vec[bin];
1207*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h12_re_prev[bin] = ptr_ps_dec->h12_re_vec[bin];
1208*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h21_re_prev[bin] = ptr_ps_dec->h21_re_vec[bin];
1209*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h22_re_prev[bin] = ptr_ps_dec->h22_re_vec[bin];
1210*15dc779aSAndroid Build Coastguard Worker 
1211*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h11_im_prev[bin] = ptr_ps_dec->h11_im_vec[bin];
1212*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h12_im_prev[bin] = ptr_ps_dec->h12_im_vec[bin];
1213*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h21_im_prev[bin] = ptr_ps_dec->h21_im_vec[bin];
1214*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->h22_im_prev[bin] = ptr_ps_dec->h22_im_vec[bin];
1215*15dc779aSAndroid Build Coastguard Worker     }
1216*15dc779aSAndroid Build Coastguard Worker 
1217*15dc779aSAndroid Build Coastguard Worker     for (bin = 0; bin < ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]; bin++) {
1218*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->ipd_idx_map_2[bin] = ptr_ps_dec->ipd_idx_map_1[bin];
1219*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->opd_idx_map_2[bin] = ptr_ps_dec->opd_idx_map_1[bin];
1220*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->ipd_idx_map_1[bin] = ptr_ps_dec->ipd_idx_map[env][bin];
1221*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->opd_idx_map_1[bin] = ptr_ps_dec->opd_idx_map[env][bin];
1222*15dc779aSAndroid Build Coastguard Worker     }
1223*15dc779aSAndroid Build Coastguard Worker   }
1224*15dc779aSAndroid Build Coastguard Worker }
1225