xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_sbrdec_lpfuncs.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include <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.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
51*15dc779aSAndroid Build Coastguard Worker 
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_bitdec.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_freq_sca.h"
63*15dc779aSAndroid Build Coastguard Worker 
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_dec.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_crc.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
74*15dc779aSAndroid Build Coastguard Worker 
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
77*15dc779aSAndroid Build Coastguard Worker 
78*15dc779aSAndroid Build Coastguard Worker #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
79*15dc779aSAndroid Build Coastguard Worker 
80*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_new_bw_table[4][4] = {
81*15dc779aSAndroid Build Coastguard Worker     {0.00f, 0.60f, 0.90f, 0.98f},
82*15dc779aSAndroid Build Coastguard Worker     {0.60f, 0.75f, 0.90f, 0.98f},
83*15dc779aSAndroid Build Coastguard Worker     {0.00f, 0.75f, 0.90f, 0.98f},
84*15dc779aSAndroid Build Coastguard Worker     {0.00f, 0.75f, 0.90f, 0.98f}};
85*15dc779aSAndroid Build Coastguard Worker static const WORD32 ixheaacd_inew_bw_table[4][4] = {
86*15dc779aSAndroid Build Coastguard Worker     {0x00000000, 0x4ccccccd, 0x73333333, 0x7d70a3d7},
87*15dc779aSAndroid Build Coastguard Worker     {0x4ccccccd, 0x60000000, 0x73333333, 0x7d70a3d7},
88*15dc779aSAndroid Build Coastguard Worker     {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7},
89*15dc779aSAndroid Build Coastguard Worker     {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}};
90*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_reset_sbrenvelope_calc(ia_sbr_calc_env_struct * h_cal_env)91*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_reset_sbrenvelope_calc(ia_sbr_calc_env_struct *h_cal_env) {
92*15dc779aSAndroid Build Coastguard Worker   h_cal_env->ph_index = 0;
93*15dc779aSAndroid Build Coastguard Worker   h_cal_env->filt_buf_noise_e = 0;
94*15dc779aSAndroid Build Coastguard Worker   h_cal_env->start_up = 1;
95*15dc779aSAndroid Build Coastguard Worker }
96*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_derive_lim_band_tbl(ia_sbr_header_data_struct * ptr_header_data,const ia_patch_param_struct * p_str_patch_param,WORD16 num_patches,ixheaacd_misc_tables * pstr_common_tables)97*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_derive_lim_band_tbl(
98*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
99*15dc779aSAndroid Build Coastguard Worker     const ia_patch_param_struct *p_str_patch_param, WORD16 num_patches,
100*15dc779aSAndroid Build Coastguard Worker     ixheaacd_misc_tables *pstr_common_tables) {
101*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k, k_1;
102*15dc779aSAndroid Build Coastguard Worker   WORD32 nr_lim, patch_border_k, patch_border_k_1, temp_nr_lim;
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker   WORD16 lim_table[MAX_FREQ_COEFFS / 2 + MAX_NUM_PATCHES + 1];
105*15dc779aSAndroid Build Coastguard Worker   WORD16 patch_borders[MAX_NUM_PATCHES + 1];
106*15dc779aSAndroid Build Coastguard Worker   WORD16 kx, k2;
107*15dc779aSAndroid Build Coastguard Worker   WORD16 temp, lim_bands, num_octaves;
108*15dc779aSAndroid Build Coastguard Worker 
109*15dc779aSAndroid Build Coastguard Worker   WORD16 *f_lim_tbl = ptr_header_data->pstr_freq_band_data->freq_band_tbl_lim;
110*15dc779aSAndroid Build Coastguard Worker   WORD16 *num_lf_bands = &ptr_header_data->pstr_freq_band_data->num_lf_bands;
111*15dc779aSAndroid Build Coastguard Worker   WORD16 *f_low_tbl =
112*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->pstr_freq_band_data->freq_band_table[LOW];
113*15dc779aSAndroid Build Coastguard Worker   WORD16 num_low_bnd = ptr_header_data->pstr_freq_band_data->num_sf_bands[LOW];
114*15dc779aSAndroid Build Coastguard Worker   WORD16 limiter_bands = ptr_header_data->limiter_bands;
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker   WORD16 sub_band_start = f_low_tbl[0];
117*15dc779aSAndroid Build Coastguard Worker   WORD16 sub_band_end = f_low_tbl[num_low_bnd];
118*15dc779aSAndroid Build Coastguard Worker   const WORD16 limbnd_per_oct[4] = {(WORD16)0x2000, (WORD16)0x2666, (WORD16)0x4000,
119*15dc779aSAndroid Build Coastguard Worker                                     (WORD16)0x6000};
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker   if (limiter_bands == 0) {
122*15dc779aSAndroid Build Coastguard Worker     f_lim_tbl[0] = 0;
123*15dc779aSAndroid Build Coastguard Worker     f_lim_tbl[1] = sub_band_end - sub_band_start;
124*15dc779aSAndroid Build Coastguard Worker     nr_lim = 1;
125*15dc779aSAndroid Build Coastguard Worker   } else {
126*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < num_patches; k++) {
127*15dc779aSAndroid Build Coastguard Worker       patch_borders[k] = p_str_patch_param[k].guard_start_band - sub_band_start;
128*15dc779aSAndroid Build Coastguard Worker     }
129*15dc779aSAndroid Build Coastguard Worker     patch_borders[k] = sub_band_end - sub_band_start;
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k <= num_low_bnd; k++) {
132*15dc779aSAndroid Build Coastguard Worker       lim_table[k] = f_low_tbl[k] - sub_band_start;
133*15dc779aSAndroid Build Coastguard Worker     }
134*15dc779aSAndroid Build Coastguard Worker     for (k = 1; k < num_patches; k++) {
135*15dc779aSAndroid Build Coastguard Worker       lim_table[num_low_bnd + k] = patch_borders[k];
136*15dc779aSAndroid Build Coastguard Worker     }
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker     temp_nr_lim = nr_lim = (num_low_bnd + num_patches) - 1;
139*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_shellsort(lim_table, (temp_nr_lim + 1));
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker     k = 1;
142*15dc779aSAndroid Build Coastguard Worker     k_1 = 0;
143*15dc779aSAndroid Build Coastguard Worker 
144*15dc779aSAndroid Build Coastguard Worker     lim_bands = limbnd_per_oct[limiter_bands];
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker     while ((k - temp_nr_lim) <= 0) {
147*15dc779aSAndroid Build Coastguard Worker       k2 = lim_table[k] + sub_band_start;
148*15dc779aSAndroid Build Coastguard Worker       kx = lim_table[k_1] + sub_band_start;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker       num_octaves = pstr_common_tables->log_dual_is_table[k2];
151*15dc779aSAndroid Build Coastguard Worker       num_octaves -= pstr_common_tables->log_dual_is_table[kx];
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker       temp = (WORD16)(((WORD32)lim_bands * (WORD32)num_octaves) >> 15);
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker       if (temp < 0x01f6) {
156*15dc779aSAndroid Build Coastguard Worker         if (lim_table[k_1] == lim_table[k]) {
157*15dc779aSAndroid Build Coastguard Worker           lim_table[k] = sub_band_end;
158*15dc779aSAndroid Build Coastguard Worker           nr_lim = nr_lim - 1;
159*15dc779aSAndroid Build Coastguard Worker           k = (k + 1);
160*15dc779aSAndroid Build Coastguard Worker           continue;
161*15dc779aSAndroid Build Coastguard Worker         }
162*15dc779aSAndroid Build Coastguard Worker         patch_border_k_1 = patch_border_k = 0;
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i <= num_patches; i++) {
165*15dc779aSAndroid Build Coastguard Worker           if (lim_table[k] == patch_borders[i]) {
166*15dc779aSAndroid Build Coastguard Worker             patch_border_k = 1;
167*15dc779aSAndroid Build Coastguard Worker           }
168*15dc779aSAndroid Build Coastguard Worker           if (lim_table[k_1] == patch_borders[i]) {
169*15dc779aSAndroid Build Coastguard Worker             patch_border_k_1 = 1;
170*15dc779aSAndroid Build Coastguard Worker           }
171*15dc779aSAndroid Build Coastguard Worker         }
172*15dc779aSAndroid Build Coastguard Worker         if (!patch_border_k) {
173*15dc779aSAndroid Build Coastguard Worker           lim_table[k] = sub_band_end;
174*15dc779aSAndroid Build Coastguard Worker           nr_lim = nr_lim - 1;
175*15dc779aSAndroid Build Coastguard Worker           k = (k + 1);
176*15dc779aSAndroid Build Coastguard Worker           continue;
177*15dc779aSAndroid Build Coastguard Worker         }
178*15dc779aSAndroid Build Coastguard Worker 
179*15dc779aSAndroid Build Coastguard Worker         if (!patch_border_k_1) {
180*15dc779aSAndroid Build Coastguard Worker           lim_table[k_1] = sub_band_end;
181*15dc779aSAndroid Build Coastguard Worker           nr_lim = nr_lim - 1;
182*15dc779aSAndroid Build Coastguard Worker         }
183*15dc779aSAndroid Build Coastguard Worker       }
184*15dc779aSAndroid Build Coastguard Worker       k_1 = k;
185*15dc779aSAndroid Build Coastguard Worker       k = (k + 1);
186*15dc779aSAndroid Build Coastguard Worker     }
187*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_shellsort(lim_table, (temp_nr_lim + 1));
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker     memcpy(f_lim_tbl, lim_table, sizeof(WORD16) * (nr_lim + 1));
190*15dc779aSAndroid Build Coastguard Worker   }
191*15dc779aSAndroid Build Coastguard Worker   *num_lf_bands = nr_lim;
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker   return;
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_lean_sbrconcealment(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data)196*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_lean_sbrconcealment(
197*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
198*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_sbr_data,
199*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_prev_data) {
200*15dc779aSAndroid Build Coastguard Worker   WORD32 target;
201*15dc779aSAndroid Build Coastguard Worker   WORD32 step;
202*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker   WORD16 cur_start_pos;
205*15dc779aSAndroid Build Coastguard Worker   WORD16 cur_stop_pos;
206*15dc779aSAndroid Build Coastguard Worker 
207*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->amp_res = ptr_prev_data->amp_res;
208*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->coupling_mode = ptr_prev_data->coupling_mode;
209*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->max_qmf_subband_aac = ptr_prev_data->max_qmf_subband_aac;
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_sbr_data->sbr_invf_mode, ptr_prev_data->sbr_invf_mode,
212*15dc779aSAndroid Build Coastguard Worker          sizeof(WORD32) * MAX_INVF_BANDS);
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.num_env = 1;
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker   cur_start_pos = ptr_prev_data->end_position - ptr_header_data->num_time_slots;
217*15dc779aSAndroid Build Coastguard Worker   cur_stop_pos = ptr_header_data->num_time_slots;
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.border_vec[0] = cur_start_pos;
220*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.border_vec[1] = cur_stop_pos;
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.noise_border_vec[0] = cur_start_pos;
223*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.noise_border_vec[1] = cur_stop_pos;
224*15dc779aSAndroid Build Coastguard Worker   ;
225*15dc779aSAndroid Build Coastguard Worker 
226*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.freq_res[0] = 1;
227*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.transient_env = -1;
228*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->str_frame_info_details.num_noise_env = 1;
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->num_env_sfac =
231*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->pstr_freq_band_data->num_sf_bands[1];
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->del_cod_dir_arr[0] = DTDF_DIR_TIME;
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker   if (ptr_sbr_data->coupling_mode == COUPLING_BAL) {
236*15dc779aSAndroid Build Coastguard Worker     target = SBR_ENERGY_PAN_OFFSET;
237*15dc779aSAndroid Build Coastguard Worker   } else {
238*15dc779aSAndroid Build Coastguard Worker     target = 0;
239*15dc779aSAndroid Build Coastguard Worker   }
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker   step = 1;
242*15dc779aSAndroid Build Coastguard Worker 
243*15dc779aSAndroid Build Coastguard Worker   if (ptr_header_data->amp_res - SBR_AMPLITUDE_RESOLUTION_1_5 == 0) {
244*15dc779aSAndroid Build Coastguard Worker     target = (target << 1);
245*15dc779aSAndroid Build Coastguard Worker     step = (step << 1);
246*15dc779aSAndroid Build Coastguard Worker   }
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ptr_sbr_data->num_env_sfac; i++) {
249*15dc779aSAndroid Build Coastguard Worker     if (ptr_prev_data->sfb_nrg_prev[i] > target)
250*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->int_env_sf_arr[i] = -(step);
251*15dc779aSAndroid Build Coastguard Worker     else
252*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->int_env_sf_arr[i] = step;
253*15dc779aSAndroid Build Coastguard Worker   }
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_data->del_cod_dir_noise_arr[0] = DTDF_DIR_TIME;
256*15dc779aSAndroid Build Coastguard Worker 
257*15dc779aSAndroid Build Coastguard Worker   memset(ptr_sbr_data->int_noise_floor, 0,
258*15dc779aSAndroid Build Coastguard Worker          sizeof(ptr_sbr_data->int_noise_floor));
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker   memset(ptr_sbr_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
261*15dc779aSAndroid Build Coastguard Worker }
262*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_find_closest_entry(WORD32 goal_sb,WORD16 * f_master_tbl,WORD16 num_mf_bands,WORD16 direction)263*15dc779aSAndroid Build Coastguard Worker static WORD16 ixheaacd_find_closest_entry(WORD32 goal_sb, WORD16 *f_master_tbl,
264*15dc779aSAndroid Build Coastguard Worker                                           WORD16 num_mf_bands,
265*15dc779aSAndroid Build Coastguard Worker                                           WORD16 direction) {
266*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker   if (goal_sb <= f_master_tbl[0]) return f_master_tbl[0];
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker   if (goal_sb >= f_master_tbl[num_mf_bands]) return f_master_tbl[num_mf_bands];
271*15dc779aSAndroid Build Coastguard Worker 
272*15dc779aSAndroid Build Coastguard Worker   if (direction) {
273*15dc779aSAndroid Build Coastguard Worker     index = 0;
274*15dc779aSAndroid Build Coastguard Worker     while (f_master_tbl[index] < goal_sb) {
275*15dc779aSAndroid Build Coastguard Worker       index++;
276*15dc779aSAndroid Build Coastguard Worker     }
277*15dc779aSAndroid Build Coastguard Worker   } else {
278*15dc779aSAndroid Build Coastguard Worker     index = num_mf_bands;
279*15dc779aSAndroid Build Coastguard Worker     while (f_master_tbl[index] > goal_sb) {
280*15dc779aSAndroid Build Coastguard Worker       index--;
281*15dc779aSAndroid Build Coastguard Worker     }
282*15dc779aSAndroid Build Coastguard Worker   }
283*15dc779aSAndroid Build Coastguard Worker 
284*15dc779aSAndroid Build Coastguard Worker   return f_master_tbl[index];
285*15dc779aSAndroid Build Coastguard Worker }
286*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_reset_hf_generator(ia_sbr_hf_generator_struct * ptr_hf_gen_str,ia_sbr_header_data_struct * ptr_header_data,WORD audio_object_type)287*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_reset_hf_generator(ia_sbr_hf_generator_struct *ptr_hf_gen_str,
288*15dc779aSAndroid Build Coastguard Worker                                    ia_sbr_header_data_struct *ptr_header_data,
289*15dc779aSAndroid Build Coastguard Worker                                    WORD audio_object_type) {
290*15dc779aSAndroid Build Coastguard Worker   WORD32 patch, sb;
291*15dc779aSAndroid Build Coastguard Worker   WORD32 temp;
292*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_noise_freq_tbl;
293*15dc779aSAndroid Build Coastguard Worker   WORD32 num_nf_bands;
294*15dc779aSAndroid Build Coastguard Worker 
295*15dc779aSAndroid Build Coastguard Worker   ia_transposer_settings_struct *pstr_transposer_settings =
296*15dc779aSAndroid Build Coastguard Worker       ptr_hf_gen_str->pstr_settings;
297*15dc779aSAndroid Build Coastguard Worker   ia_patch_param_struct *p_str_patch_param =
298*15dc779aSAndroid Build Coastguard Worker       pstr_transposer_settings->str_patch_param;
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker   WORD32 sub_band_start = ptr_header_data->pstr_freq_band_data->sub_band_start;
301*15dc779aSAndroid Build Coastguard Worker   WORD16 *f_master_tbl = ptr_header_data->pstr_freq_band_data->f_master_tbl;
302*15dc779aSAndroid Build Coastguard Worker   WORD16 num_mf_bands = ptr_header_data->pstr_freq_band_data->num_mf_bands;
303*15dc779aSAndroid Build Coastguard Worker   WORD16 usb = ptr_header_data->pstr_freq_band_data->sub_band_end;
304*15dc779aSAndroid Build Coastguard Worker 
305*15dc779aSAndroid Build Coastguard Worker   WORD32 src_start_band;
306*15dc779aSAndroid Build Coastguard Worker   WORD32 patch_stride;
307*15dc779aSAndroid Build Coastguard Worker   WORD32 num_bands_in_patch;
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker   WORD32 lsb = f_master_tbl[0];
310*15dc779aSAndroid Build Coastguard Worker   WORD16 xover_offset = sub_band_start - lsb;
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker   WORD16 goal_sb, flag_break_1 = 0;
313*15dc779aSAndroid Build Coastguard Worker   WORD32 fs = ptr_header_data->out_sampling_freq;
314*15dc779aSAndroid Build Coastguard Worker 
315*15dc779aSAndroid Build Coastguard Worker   if (lsb < (SHIFT_START_SB + 4)) {
316*15dc779aSAndroid Build Coastguard Worker     return (1);
317*15dc779aSAndroid Build Coastguard Worker   }
318*15dc779aSAndroid Build Coastguard Worker   switch (fs) {
319*15dc779aSAndroid Build Coastguard Worker     case 16000:
320*15dc779aSAndroid Build Coastguard Worker     case 22050:
321*15dc779aSAndroid Build Coastguard Worker     case 24000:
322*15dc779aSAndroid Build Coastguard Worker     case 32000:
323*15dc779aSAndroid Build Coastguard Worker       goal_sb = 64;
324*15dc779aSAndroid Build Coastguard Worker       break;
325*15dc779aSAndroid Build Coastguard Worker     case 44100:
326*15dc779aSAndroid Build Coastguard Worker       goal_sb = 46;
327*15dc779aSAndroid Build Coastguard Worker       break;
328*15dc779aSAndroid Build Coastguard Worker     case 48000:
329*15dc779aSAndroid Build Coastguard Worker       goal_sb = 43;
330*15dc779aSAndroid Build Coastguard Worker       break;
331*15dc779aSAndroid Build Coastguard Worker     case 64000:
332*15dc779aSAndroid Build Coastguard Worker       goal_sb = 32;
333*15dc779aSAndroid Build Coastguard Worker       break;
334*15dc779aSAndroid Build Coastguard Worker     case 88200:
335*15dc779aSAndroid Build Coastguard Worker       goal_sb = 23;
336*15dc779aSAndroid Build Coastguard Worker       break;
337*15dc779aSAndroid Build Coastguard Worker     case 96000:
338*15dc779aSAndroid Build Coastguard Worker       goal_sb = 21;
339*15dc779aSAndroid Build Coastguard Worker       break;
340*15dc779aSAndroid Build Coastguard Worker     default:
341*15dc779aSAndroid Build Coastguard Worker       return (0);
342*15dc779aSAndroid Build Coastguard Worker   }
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker   goal_sb = ixheaacd_find_closest_entry(goal_sb, f_master_tbl, num_mf_bands, 1);
345*15dc779aSAndroid Build Coastguard Worker   if (audio_object_type != AOT_ER_AAC_ELD &&
346*15dc779aSAndroid Build Coastguard Worker       audio_object_type != AOT_ER_AAC_LD) {
347*15dc779aSAndroid Build Coastguard Worker     if (ixheaac_abs16_sat((WORD16)(goal_sb - usb)) < 4) {
348*15dc779aSAndroid Build Coastguard Worker       goal_sb = usb;
349*15dc779aSAndroid Build Coastguard Worker     }
350*15dc779aSAndroid Build Coastguard Worker   }
351*15dc779aSAndroid Build Coastguard Worker 
352*15dc779aSAndroid Build Coastguard Worker   src_start_band = SHIFT_START_SB + xover_offset;
353*15dc779aSAndroid Build Coastguard Worker   sb = (lsb + xover_offset);
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   patch = 0;
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker   if ((goal_sb < sb) && (lsb > src_start_band)) {
358*15dc779aSAndroid Build Coastguard Worker     return -1;
359*15dc779aSAndroid Build Coastguard Worker   }
360*15dc779aSAndroid Build Coastguard Worker 
361*15dc779aSAndroid Build Coastguard Worker   while (((sb - usb) < 0) && (patch < MAX_NUM_PATCHES)) {
362*15dc779aSAndroid Build Coastguard Worker     ia_patch_param_struct *ptr_loc_patch_param = &p_str_patch_param[patch];
363*15dc779aSAndroid Build Coastguard Worker     WORD16 abs_sb, flag_break = 0;
364*15dc779aSAndroid Build Coastguard Worker     ptr_loc_patch_param->guard_start_band = sb;
365*15dc779aSAndroid Build Coastguard Worker     sb = (sb + GUARDBANDS);
366*15dc779aSAndroid Build Coastguard Worker     ptr_loc_patch_param->dst_start_band = sb;
367*15dc779aSAndroid Build Coastguard Worker 
368*15dc779aSAndroid Build Coastguard Worker     num_bands_in_patch = (goal_sb - sb);
369*15dc779aSAndroid Build Coastguard Worker     if ((num_bands_in_patch <= 0) &&
370*15dc779aSAndroid Build Coastguard Worker         ((num_bands_in_patch - (lsb - src_start_band)) < 0)) {
371*15dc779aSAndroid Build Coastguard Worker       flag_break = 1;
372*15dc779aSAndroid Build Coastguard Worker     }
373*15dc779aSAndroid Build Coastguard Worker     if ((num_bands_in_patch - (lsb - src_start_band)) >= 0) {
374*15dc779aSAndroid Build Coastguard Worker       patch_stride = sb - src_start_band;
375*15dc779aSAndroid Build Coastguard Worker       patch_stride = (WORD16)(patch_stride & ~1);
376*15dc779aSAndroid Build Coastguard Worker       num_bands_in_patch = (lsb - (sb - patch_stride));
377*15dc779aSAndroid Build Coastguard Worker       num_bands_in_patch = ixheaacd_find_closest_entry(
378*15dc779aSAndroid Build Coastguard Worker           sb + num_bands_in_patch, f_master_tbl, num_mf_bands, 0);
379*15dc779aSAndroid Build Coastguard Worker       num_bands_in_patch -= sb;
380*15dc779aSAndroid Build Coastguard Worker     }
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker     patch_stride = ((num_bands_in_patch + sb) - lsb);
383*15dc779aSAndroid Build Coastguard Worker     patch_stride = (WORD16)((patch_stride + 1) & ~1);
384*15dc779aSAndroid Build Coastguard Worker 
385*15dc779aSAndroid Build Coastguard Worker     if (num_bands_in_patch > 0) {
386*15dc779aSAndroid Build Coastguard Worker       ptr_loc_patch_param->src_start_band = (sb - patch_stride);
387*15dc779aSAndroid Build Coastguard Worker       ptr_loc_patch_param->dst_end_band = patch_stride;
388*15dc779aSAndroid Build Coastguard Worker       ptr_loc_patch_param->num_bands_in_patch = num_bands_in_patch;
389*15dc779aSAndroid Build Coastguard Worker       ptr_loc_patch_param->src_end_band =
390*15dc779aSAndroid Build Coastguard Worker           (ptr_loc_patch_param->src_start_band + num_bands_in_patch);
391*15dc779aSAndroid Build Coastguard Worker 
392*15dc779aSAndroid Build Coastguard Worker       sb = (sb + ptr_loc_patch_param->num_bands_in_patch);
393*15dc779aSAndroid Build Coastguard Worker       patch++;
394*15dc779aSAndroid Build Coastguard Worker     }
395*15dc779aSAndroid Build Coastguard Worker 
396*15dc779aSAndroid Build Coastguard Worker     src_start_band = SHIFT_START_SB;
397*15dc779aSAndroid Build Coastguard Worker     abs_sb = ixheaac_abs16_sat((WORD16)((sb - goal_sb))) - 3;
398*15dc779aSAndroid Build Coastguard Worker 
399*15dc779aSAndroid Build Coastguard Worker     if (num_bands_in_patch <= 0 && flag_break_1 == 1) {
400*15dc779aSAndroid Build Coastguard Worker       break;
401*15dc779aSAndroid Build Coastguard Worker     }
402*15dc779aSAndroid Build Coastguard Worker 
403*15dc779aSAndroid Build Coastguard Worker     if (abs_sb < 0) {
404*15dc779aSAndroid Build Coastguard Worker       goal_sb = usb;
405*15dc779aSAndroid Build Coastguard Worker     } else {
406*15dc779aSAndroid Build Coastguard Worker       if (flag_break == 1) break;
407*15dc779aSAndroid Build Coastguard Worker     }
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker     if (num_bands_in_patch <= 0) {
410*15dc779aSAndroid Build Coastguard Worker       flag_break_1 = 1;
411*15dc779aSAndroid Build Coastguard Worker     } else {
412*15dc779aSAndroid Build Coastguard Worker       flag_break_1 = 0;
413*15dc779aSAndroid Build Coastguard Worker     }
414*15dc779aSAndroid Build Coastguard Worker   }
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker   patch--;
417*15dc779aSAndroid Build Coastguard Worker 
418*15dc779aSAndroid Build Coastguard Worker   if ((patch > 0) && (p_str_patch_param[patch].num_bands_in_patch < 3)) {
419*15dc779aSAndroid Build Coastguard Worker     patch--;
420*15dc779aSAndroid Build Coastguard Worker     sb = p_str_patch_param[patch].dst_start_band +
421*15dc779aSAndroid Build Coastguard Worker          p_str_patch_param[patch].num_bands_in_patch;
422*15dc779aSAndroid Build Coastguard Worker   }
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker   if (patch >= MAX_NUM_PATCHES) {
425*15dc779aSAndroid Build Coastguard Worker     return -1;
426*15dc779aSAndroid Build Coastguard Worker   }
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker   pstr_transposer_settings->num_patches = patch + 1;
429*15dc779aSAndroid Build Coastguard Worker 
430*15dc779aSAndroid Build Coastguard Worker   temp = 0;
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   for (patch = 0; patch < pstr_transposer_settings->num_patches; patch++) {
433*15dc779aSAndroid Build Coastguard Worker     sb = ixheaac_min32(sb, p_str_patch_param[patch].src_start_band);
434*15dc779aSAndroid Build Coastguard Worker     temp = ixheaac_max32(temp, p_str_patch_param[patch].src_end_band);
435*15dc779aSAndroid Build Coastguard Worker   }
436*15dc779aSAndroid Build Coastguard Worker 
437*15dc779aSAndroid Build Coastguard Worker   if (sb > temp) return IA_FATAL_ERROR;
438*15dc779aSAndroid Build Coastguard Worker 
439*15dc779aSAndroid Build Coastguard Worker   pstr_transposer_settings->start_patch = sb;
440*15dc779aSAndroid Build Coastguard Worker   pstr_transposer_settings->stop_patch = temp;
441*15dc779aSAndroid Build Coastguard Worker 
442*15dc779aSAndroid Build Coastguard Worker   ptr_noise_freq_tbl =
443*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->pstr_freq_band_data->freq_band_tbl_noise;
444*15dc779aSAndroid Build Coastguard Worker   num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker   memcpy(&pstr_transposer_settings->bw_borders[0], &ptr_noise_freq_tbl[1],
447*15dc779aSAndroid Build Coastguard Worker          sizeof(WORD16) * num_nf_bands);
448*15dc779aSAndroid Build Coastguard Worker 
449*15dc779aSAndroid Build Coastguard Worker   memset(ptr_hf_gen_str->bw_array_prev, 0, sizeof(WORD32) * MAX_NUM_PATCHES);
450*15dc779aSAndroid Build Coastguard Worker 
451*15dc779aSAndroid Build Coastguard Worker   return 0;
452*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_rescale_x_overlap(ia_sbr_dec_struct * ptr_sbr_dec,ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_sbr_prev_frame_data_struct * ptr_frame_data_prev,WORD32 ** pp_overlap_buffer_real,WORD32 ** pp_overlap_buffer_imag,FLAG low_pow_flag)453*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_rescale_x_overlap(
454*15dc779aSAndroid Build Coastguard Worker     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
455*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_frame_data,
456*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
457*15dc779aSAndroid Build Coastguard Worker     WORD32 **pp_overlap_buffer_real, WORD32 **pp_overlap_buffer_imag,
458*15dc779aSAndroid Build Coastguard Worker     FLAG low_pow_flag) {
459*15dc779aSAndroid Build Coastguard Worker   WORD32 k, l;
460*15dc779aSAndroid Build Coastguard Worker   WORD32 start_band, end_band;
461*15dc779aSAndroid Build Coastguard Worker   WORD32 target_lsb, target_usb;
462*15dc779aSAndroid Build Coastguard Worker   WORD32 source_scale, target_scale, delta_scale, reserve;
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker   WORD32 old_lsb = ptr_frame_data_prev->max_qmf_subband_aac;
465*15dc779aSAndroid Build Coastguard Worker   WORD32 start_slot =
466*15dc779aSAndroid Build Coastguard Worker       (ptr_header_data->time_step *
467*15dc779aSAndroid Build Coastguard Worker        (ptr_frame_data_prev->end_position - ptr_header_data->num_time_slots));
468*15dc779aSAndroid Build Coastguard Worker   WORD32 new_lsb = ptr_frame_data->max_qmf_subband_aac;
469*15dc779aSAndroid Build Coastguard Worker 
470*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_dec->str_codec_qmf_bank.usb = new_lsb;
471*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_dec->str_synthesis_qmf_bank.lsb = new_lsb;
472*15dc779aSAndroid Build Coastguard Worker 
473*15dc779aSAndroid Build Coastguard Worker   start_band = ixheaac_min32(old_lsb, new_lsb);
474*15dc779aSAndroid Build Coastguard Worker   end_band = ixheaac_max32(old_lsb, new_lsb);
475*15dc779aSAndroid Build Coastguard Worker 
476*15dc779aSAndroid Build Coastguard Worker   if (new_lsb != old_lsb && old_lsb > 0) {
477*15dc779aSAndroid Build Coastguard Worker     for (l = start_slot; l < 6; l++) {
478*15dc779aSAndroid Build Coastguard Worker       for (k = old_lsb; k < new_lsb; k++) {
479*15dc779aSAndroid Build Coastguard Worker         pp_overlap_buffer_real[l][k] = 0L;
480*15dc779aSAndroid Build Coastguard Worker 
481*15dc779aSAndroid Build Coastguard Worker         if (!low_pow_flag) {
482*15dc779aSAndroid Build Coastguard Worker           pp_overlap_buffer_imag[l][k] = 0L;
483*15dc779aSAndroid Build Coastguard Worker         }
484*15dc779aSAndroid Build Coastguard Worker       }
485*15dc779aSAndroid Build Coastguard Worker     }
486*15dc779aSAndroid Build Coastguard Worker 
487*15dc779aSAndroid Build Coastguard Worker     if (new_lsb > old_lsb) {
488*15dc779aSAndroid Build Coastguard Worker       source_scale = ptr_sbr_dec->str_sbr_scale_fact.ov_hb_scale;
489*15dc779aSAndroid Build Coastguard Worker       target_scale = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale;
490*15dc779aSAndroid Build Coastguard Worker       target_lsb = 0;
491*15dc779aSAndroid Build Coastguard Worker       target_usb = old_lsb;
492*15dc779aSAndroid Build Coastguard Worker     } else {
493*15dc779aSAndroid Build Coastguard Worker       source_scale = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale;
494*15dc779aSAndroid Build Coastguard Worker       target_scale = ptr_sbr_dec->str_sbr_scale_fact.ov_hb_scale;
495*15dc779aSAndroid Build Coastguard Worker       target_lsb = old_lsb;
496*15dc779aSAndroid Build Coastguard Worker       target_usb = ptr_sbr_dec->str_synthesis_qmf_bank.usb;
497*15dc779aSAndroid Build Coastguard Worker     }
498*15dc779aSAndroid Build Coastguard Worker 
499*15dc779aSAndroid Build Coastguard Worker     reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
500*15dc779aSAndroid Build Coastguard Worker         pp_overlap_buffer_real, pp_overlap_buffer_imag, start_band, end_band, 0,
501*15dc779aSAndroid Build Coastguard Worker         start_slot, low_pow_flag);
502*15dc779aSAndroid Build Coastguard Worker 
503*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_adjust_scale)(pp_overlap_buffer_real, pp_overlap_buffer_imag,
504*15dc779aSAndroid Build Coastguard Worker                              start_band, end_band, 0, start_slot, reserve,
505*15dc779aSAndroid Build Coastguard Worker                              low_pow_flag);
506*15dc779aSAndroid Build Coastguard Worker 
507*15dc779aSAndroid Build Coastguard Worker     source_scale += reserve;
508*15dc779aSAndroid Build Coastguard Worker 
509*15dc779aSAndroid Build Coastguard Worker     delta_scale = (target_scale - source_scale);
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker     if (delta_scale > 0) {
512*15dc779aSAndroid Build Coastguard Worker       delta_scale = -(delta_scale);
513*15dc779aSAndroid Build Coastguard Worker       start_band = target_lsb;
514*15dc779aSAndroid Build Coastguard Worker       end_band = target_usb;
515*15dc779aSAndroid Build Coastguard Worker 
516*15dc779aSAndroid Build Coastguard Worker       if (new_lsb > old_lsb) {
517*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = source_scale;
518*15dc779aSAndroid Build Coastguard Worker       } else {
519*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_sbr_scale_fact.ov_hb_scale = source_scale;
520*15dc779aSAndroid Build Coastguard Worker       }
521*15dc779aSAndroid Build Coastguard Worker     }
522*15dc779aSAndroid Build Coastguard Worker 
523*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_adjust_scale)(pp_overlap_buffer_real, pp_overlap_buffer_imag,
524*15dc779aSAndroid Build Coastguard Worker                              start_band, end_band, 0, start_slot, delta_scale,
525*15dc779aSAndroid Build Coastguard Worker                              low_pow_flag);
526*15dc779aSAndroid Build Coastguard Worker   }
527*15dc779aSAndroid Build Coastguard Worker }
528*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_sineflags(WORD16 * freq_band_table,WORD16 num_sf_bands,FLAG * add_harmonics,WORD8 * harm_flags_prev,WORD16 transient_env,WORD8 * sine_mapped)529*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_map_sineflags(WORD16 *freq_band_table, WORD16 num_sf_bands,
530*15dc779aSAndroid Build Coastguard Worker                             FLAG *add_harmonics, WORD8 *harm_flags_prev,
531*15dc779aSAndroid Build Coastguard Worker                             WORD16 transient_env, WORD8 *sine_mapped)
532*15dc779aSAndroid Build Coastguard Worker 
533*15dc779aSAndroid Build Coastguard Worker {
534*15dc779aSAndroid Build Coastguard Worker   WORD32 qmfband2, li, ui, i;
535*15dc779aSAndroid Build Coastguard Worker   WORD32 low_subband_sec;
536*15dc779aSAndroid Build Coastguard Worker   WORD32 oldflags;
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker   low_subband_sec = (freq_band_table[0] << 1);
539*15dc779aSAndroid Build Coastguard Worker 
540*15dc779aSAndroid Build Coastguard Worker   memset(sine_mapped, MAX_ENVELOPES, sizeof(WORD8) * MAX_FREQ_COEFFS);
541*15dc779aSAndroid Build Coastguard Worker 
542*15dc779aSAndroid Build Coastguard Worker   for (i = (num_sf_bands - 1); i >= 0; i--) {
543*15dc779aSAndroid Build Coastguard Worker     oldflags = *harm_flags_prev;
544*15dc779aSAndroid Build Coastguard Worker     *harm_flags_prev++ = add_harmonics[i];
545*15dc779aSAndroid Build Coastguard Worker 
546*15dc779aSAndroid Build Coastguard Worker     if (add_harmonics[i]) {
547*15dc779aSAndroid Build Coastguard Worker       li = freq_band_table[i];
548*15dc779aSAndroid Build Coastguard Worker 
549*15dc779aSAndroid Build Coastguard Worker       ui = freq_band_table[i + 1];
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker       qmfband2 = ((ui + li) - low_subband_sec) >> 1;
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker       if (oldflags)
554*15dc779aSAndroid Build Coastguard Worker         sine_mapped[qmfband2] = 0;
555*15dc779aSAndroid Build Coastguard Worker       else
556*15dc779aSAndroid Build Coastguard Worker         sine_mapped[qmfband2] = (WORD8)transient_env;
557*15dc779aSAndroid Build Coastguard Worker     }
558*15dc779aSAndroid Build Coastguard Worker   }
559*15dc779aSAndroid Build Coastguard Worker }
560*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_34_params_to_20(WORD16 * params)561*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_map_34_params_to_20(WORD16 *params) {
562*15dc779aSAndroid Build Coastguard Worker   params[0] = ixheaacd_divideby3(params[0] + params[0] + params[1]);
563*15dc779aSAndroid Build Coastguard Worker   params[1] = ixheaacd_divideby3(params[1] + params[2] + params[2]);
564*15dc779aSAndroid Build Coastguard Worker   params[2] = ixheaacd_divideby3(params[3] + params[3] + params[4]);
565*15dc779aSAndroid Build Coastguard Worker   params[3] = ixheaacd_divideby3(params[4] + params[5] + params[5]);
566*15dc779aSAndroid Build Coastguard Worker   params[4] = ixheaacd_divideby2(params[6] + params[7]);
567*15dc779aSAndroid Build Coastguard Worker   params[5] = ixheaacd_divideby2(params[8] + params[9]);
568*15dc779aSAndroid Build Coastguard Worker   params[6] = params[10];
569*15dc779aSAndroid Build Coastguard Worker   params[7] = params[11];
570*15dc779aSAndroid Build Coastguard Worker   params[8] = ixheaacd_divideby2(params[12] + params[13]);
571*15dc779aSAndroid Build Coastguard Worker   params[9] = ixheaacd_divideby2(params[14] + params[15]);
572*15dc779aSAndroid Build Coastguard Worker   params[10] = params[16];
573*15dc779aSAndroid Build Coastguard Worker   params[11] = params[17];
574*15dc779aSAndroid Build Coastguard Worker   params[12] = params[18];
575*15dc779aSAndroid Build Coastguard Worker   params[13] = params[19];
576*15dc779aSAndroid Build Coastguard Worker   params[14] = ixheaacd_divideby2(params[20] + params[21]);
577*15dc779aSAndroid Build Coastguard Worker   params[15] = ixheaacd_divideby2(params[22] + params[23]);
578*15dc779aSAndroid Build Coastguard Worker   params[16] = ixheaacd_divideby2(params[24] + params[25]);
579*15dc779aSAndroid Build Coastguard Worker   params[17] = ixheaacd_divideby2(params[26] + params[27]);
580*15dc779aSAndroid Build Coastguard Worker   params[18] = ixheaacd_divideby2(
581*15dc779aSAndroid Build Coastguard Worker       ixheaacd_divideby2(params[28] + params[29] + params[30] + params[31]));
582*15dc779aSAndroid Build Coastguard Worker   params[19] = ixheaacd_divideby2(params[32] + params[33]);
583*15dc779aSAndroid Build Coastguard Worker }
584*15dc779aSAndroid Build Coastguard Worker 
585*15dc779aSAndroid Build Coastguard Worker extern const WORD16 ixheaacd_num_bands[3];
586*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_read_ps_data(ia_ps_dec_struct * ptr_ps_dec,ia_bit_buf_struct * it_bit_buff,WORD16 num_bits_left,ia_ps_tables_struct * ps_tables_ptr)587*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_read_ps_data(ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
588*15dc779aSAndroid Build Coastguard Worker                                    WORD16 num_bits_left, ia_ps_tables_struct *ps_tables_ptr)
589*15dc779aSAndroid Build Coastguard Worker {
590*15dc779aSAndroid Build Coastguard Worker   WORD b, e, temp;
591*15dc779aSAndroid Build Coastguard Worker   const WORD16 num_env_tab[4] = {0, 1, 2, 4};
592*15dc779aSAndroid Build Coastguard Worker   WORD cnt_bits;
593*15dc779aSAndroid Build Coastguard Worker   ia_huffman_data_type huffman_table, huffman_df_table, huffman_dt_table;
594*15dc779aSAndroid Build Coastguard Worker   FLAG enable_ps_header;
595*15dc779aSAndroid Build Coastguard Worker 
596*15dc779aSAndroid Build Coastguard Worker   if (!ptr_ps_dec) {
597*15dc779aSAndroid Build Coastguard Worker     return 0;
598*15dc779aSAndroid Build Coastguard Worker   }
599*15dc779aSAndroid Build Coastguard Worker 
600*15dc779aSAndroid Build Coastguard Worker   cnt_bits = it_bit_buff->cnt_bits;
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker   enable_ps_header = ixheaacd_read_bits_buf(it_bit_buff, 1);
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker   if (enable_ps_header) {
605*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->enable_iid = ixheaacd_read_bits_buf(it_bit_buff, 1);
606*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->enable_iid) {
607*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->iid_mode = ixheaacd_read_bits_buf(it_bit_buff, 3);
608*15dc779aSAndroid Build Coastguard Worker     }
609*15dc779aSAndroid Build Coastguard Worker 
610*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->iid_mode > 2) {
611*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->iid_quant = 1;
612*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->iid_mode -= 3;
613*15dc779aSAndroid Build Coastguard Worker     } else {
614*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->iid_quant = 0;
615*15dc779aSAndroid Build Coastguard Worker     }
616*15dc779aSAndroid Build Coastguard Worker 
617*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->enable_icc = ixheaacd_read_bits_buf(it_bit_buff, 1);
618*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->enable_icc) {
619*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->icc_mode = ixheaacd_read_bits_buf(it_bit_buff, 3);
620*15dc779aSAndroid Build Coastguard Worker     }
621*15dc779aSAndroid Build Coastguard Worker 
622*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->enable_ext = ixheaacd_read_bits_buf(it_bit_buff, 1);
623*15dc779aSAndroid Build Coastguard Worker 
624*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->icc_mode > 2) {
625*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->icc_mode -= 3;
626*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->use_pca_rot_flg = 1;
627*15dc779aSAndroid Build Coastguard Worker     } else {
628*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->use_pca_rot_flg = 0;
629*15dc779aSAndroid Build Coastguard Worker     }
630*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->freq_res_ipd = ptr_ps_dec->iid_mode;
631*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->freq_res_ipd > 2) {
632*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
633*15dc779aSAndroid Build Coastguard Worker     }
634*15dc779aSAndroid Build Coastguard Worker   }
635*15dc779aSAndroid Build Coastguard Worker 
636*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_34_st_bands = 0;
637*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->use_pca_rot_flg = 0;
638*15dc779aSAndroid Build Coastguard Worker 
639*15dc779aSAndroid Build Coastguard Worker   if ((ptr_ps_dec->enable_iid && ptr_ps_dec->iid_mode > 2) ||
640*15dc779aSAndroid Build Coastguard Worker       (ptr_ps_dec->enable_icc && ptr_ps_dec->icc_mode > 2)) {
641*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->ps_data_present = 0;
642*15dc779aSAndroid Build Coastguard Worker 
643*15dc779aSAndroid Build Coastguard Worker     num_bits_left -= (cnt_bits - it_bit_buff->cnt_bits);
644*15dc779aSAndroid Build Coastguard Worker 
645*15dc779aSAndroid Build Coastguard Worker     while (num_bits_left > 8) {
646*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 8);
647*15dc779aSAndroid Build Coastguard Worker       num_bits_left -= 8;
648*15dc779aSAndroid Build Coastguard Worker     }
649*15dc779aSAndroid Build Coastguard Worker     if (num_bits_left >= 0) {
650*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, num_bits_left);
651*15dc779aSAndroid Build Coastguard Worker     }
652*15dc779aSAndroid Build Coastguard Worker 
653*15dc779aSAndroid Build Coastguard Worker     return (cnt_bits - it_bit_buff->cnt_bits);
654*15dc779aSAndroid Build Coastguard Worker   }
655*15dc779aSAndroid Build Coastguard Worker 
656*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->frame_class = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
657*15dc779aSAndroid Build Coastguard Worker 
658*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_read_bits_buf(it_bit_buff, 2);
659*15dc779aSAndroid Build Coastguard Worker 
660*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->frame_class == 0) {
661*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_env = num_env_tab[temp];
662*15dc779aSAndroid Build Coastguard Worker   } else {
663*15dc779aSAndroid Build Coastguard Worker     ptr_ps_dec->num_env = (((1 + temp) << 8) >> 8);
664*15dc779aSAndroid Build Coastguard Worker 
665*15dc779aSAndroid Build Coastguard Worker     for (e = 1; e < ptr_ps_dec->num_env + 1; e++) {
666*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->border_position[e] =
667*15dc779aSAndroid Build Coastguard Worker           (((ixheaacd_read_bits_buf(it_bit_buff, 5) + 1) << 8) >> 8);
668*15dc779aSAndroid Build Coastguard Worker     }
669*15dc779aSAndroid Build Coastguard Worker   }
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->enable_iid) {
672*15dc779aSAndroid Build Coastguard Worker     if (ptr_ps_dec->iid_quant) {
673*15dc779aSAndroid Build Coastguard Worker       huffman_df_table = (ia_huffman_data_type)&ps_tables_ptr->huff_iid_df_fine;
674*15dc779aSAndroid Build Coastguard Worker       huffman_dt_table = (ia_huffman_data_type)&ps_tables_ptr->huff_iid_dt_fine;
675*15dc779aSAndroid Build Coastguard Worker     } else {
676*15dc779aSAndroid Build Coastguard Worker       huffman_df_table = (ia_huffman_data_type)&ps_tables_ptr->huff_iid_df;
677*15dc779aSAndroid Build Coastguard Worker       huffman_dt_table = (ia_huffman_data_type)&ps_tables_ptr->huff_iid_dt;
678*15dc779aSAndroid Build Coastguard Worker     }
679*15dc779aSAndroid Build Coastguard Worker 
680*15dc779aSAndroid Build Coastguard Worker     for (e = 0; e < ptr_ps_dec->num_env; e++) {
681*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->iid_dt[e] = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
682*15dc779aSAndroid Build Coastguard Worker 
683*15dc779aSAndroid Build Coastguard Worker       if (ptr_ps_dec->iid_dt[e]) {
684*15dc779aSAndroid Build Coastguard Worker         huffman_table = huffman_dt_table;
685*15dc779aSAndroid Build Coastguard Worker       } else {
686*15dc779aSAndroid Build Coastguard Worker         huffman_table = huffman_df_table;
687*15dc779aSAndroid Build Coastguard Worker       }
688*15dc779aSAndroid Build Coastguard Worker 
689*15dc779aSAndroid Build Coastguard Worker       for (b = 0; b < ixheaacd_num_bands[ptr_ps_dec->iid_mode]; b++) {
690*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->iid_par_table[e][b] =
691*15dc779aSAndroid Build Coastguard Worker             ixheaacd_ssc_huff_dec(huffman_table, it_bit_buff);
692*15dc779aSAndroid Build Coastguard Worker       }
693*15dc779aSAndroid Build Coastguard Worker     }
694*15dc779aSAndroid Build Coastguard Worker   }
695*15dc779aSAndroid Build Coastguard Worker 
696*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->enable_icc) {
697*15dc779aSAndroid Build Coastguard Worker     huffman_df_table = (ia_huffman_data_type)&ps_tables_ptr->huff_icc_df;
698*15dc779aSAndroid Build Coastguard Worker     huffman_dt_table = (ia_huffman_data_type)&ps_tables_ptr->huff_icc_dt;
699*15dc779aSAndroid Build Coastguard Worker 
700*15dc779aSAndroid Build Coastguard Worker     for (e = 0; e < ptr_ps_dec->num_env; e++) {
701*15dc779aSAndroid Build Coastguard Worker       ptr_ps_dec->icc_dt[e] = ixheaacd_read_bits_buf(it_bit_buff, 1);
702*15dc779aSAndroid Build Coastguard Worker 
703*15dc779aSAndroid Build Coastguard Worker       if (ptr_ps_dec->icc_dt[e]) {
704*15dc779aSAndroid Build Coastguard Worker         huffman_table = huffman_dt_table;
705*15dc779aSAndroid Build Coastguard Worker       } else {
706*15dc779aSAndroid Build Coastguard Worker         huffman_table = huffman_df_table;
707*15dc779aSAndroid Build Coastguard Worker       }
708*15dc779aSAndroid Build Coastguard Worker 
709*15dc779aSAndroid Build Coastguard Worker       for (b = 0; b < ixheaacd_num_bands[ptr_ps_dec->icc_mode]; b++) {
710*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->icc_par_table[e][b] = ixheaacd_ssc_huff_dec(huffman_table, it_bit_buff);
711*15dc779aSAndroid Build Coastguard Worker       }
712*15dc779aSAndroid Build Coastguard Worker     }
713*15dc779aSAndroid Build Coastguard Worker   }
714*15dc779aSAndroid Build Coastguard Worker 
715*15dc779aSAndroid Build Coastguard Worker   if (ptr_ps_dec->enable_ext) {
716*15dc779aSAndroid Build Coastguard Worker     WORD32 cnt;
717*15dc779aSAndroid Build Coastguard Worker     if (it_bit_buff->cnt_bits < 4)
718*15dc779aSAndroid Build Coastguard Worker       cnt = ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
719*15dc779aSAndroid Build Coastguard Worker     else
720*15dc779aSAndroid Build Coastguard Worker       cnt = ixheaacd_read_bits_buf(it_bit_buff, 4);
721*15dc779aSAndroid Build Coastguard Worker 
722*15dc779aSAndroid Build Coastguard Worker     if (cnt == 15) {
723*15dc779aSAndroid Build Coastguard Worker       cnt += ixheaacd_read_bits_buf(it_bit_buff, 8);
724*15dc779aSAndroid Build Coastguard Worker     }
725*15dc779aSAndroid Build Coastguard Worker     while (cnt--) {
726*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 8);
727*15dc779aSAndroid Build Coastguard Worker     }
728*15dc779aSAndroid Build Coastguard Worker   }
729*15dc779aSAndroid Build Coastguard Worker 
730*15dc779aSAndroid Build Coastguard Worker   ptr_ps_dec->ps_data_present = 1;
731*15dc779aSAndroid Build Coastguard Worker 
732*15dc779aSAndroid Build Coastguard Worker   return (cnt_bits - it_bit_buff->cnt_bits);
733*15dc779aSAndroid Build Coastguard Worker }
734*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_invfilt_level_emphasis(ia_sbr_hf_generator_struct * ptr_hf_gen_str,WORD32 num_if_bands,WORD32 * inv_filt_mode,WORD32 * inv_filt_mode_prev,WORD32 * bw_array)735*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_invfilt_level_emphasis(ia_sbr_hf_generator_struct *ptr_hf_gen_str,
736*15dc779aSAndroid Build Coastguard Worker                                      WORD32 num_if_bands, WORD32 *inv_filt_mode,
737*15dc779aSAndroid Build Coastguard Worker                                      WORD32 *inv_filt_mode_prev,
738*15dc779aSAndroid Build Coastguard Worker                                      WORD32 *bw_array) {
739*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
740*15dc779aSAndroid Build Coastguard Worker   WORD32 accu;
741*15dc779aSAndroid Build Coastguard Worker   WORD16 w1, w2;
742*15dc779aSAndroid Build Coastguard Worker 
743*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_if_bands; i++) {
744*15dc779aSAndroid Build Coastguard Worker     bw_array[i] =
745*15dc779aSAndroid Build Coastguard Worker         ixheaacd_inew_bw_table[inv_filt_mode_prev[i]][inv_filt_mode[i]];
746*15dc779aSAndroid Build Coastguard Worker 
747*15dc779aSAndroid Build Coastguard Worker     if (bw_array[i] < ptr_hf_gen_str->bw_array_prev[i]) {
748*15dc779aSAndroid Build Coastguard Worker       w1 = 0x6000;
749*15dc779aSAndroid Build Coastguard Worker       w2 = 0x2000;
750*15dc779aSAndroid Build Coastguard Worker     } else {
751*15dc779aSAndroid Build Coastguard Worker       w1 = 0x7400;
752*15dc779aSAndroid Build Coastguard Worker       w2 = 0x0c00;
753*15dc779aSAndroid Build Coastguard Worker     }
754*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_add32(
755*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_shl(bw_array[i], w1),
756*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32_shl(ptr_hf_gen_str->bw_array_prev[i], w2));
757*15dc779aSAndroid Build Coastguard Worker 
758*15dc779aSAndroid Build Coastguard Worker     if (accu < 0x02000000) {
759*15dc779aSAndroid Build Coastguard Worker       accu = 0;
760*15dc779aSAndroid Build Coastguard Worker     }
761*15dc779aSAndroid Build Coastguard Worker 
762*15dc779aSAndroid Build Coastguard Worker     if (accu >= 0x7f800000) {
763*15dc779aSAndroid Build Coastguard Worker       accu = 0x7f800000;
764*15dc779aSAndroid Build Coastguard Worker     }
765*15dc779aSAndroid Build Coastguard Worker     bw_array[i] = accu;
766*15dc779aSAndroid Build Coastguard Worker   }
767*15dc779aSAndroid Build Coastguard Worker }
768*15dc779aSAndroid Build Coastguard Worker 
769*15dc779aSAndroid Build Coastguard Worker typedef struct {
770*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_0_1_real;
771*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_0_1_imag;
772*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_0_2_real;
773*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_0_2_imag;
774*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_1_1;
775*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_1_2_real;
776*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_1_2_imag;
777*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phi_2_2;
778*15dc779aSAndroid Build Coastguard Worker   FLOAT32 det;
779*15dc779aSAndroid Build Coastguard Worker } ia_auto_corr_ele_struct;
780*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_calc_co_variance(ia_auto_corr_ele_struct * pstr_auto_corr,FLOAT32 vec_x_real[][64],FLOAT32 vec_x_imag[][64],WORD32 bd,WORD32 len)781*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_esbr_calc_co_variance(
782*15dc779aSAndroid Build Coastguard Worker     ia_auto_corr_ele_struct *pstr_auto_corr, FLOAT32 vec_x_real[][64],
783*15dc779aSAndroid Build Coastguard Worker     FLOAT32 vec_x_imag[][64], WORD32 bd, WORD32 len) {
784*15dc779aSAndroid Build Coastguard Worker   WORD32 j, jminus1, jminus2;
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker   memset(pstr_auto_corr, 0, sizeof(ia_auto_corr_ele_struct));
787*15dc779aSAndroid Build Coastguard Worker 
788*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < len; j++) {
789*15dc779aSAndroid Build Coastguard Worker     jminus1 = j - 1;
790*15dc779aSAndroid Build Coastguard Worker     jminus2 = jminus1 - 1;
791*15dc779aSAndroid Build Coastguard Worker 
792*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_0_1_real +=
793*15dc779aSAndroid Build Coastguard Worker         vec_x_real[j][bd] * vec_x_real[jminus1][bd] +
794*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[j][bd] * vec_x_imag[jminus1][bd];
795*15dc779aSAndroid Build Coastguard Worker 
796*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_0_1_imag +=
797*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[j][bd] * vec_x_real[jminus1][bd] -
798*15dc779aSAndroid Build Coastguard Worker         vec_x_real[j][bd] * vec_x_imag[jminus1][bd];
799*15dc779aSAndroid Build Coastguard Worker 
800*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_0_2_real +=
801*15dc779aSAndroid Build Coastguard Worker         vec_x_real[j][bd] * vec_x_real[jminus2][bd] +
802*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[j][bd] * vec_x_imag[jminus2][bd];
803*15dc779aSAndroid Build Coastguard Worker 
804*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_0_2_imag +=
805*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[j][bd] * vec_x_real[jminus2][bd] -
806*15dc779aSAndroid Build Coastguard Worker         vec_x_real[j][bd] * vec_x_imag[jminus2][bd];
807*15dc779aSAndroid Build Coastguard Worker 
808*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_1_1 +=
809*15dc779aSAndroid Build Coastguard Worker         vec_x_real[jminus1][bd] * vec_x_real[jminus1][bd] +
810*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[jminus1][bd] * vec_x_imag[jminus1][bd];
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_1_2_real +=
813*15dc779aSAndroid Build Coastguard Worker         vec_x_real[jminus1][bd] * vec_x_real[jminus2][bd] +
814*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[jminus1][bd] * vec_x_imag[jminus2][bd];
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_1_2_imag +=
817*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[jminus1][bd] * vec_x_real[jminus2][bd] -
818*15dc779aSAndroid Build Coastguard Worker         vec_x_real[jminus1][bd] * vec_x_imag[jminus2][bd];
819*15dc779aSAndroid Build Coastguard Worker 
820*15dc779aSAndroid Build Coastguard Worker     pstr_auto_corr->phi_2_2 +=
821*15dc779aSAndroid Build Coastguard Worker         vec_x_real[jminus2][bd] * vec_x_real[jminus2][bd] +
822*15dc779aSAndroid Build Coastguard Worker         vec_x_imag[jminus2][bd] * vec_x_imag[jminus2][bd];
823*15dc779aSAndroid Build Coastguard Worker   }
824*15dc779aSAndroid Build Coastguard Worker 
825*15dc779aSAndroid Build Coastguard Worker   pstr_auto_corr->det =
826*15dc779aSAndroid Build Coastguard Worker       pstr_auto_corr->phi_1_1 * pstr_auto_corr->phi_2_2 -
827*15dc779aSAndroid Build Coastguard Worker       (pstr_auto_corr->phi_1_2_real * pstr_auto_corr->phi_1_2_real +
828*15dc779aSAndroid Build Coastguard Worker        pstr_auto_corr->phi_1_2_imag * pstr_auto_corr->phi_1_2_imag) *
829*15dc779aSAndroid Build Coastguard Worker           SBR_HF_RELAXATION_PARAM;
830*15dc779aSAndroid Build Coastguard Worker }
831*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_chirp_fac_calc(WORD32 * inv_filt_mode,WORD32 * inv_filt_mode_prev,WORD32 num_if_bands,FLOAT32 * bw_array,FLOAT32 * bw_array_prev)832*15dc779aSAndroid Build Coastguard Worker static void ixheaacd_esbr_chirp_fac_calc(WORD32 *inv_filt_mode,
833*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *inv_filt_mode_prev,
834*15dc779aSAndroid Build Coastguard Worker                                          WORD32 num_if_bands, FLOAT32 *bw_array,
835*15dc779aSAndroid Build Coastguard Worker                                          FLOAT32 *bw_array_prev) {
836*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
837*15dc779aSAndroid Build Coastguard Worker 
838*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_if_bands; i++) {
839*15dc779aSAndroid Build Coastguard Worker     bw_array[i] =
840*15dc779aSAndroid Build Coastguard Worker         ixheaacd_new_bw_table[inv_filt_mode_prev[i]][inv_filt_mode[i]];
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker     if (bw_array[i] < bw_array_prev[i])
843*15dc779aSAndroid Build Coastguard Worker       bw_array[i] = 0.75000f * bw_array[i] + 0.25000f * bw_array_prev[i];
844*15dc779aSAndroid Build Coastguard Worker     else
845*15dc779aSAndroid Build Coastguard Worker       bw_array[i] = 0.90625f * bw_array[i] + 0.09375f * bw_array_prev[i];
846*15dc779aSAndroid Build Coastguard Worker 
847*15dc779aSAndroid Build Coastguard Worker     if (bw_array[i] < 0.015625) bw_array[i] = 0;
848*15dc779aSAndroid Build Coastguard Worker   }
849*15dc779aSAndroid Build Coastguard Worker }
850*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_gausssolve(WORD32 n,FLOAT32 a[][MAXDEG+1],FLOAT32 b[],FLOAT32 y[])851*15dc779aSAndroid Build Coastguard Worker static void ixheaacd_gausssolve(WORD32 n, FLOAT32 a[][MAXDEG + 1], FLOAT32 b[],
852*15dc779aSAndroid Build Coastguard Worker                                 FLOAT32 y[]) {
853*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, imax;
854*15dc779aSAndroid Build Coastguard Worker   FLOAT32 v;
855*15dc779aSAndroid Build Coastguard Worker 
856*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n; i++) {
857*15dc779aSAndroid Build Coastguard Worker     imax = i;
858*15dc779aSAndroid Build Coastguard Worker     for (k = i + 1; k < n; k++) {
859*15dc779aSAndroid Build Coastguard Worker       if (fabs(a[k][i]) > fabs(a[imax][i])) {
860*15dc779aSAndroid Build Coastguard Worker         imax = k;
861*15dc779aSAndroid Build Coastguard Worker       }
862*15dc779aSAndroid Build Coastguard Worker     }
863*15dc779aSAndroid Build Coastguard Worker     if (imax != i) {
864*15dc779aSAndroid Build Coastguard Worker       v = b[imax];
865*15dc779aSAndroid Build Coastguard Worker       b[imax] = b[i];
866*15dc779aSAndroid Build Coastguard Worker       b[i] = v;
867*15dc779aSAndroid Build Coastguard Worker       for (j = i; j < n; j++) {
868*15dc779aSAndroid Build Coastguard Worker         v = a[imax][j];
869*15dc779aSAndroid Build Coastguard Worker         a[imax][j] = a[i][j];
870*15dc779aSAndroid Build Coastguard Worker         a[i][j] = v;
871*15dc779aSAndroid Build Coastguard Worker       }
872*15dc779aSAndroid Build Coastguard Worker     }
873*15dc779aSAndroid Build Coastguard Worker 
874*15dc779aSAndroid Build Coastguard Worker     v = a[i][i];
875*15dc779aSAndroid Build Coastguard Worker 
876*15dc779aSAndroid Build Coastguard Worker     b[i] /= v;
877*15dc779aSAndroid Build Coastguard Worker     for (j = i; j < n; j++) {
878*15dc779aSAndroid Build Coastguard Worker       a[i][j] /= v;
879*15dc779aSAndroid Build Coastguard Worker     }
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker     for (k = i + 1; k < n; k++) {
882*15dc779aSAndroid Build Coastguard Worker       v = a[k][i];
883*15dc779aSAndroid Build Coastguard Worker       b[k] -= v * b[i];
884*15dc779aSAndroid Build Coastguard Worker       for (j = i + 1; j < n; j++) {
885*15dc779aSAndroid Build Coastguard Worker         a[k][j] -= v * a[i][j];
886*15dc779aSAndroid Build Coastguard Worker       }
887*15dc779aSAndroid Build Coastguard Worker     }
888*15dc779aSAndroid Build Coastguard Worker   }
889*15dc779aSAndroid Build Coastguard Worker 
890*15dc779aSAndroid Build Coastguard Worker   for (i = n - 1; i >= 0; i--) {
891*15dc779aSAndroid Build Coastguard Worker     y[i] = b[i];
892*15dc779aSAndroid Build Coastguard Worker     for (j = i + 1; j < n; j++) {
893*15dc779aSAndroid Build Coastguard Worker       y[i] -= a[i][j] * y[j];
894*15dc779aSAndroid Build Coastguard Worker     }
895*15dc779aSAndroid Build Coastguard Worker   }
896*15dc779aSAndroid Build Coastguard Worker }
897*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_polyfit(WORD32 n,FLOAT32 y[],FLOAT32 p[])898*15dc779aSAndroid Build Coastguard Worker void ixheaacd_polyfit(WORD32 n, FLOAT32 y[], FLOAT32 p[]) {
899*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k;
900*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a[MAXDEG + 1][MAXDEG + 1];
901*15dc779aSAndroid Build Coastguard Worker   FLOAT32 b[MAXDEG + 1];
902*15dc779aSAndroid Build Coastguard Worker   FLOAT32 v[2 * MAXDEG + 1];
903*15dc779aSAndroid Build Coastguard Worker 
904*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i <= MAXDEG; i++) {
905*15dc779aSAndroid Build Coastguard Worker     b[i] = 0.0f;
906*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j <= MAXDEG; j++) {
907*15dc779aSAndroid Build Coastguard Worker       a[i][j] = 0.0f;
908*15dc779aSAndroid Build Coastguard Worker     }
909*15dc779aSAndroid Build Coastguard Worker   }
910*15dc779aSAndroid Build Coastguard Worker 
911*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < n; k++) {
912*15dc779aSAndroid Build Coastguard Worker     v[0] = 1.0;
913*15dc779aSAndroid Build Coastguard Worker     for (i = 1; i <= 2 * MAXDEG; i++) {
914*15dc779aSAndroid Build Coastguard Worker       v[i] = k * v[i - 1];
915*15dc779aSAndroid Build Coastguard Worker     }
916*15dc779aSAndroid Build Coastguard Worker 
917*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i <= MAXDEG; i++) {
918*15dc779aSAndroid Build Coastguard Worker       b[i] += v[MAXDEG - i] * y[k];
919*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j <= MAXDEG; j++) {
920*15dc779aSAndroid Build Coastguard Worker         a[i][j] += v[2 * MAXDEG - i - j];
921*15dc779aSAndroid Build Coastguard Worker       }
922*15dc779aSAndroid Build Coastguard Worker     }
923*15dc779aSAndroid Build Coastguard Worker   }
924*15dc779aSAndroid Build Coastguard Worker 
925*15dc779aSAndroid Build Coastguard Worker   ixheaacd_gausssolve(MAXDEG + 1, a, b, p);
926*15dc779aSAndroid Build Coastguard Worker }
927*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pre_processing(FLOAT32 ptr_src_buf_real[][64],FLOAT32 ptr_src_buf_imag[][64],FLOAT32 gain_vector[],WORD32 num_bands,WORD32 start_sample,WORD32 end_sample)928*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pre_processing(FLOAT32 ptr_src_buf_real[][64],
929*15dc779aSAndroid Build Coastguard Worker                              FLOAT32 ptr_src_buf_imag[][64],
930*15dc779aSAndroid Build Coastguard Worker                              FLOAT32 gain_vector[], WORD32 num_bands,
931*15dc779aSAndroid Build Coastguard Worker                              WORD32 start_sample, WORD32 end_sample) {
932*15dc779aSAndroid Build Coastguard Worker   WORD32 k, i;
933*15dc779aSAndroid Build Coastguard Worker   FLOAT32 poly_coeff[4];
934*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mean_enrg = 0;
935*15dc779aSAndroid Build Coastguard Worker   FLOAT32 low_env_slope[64];
936*15dc779aSAndroid Build Coastguard Worker   FLOAT32 low_env[64] = {0};
937*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a0;
938*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a1;
939*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a2;
940*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a3;
941*15dc779aSAndroid Build Coastguard Worker 
942*15dc779aSAndroid Build Coastguard Worker   if (num_bands != 0 && end_sample != start_sample) {
943*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < num_bands; k++) {
944*15dc779aSAndroid Build Coastguard Worker       FLOAT32 temp = 0;
945*15dc779aSAndroid Build Coastguard Worker       for (i = start_sample; i < end_sample; i++) {
946*15dc779aSAndroid Build Coastguard Worker         temp += ptr_src_buf_real[i][k] * ptr_src_buf_real[i][k] +
947*15dc779aSAndroid Build Coastguard Worker                 ptr_src_buf_imag[i][k] * ptr_src_buf_imag[i][k];
948*15dc779aSAndroid Build Coastguard Worker       }
949*15dc779aSAndroid Build Coastguard Worker       temp /= (end_sample - start_sample);
950*15dc779aSAndroid Build Coastguard Worker       low_env[k] = (FLOAT32)(10 * log10(temp + 1));
951*15dc779aSAndroid Build Coastguard Worker       mean_enrg = mean_enrg + low_env[k];
952*15dc779aSAndroid Build Coastguard Worker     }
953*15dc779aSAndroid Build Coastguard Worker     mean_enrg /= num_bands;
954*15dc779aSAndroid Build Coastguard Worker   }
955*15dc779aSAndroid Build Coastguard Worker 
956*15dc779aSAndroid Build Coastguard Worker   ixheaacd_polyfit(num_bands, low_env, poly_coeff);
957*15dc779aSAndroid Build Coastguard Worker 
958*15dc779aSAndroid Build Coastguard Worker   a0 = poly_coeff[0];
959*15dc779aSAndroid Build Coastguard Worker   a1 = poly_coeff[1];
960*15dc779aSAndroid Build Coastguard Worker   a2 = poly_coeff[2];
961*15dc779aSAndroid Build Coastguard Worker   a3 = poly_coeff[3];
962*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < num_bands; k++) {
963*15dc779aSAndroid Build Coastguard Worker     FLOAT32 x_low_l = (FLOAT32)k;
964*15dc779aSAndroid Build Coastguard Worker     FLOAT32 low_env_slope_l = a3;
965*15dc779aSAndroid Build Coastguard Worker     low_env_slope_l = low_env_slope_l + a2 * x_low_l;
966*15dc779aSAndroid Build Coastguard Worker 
967*15dc779aSAndroid Build Coastguard Worker     x_low_l = x_low_l * x_low_l;
968*15dc779aSAndroid Build Coastguard Worker     low_env_slope_l = low_env_slope_l + a1 * x_low_l;
969*15dc779aSAndroid Build Coastguard Worker 
970*15dc779aSAndroid Build Coastguard Worker     x_low_l = x_low_l * (FLOAT32)k;
971*15dc779aSAndroid Build Coastguard Worker     low_env_slope_l = low_env_slope_l + a0 * x_low_l;
972*15dc779aSAndroid Build Coastguard Worker 
973*15dc779aSAndroid Build Coastguard Worker     low_env_slope[k] = low_env_slope_l;
974*15dc779aSAndroid Build Coastguard Worker   }
975*15dc779aSAndroid Build Coastguard Worker 
976*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_bands; i++) {
977*15dc779aSAndroid Build Coastguard Worker     gain_vector[i] = (FLOAT32)pow(10, (mean_enrg - low_env_slope[i]) / 20.0f);
978*15dc779aSAndroid Build Coastguard Worker   }
979*15dc779aSAndroid Build Coastguard Worker }
980*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64],FLOAT32 ptr_src_buf_imag[][64],FLOAT32 ptr_ph_vocod_buf_real[][64],FLOAT32 ptr_ph_vocod_buf_imag[][64],FLOAT32 ptr_dst_buf_real[][64],FLOAT32 ptr_dst_buf_imag[][64],ia_sbr_frame_info_data_struct * ptr_frame_data,ia_sbr_header_data_struct * ptr_header_data,WORD32 ldmps_present,WORD32 time_slots,WORD32 ec_flag)981*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], FLOAT32 ptr_src_buf_imag[][64],
982*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 ptr_ph_vocod_buf_real[][64],
983*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 ptr_ph_vocod_buf_imag[][64], FLOAT32 ptr_dst_buf_real[][64],
984*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 ptr_dst_buf_imag[][64],
985*15dc779aSAndroid Build Coastguard Worker                             ia_sbr_frame_info_data_struct *ptr_frame_data,
986*15dc779aSAndroid Build Coastguard Worker                             ia_sbr_header_data_struct *ptr_header_data, WORD32 ldmps_present,
987*15dc779aSAndroid Build Coastguard Worker                             WORD32 time_slots, WORD32 ec_flag) {
988*15dc779aSAndroid Build Coastguard Worker   WORD32 bw_index, i, k, k2, patch = 0;
989*15dc779aSAndroid Build Coastguard Worker   WORD32 co_var_len;
990*15dc779aSAndroid Build Coastguard Worker   WORD32 start_sample, end_sample, goal_sb;
991*15dc779aSAndroid Build Coastguard Worker   WORD32 sb, source_start_band, patch_stride, num_bands_in_patch;
992*15dc779aSAndroid Build Coastguard Worker   WORD32 hbe_flag = ptr_header_data->hbe_flag;
993*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a0r, a0i, a1r, a1i;
994*15dc779aSAndroid Build Coastguard Worker   FLOAT32 bw_array[MAX_NUM_PATCHES] = {0};
995*15dc779aSAndroid Build Coastguard Worker 
996*15dc779aSAndroid Build Coastguard Worker   ia_auto_corr_ele_struct str_auto_corr;
997*15dc779aSAndroid Build Coastguard Worker 
998*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_invf_band_tbl =
999*15dc779aSAndroid Build Coastguard Worker       &ptr_header_data->pstr_freq_band_data
1000*15dc779aSAndroid Build Coastguard Worker            ->freq_band_tbl_noise[1];  // offest 1 used as base address of
1001*15dc779aSAndroid Build Coastguard Worker                                       // ptr_invf_band_tbl
1002*15dc779aSAndroid Build Coastguard Worker   WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
1003*15dc779aSAndroid Build Coastguard Worker   WORD32 sub_band_start = ptr_header_data->pstr_freq_band_data->sub_band_start;
1004*15dc779aSAndroid Build Coastguard Worker   WORD16 *f_master_tbl = ptr_header_data->pstr_freq_band_data->f_master_tbl;
1005*15dc779aSAndroid Build Coastguard Worker   WORD32 num_mf_bands = ptr_header_data->pstr_freq_band_data->num_mf_bands;
1006*15dc779aSAndroid Build Coastguard Worker   WORD32 *inv_filt_mode = ptr_frame_data->sbr_invf_mode;
1007*15dc779aSAndroid Build Coastguard Worker   WORD32 *inv_filt_mode_prev = ptr_frame_data->sbr_invf_mode_prev;
1008*15dc779aSAndroid Build Coastguard Worker   WORD32 sbr_patching_mode = ptr_frame_data->sbr_patching_mode;
1009*15dc779aSAndroid Build Coastguard Worker   ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1010*15dc779aSAndroid Build Coastguard Worker   WORD32 pre_proc_flag = ptr_header_data->pre_proc_flag;
1011*15dc779aSAndroid Build Coastguard Worker   WORD32 is_usf_4 = ptr_header_data->is_usf_4;
1012*15dc779aSAndroid Build Coastguard Worker   WORD32 fs = ptr_header_data->out_sampling_freq;
1013*15dc779aSAndroid Build Coastguard Worker   WORD32 cov_count;
1014*15dc779aSAndroid Build Coastguard Worker   WORD32 lsb = f_master_tbl[0];
1015*15dc779aSAndroid Build Coastguard Worker   WORD32 usb = f_master_tbl[num_mf_bands];
1016*15dc779aSAndroid Build Coastguard Worker   WORD32 xover_offset = sub_band_start - f_master_tbl[0];
1017*15dc779aSAndroid Build Coastguard Worker 
1018*15dc779aSAndroid Build Coastguard Worker   FLOAT32 bw = 0.0f;
1019*15dc779aSAndroid Build Coastguard Worker   FLOAT32 fac = 0.0f;
1020*15dc779aSAndroid Build Coastguard Worker 
1021*15dc779aSAndroid Build Coastguard Worker   FLOAT32 gain;
1022*15dc779aSAndroid Build Coastguard Worker   FLOAT32 gain_vector[64];
1023*15dc779aSAndroid Build Coastguard Worker 
1024*15dc779aSAndroid Build Coastguard Worker   WORD32 slope_length = 0;
1025*15dc779aSAndroid Build Coastguard Worker   WORD32 first_slot_offset = p_frame_info->border_vec[0];
1026*15dc779aSAndroid Build Coastguard Worker   WORD32 end_slot_offs = 0;
1027*15dc779aSAndroid Build Coastguard Worker 
1028*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *bw_array_prev = ptr_frame_data->bw_array_prev;
1029*15dc779aSAndroid Build Coastguard Worker 
1030*15dc779aSAndroid Build Coastguard Worker   end_slot_offs = p_frame_info->border_vec[p_frame_info->num_env] - 16;
1031*15dc779aSAndroid Build Coastguard Worker 
1032*15dc779aSAndroid Build Coastguard Worker   if (ldmps_present == 1)
1033*15dc779aSAndroid Build Coastguard Worker     end_slot_offs =
1034*15dc779aSAndroid Build Coastguard Worker         p_frame_info->border_vec[p_frame_info->num_env] - time_slots;
1035*15dc779aSAndroid Build Coastguard Worker 
1036*15dc779aSAndroid Build Coastguard Worker   if (is_usf_4) {
1037*15dc779aSAndroid Build Coastguard Worker     start_sample = first_slot_offset * 4;
1038*15dc779aSAndroid Build Coastguard Worker     end_sample = 64 + end_slot_offs * 4;
1039*15dc779aSAndroid Build Coastguard Worker     co_var_len = 76;
1040*15dc779aSAndroid Build Coastguard Worker   } else {
1041*15dc779aSAndroid Build Coastguard Worker     start_sample = first_slot_offset * 2;
1042*15dc779aSAndroid Build Coastguard Worker     end_sample = 32 + end_slot_offs * 2;
1043*15dc779aSAndroid Build Coastguard Worker     co_var_len = 38;
1044*15dc779aSAndroid Build Coastguard Worker   }
1045*15dc779aSAndroid Build Coastguard Worker 
1046*15dc779aSAndroid Build Coastguard Worker   if (ldmps_present == 1) {
1047*15dc779aSAndroid Build Coastguard Worker     start_sample = 0;
1048*15dc779aSAndroid Build Coastguard Worker     end_sample = time_slots;
1049*15dc779aSAndroid Build Coastguard Worker     co_var_len = time_slots;
1050*15dc779aSAndroid Build Coastguard Worker   }
1051*15dc779aSAndroid Build Coastguard Worker 
1052*15dc779aSAndroid Build Coastguard Worker   if (pre_proc_flag) {
1053*15dc779aSAndroid Build Coastguard Worker     ixheaacd_pre_processing(ptr_src_buf_real, ptr_src_buf_imag, gain_vector,
1054*15dc779aSAndroid Build Coastguard Worker                             f_master_tbl[0], start_sample, end_sample);
1055*15dc779aSAndroid Build Coastguard Worker   }
1056*15dc779aSAndroid Build Coastguard Worker 
1057*15dc779aSAndroid Build Coastguard Worker   ixheaacd_esbr_chirp_fac_calc(inv_filt_mode, inv_filt_mode_prev, num_if_bands,
1058*15dc779aSAndroid Build Coastguard Worker                                bw_array, bw_array_prev);
1059*15dc779aSAndroid Build Coastguard Worker 
1060*15dc779aSAndroid Build Coastguard Worker   for (i = start_sample; i < end_sample; i++) {
1061*15dc779aSAndroid Build Coastguard Worker     memset(ptr_dst_buf_real[i] + usb, 0, (64 - usb) * sizeof(FLOAT32));
1062*15dc779aSAndroid Build Coastguard Worker     memset(ptr_dst_buf_imag[i] + usb, 0, (64 - usb) * sizeof(FLOAT32));
1063*15dc779aSAndroid Build Coastguard Worker   }
1064*15dc779aSAndroid Build Coastguard Worker 
1065*15dc779aSAndroid Build Coastguard Worker   if (sbr_patching_mode || !hbe_flag) {
1066*15dc779aSAndroid Build Coastguard Worker     WORD32 flag_break = 0;
1067*15dc779aSAndroid Build Coastguard Worker     FLOAT32 alpha_real[64][2] = {{0}}, alpha_imag[64][2] = {{0}};
1068*15dc779aSAndroid Build Coastguard Worker     if (ptr_frame_data->mps_sbr_flag) {
1069*15dc779aSAndroid Build Coastguard Worker       cov_count = (f_master_tbl[0] < ptr_frame_data->cov_count)
1070*15dc779aSAndroid Build Coastguard Worker                       ? f_master_tbl[0]
1071*15dc779aSAndroid Build Coastguard Worker                       : ptr_frame_data->cov_count;
1072*15dc779aSAndroid Build Coastguard Worker     } else {
1073*15dc779aSAndroid Build Coastguard Worker       cov_count = f_master_tbl[0];
1074*15dc779aSAndroid Build Coastguard Worker     }
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker     for (k = 1; k < cov_count; k++) {
1077*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_src_buf_real[0],
1078*15dc779aSAndroid Build Coastguard Worker                                      &ptr_src_buf_imag[0], k, co_var_len);
1079*15dc779aSAndroid Build Coastguard Worker       if (str_auto_corr.det == 0.0f) {
1080*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][1] = alpha_imag[k][1] = 0;
1081*15dc779aSAndroid Build Coastguard Worker       } else {
1082*15dc779aSAndroid Build Coastguard Worker         fac = 1.0f / str_auto_corr.det;
1083*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][1] =
1084*15dc779aSAndroid Build Coastguard Worker             (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
1085*15dc779aSAndroid Build Coastguard Worker              str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
1086*15dc779aSAndroid Build Coastguard Worker              str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
1087*15dc779aSAndroid Build Coastguard Worker             fac;
1088*15dc779aSAndroid Build Coastguard Worker         alpha_imag[k][1] =
1089*15dc779aSAndroid Build Coastguard Worker             (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
1090*15dc779aSAndroid Build Coastguard Worker              str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
1091*15dc779aSAndroid Build Coastguard Worker              str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
1092*15dc779aSAndroid Build Coastguard Worker             fac;
1093*15dc779aSAndroid Build Coastguard Worker       }
1094*15dc779aSAndroid Build Coastguard Worker 
1095*15dc779aSAndroid Build Coastguard Worker       if (str_auto_corr.phi_1_1 == 0) {
1096*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][0] = alpha_imag[k][0] = 0;
1097*15dc779aSAndroid Build Coastguard Worker       } else {
1098*15dc779aSAndroid Build Coastguard Worker         fac = 1.0f / str_auto_corr.phi_1_1;
1099*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][0] = -(str_auto_corr.phi_0_1_real +
1100*15dc779aSAndroid Build Coastguard Worker                              alpha_real[k][1] * str_auto_corr.phi_1_2_real +
1101*15dc779aSAndroid Build Coastguard Worker                              alpha_imag[k][1] * str_auto_corr.phi_1_2_imag) *
1102*15dc779aSAndroid Build Coastguard Worker                            fac;
1103*15dc779aSAndroid Build Coastguard Worker         alpha_imag[k][0] = -(str_auto_corr.phi_0_1_imag +
1104*15dc779aSAndroid Build Coastguard Worker                              alpha_imag[k][1] * str_auto_corr.phi_1_2_real -
1105*15dc779aSAndroid Build Coastguard Worker                              alpha_real[k][1] * str_auto_corr.phi_1_2_imag) *
1106*15dc779aSAndroid Build Coastguard Worker                            fac;
1107*15dc779aSAndroid Build Coastguard Worker       }
1108*15dc779aSAndroid Build Coastguard Worker 
1109*15dc779aSAndroid Build Coastguard Worker       if ((alpha_real[k][0] * alpha_real[k][0] +
1110*15dc779aSAndroid Build Coastguard Worker                alpha_imag[k][0] * alpha_imag[k][0] >=
1111*15dc779aSAndroid Build Coastguard Worker            16.0f) ||
1112*15dc779aSAndroid Build Coastguard Worker           (alpha_real[k][1] * alpha_real[k][1] +
1113*15dc779aSAndroid Build Coastguard Worker                alpha_imag[k][1] * alpha_imag[k][1] >=
1114*15dc779aSAndroid Build Coastguard Worker            16.0f)) {
1115*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][0] = 0.0f;
1116*15dc779aSAndroid Build Coastguard Worker         alpha_imag[k][0] = 0.0f;
1117*15dc779aSAndroid Build Coastguard Worker         alpha_real[k][1] = 0.0f;
1118*15dc779aSAndroid Build Coastguard Worker         alpha_imag[k][1] = 0.0f;
1119*15dc779aSAndroid Build Coastguard Worker       }
1120*15dc779aSAndroid Build Coastguard Worker     }
1121*15dc779aSAndroid Build Coastguard Worker 
1122*15dc779aSAndroid Build Coastguard Worker     goal_sb = (WORD32)(2.048e6f / fs + 0.5f);
1123*15dc779aSAndroid Build Coastguard Worker     {
1124*15dc779aSAndroid Build Coastguard Worker       WORD32 index;
1125*15dc779aSAndroid Build Coastguard Worker       if (goal_sb < f_master_tbl[num_mf_bands]) {
1126*15dc779aSAndroid Build Coastguard Worker         for (index = 0; (f_master_tbl[index] < goal_sb); index++)
1127*15dc779aSAndroid Build Coastguard Worker           ;
1128*15dc779aSAndroid Build Coastguard Worker         goal_sb = f_master_tbl[index];
1129*15dc779aSAndroid Build Coastguard Worker       } else {
1130*15dc779aSAndroid Build Coastguard Worker         goal_sb = f_master_tbl[num_mf_bands];
1131*15dc779aSAndroid Build Coastguard Worker       }
1132*15dc779aSAndroid Build Coastguard Worker     }
1133*15dc779aSAndroid Build Coastguard Worker 
1134*15dc779aSAndroid Build Coastguard Worker     source_start_band = xover_offset + 1;
1135*15dc779aSAndroid Build Coastguard Worker     sb = lsb + xover_offset;
1136*15dc779aSAndroid Build Coastguard Worker 
1137*15dc779aSAndroid Build Coastguard Worker     patch = 0;
1138*15dc779aSAndroid Build Coastguard Worker     while (sb < usb) {
1139*15dc779aSAndroid Build Coastguard Worker       if (MAX_NUM_PATCHES <= patch) {
1140*15dc779aSAndroid Build Coastguard Worker         if (ec_flag) {
1141*15dc779aSAndroid Build Coastguard Worker           break;
1142*15dc779aSAndroid Build Coastguard Worker         } else {
1143*15dc779aSAndroid Build Coastguard Worker           return -1;
1144*15dc779aSAndroid Build Coastguard Worker         }
1145*15dc779aSAndroid Build Coastguard Worker       }
1146*15dc779aSAndroid Build Coastguard Worker       ptr_frame_data->patch_param.start_subband[patch] = sb;
1147*15dc779aSAndroid Build Coastguard Worker       num_bands_in_patch = goal_sb - sb;
1148*15dc779aSAndroid Build Coastguard Worker 
1149*15dc779aSAndroid Build Coastguard Worker       if (num_bands_in_patch >= lsb - source_start_band) {
1150*15dc779aSAndroid Build Coastguard Worker         patch_stride = sb - source_start_band;
1151*15dc779aSAndroid Build Coastguard Worker         patch_stride = patch_stride & ~1;
1152*15dc779aSAndroid Build Coastguard Worker         num_bands_in_patch = lsb - (sb - patch_stride);
1153*15dc779aSAndroid Build Coastguard Worker         num_bands_in_patch =
1154*15dc779aSAndroid Build Coastguard Worker             ixheaacd_find_closest_entry(sb + num_bands_in_patch, f_master_tbl,
1155*15dc779aSAndroid Build Coastguard Worker                                         (WORD16)(num_mf_bands), 0) -
1156*15dc779aSAndroid Build Coastguard Worker             (WORD32)(sb);
1157*15dc779aSAndroid Build Coastguard Worker       }
1158*15dc779aSAndroid Build Coastguard Worker 
1159*15dc779aSAndroid Build Coastguard Worker       patch_stride = num_bands_in_patch + sb - lsb;
1160*15dc779aSAndroid Build Coastguard Worker       patch_stride = (patch_stride + 1) & ~1;
1161*15dc779aSAndroid Build Coastguard Worker 
1162*15dc779aSAndroid Build Coastguard Worker       source_start_band = 1;
1163*15dc779aSAndroid Build Coastguard Worker 
1164*15dc779aSAndroid Build Coastguard Worker       if (goal_sb - (sb + num_bands_in_patch) < 3) {
1165*15dc779aSAndroid Build Coastguard Worker         goal_sb = usb;
1166*15dc779aSAndroid Build Coastguard Worker       }
1167*15dc779aSAndroid Build Coastguard Worker 
1168*15dc779aSAndroid Build Coastguard Worker       if ((num_bands_in_patch < 3) && (patch > 0) &&
1169*15dc779aSAndroid Build Coastguard Worker           (sb + num_bands_in_patch == usb)) {
1170*15dc779aSAndroid Build Coastguard Worker         for (i = start_sample + slope_length; i < end_sample + slope_length;
1171*15dc779aSAndroid Build Coastguard Worker              i++) {
1172*15dc779aSAndroid Build Coastguard Worker           for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) {
1173*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_real[i][k2] = 0.0f;
1174*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_imag[i][k2] = 0.0f;
1175*15dc779aSAndroid Build Coastguard Worker           }
1176*15dc779aSAndroid Build Coastguard Worker         }
1177*15dc779aSAndroid Build Coastguard Worker 
1178*15dc779aSAndroid Build Coastguard Worker         break;
1179*15dc779aSAndroid Build Coastguard Worker       }
1180*15dc779aSAndroid Build Coastguard Worker 
1181*15dc779aSAndroid Build Coastguard Worker       if (num_bands_in_patch < 0 && flag_break == 1) {
1182*15dc779aSAndroid Build Coastguard Worker         break;
1183*15dc779aSAndroid Build Coastguard Worker       }
1184*15dc779aSAndroid Build Coastguard Worker 
1185*15dc779aSAndroid Build Coastguard Worker       if (num_bands_in_patch < 0) {
1186*15dc779aSAndroid Build Coastguard Worker         flag_break = 1;
1187*15dc779aSAndroid Build Coastguard Worker         continue;
1188*15dc779aSAndroid Build Coastguard Worker       } else {
1189*15dc779aSAndroid Build Coastguard Worker         flag_break = 0;
1190*15dc779aSAndroid Build Coastguard Worker       }
1191*15dc779aSAndroid Build Coastguard Worker 
1192*15dc779aSAndroid Build Coastguard Worker       for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) {
1193*15dc779aSAndroid Build Coastguard Worker         k = k2 - patch_stride;
1194*15dc779aSAndroid Build Coastguard Worker         bw_index = 0;
1195*15dc779aSAndroid Build Coastguard Worker         while (k2 >= ptr_invf_band_tbl[bw_index]) {
1196*15dc779aSAndroid Build Coastguard Worker           bw_index++;
1197*15dc779aSAndroid Build Coastguard Worker           if (bw_index >= MAX_NOISE_COEFFS) {
1198*15dc779aSAndroid Build Coastguard Worker             if (ec_flag) {
1199*15dc779aSAndroid Build Coastguard Worker               bw_index = MAX_NOISE_COEFFS - 1;
1200*15dc779aSAndroid Build Coastguard Worker               break;
1201*15dc779aSAndroid Build Coastguard Worker             } else
1202*15dc779aSAndroid Build Coastguard Worker               return -1;
1203*15dc779aSAndroid Build Coastguard Worker           }
1204*15dc779aSAndroid Build Coastguard Worker         }
1205*15dc779aSAndroid Build Coastguard Worker 
1206*15dc779aSAndroid Build Coastguard Worker         if (bw_index >= MAX_NUM_PATCHES) {
1207*15dc779aSAndroid Build Coastguard Worker           if (ec_flag)
1208*15dc779aSAndroid Build Coastguard Worker             bw_index = MAX_NUM_PATCHES - 1;
1209*15dc779aSAndroid Build Coastguard Worker           else
1210*15dc779aSAndroid Build Coastguard Worker             return -1;
1211*15dc779aSAndroid Build Coastguard Worker         }
1212*15dc779aSAndroid Build Coastguard Worker         bw = bw_array[bw_index];
1213*15dc779aSAndroid Build Coastguard Worker 
1214*15dc779aSAndroid Build Coastguard Worker         a0r = bw * alpha_real[k][0];
1215*15dc779aSAndroid Build Coastguard Worker         a0i = bw * alpha_imag[k][0];
1216*15dc779aSAndroid Build Coastguard Worker         bw *= bw;
1217*15dc779aSAndroid Build Coastguard Worker         a1r = bw * alpha_real[k][1];
1218*15dc779aSAndroid Build Coastguard Worker         a1i = bw * alpha_imag[k][1];
1219*15dc779aSAndroid Build Coastguard Worker 
1220*15dc779aSAndroid Build Coastguard Worker         if (pre_proc_flag) {
1221*15dc779aSAndroid Build Coastguard Worker           gain = gain_vector[k];
1222*15dc779aSAndroid Build Coastguard Worker         } else {
1223*15dc779aSAndroid Build Coastguard Worker           gain = 1.0f;
1224*15dc779aSAndroid Build Coastguard Worker         }
1225*15dc779aSAndroid Build Coastguard Worker 
1226*15dc779aSAndroid Build Coastguard Worker         for (i = start_sample + slope_length; i < end_sample + slope_length;
1227*15dc779aSAndroid Build Coastguard Worker              i++) {
1228*15dc779aSAndroid Build Coastguard Worker           ptr_dst_buf_real[i][k2] = ptr_src_buf_real[i][k] * gain;
1229*15dc779aSAndroid Build Coastguard Worker 
1230*15dc779aSAndroid Build Coastguard Worker           ptr_dst_buf_imag[i][k2] = ptr_src_buf_imag[i][k] * gain;
1231*15dc779aSAndroid Build Coastguard Worker 
1232*15dc779aSAndroid Build Coastguard Worker           if (bw > 0.0f) {
1233*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_real[i][k2] += (a0r * ptr_src_buf_real[i - 1][k] -
1234*15dc779aSAndroid Build Coastguard Worker                                         a0i * ptr_src_buf_imag[i - 1][k] +
1235*15dc779aSAndroid Build Coastguard Worker                                         a1r * ptr_src_buf_real[i - 2][k] -
1236*15dc779aSAndroid Build Coastguard Worker                                         a1i * ptr_src_buf_imag[i - 2][k]) *
1237*15dc779aSAndroid Build Coastguard Worker                                        gain;
1238*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_imag[i][k2] += (a0i * ptr_src_buf_real[i - 1][k] +
1239*15dc779aSAndroid Build Coastguard Worker                                         a0r * ptr_src_buf_imag[i - 1][k] +
1240*15dc779aSAndroid Build Coastguard Worker                                         a1i * ptr_src_buf_real[i - 2][k] +
1241*15dc779aSAndroid Build Coastguard Worker                                         a1r * ptr_src_buf_imag[i - 2][k]) *
1242*15dc779aSAndroid Build Coastguard Worker                                        gain;
1243*15dc779aSAndroid Build Coastguard Worker           }
1244*15dc779aSAndroid Build Coastguard Worker         }
1245*15dc779aSAndroid Build Coastguard Worker       }
1246*15dc779aSAndroid Build Coastguard Worker       sb += num_bands_in_patch;
1247*15dc779aSAndroid Build Coastguard Worker       patch++;
1248*15dc779aSAndroid Build Coastguard Worker     }
1249*15dc779aSAndroid Build Coastguard Worker   }
1250*15dc779aSAndroid Build Coastguard Worker 
1251*15dc779aSAndroid Build Coastguard Worker   if (NULL != ptr_ph_vocod_buf_real && NULL != ptr_ph_vocod_buf_imag) {
1252*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag && !sbr_patching_mode) {
1253*15dc779aSAndroid Build Coastguard Worker       FLOAT32 alpha_real[2], alpha_imag[2];
1254*15dc779aSAndroid Build Coastguard Worker 
1255*15dc779aSAndroid Build Coastguard Worker       bw_index = 0, patch = 1;
1256*15dc779aSAndroid Build Coastguard Worker 
1257*15dc779aSAndroid Build Coastguard Worker       for (k2 = sub_band_start; k2 < f_master_tbl[num_mf_bands]; k2++) {
1258*15dc779aSAndroid Build Coastguard Worker         ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_ph_vocod_buf_real[0],
1259*15dc779aSAndroid Build Coastguard Worker                                        &ptr_ph_vocod_buf_imag[0], k2, co_var_len);
1260*15dc779aSAndroid Build Coastguard Worker 
1261*15dc779aSAndroid Build Coastguard Worker         if (str_auto_corr.det == 0.0f) {
1262*15dc779aSAndroid Build Coastguard Worker           alpha_real[1] = alpha_imag[1] = 0;
1263*15dc779aSAndroid Build Coastguard Worker         } else {
1264*15dc779aSAndroid Build Coastguard Worker           fac = 1.0f / str_auto_corr.det;
1265*15dc779aSAndroid Build Coastguard Worker           alpha_real[1] = (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
1266*15dc779aSAndroid Build Coastguard Worker                            str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
1267*15dc779aSAndroid Build Coastguard Worker                            str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
1268*15dc779aSAndroid Build Coastguard Worker                           fac;
1269*15dc779aSAndroid Build Coastguard Worker           alpha_imag[1] = (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
1270*15dc779aSAndroid Build Coastguard Worker                            str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
1271*15dc779aSAndroid Build Coastguard Worker                            str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
1272*15dc779aSAndroid Build Coastguard Worker                           fac;
1273*15dc779aSAndroid Build Coastguard Worker         }
1274*15dc779aSAndroid Build Coastguard Worker 
1275*15dc779aSAndroid Build Coastguard Worker         if (str_auto_corr.phi_1_1 == 0) {
1276*15dc779aSAndroid Build Coastguard Worker           alpha_real[0] = alpha_imag[0] = 0;
1277*15dc779aSAndroid Build Coastguard Worker         } else {
1278*15dc779aSAndroid Build Coastguard Worker           fac = 1.0f / str_auto_corr.phi_1_1;
1279*15dc779aSAndroid Build Coastguard Worker           alpha_real[0] =
1280*15dc779aSAndroid Build Coastguard Worker               -(str_auto_corr.phi_0_1_real + alpha_real[1] * str_auto_corr.phi_1_2_real +
1281*15dc779aSAndroid Build Coastguard Worker                 alpha_imag[1] * str_auto_corr.phi_1_2_imag) *
1282*15dc779aSAndroid Build Coastguard Worker               fac;
1283*15dc779aSAndroid Build Coastguard Worker           alpha_imag[0] =
1284*15dc779aSAndroid Build Coastguard Worker               -(str_auto_corr.phi_0_1_imag + alpha_imag[1] * str_auto_corr.phi_1_2_real -
1285*15dc779aSAndroid Build Coastguard Worker                 alpha_real[1] * str_auto_corr.phi_1_2_imag) *
1286*15dc779aSAndroid Build Coastguard Worker               fac;
1287*15dc779aSAndroid Build Coastguard Worker         }
1288*15dc779aSAndroid Build Coastguard Worker 
1289*15dc779aSAndroid Build Coastguard Worker         if (alpha_real[0] * alpha_real[0] + alpha_imag[0] * alpha_imag[0] >= 16.0f ||
1290*15dc779aSAndroid Build Coastguard Worker             alpha_real[1] * alpha_real[1] + alpha_imag[1] * alpha_imag[1] >= 16.0f) {
1291*15dc779aSAndroid Build Coastguard Worker           alpha_real[0] = 0.0f;
1292*15dc779aSAndroid Build Coastguard Worker           alpha_imag[0] = 0.0f;
1293*15dc779aSAndroid Build Coastguard Worker           alpha_real[1] = 0.0f;
1294*15dc779aSAndroid Build Coastguard Worker           alpha_imag[1] = 0.0f;
1295*15dc779aSAndroid Build Coastguard Worker         }
1296*15dc779aSAndroid Build Coastguard Worker 
1297*15dc779aSAndroid Build Coastguard Worker         while (k2 >= ptr_invf_band_tbl[bw_index]) {
1298*15dc779aSAndroid Build Coastguard Worker           bw_index++;
1299*15dc779aSAndroid Build Coastguard Worker           if (bw_index >= MAX_NOISE_COEFFS) {
1300*15dc779aSAndroid Build Coastguard Worker             if (ec_flag) {
1301*15dc779aSAndroid Build Coastguard Worker               bw_index = MAX_NOISE_COEFFS - 1;
1302*15dc779aSAndroid Build Coastguard Worker               break;
1303*15dc779aSAndroid Build Coastguard Worker             } else
1304*15dc779aSAndroid Build Coastguard Worker               return -1;
1305*15dc779aSAndroid Build Coastguard Worker           }
1306*15dc779aSAndroid Build Coastguard Worker         }
1307*15dc779aSAndroid Build Coastguard Worker 
1308*15dc779aSAndroid Build Coastguard Worker         if (bw_index >= MAX_NUM_PATCHES) {
1309*15dc779aSAndroid Build Coastguard Worker           if (ec_flag)
1310*15dc779aSAndroid Build Coastguard Worker             bw_index = MAX_NUM_PATCHES - 1;
1311*15dc779aSAndroid Build Coastguard Worker           else
1312*15dc779aSAndroid Build Coastguard Worker             return -1;
1313*15dc779aSAndroid Build Coastguard Worker         }
1314*15dc779aSAndroid Build Coastguard Worker         bw = bw_array[bw_index];
1315*15dc779aSAndroid Build Coastguard Worker 
1316*15dc779aSAndroid Build Coastguard Worker         a0r = bw * alpha_real[0];
1317*15dc779aSAndroid Build Coastguard Worker         a0i = bw * alpha_imag[0];
1318*15dc779aSAndroid Build Coastguard Worker         bw *= bw;
1319*15dc779aSAndroid Build Coastguard Worker         a1r = bw * alpha_real[1];
1320*15dc779aSAndroid Build Coastguard Worker         a1i = bw * alpha_imag[1];
1321*15dc779aSAndroid Build Coastguard Worker 
1322*15dc779aSAndroid Build Coastguard Worker         if (bw > 0.0f) {
1323*15dc779aSAndroid Build Coastguard Worker           for (i = start_sample; i < end_sample; i++) {
1324*15dc779aSAndroid Build Coastguard Worker             FLOAT32 real1, imag1, real2, imag2, realTarget, imag_target;
1325*15dc779aSAndroid Build Coastguard Worker 
1326*15dc779aSAndroid Build Coastguard Worker             realTarget = ptr_ph_vocod_buf_real[i][k2];
1327*15dc779aSAndroid Build Coastguard Worker             imag_target = ptr_ph_vocod_buf_imag[i][k2];
1328*15dc779aSAndroid Build Coastguard Worker             real1 = ptr_ph_vocod_buf_real[i - 1][k2];
1329*15dc779aSAndroid Build Coastguard Worker             imag1 = ptr_ph_vocod_buf_imag[i - 1][k2];
1330*15dc779aSAndroid Build Coastguard Worker             real2 = ptr_ph_vocod_buf_real[i - 2][k2];
1331*15dc779aSAndroid Build Coastguard Worker             imag2 = ptr_ph_vocod_buf_imag[i - 2][k2];
1332*15dc779aSAndroid Build Coastguard Worker             realTarget += ((a0r * real1 - a0i * imag1) + (a1r * real2 - a1i * imag2));
1333*15dc779aSAndroid Build Coastguard Worker             imag_target += ((a0i * real1 + a0r * imag1) + (a1i * real2 + a1r * imag2));
1334*15dc779aSAndroid Build Coastguard Worker 
1335*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_real[i][k2] = realTarget;
1336*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_imag[i][k2] = imag_target;
1337*15dc779aSAndroid Build Coastguard Worker           }
1338*15dc779aSAndroid Build Coastguard Worker         } else {
1339*15dc779aSAndroid Build Coastguard Worker           for (i = start_sample; i < end_sample; i++) {
1340*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_real[i][k2] = ptr_ph_vocod_buf_real[i][k2];
1341*15dc779aSAndroid Build Coastguard Worker             ptr_dst_buf_imag[i][k2] = ptr_ph_vocod_buf_imag[i][k2];
1342*15dc779aSAndroid Build Coastguard Worker           }
1343*15dc779aSAndroid Build Coastguard Worker         }
1344*15dc779aSAndroid Build Coastguard Worker       }
1345*15dc779aSAndroid Build Coastguard Worker     }
1346*15dc779aSAndroid Build Coastguard Worker   }
1347*15dc779aSAndroid Build Coastguard Worker   if ((MAX_NUM_PATCHES + 1) <= patch) {
1348*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
1349*15dc779aSAndroid Build Coastguard Worker       patch = MAX_NUM_PATCHES;
1350*15dc779aSAndroid Build Coastguard Worker     } else {
1351*15dc779aSAndroid Build Coastguard Worker       return -1;
1352*15dc779aSAndroid Build Coastguard Worker     }
1353*15dc779aSAndroid Build Coastguard Worker   }
1354*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->patch_param.num_patches = patch;
1355*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_if_bands; i++) {
1356*15dc779aSAndroid Build Coastguard Worker     bw_array_prev[i] = bw_array[i];
1357*15dc779aSAndroid Build Coastguard Worker   }
1358*15dc779aSAndroid Build Coastguard Worker   return 0;
1359*15dc779aSAndroid Build Coastguard Worker }
1360