xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_sbr_dec.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
29*15dc779aSAndroid Build Coastguard Worker 
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
36*15dc779aSAndroid Build Coastguard Worker 
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 #include "ixheaacd_sbrdecoder.h"
50*15dc779aSAndroid Build Coastguard Worker 
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_definitions.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
68*15dc779aSAndroid Build Coastguard Worker 
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
71*15dc779aSAndroid Build Coastguard Worker 
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
80*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct * ptr_sbr_dec,WORD32 upsample_ratio_idx,WORD32 low_pow_flag)81*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct *ptr_sbr_dec,
82*15dc779aSAndroid Build Coastguard Worker                             WORD32 upsample_ratio_idx, WORD32 low_pow_flag) {
83*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
84*15dc779aSAndroid Build Coastguard Worker   if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
85*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
86*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 16; j++) {
87*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->qmf_energy_buf[i][j] =
88*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[2 + i][j] *
89*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[2 + i][j];
90*15dc779aSAndroid Build Coastguard Worker         if (!low_pow_flag)
91*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_energy_buf[i][j] +=
92*15dc779aSAndroid Build Coastguard Worker               (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
93*15dc779aSAndroid Build Coastguard Worker                ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
94*15dc779aSAndroid Build Coastguard Worker       }
95*15dc779aSAndroid Build Coastguard Worker     }
96*15dc779aSAndroid Build Coastguard Worker 
97*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 16; i++) {
98*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 16; j++) {
99*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
100*15dc779aSAndroid Build Coastguard Worker             (ptr_sbr_dec->qmf_energy_buf[4 * i + 0][j] +
101*15dc779aSAndroid Build Coastguard Worker              ptr_sbr_dec->qmf_energy_buf[4 * i + 1][j] +
102*15dc779aSAndroid Build Coastguard Worker              ptr_sbr_dec->qmf_energy_buf[4 * i + 2][j] +
103*15dc779aSAndroid Build Coastguard Worker              ptr_sbr_dec->qmf_energy_buf[4 * i + 3][j]) *
104*15dc779aSAndroid Build Coastguard Worker             0.25f;
105*15dc779aSAndroid Build Coastguard Worker       }
106*15dc779aSAndroid Build Coastguard Worker     }
107*15dc779aSAndroid Build Coastguard Worker   } else {
108*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
109*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 32; j++) {
110*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->qmf_energy_buf[i][j] =
111*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[2 + i][j] *
112*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[2 + i][j];
113*15dc779aSAndroid Build Coastguard Worker         if (!low_pow_flag)
114*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_energy_buf[i][j] +=
115*15dc779aSAndroid Build Coastguard Worker               (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
116*15dc779aSAndroid Build Coastguard Worker                ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
117*15dc779aSAndroid Build Coastguard Worker       }
118*15dc779aSAndroid Build Coastguard Worker     }
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 16; i++) {
121*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 32; j++) {
122*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
123*15dc779aSAndroid Build Coastguard Worker             (ptr_sbr_dec->qmf_energy_buf[2 * i + 0][j] +
124*15dc779aSAndroid Build Coastguard Worker              ptr_sbr_dec->qmf_energy_buf[2 * i + 1][j]) *
125*15dc779aSAndroid Build Coastguard Worker             0.5f;
126*15dc779aSAndroid Build Coastguard Worker       }
127*15dc779aSAndroid Build Coastguard Worker     }
128*15dc779aSAndroid Build Coastguard Worker   }
129*15dc779aSAndroid Build Coastguard Worker }
130*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES],FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64],WORD32 no_bins,WORD32 max_stretch)131*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES],
132*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 qmf_buf_real[][64],
133*15dc779aSAndroid Build Coastguard Worker                             FLOAT32 qmf_buf_imag[][64], WORD32 no_bins,
134*15dc779aSAndroid Build Coastguard Worker                             WORD32 max_stretch) {
135*15dc779aSAndroid Build Coastguard Worker   WORD32 patch_bands;
136*15dc779aSAndroid Build Coastguard Worker   WORD32 patch, band, col, target, source_bands, i;
137*15dc779aSAndroid Build Coastguard Worker   WORD32 num_patches = 0;
138*15dc779aSAndroid Build Coastguard Worker 
139*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < MAX_NUM_PATCHES; i++) {
140*15dc779aSAndroid Build Coastguard Worker     if (x_over_qmf[i] != 0) {
141*15dc779aSAndroid Build Coastguard Worker       num_patches++;
142*15dc779aSAndroid Build Coastguard Worker     }
143*15dc779aSAndroid Build Coastguard Worker   }
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker   for (patch = (max_stretch - 1); patch < num_patches; patch++) {
146*15dc779aSAndroid Build Coastguard Worker     patch_bands = x_over_qmf[patch + 1] - x_over_qmf[patch];
147*15dc779aSAndroid Build Coastguard Worker     target = x_over_qmf[patch];
148*15dc779aSAndroid Build Coastguard Worker     source_bands = x_over_qmf[max_stretch - 1] - x_over_qmf[max_stretch - 2];
149*15dc779aSAndroid Build Coastguard Worker     while (patch_bands > 0) {
150*15dc779aSAndroid Build Coastguard Worker       WORD32 ixheaacd_num_bands = source_bands;
151*15dc779aSAndroid Build Coastguard Worker       WORD32 start_band = x_over_qmf[max_stretch - 1] - 1;
152*15dc779aSAndroid Build Coastguard Worker       if (target + ixheaacd_num_bands >= x_over_qmf[patch + 1]) {
153*15dc779aSAndroid Build Coastguard Worker         ixheaacd_num_bands = x_over_qmf[patch + 1] - target;
154*15dc779aSAndroid Build Coastguard Worker       }
155*15dc779aSAndroid Build Coastguard Worker       if ((((target + ixheaacd_num_bands - 1) & 1) +
156*15dc779aSAndroid Build Coastguard Worker            ((x_over_qmf[max_stretch - 1] - 1) & 1)) &
157*15dc779aSAndroid Build Coastguard Worker           1) {
158*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_num_bands == source_bands) {
159*15dc779aSAndroid Build Coastguard Worker           ixheaacd_num_bands--;
160*15dc779aSAndroid Build Coastguard Worker         } else {
161*15dc779aSAndroid Build Coastguard Worker           start_band--;
162*15dc779aSAndroid Build Coastguard Worker         }
163*15dc779aSAndroid Build Coastguard Worker       }
164*15dc779aSAndroid Build Coastguard Worker       if (!ixheaacd_num_bands) break;
165*15dc779aSAndroid Build Coastguard Worker       for (col = 0; col < no_bins; col++) {
166*15dc779aSAndroid Build Coastguard Worker         WORD32 i = 0;
167*15dc779aSAndroid Build Coastguard Worker         band = target + ixheaacd_num_bands - 1;
168*15dc779aSAndroid Build Coastguard Worker         if (64 <= band) {
169*15dc779aSAndroid Build Coastguard Worker           band = 63;
170*15dc779aSAndroid Build Coastguard Worker         }
171*15dc779aSAndroid Build Coastguard Worker         if (x_over_qmf[patch + 1] <= band) {
172*15dc779aSAndroid Build Coastguard Worker           band = x_over_qmf[patch + 1] - 1;
173*15dc779aSAndroid Build Coastguard Worker         }
174*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < ixheaacd_num_bands; i++, band--) {
175*15dc779aSAndroid Build Coastguard Worker           qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i];
176*15dc779aSAndroid Build Coastguard Worker           qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i];
177*15dc779aSAndroid Build Coastguard Worker         }
178*15dc779aSAndroid Build Coastguard Worker       }
179*15dc779aSAndroid Build Coastguard Worker       target += ixheaacd_num_bands;
180*15dc779aSAndroid Build Coastguard Worker       patch_bands -= ixheaacd_num_bands;
181*15dc779aSAndroid Build Coastguard Worker     }
182*15dc779aSAndroid Build Coastguard Worker   }
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct * ptr_sbr_dec,ia_sbr_tables_struct * sbr_tables_ptr,WORD32 op_delay)185*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec,
186*15dc779aSAndroid Build Coastguard Worker                                        ia_sbr_tables_struct *sbr_tables_ptr,
187*15dc779aSAndroid Build Coastguard Worker                                        WORD32 op_delay) {
188*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *core_coder_samples;
189*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_filt_states;
190*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_filt_states_1;
191*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_filt_states_2;
192*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_temp;
193*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_win_coeffs_1;
194*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_win_coeffs_2;
195*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_win_coeffs;
196*15dc779aSAndroid Build Coastguard Worker   WORD32 *ploc_qmf_buf_real;
197*15dc779aSAndroid Build Coastguard Worker   WORD32 *ploc_qmf_buf_imag;
198*15dc779aSAndroid Build Coastguard Worker   WORD32 local_qmf_buffer[128] = {0};
199*15dc779aSAndroid Build Coastguard Worker   WORD32 anal_buf[2 * 32];
200*15dc779aSAndroid Build Coastguard Worker   WORD32 idx, z;
201*15dc779aSAndroid Build Coastguard Worker   WORD32 core_syn_ch_index;
202*15dc779aSAndroid Build Coastguard Worker   FLOAT32 gain;
203*15dc779aSAndroid Build Coastguard Worker   WORD32 filt_offset;
204*15dc779aSAndroid Build Coastguard Worker   WORD32 num_columns;
205*15dc779aSAndroid Build Coastguard Worker   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
206*15dc779aSAndroid Build Coastguard Worker       sbr_tables_ptr->qmf_dec_tables_ptr;
207*15dc779aSAndroid Build Coastguard Worker   ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank =
208*15dc779aSAndroid Build Coastguard Worker       &ptr_sbr_dec->str_codec_qmf_bank;
209*15dc779aSAndroid Build Coastguard Worker   core_coder_samples = ptr_sbr_dec->time_sample_buf;
210*15dc779aSAndroid Build Coastguard Worker   ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32;
211*15dc779aSAndroid Build Coastguard Worker   ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32;
212*15dc779aSAndroid Build Coastguard Worker   num_columns = pstr_qmf_anal_bank->no_channels;
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker   switch (num_columns) {
215*15dc779aSAndroid Build Coastguard Worker     case 16:
216*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
217*15dc779aSAndroid Build Coastguard Worker       gain = 128.0f;
218*15dc779aSAndroid Build Coastguard Worker       filt_offset = 64;
219*15dc779aSAndroid Build Coastguard Worker       break;
220*15dc779aSAndroid Build Coastguard Worker     case 24:
221*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
222*15dc779aSAndroid Build Coastguard Worker       gain = 12.0f;
223*15dc779aSAndroid Build Coastguard Worker       filt_offset = 24;
224*15dc779aSAndroid Build Coastguard Worker       break;
225*15dc779aSAndroid Build Coastguard Worker     case 32:
226*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
227*15dc779aSAndroid Build Coastguard Worker       gain = 256.0f;
228*15dc779aSAndroid Build Coastguard Worker       filt_offset = 64;
229*15dc779aSAndroid Build Coastguard Worker       break;
230*15dc779aSAndroid Build Coastguard Worker     default:
231*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
232*15dc779aSAndroid Build Coastguard Worker       gain = 256.0f;
233*15dc779aSAndroid Build Coastguard Worker       filt_offset = 64;
234*15dc779aSAndroid Build Coastguard Worker       break;
235*15dc779aSAndroid Build Coastguard Worker   }
236*15dc779aSAndroid Build Coastguard Worker   gain = 1.0f / gain;
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker   pstr_qmf_anal_bank->usb = num_columns;
239*15dc779aSAndroid Build Coastguard Worker 
240*15dc779aSAndroid Build Coastguard Worker   ploc_qmf_buf_real = &local_qmf_buffer[0];
241*15dc779aSAndroid Build Coastguard Worker   ploc_qmf_buf_imag = &local_qmf_buffer[64];
242*15dc779aSAndroid Build Coastguard Worker 
243*15dc779aSAndroid Build Coastguard Worker   ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
244*15dc779aSAndroid Build Coastguard Worker   ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
245*15dc779aSAndroid Build Coastguard Worker 
246*15dc779aSAndroid Build Coastguard Worker   for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) {
247*15dc779aSAndroid Build Coastguard Worker     for (z = 0; z < num_columns; z++) {
248*15dc779aSAndroid Build Coastguard Worker       ptr_filt_states[num_columns - 1 - z] =
249*15dc779aSAndroid Build Coastguard Worker           (WORD32)(core_coder_samples[z] * (1 << 15));
250*15dc779aSAndroid Build Coastguard Worker     }
251*15dc779aSAndroid Build Coastguard Worker     ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2,
252*15dc779aSAndroid Build Coastguard Worker                                    ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf,
253*15dc779aSAndroid Build Coastguard Worker                                    num_columns);
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker     core_coder_samples += num_columns;
256*15dc779aSAndroid Build Coastguard Worker 
257*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states -= num_columns;
258*15dc779aSAndroid Build Coastguard Worker     if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
259*15dc779aSAndroid Build Coastguard Worker       ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 +
260*15dc779aSAndroid Build Coastguard Worker                         10 * num_columns - num_columns;
261*15dc779aSAndroid Build Coastguard Worker     }
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker     ptr_temp = ptr_filt_states_1;
264*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states_1 = ptr_filt_states_2;
265*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states_2 = ptr_temp;
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker     ptr_win_coeffs_1 += filt_offset;
268*15dc779aSAndroid Build Coastguard Worker     ptr_win_coeffs_2 += filt_offset;
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker     ptr_win_coeffs = ptr_win_coeffs_1;
271*15dc779aSAndroid Build Coastguard Worker     ptr_win_coeffs_1 = ptr_win_coeffs_2;
272*15dc779aSAndroid Build Coastguard Worker     ptr_win_coeffs_2 = ptr_win_coeffs;
273*15dc779aSAndroid Build Coastguard Worker 
274*15dc779aSAndroid Build Coastguard Worker     if (ptr_win_coeffs_2 >
275*15dc779aSAndroid Build Coastguard Worker         (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) {
276*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32;
277*15dc779aSAndroid Build Coastguard Worker       ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset;
278*15dc779aSAndroid Build Coastguard Worker     }
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker     ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0],
281*15dc779aSAndroid Build Coastguard Worker                                  &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank,
282*15dc779aSAndroid Build Coastguard Worker                                  qmf_dec_tables_ptr);
283*15dc779aSAndroid Build Coastguard Worker     core_syn_ch_index = num_columns;
284*15dc779aSAndroid Build Coastguard Worker 
285*15dc779aSAndroid Build Coastguard Worker     for (z = 0; z < core_syn_ch_index; z++) {
286*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] =
287*15dc779aSAndroid Build Coastguard Worker           ((FLOAT32)ploc_qmf_buf_real[z] * gain);
288*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
289*15dc779aSAndroid Build Coastguard Worker           ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
290*15dc779aSAndroid Build Coastguard Worker     }
291*15dc779aSAndroid Build Coastguard Worker   }
292*15dc779aSAndroid Build Coastguard Worker 
293*15dc779aSAndroid Build Coastguard Worker   pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
294*15dc779aSAndroid Build Coastguard Worker   pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states;
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_synthesis_regrp(FLOAT32 * qmf_buf_real,FLOAT32 * qmf_buf_imag,ia_sbr_dec_struct * ptr_sbr_dec,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_sbr_header_data_struct * ptr_header_data,WORD32 stereo_config_idx,WORD32 apply_processing)297*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_synthesis_regrp(
298*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag,
299*15dc779aSAndroid Build Coastguard Worker     ia_sbr_dec_struct *ptr_sbr_dec,
300*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_frame_data,
301*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx,
302*15dc779aSAndroid Build Coastguard Worker     WORD32 apply_processing) {
303*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
304*15dc779aSAndroid Build Coastguard Worker   WORD32 stop_border = 0;
305*15dc779aSAndroid Build Coastguard Worker   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
306*15dc779aSAndroid Build Coastguard Worker   WORD32 x_over_band = num_anal_bands;
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker   if (apply_processing) {
309*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
310*15dc779aSAndroid Build Coastguard Worker       stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0];
311*15dc779aSAndroid Build Coastguard Worker     } else {
312*15dc779aSAndroid Build Coastguard Worker       stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0];
313*15dc779aSAndroid Build Coastguard Worker     }
314*15dc779aSAndroid Build Coastguard Worker     x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
315*15dc779aSAndroid Build Coastguard Worker   }
316*15dc779aSAndroid Build Coastguard Worker 
317*15dc779aSAndroid Build Coastguard Worker   if (stereo_config_idx > 0) {
318*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < stop_border; i++) {
319*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 3; k++) {
320*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ =
321*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
322*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ =
323*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
324*15dc779aSAndroid Build Coastguard Worker       }
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker       for (; k < x_over_band; k++) {
327*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
328*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
329*15dc779aSAndroid Build Coastguard Worker       }
330*15dc779aSAndroid Build Coastguard Worker 
331*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
332*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
333*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
334*15dc779aSAndroid Build Coastguard Worker       }
335*15dc779aSAndroid Build Coastguard Worker 
336*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
337*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
338*15dc779aSAndroid Build Coastguard Worker     }
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
343*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 3; k++) {
344*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ =
345*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
346*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ =
347*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
348*15dc779aSAndroid Build Coastguard Worker       }
349*15dc779aSAndroid Build Coastguard Worker 
350*15dc779aSAndroid Build Coastguard Worker       for (; k < x_over_band; k++) {
351*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
352*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
353*15dc779aSAndroid Build Coastguard Worker       }
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
356*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
357*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
358*15dc779aSAndroid Build Coastguard Worker       }
359*15dc779aSAndroid Build Coastguard Worker 
360*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
361*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
362*15dc779aSAndroid Build Coastguard Worker     }
363*15dc779aSAndroid Build Coastguard Worker 
364*15dc779aSAndroid Build Coastguard Worker   } else {
365*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < stop_border; i++) {
366*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < x_over_band; k++) {
367*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
368*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
369*15dc779aSAndroid Build Coastguard Worker       }
370*15dc779aSAndroid Build Coastguard Worker 
371*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
372*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
373*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
374*15dc779aSAndroid Build Coastguard Worker       }
375*15dc779aSAndroid Build Coastguard Worker 
376*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
377*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
378*15dc779aSAndroid Build Coastguard Worker     }
379*15dc779aSAndroid Build Coastguard Worker 
380*15dc779aSAndroid Build Coastguard Worker     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
383*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < x_over_band; k++) {
384*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
385*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
386*15dc779aSAndroid Build Coastguard Worker       }
387*15dc779aSAndroid Build Coastguard Worker 
388*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
389*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
390*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
391*15dc779aSAndroid Build Coastguard Worker       }
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
394*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
395*15dc779aSAndroid Build Coastguard Worker     }
396*15dc779aSAndroid Build Coastguard Worker   }
397*15dc779aSAndroid Build Coastguard Worker }
398*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 * qmf_buf_real,FLOAT32 * qmf_buf_imag,ia_sbr_dec_struct * ptr_sbr_dec,WORD32 stereo_config_idx)399*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real,
400*15dc779aSAndroid Build Coastguard Worker                                        FLOAT32 *qmf_buf_imag,
401*15dc779aSAndroid Build Coastguard Worker                                        ia_sbr_dec_struct *ptr_sbr_dec,
402*15dc779aSAndroid Build Coastguard Worker                                        WORD32 stereo_config_idx) {
403*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
404*15dc779aSAndroid Build Coastguard Worker   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
405*15dc779aSAndroid Build Coastguard Worker   WORD32 x_over_band = num_anal_bands;
406*15dc779aSAndroid Build Coastguard Worker 
407*15dc779aSAndroid Build Coastguard Worker   if (stereo_config_idx > 0) {
408*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
409*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 3; k++) {
410*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ =
411*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
412*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ =
413*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
414*15dc779aSAndroid Build Coastguard Worker       }
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker       for (; k < x_over_band; k++) {
417*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
418*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
419*15dc779aSAndroid Build Coastguard Worker       }
420*15dc779aSAndroid Build Coastguard Worker 
421*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
422*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = 0;
423*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = 0;
424*15dc779aSAndroid Build Coastguard Worker       }
425*15dc779aSAndroid Build Coastguard Worker 
426*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
427*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
428*15dc779aSAndroid Build Coastguard Worker     }
429*15dc779aSAndroid Build Coastguard Worker   } else {
430*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
431*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < x_over_band; k++) {
432*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
433*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
434*15dc779aSAndroid Build Coastguard Worker       }
435*15dc779aSAndroid Build Coastguard Worker 
436*15dc779aSAndroid Build Coastguard Worker       for (; k < 64; k++) {
437*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_real++ = 0.0f;
438*15dc779aSAndroid Build Coastguard Worker         *qmf_buf_imag++ = 0.0f;
439*15dc779aSAndroid Build Coastguard Worker       }
440*15dc779aSAndroid Build Coastguard Worker 
441*15dc779aSAndroid Build Coastguard Worker       qmf_buf_real += 14;
442*15dc779aSAndroid Build Coastguard Worker       qmf_buf_imag += 14;
443*15dc779aSAndroid Build Coastguard Worker     }
444*15dc779aSAndroid Build Coastguard Worker   }
445*15dc779aSAndroid Build Coastguard Worker }
446*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_synthesis_filt_block(ia_sbr_dec_struct * ptr_sbr_dec,ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,WORD32 apply_processing,FLOAT32 ** qmf_buf_real,FLOAT32 ** qmf_buf_imag,WORD32 stereo_config_idx,ia_sbr_tables_struct * sbr_tables_ptr,WORD32 mps_sbr_flag,WORD32 ch_fac,WORD32 ps_enable,WORD32 skip_re_grouping,ia_ps_dec_struct * ptr_ps_dec,FLAG drc_on,WORD32 drc_sbr_factors[][64])447*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_esbr_synthesis_filt_block(
448*15dc779aSAndroid Build Coastguard Worker     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
449*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing,
450*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx,
451*15dc779aSAndroid Build Coastguard Worker     ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac,
452*15dc779aSAndroid Build Coastguard Worker     WORD32 ps_enable, WORD32 skip_re_grouping, ia_ps_dec_struct *ptr_ps_dec,
453*15dc779aSAndroid Build Coastguard Worker     FLAG drc_on, WORD32 drc_sbr_factors[][64]) {
454*15dc779aSAndroid Build Coastguard Worker 
455*15dc779aSAndroid Build Coastguard Worker     WORD32 i, k;
456*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_filt_states;
457*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_filt_states_1;
458*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_filt_states_2;
459*15dc779aSAndroid Build Coastguard Worker     WORD32 *filter_l;
460*15dc779aSAndroid Build Coastguard Worker     WORD32 *ploc_qmf_buf_real;
461*15dc779aSAndroid Build Coastguard Worker     WORD32 *ploc_qmf_buf_imag;
462*15dc779aSAndroid Build Coastguard Worker     WORD32 out_scalefactor;
463*15dc779aSAndroid Build Coastguard Worker     WORD32 sixty4, thrity2;
464*15dc779aSAndroid Build Coastguard Worker     WORD32 no_synthesis_channels;
465*15dc779aSAndroid Build Coastguard Worker     WORD32 ixheaacd_drc_offset;
466*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *syn_buffer;
467*15dc779aSAndroid Build Coastguard Worker     WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local;
468*15dc779aSAndroid Build Coastguard Worker     WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]);
469*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *time_sample_buf;
470*15dc779aSAndroid Build Coastguard Worker   if (ps_enable) {
471*15dc779aSAndroid Build Coastguard Worker     time_sample_buf = ptr_ps_dec->time_sample_buf[0];
472*15dc779aSAndroid Build Coastguard Worker   } else {
473*15dc779aSAndroid Build Coastguard Worker     time_sample_buf = ptr_sbr_dec->time_sample_buf;
474*15dc779aSAndroid Build Coastguard Worker   }
475*15dc779aSAndroid Build Coastguard Worker     ia_sbr_qmf_filter_bank_struct *qmf_bank =
476*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->str_synthesis_qmf_bank;
477*15dc779aSAndroid Build Coastguard Worker     ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
478*15dc779aSAndroid Build Coastguard Worker         sbr_tables_ptr->qmf_dec_tables_ptr;
479*15dc779aSAndroid Build Coastguard Worker 
480*15dc779aSAndroid Build Coastguard Worker   if (!skip_re_grouping) {
481*15dc779aSAndroid Build Coastguard Worker     if (!mps_sbr_flag) {
482*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
483*15dc779aSAndroid Build Coastguard Worker                                     ptr_sbr_dec, ptr_frame_data, ptr_header_data,
484*15dc779aSAndroid Build Coastguard Worker                                     stereo_config_idx, apply_processing);
485*15dc779aSAndroid Build Coastguard Worker       if (ps_enable) {
486*15dc779aSAndroid Build Coastguard Worker         FLOAT32 factor = 1.0f;
487*15dc779aSAndroid Build Coastguard Worker         for (i = ptr_ps_dec->num_sub_samples;i < (WORD32)ptr_ps_dec->num_sub_samples + 6;i++) {
488*15dc779aSAndroid Build Coastguard Worker           for (k = 0; k < 5; k++)
489*15dc779aSAndroid Build Coastguard Worker           {
490*15dc779aSAndroid Build Coastguard Worker             if (drc_on)
491*15dc779aSAndroid Build Coastguard Worker             {
492*15dc779aSAndroid Build Coastguard Worker               if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
493*15dc779aSAndroid Build Coastguard Worker               {
494*15dc779aSAndroid Build Coastguard Worker                 factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
495*15dc779aSAndroid Build Coastguard Worker               }
496*15dc779aSAndroid Build Coastguard Worker               else
497*15dc779aSAndroid Build Coastguard Worker               {
498*15dc779aSAndroid Build Coastguard Worker                 factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
499*15dc779aSAndroid Build Coastguard Worker               }
500*15dc779aSAndroid Build Coastguard Worker             }
501*15dc779aSAndroid Build Coastguard Worker             ptr_ps_dec->pp_qmf_buf_real[0][i][k] =
502*15dc779aSAndroid Build Coastguard Worker               factor * ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
503*15dc779aSAndroid Build Coastguard Worker             ptr_ps_dec->pp_qmf_buf_imag[0][i][k] =
504*15dc779aSAndroid Build Coastguard Worker               factor * ptr_sbr_dec->qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
505*15dc779aSAndroid Build Coastguard Worker           }
506*15dc779aSAndroid Build Coastguard Worker         }
507*15dc779aSAndroid Build Coastguard Worker       }
508*15dc779aSAndroid Build Coastguard Worker       if (ps_enable && apply_processing) {
509*15dc779aSAndroid Build Coastguard Worker         WORD32 usb = ptr_header_data->pstr_freq_band_data->sub_band_end;
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker         ixheaacd_esbr_apply_ps(ptr_ps_dec,
512*15dc779aSAndroid Build Coastguard Worker                                ptr_ps_dec->pp_qmf_buf_real[0],
513*15dc779aSAndroid Build Coastguard Worker                                ptr_ps_dec->pp_qmf_buf_imag[0],
514*15dc779aSAndroid Build Coastguard Worker                                ptr_ps_dec->pp_qmf_buf_real[1],
515*15dc779aSAndroid Build Coastguard Worker                                ptr_ps_dec->pp_qmf_buf_imag[1],
516*15dc779aSAndroid Build Coastguard Worker                                usb, sbr_tables_ptr->ps_tables_ptr,
517*15dc779aSAndroid Build Coastguard Worker                                ptr_header_data->num_time_slots);
518*15dc779aSAndroid Build Coastguard Worker       } else if (ps_enable) {
519*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < (ptr_header_data->num_time_slots * 2); i++) {
520*15dc779aSAndroid Build Coastguard Worker           for (k = 0; k < 64; k++) {
521*15dc779aSAndroid Build Coastguard Worker             ptr_ps_dec->pp_qmf_buf_real[1][i][k] = ptr_ps_dec->pp_qmf_buf_real[0][i][k];
522*15dc779aSAndroid Build Coastguard Worker             ptr_ps_dec->pp_qmf_buf_imag[1][i][k] = ptr_ps_dec->pp_qmf_buf_imag[0][i][k];
523*15dc779aSAndroid Build Coastguard Worker           }
524*15dc779aSAndroid Build Coastguard Worker         }
525*15dc779aSAndroid Build Coastguard Worker       }
526*15dc779aSAndroid Build Coastguard Worker     } else {
527*15dc779aSAndroid Build Coastguard Worker       ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
528*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec, stereo_config_idx);
529*15dc779aSAndroid Build Coastguard Worker     }
530*15dc779aSAndroid Build Coastguard Worker   } else {
531*15dc779aSAndroid Build Coastguard Worker     if (ps_enable) {
532*15dc779aSAndroid Build Coastguard Worker       time_sample_buf = ptr_ps_dec->time_sample_buf[1];
533*15dc779aSAndroid Build Coastguard Worker     }
534*15dc779aSAndroid Build Coastguard Worker   }
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker   if (drc_on)
537*15dc779aSAndroid Build Coastguard Worker   {
538*15dc779aSAndroid Build Coastguard Worker     FLOAT32 factor = 1.0f;
539*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++)
540*15dc779aSAndroid Build Coastguard Worker     {
541*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 64; k++)
542*15dc779aSAndroid Build Coastguard Worker       {
543*15dc779aSAndroid Build Coastguard Worker         if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
544*15dc779aSAndroid Build Coastguard Worker         {
545*15dc779aSAndroid Build Coastguard Worker           factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
546*15dc779aSAndroid Build Coastguard Worker         }
547*15dc779aSAndroid Build Coastguard Worker         else
548*15dc779aSAndroid Build Coastguard Worker         {
549*15dc779aSAndroid Build Coastguard Worker           factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
550*15dc779aSAndroid Build Coastguard Worker         }
551*15dc779aSAndroid Build Coastguard Worker         qmf_buf_real[i][k] *= factor;
552*15dc779aSAndroid Build Coastguard Worker         qmf_buf_imag[i][k] *= factor;
553*15dc779aSAndroid Build Coastguard Worker       }
554*15dc779aSAndroid Build Coastguard Worker     }
555*15dc779aSAndroid Build Coastguard Worker   }
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker   if (stereo_config_idx <= 0) {
558*15dc779aSAndroid Build Coastguard Worker     out_scalefactor = 5;
559*15dc779aSAndroid Build Coastguard Worker     no_synthesis_channels = qmf_bank->no_channels;
560*15dc779aSAndroid Build Coastguard Worker     sixty4 = NO_SYNTHESIS_CHANNELS;
561*15dc779aSAndroid Build Coastguard Worker     thrity2 = qmf_bank->no_channels;
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker     if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
564*15dc779aSAndroid Build Coastguard Worker     {
565*15dc779aSAndroid Build Coastguard Worker         qmf_bank->esbr_cos_twiddle =
566*15dc779aSAndroid Build Coastguard Worker           (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
567*15dc779aSAndroid Build Coastguard Worker         qmf_bank->esbr_alt_sin_twiddle =
568*15dc779aSAndroid Build Coastguard Worker           (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
569*15dc779aSAndroid Build Coastguard Worker     }
570*15dc779aSAndroid Build Coastguard Worker     else
571*15dc779aSAndroid Build Coastguard Worker     {
572*15dc779aSAndroid Build Coastguard Worker       qmf_bank->esbr_cos_twiddle =
573*15dc779aSAndroid Build Coastguard Worker         (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64;
574*15dc779aSAndroid Build Coastguard Worker       qmf_bank->esbr_alt_sin_twiddle =
575*15dc779aSAndroid Build Coastguard Worker         (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64;
576*15dc779aSAndroid Build Coastguard Worker     }
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker     qmf_bank->filter_pos_syn_32 +=
579*15dc779aSAndroid Build Coastguard Worker         qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32;
580*15dc779aSAndroid Build Coastguard Worker     qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
581*15dc779aSAndroid Build Coastguard Worker 
582*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states = qmf_bank->filter_states_32;
583*15dc779aSAndroid Build Coastguard Worker 
584*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states_1 = &ptr_filt_states[0];
585*15dc779aSAndroid Build Coastguard Worker     ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels;
586*15dc779aSAndroid Build Coastguard Worker 
587*15dc779aSAndroid Build Coastguard Worker     filter_l = qmf_bank->filter_pos_syn_32;
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker     ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
590*15dc779aSAndroid Build Coastguard Worker 
591*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
592*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 64; k++) {
593*15dc779aSAndroid Build Coastguard Worker         local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64);
594*15dc779aSAndroid Build Coastguard Worker         local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64);
595*15dc779aSAndroid Build Coastguard Worker       }
596*15dc779aSAndroid Build Coastguard Worker       ploc_qmf_buf_real = local_qmf_buffer;
597*15dc779aSAndroid Build Coastguard Worker       ploc_qmf_buf_imag = local_qmf_buffer + 64;
598*15dc779aSAndroid Build Coastguard Worker 
599*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real,
600*15dc779aSAndroid Build Coastguard Worker                                    &ptr_sbr_dec->str_synthesis_qmf_bank,
601*15dc779aSAndroid Build Coastguard Worker                                    sbr_tables_ptr->qmf_dec_tables_ptr,
602*15dc779aSAndroid Build Coastguard Worker                                    no_synthesis_channels);
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker       ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag,
605*15dc779aSAndroid Build Coastguard Worker                                          &ptr_filt_states[ixheaacd_drc_offset],
606*15dc779aSAndroid Build Coastguard Worker                                          no_synthesis_channels,
607*15dc779aSAndroid Build Coastguard Worker                                          out_scalefactor + 1);
608*15dc779aSAndroid Build Coastguard Worker 
609*15dc779aSAndroid Build Coastguard Worker       if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) {
610*15dc779aSAndroid Build Coastguard Worker         ixheaacd_esbr_qmfsyn32_winadd(ptr_filt_states_1, ptr_filt_states_2,
611*15dc779aSAndroid Build Coastguard Worker                                       filter_l, &time_out[0], ch_fac);
612*15dc779aSAndroid Build Coastguard Worker 
613*15dc779aSAndroid Build Coastguard Worker         if (!mps_sbr_flag) {
614*15dc779aSAndroid Build Coastguard Worker           syn_buffer = time_sample_buf + i * 32;
615*15dc779aSAndroid Build Coastguard Worker         } else {
616*15dc779aSAndroid Build Coastguard Worker           syn_buffer = ptr_sbr_dec->time_sample_buf + i * 32;
617*15dc779aSAndroid Build Coastguard Worker         }
618*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < 32; k++) {
619*15dc779aSAndroid Build Coastguard Worker           syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
620*15dc779aSAndroid Build Coastguard Worker         }
621*15dc779aSAndroid Build Coastguard Worker 
622*15dc779aSAndroid Build Coastguard Worker         ptr_filt_states_1 += thrity2;
623*15dc779aSAndroid Build Coastguard Worker         ptr_filt_states_2 -= thrity2;
624*15dc779aSAndroid Build Coastguard Worker         thrity2 = -thrity2;
625*15dc779aSAndroid Build Coastguard Worker         ixheaacd_drc_offset -= 64;
626*15dc779aSAndroid Build Coastguard Worker 
627*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640;
628*15dc779aSAndroid Build Coastguard Worker       } else {
629*15dc779aSAndroid Build Coastguard Worker         ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
630*15dc779aSAndroid Build Coastguard Worker                                       filter_l, &time_out[0], ch_fac);
631*15dc779aSAndroid Build Coastguard Worker 
632*15dc779aSAndroid Build Coastguard Worker         if (!mps_sbr_flag) {
633*15dc779aSAndroid Build Coastguard Worker           syn_buffer = time_sample_buf + i * 64;
634*15dc779aSAndroid Build Coastguard Worker         } else {
635*15dc779aSAndroid Build Coastguard Worker           syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
636*15dc779aSAndroid Build Coastguard Worker         }
637*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < 64; k++) {
638*15dc779aSAndroid Build Coastguard Worker           syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
639*15dc779aSAndroid Build Coastguard Worker         }
640*15dc779aSAndroid Build Coastguard Worker 
641*15dc779aSAndroid Build Coastguard Worker         ptr_filt_states_1 += sixty4;
642*15dc779aSAndroid Build Coastguard Worker         ptr_filt_states_2 -= sixty4;
643*15dc779aSAndroid Build Coastguard Worker         sixty4 = -sixty4;
644*15dc779aSAndroid Build Coastguard Worker         ixheaacd_drc_offset -= 128;
645*15dc779aSAndroid Build Coastguard Worker 
646*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
647*15dc779aSAndroid Build Coastguard Worker       }
648*15dc779aSAndroid Build Coastguard Worker 
649*15dc779aSAndroid Build Coastguard Worker       filter_l += 64;
650*15dc779aSAndroid Build Coastguard Worker 
651*15dc779aSAndroid Build Coastguard Worker       if (filter_l == qmf_bank->p_filter_32 + 640)
652*15dc779aSAndroid Build Coastguard Worker         filter_l = (WORD32 *)qmf_bank->p_filter_32;
653*15dc779aSAndroid Build Coastguard Worker     }
654*15dc779aSAndroid Build Coastguard Worker 
655*15dc779aSAndroid Build Coastguard Worker     qmf_bank->filter_pos_syn_32 = filter_l;
656*15dc779aSAndroid Build Coastguard Worker     qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset;
657*15dc779aSAndroid Build Coastguard Worker   }
658*15dc779aSAndroid Build Coastguard Worker 
659*15dc779aSAndroid Build Coastguard Worker   if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0;
660*15dc779aSAndroid Build Coastguard Worker }
661*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_dec(ia_sbr_dec_struct * ptr_sbr_dec,WORD16 * ptr_time_data,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,ia_ps_dec_struct * ptr_ps_dec,ia_sbr_qmf_filter_bank_struct * ptr_qmf_synth_bank_r,ia_sbr_scale_fact_struct * ptr_sbr_sf_r,FLAG apply_processing,FLAG low_pow_flag,WORD32 * ptr_work_buf_core,ia_sbr_tables_struct * sbr_tables_ptr,ixheaacd_misc_tables * pstr_common_tables,WORD ch_fac,ia_pvc_data_struct * ptr_pvc_data,FLAG drc_on,WORD32 drc_sbr_factors[][64],WORD32 audio_object_type,WORD32 ldmps_present,VOID * self,WORD32 heaac_mps_present,WORD32 ec_flag)662*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_sbr_dec(
663*15dc779aSAndroid Build Coastguard Worker     ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
664*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data,
665*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec,
666*15dc779aSAndroid Build Coastguard Worker     ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
667*15dc779aSAndroid Build Coastguard Worker     FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core,
668*15dc779aSAndroid Build Coastguard Worker     ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
669*15dc779aSAndroid Build Coastguard Worker     ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, WORD32 drc_sbr_factors[][64],
670*15dc779aSAndroid Build Coastguard Worker     WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present,
671*15dc779aSAndroid Build Coastguard Worker     WORD32 ec_flag) {
672*15dc779aSAndroid Build Coastguard Worker   WORD i, j, k;
673*15dc779aSAndroid Build Coastguard Worker   WORD slot, reserve;
674*15dc779aSAndroid Build Coastguard Worker   WORD save_lb_scale;
675*15dc779aSAndroid Build Coastguard Worker   WORD op_delay;
676*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
677*15dc779aSAndroid Build Coastguard Worker 
678*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0};
679*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0};
680*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr;
681*15dc779aSAndroid Build Coastguard Worker   WORD hbe_flag = ptr_header_data->hbe_flag;
682*15dc779aSAndroid Build Coastguard Worker 
683*15dc779aSAndroid Build Coastguard Worker   FLOAT32 **pp_qmf_buf_real = NULL;
684*15dc779aSAndroid Build Coastguard Worker   FLOAT32 **pp_qmf_buf_imag = NULL;
685*15dc779aSAndroid Build Coastguard Worker   FLOAT32 pvc_dec_out_buf[16 * 64];
686*15dc779aSAndroid Build Coastguard Worker 
687*15dc779aSAndroid Build Coastguard Worker   WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
688*15dc779aSAndroid Build Coastguard Worker   WORD no_bins;
689*15dc779aSAndroid Build Coastguard Worker   WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
690*15dc779aSAndroid Build Coastguard Worker   WORD stereo_config_idx = ptr_frame_data->stereo_config_idx;
691*15dc779aSAndroid Build Coastguard Worker   WORD sbr_mode = ptr_frame_data->sbr_mode;
692*15dc779aSAndroid Build Coastguard Worker   WORD usac_flag = ptr_header_data->usac_flag;
693*15dc779aSAndroid Build Coastguard Worker   WORD add_slot = 0;
694*15dc779aSAndroid Build Coastguard Worker 
695*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr;
696*15dc779aSAndroid Build Coastguard Worker 
697*15dc779aSAndroid Build Coastguard Worker   WORD32 dft_hbe_flag = ptr_header_data->esbr_hq;
698*15dc779aSAndroid Build Coastguard Worker   WORD32 esbr_hbe_delay_offsets;
699*15dc779aSAndroid Build Coastguard Worker   if (ptr_header_data->num_time_slots == 15)
700*15dc779aSAndroid Build Coastguard Worker     esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET_960;
701*15dc779aSAndroid Build Coastguard Worker   else
702*15dc779aSAndroid Build Coastguard Worker     esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET;
703*15dc779aSAndroid Build Coastguard Worker 
704*15dc779aSAndroid Build Coastguard Worker   memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
705*15dc779aSAndroid Build Coastguard Worker   memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32));
706*15dc779aSAndroid Build Coastguard Worker   if (audio_object_type == AOT_ER_AAC_ELD) {
707*15dc779aSAndroid Build Coastguard Worker     op_delay = 0;
708*15dc779aSAndroid Build Coastguard Worker   } else {
709*15dc779aSAndroid Build Coastguard Worker     op_delay = 6;
710*15dc779aSAndroid Build Coastguard Worker   }
711*15dc779aSAndroid Build Coastguard Worker 
712*15dc779aSAndroid Build Coastguard Worker   if (ldmps_present == 1) add_slot = SBR_HF_ADJ_OFFSET;
713*15dc779aSAndroid Build Coastguard Worker 
714*15dc779aSAndroid Build Coastguard Worker   if (!((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD))
715*15dc779aSAndroid Build Coastguard Worker       && ptr_header_data->enh_sbr) {
716*15dc779aSAndroid Build Coastguard Worker     ch_fac = 1;
717*15dc779aSAndroid Build Coastguard Worker     pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
718*15dc779aSAndroid Build Coastguard Worker     pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
719*15dc779aSAndroid Build Coastguard Worker     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
720*15dc779aSAndroid Build Coastguard Worker       op_delay = 2 * 6;
721*15dc779aSAndroid Build Coastguard Worker     }
722*15dc779aSAndroid Build Coastguard Worker   }
723*15dc779aSAndroid Build Coastguard Worker 
724*15dc779aSAndroid Build Coastguard Worker   no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
725*15dc779aSAndroid Build Coastguard Worker 
726*15dc779aSAndroid Build Coastguard Worker   if ((audio_object_type == AOT_ER_AAC_ELD) ||
727*15dc779aSAndroid Build Coastguard Worker       (audio_object_type == AOT_ER_AAC_LD)  ||
728*15dc779aSAndroid Build Coastguard Worker       !ptr_header_data->enh_sbr) {
729*15dc779aSAndroid Build Coastguard Worker     WORD32 num = op_delay;
730*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
731*15dc779aSAndroid Build Coastguard Worker     WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag));
732*15dc779aSAndroid Build Coastguard Worker 
733*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->num_time_slots != 15) {
734*15dc779aSAndroid Build Coastguard Worker       if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS)) {
735*15dc779aSAndroid Build Coastguard Worker         if (ec_flag)
736*15dc779aSAndroid Build Coastguard Worker           no_bins = LPC_ORDER;
737*15dc779aSAndroid Build Coastguard Worker         else
738*15dc779aSAndroid Build Coastguard Worker           return -1;
739*15dc779aSAndroid Build Coastguard Worker       }
740*15dc779aSAndroid Build Coastguard Worker     } else {
741*15dc779aSAndroid Build Coastguard Worker       if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS_960)) {
742*15dc779aSAndroid Build Coastguard Worker         if (ec_flag)
743*15dc779aSAndroid Build Coastguard Worker           no_bins = LPC_ORDER;
744*15dc779aSAndroid Build Coastguard Worker         else
745*15dc779aSAndroid Build Coastguard Worker           return -1;
746*15dc779aSAndroid Build Coastguard Worker       }
747*15dc779aSAndroid Build Coastguard Worker     }
748*15dc779aSAndroid Build Coastguard Worker 
749*15dc779aSAndroid Build Coastguard Worker     if (!low_pow_flag) {
750*15dc779aSAndroid Build Coastguard Worker       num = num << 1;
751*15dc779aSAndroid Build Coastguard Worker     }
752*15dc779aSAndroid Build Coastguard Worker     if (audio_object_type != AOT_ER_AAC_ELD) {
753*15dc779aSAndroid Build Coastguard Worker       memcpy(p_scr_qmf_real, ptr_pers_qmf_real,
754*15dc779aSAndroid Build Coastguard Worker              sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
755*15dc779aSAndroid Build Coastguard Worker     }
756*15dc779aSAndroid Build Coastguard Worker     ptr = p_scr_qmf_real;
757*15dc779aSAndroid Build Coastguard Worker 
758*15dc779aSAndroid Build Coastguard Worker     for (slot = 0; slot < op_delay + no_bins + add_slot; slot++) {
759*15dc779aSAndroid Build Coastguard Worker       p_arr_qmf_buf_real[slot] = ptr;
760*15dc779aSAndroid Build Coastguard Worker       ptr += NO_SYNTHESIS_CHANNELS;
761*15dc779aSAndroid Build Coastguard Worker 
762*15dc779aSAndroid Build Coastguard Worker       if (!low_pow_flag) {
763*15dc779aSAndroid Build Coastguard Worker         p_arr_qmf_buf_imag[slot] = ptr;
764*15dc779aSAndroid Build Coastguard Worker         ptr += NO_SYNTHESIS_CHANNELS;
765*15dc779aSAndroid Build Coastguard Worker       }
766*15dc779aSAndroid Build Coastguard Worker     }
767*15dc779aSAndroid Build Coastguard Worker 
768*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
769*15dc779aSAndroid Build Coastguard Worker 
770*15dc779aSAndroid Build Coastguard Worker     if (apply_processing) {
771*15dc779aSAndroid Build Coastguard Worker       ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data,
772*15dc779aSAndroid Build Coastguard Worker                                  ptr_frame_data_prev, p_arr_qmf_buf_real,
773*15dc779aSAndroid Build Coastguard Worker                                  p_arr_qmf_buf_imag, low_pow_flag);
774*15dc779aSAndroid Build Coastguard Worker     }
775*15dc779aSAndroid Build Coastguard Worker   }
776*15dc779aSAndroid Build Coastguard Worker 
777*15dc779aSAndroid Build Coastguard Worker   if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) && ptr_header_data->enh_sbr) {
778*15dc779aSAndroid Build Coastguard Worker     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
779*15dc779aSAndroid Build Coastguard Worker     WORD32 frame_move = 9 * num_anal_bands;
780*15dc779aSAndroid Build Coastguard Worker     WORD32 core_frame_size = ptr_header_data->core_frame_size;
781*15dc779aSAndroid Build Coastguard Worker 
782*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_sbr_dec->core_sample_buf[core_frame_size],
783*15dc779aSAndroid Build Coastguard Worker            &ptr_sbr_dec->time_sample_buf[core_frame_size - frame_move],
784*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(FLOAT32));
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_sbr_dec->time_sample_buf[frame_move], &ptr_sbr_dec->time_sample_buf[0],
787*15dc779aSAndroid Build Coastguard Worker             (core_frame_size - frame_move));
788*15dc779aSAndroid Build Coastguard Worker 
789*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_sbr_dec->time_sample_buf[0], &ptr_sbr_dec->core_sample_buf[0],
790*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(FLOAT32));
791*15dc779aSAndroid Build Coastguard Worker 
792*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_sbr_dec->core_sample_buf[0], &ptr_sbr_dec->core_sample_buf[core_frame_size],
793*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(FLOAT32));
794*15dc779aSAndroid Build Coastguard Worker   }
795*15dc779aSAndroid Build Coastguard Worker   if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) &&
796*15dc779aSAndroid Build Coastguard Worker     !ptr_header_data->enh_sbr) {
797*15dc779aSAndroid Build Coastguard Worker     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
798*15dc779aSAndroid Build Coastguard Worker     WORD32 frame_move = 9 * num_anal_bands;
799*15dc779aSAndroid Build Coastguard Worker     WORD32 core_frame_size = ptr_header_data->core_frame_size;
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_sbr_dec->core_sample_buf_sbr[core_frame_size],
802*15dc779aSAndroid Build Coastguard Worker            &ptr_time_data[core_frame_size - frame_move],
803*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(WORD16));
804*15dc779aSAndroid Build Coastguard Worker 
805*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_time_data[frame_move], &ptr_time_data[0],
806*15dc779aSAndroid Build Coastguard Worker             (core_frame_size - frame_move));
807*15dc779aSAndroid Build Coastguard Worker 
808*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_time_data[0], &ptr_sbr_dec->core_sample_buf_sbr[0],
809*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(WORD16));
810*15dc779aSAndroid Build Coastguard Worker 
811*15dc779aSAndroid Build Coastguard Worker     memcpy(&ptr_sbr_dec->core_sample_buf_sbr[0],
812*15dc779aSAndroid Build Coastguard Worker            &ptr_sbr_dec->core_sample_buf_sbr[core_frame_size],
813*15dc779aSAndroid Build Coastguard Worker            frame_move * sizeof(WORD16));
814*15dc779aSAndroid Build Coastguard Worker   }
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker   if ((audio_object_type != AOT_ER_AAC_ELD) &&
817*15dc779aSAndroid Build Coastguard Worker       (audio_object_type != AOT_ER_AAC_LD) &&
818*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->enh_sbr) {
819*15dc779aSAndroid Build Coastguard Worker     WORD32 codec_x_delay = 0;
820*15dc779aSAndroid Build Coastguard Worker 
821*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag || !usac_flag) {
822*15dc779aSAndroid Build Coastguard Worker       codec_x_delay = esbr_hbe_delay_offsets;
823*15dc779aSAndroid Build Coastguard Worker     }
824*15dc779aSAndroid Build Coastguard Worker     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
825*15dc779aSAndroid Build Coastguard Worker       codec_x_delay = 2 * codec_x_delay;
826*15dc779aSAndroid Build Coastguard Worker     }
827*15dc779aSAndroid Build Coastguard Worker     /* fixed decoder delay for bitstreams with SBR 4:1 and stereoConfigIndex 3
828*15dc779aSAndroid Build Coastguard Worker      */
829*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->num_time_slots != 15) {
830*15dc779aSAndroid Build Coastguard Worker       if (mps_sbr_flag) op_delay = MPS_SBR_DELAY;
831*15dc779aSAndroid Build Coastguard Worker     } else {
832*15dc779aSAndroid Build Coastguard Worker       if (mps_sbr_flag) op_delay = MPS_SBR_DELAY_960;
833*15dc779aSAndroid Build Coastguard Worker     }
834*15dc779aSAndroid Build Coastguard Worker 
835*15dc779aSAndroid Build Coastguard Worker     {
836*15dc779aSAndroid Build Coastguard Worker     memmove(
837*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->qmf_buf_real[0][0],
838*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec
839*15dc779aSAndroid Build Coastguard Worker              ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
840*15dc779aSAndroid Build Coastguard Worker         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker     memmove(
843*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->qmf_buf_imag[0][0],
844*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec
845*15dc779aSAndroid Build Coastguard Worker              ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
846*15dc779aSAndroid Build Coastguard Worker         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
847*15dc779aSAndroid Build Coastguard Worker 
848*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
849*15dc779aSAndroid Build Coastguard Worker             &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
850*15dc779aSAndroid Build Coastguard Worker                                                .num_time_slots][0],
851*15dc779aSAndroid Build Coastguard Worker             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
852*15dc779aSAndroid Build Coastguard Worker 
853*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
854*15dc779aSAndroid Build Coastguard Worker             &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
855*15dc779aSAndroid Build Coastguard Worker                                                .num_time_slots][0],
856*15dc779aSAndroid Build Coastguard Worker             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
857*15dc779aSAndroid Build Coastguard Worker 
858*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag) {
859*15dc779aSAndroid Build Coastguard Worker       memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
860*15dc779aSAndroid Build Coastguard Worker               &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
861*15dc779aSAndroid Build Coastguard Worker                                                   .num_time_slots][0],
862*15dc779aSAndroid Build Coastguard Worker               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
863*15dc779aSAndroid Build Coastguard Worker 
864*15dc779aSAndroid Build Coastguard Worker       memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
865*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_imag +
866*15dc779aSAndroid Build Coastguard Worker                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
867*15dc779aSAndroid Build Coastguard Worker               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
868*15dc779aSAndroid Build Coastguard Worker         if (!usac_flag) {
869*15dc779aSAndroid Build Coastguard Worker           WORD32 qmf_sb_prev = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
870*15dc779aSAndroid Build Coastguard Worker           for (i = SBR_HF_ADJ_OFFSET; i < op_delay + SBR_HF_ADJ_OFFSET; ++i) {
871*15dc779aSAndroid Build Coastguard Worker             memset(&ptr_sbr_dec->qmf_buf_real[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
872*15dc779aSAndroid Build Coastguard Worker             memset(&ptr_sbr_dec->qmf_buf_imag[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
873*15dc779aSAndroid Build Coastguard Worker           }
874*15dc779aSAndroid Build Coastguard Worker         }
875*15dc779aSAndroid Build Coastguard Worker       }
876*15dc779aSAndroid Build Coastguard Worker     }
877*15dc779aSAndroid Build Coastguard Worker     ixheaacd_esbr_analysis_filt_block(
878*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec, sbr_tables_ptr,
879*15dc779aSAndroid Build Coastguard Worker         op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag && apply_processing) {
882*15dc779aSAndroid Build Coastguard Worker       if (dft_hbe_flag == 1) {
883*15dc779aSAndroid Build Coastguard Worker         WORD32 err_code = 0;
884*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->p_hbe_txposer->oversampling_flag =
885*15dc779aSAndroid Build Coastguard Worker             ptr_frame_data->over_sampling_flag;
886*15dc779aSAndroid Build Coastguard Worker         err_code = ixheaacd_dft_hbe_apply(
887*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->p_hbe_txposer,
888*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
889*15dc779aSAndroid Build Coastguard Worker           esbr_hbe_delay_offsets,
890*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
891*15dc779aSAndroid Build Coastguard Worker           esbr_hbe_delay_offsets,
892*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
893*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
894*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
895*15dc779aSAndroid Build Coastguard Worker           ptr_frame_data->pitch_in_bins, (FLOAT32 *)ptr_work_buf_core);
896*15dc779aSAndroid Build Coastguard Worker         if (err_code) return err_code;
897*15dc779aSAndroid Build Coastguard Worker       } else {
898*15dc779aSAndroid Build Coastguard Worker           WORD32 err_code = ixheaacd_qmf_hbe_apply(
899*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->p_hbe_txposer,
900*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
901*15dc779aSAndroid Build Coastguard Worker               esbr_hbe_delay_offsets,
902*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
903*15dc779aSAndroid Build Coastguard Worker               esbr_hbe_delay_offsets,
904*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
905*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
906*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
907*15dc779aSAndroid Build Coastguard Worker               ptr_frame_data->pitch_in_bins, ptr_header_data);
908*15dc779aSAndroid Build Coastguard Worker           if (err_code) return err_code;
909*15dc779aSAndroid Build Coastguard Worker 
910*15dc779aSAndroid Build Coastguard Worker         if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
911*15dc779aSAndroid Build Coastguard Worker           ixheaacd_hbe_repl_spec(
912*15dc779aSAndroid Build Coastguard Worker               &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
913*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
914*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
915*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
916*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->p_hbe_txposer->max_stretch);
917*15dc779aSAndroid Build Coastguard Worker         }
918*15dc779aSAndroid Build Coastguard Worker       }
919*15dc779aSAndroid Build Coastguard Worker     }
920*15dc779aSAndroid Build Coastguard Worker     if (!mps_sbr_flag && apply_processing) {
921*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaacd_generate_hf(ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
922*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
923*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
924*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
925*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
926*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
927*15dc779aSAndroid Build Coastguard Worker                                       ptr_frame_data, ptr_header_data, ldmps_present,
928*15dc779aSAndroid Build Coastguard Worker                                       ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
929*15dc779aSAndroid Build Coastguard Worker       if (err_code) return err_code;
930*15dc779aSAndroid Build Coastguard Worker 
931*15dc779aSAndroid Build Coastguard Worker       ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
932*15dc779aSAndroid Build Coastguard Worker 
933*15dc779aSAndroid Build Coastguard Worker       if (sbr_mode == PVC_SBR) {
934*15dc779aSAndroid Build Coastguard Worker         ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
935*15dc779aSAndroid Build Coastguard Worker         if (ec_flag) {
936*15dc779aSAndroid Build Coastguard Worker           ptr_pvc_data->pvc_mode = 1;
937*15dc779aSAndroid Build Coastguard Worker         }
938*15dc779aSAndroid Build Coastguard Worker         err_code = ixheaacd_pvc_process(
939*15dc779aSAndroid Build Coastguard Worker             ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
940*15dc779aSAndroid Build Coastguard Worker             ptr_frame_data->str_pvc_frame_info.border_vec[0],
941*15dc779aSAndroid Build Coastguard Worker             &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]);
942*15dc779aSAndroid Build Coastguard Worker 
943*15dc779aSAndroid Build Coastguard Worker         if (err_code) return err_code;
944*15dc779aSAndroid Build Coastguard Worker 
945*15dc779aSAndroid Build Coastguard Worker         ptr_pvc_data->prev_pvc_flg = 1;
946*15dc779aSAndroid Build Coastguard Worker       } else {
947*15dc779aSAndroid Build Coastguard Worker         memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
948*15dc779aSAndroid Build Coastguard Worker         ptr_pvc_data->prev_pvc_flg = 0;
949*15dc779aSAndroid Build Coastguard Worker       }
950*15dc779aSAndroid Build Coastguard Worker 
951*15dc779aSAndroid Build Coastguard Worker       ptr_pvc_data->prev_first_bnd_idx =
952*15dc779aSAndroid Build Coastguard Worker           ptr_header_data->pstr_freq_band_data->sub_band_start;
953*15dc779aSAndroid Build Coastguard Worker       ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate;
954*15dc779aSAndroid Build Coastguard Worker 
955*15dc779aSAndroid Build Coastguard Worker       ptr_frame_data->pstr_sbr_header = ptr_header_data;
956*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaacd_sbr_env_calc(
957*15dc779aSAndroid Build Coastguard Worker           ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
958*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
959*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
960*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
961*15dc779aSAndroid Build Coastguard Worker           (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
962*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present, ec_flag);
963*15dc779aSAndroid Build Coastguard Worker 
964*15dc779aSAndroid Build Coastguard Worker       if (err_code) return err_code;
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker     } else {
967*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < 64; i++) {
968*15dc779aSAndroid Build Coastguard Worker         memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
969*15dc779aSAndroid Build Coastguard Worker         memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
970*15dc779aSAndroid Build Coastguard Worker       }
971*15dc779aSAndroid Build Coastguard Worker     }
972*15dc779aSAndroid Build Coastguard Worker 
973*15dc779aSAndroid Build Coastguard Worker     if (!mps_sbr_flag) {
974*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->band_count =
975*15dc779aSAndroid Build Coastguard Worker           ptr_header_data->pstr_freq_band_data->sub_band_end;
976*15dc779aSAndroid Build Coastguard Worker     } else
977*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
978*15dc779aSAndroid Build Coastguard Worker 
979*15dc779aSAndroid Build Coastguard Worker     ixheaacd_esbr_synthesis_filt_block(
980*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
981*15dc779aSAndroid Build Coastguard Worker         pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
982*15dc779aSAndroid Build Coastguard Worker         mps_sbr_flag, ch_fac,
983*15dc779aSAndroid Build Coastguard Worker         ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
984*15dc779aSAndroid Build Coastguard Worker         0, ptr_ps_dec, drc_on, drc_sbr_factors);
985*15dc779aSAndroid Build Coastguard Worker 
986*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->enh_sbr_ps || ptr_header_data->channel_mode == PS_STEREO) {
987*15dc779aSAndroid Build Coastguard Worker       pp_qmf_buf_real = ptr_ps_dec->pp_qmf_buf_real[1];
988*15dc779aSAndroid Build Coastguard Worker       pp_qmf_buf_imag = ptr_ps_dec->pp_qmf_buf_imag[1];
989*15dc779aSAndroid Build Coastguard Worker       ixheaacd_esbr_synthesis_filt_block(
990*15dc779aSAndroid Build Coastguard Worker           (ia_sbr_dec_struct *)
991*15dc779aSAndroid Build Coastguard Worker           (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_channel[1]->str_sbr_dec)),
992*15dc779aSAndroid Build Coastguard Worker           (ia_sbr_header_data_struct *)
993*15dc779aSAndroid Build Coastguard Worker           (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_header[1])),
994*15dc779aSAndroid Build Coastguard Worker           (ia_sbr_frame_info_data_struct *)
995*15dc779aSAndroid Build Coastguard Worker           (&(((ia_handle_sbr_dec_inst_struct)self)->frame_buffer[1])), apply_processing,
996*15dc779aSAndroid Build Coastguard Worker           pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
997*15dc779aSAndroid Build Coastguard Worker           mps_sbr_flag, ch_fac,
998*15dc779aSAndroid Build Coastguard Worker           ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
999*15dc779aSAndroid Build Coastguard Worker           1, ptr_ps_dec, drc_on, drc_sbr_factors);
1000*15dc779aSAndroid Build Coastguard Worker     }
1001*15dc779aSAndroid Build Coastguard Worker     if (apply_processing && ec_flag) {
1002*15dc779aSAndroid Build Coastguard Worker       WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
1003*15dc779aSAndroid Build Coastguard Worker       ptr_frame_data_prev->end_position =
1004*15dc779aSAndroid Build Coastguard Worker           border_vec[ptr_frame_data->str_frame_info_details.num_env];
1005*15dc779aSAndroid Build Coastguard Worker     }
1006*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data->prev_sbr_mode = sbr_mode;
1007*15dc779aSAndroid Build Coastguard Worker 
1008*15dc779aSAndroid Build Coastguard Worker     return 0;
1009*15dc779aSAndroid Build Coastguard Worker   }
1010*15dc779aSAndroid Build Coastguard Worker 
1011*15dc779aSAndroid Build Coastguard Worker   if (ldmps_present) {
1012*15dc779aSAndroid Build Coastguard Worker     if (ptr_sbr_dec->str_codec_qmf_bank.no_channels > 32) {
1013*15dc779aSAndroid Build Coastguard Worker       if (ec_flag) {
1014*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_codec_qmf_bank.no_channels = 32;
1015*15dc779aSAndroid Build Coastguard Worker       } else {
1016*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
1017*15dc779aSAndroid Build Coastguard Worker       }
1018*15dc779aSAndroid Build Coastguard Worker     }
1019*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cplx_anal_qmffilt_32(
1020*15dc779aSAndroid Build Coastguard Worker         (WORD32 *)ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact,
1021*15dc779aSAndroid Build Coastguard Worker         &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay],
1022*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr,
1023*15dc779aSAndroid Build Coastguard Worker         ch_fac, 1);
1024*15dc779aSAndroid Build Coastguard Worker   } else {
1025*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cplx_anal_qmffilt(
1026*15dc779aSAndroid Build Coastguard Worker         ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, &p_arr_qmf_buf_real[op_delay],
1027*15dc779aSAndroid Build Coastguard Worker         &p_arr_qmf_buf_imag[op_delay], &ptr_sbr_dec->str_codec_qmf_bank,
1028*15dc779aSAndroid Build Coastguard Worker         sbr_tables_ptr->qmf_dec_tables_ptr, ch_fac, low_pow_flag, audio_object_type);
1029*15dc779aSAndroid Build Coastguard Worker   }
1030*15dc779aSAndroid Build Coastguard Worker 
1031*15dc779aSAndroid Build Coastguard Worker   if (ldmps_present == 1) {
1032*15dc779aSAndroid Build Coastguard Worker     for (j = SBR_HF_ADJ_OFFSET;
1033*15dc779aSAndroid Build Coastguard Worker          j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + SBR_HF_ADJ_OFFSET;
1034*15dc779aSAndroid Build Coastguard Worker          j++) {
1035*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 64; k++) {
1036*15dc779aSAndroid Build Coastguard Worker         WORD32 scale = 7;
1037*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_real[j][k] = 0.0f;
1038*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_imag[j][k] = 0.0f;
1039*15dc779aSAndroid Build Coastguard Worker         if (k < ptr_sbr_dec->str_codec_qmf_bank.usb) {
1040*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
1041*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(p_arr_qmf_buf_real[j][k] / (FLOAT32)(1 << scale));
1042*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
1043*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(p_arr_qmf_buf_imag[j][k] / (FLOAT32)(1 << scale));
1044*15dc779aSAndroid Build Coastguard Worker         }
1045*15dc779aSAndroid Build Coastguard Worker       }
1046*15dc779aSAndroid Build Coastguard Worker     }
1047*15dc779aSAndroid Build Coastguard Worker   }
1048*15dc779aSAndroid Build Coastguard Worker   /*ITTIAM : the size of real and img coeff are not same as that of the mps
1049*15dc779aSAndroid Build Coastguard Worker    * analysis.*/
1050*15dc779aSAndroid Build Coastguard Worker   {
1051*15dc779aSAndroid Build Coastguard Worker     WORD shift1, shift2;
1052*15dc779aSAndroid Build Coastguard Worker     WORD min_shift;
1053*15dc779aSAndroid Build Coastguard Worker     WORD shift_over;
1054*15dc779aSAndroid Build Coastguard Worker     WORD reserve_ov1, reserve_ov2;
1055*15dc779aSAndroid Build Coastguard Worker     WORD reservea[2];
1056*15dc779aSAndroid Build Coastguard Worker     WORD i = 0;
1057*15dc779aSAndroid Build Coastguard Worker     WORD usb = ptr_sbr_dec->str_codec_qmf_bank.usb;
1058*15dc779aSAndroid Build Coastguard Worker     WORD iter_val = 1;
1059*15dc779aSAndroid Build Coastguard Worker     if (audio_object_type == AOT_ER_AAC_ELD ||
1060*15dc779aSAndroid Build Coastguard Worker         audio_object_type == AOT_ER_AAC_LD) {
1061*15dc779aSAndroid Build Coastguard Worker       iter_val = 0;
1062*15dc779aSAndroid Build Coastguard Worker     }
1063*15dc779aSAndroid Build Coastguard Worker     do {
1064*15dc779aSAndroid Build Coastguard Worker       WORD t1 = op_delay;
1065*15dc779aSAndroid Build Coastguard Worker       WORD t2 = no_bins + op_delay;
1066*15dc779aSAndroid Build Coastguard Worker       if (i) {
1067*15dc779aSAndroid Build Coastguard Worker         t1 = 0;
1068*15dc779aSAndroid Build Coastguard Worker         t2 = op_delay;
1069*15dc779aSAndroid Build Coastguard Worker       }
1070*15dc779aSAndroid Build Coastguard Worker       reservea[i] = (*ixheaacd_ixheaacd_expsubbandsamples)(
1071*15dc779aSAndroid Build Coastguard Worker           p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, t1, t2, low_pow_flag);
1072*15dc779aSAndroid Build Coastguard Worker       i++;
1073*15dc779aSAndroid Build Coastguard Worker     } while (i <= iter_val);
1074*15dc779aSAndroid Build Coastguard Worker     ;
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker     reserve = reservea[0];
1077*15dc779aSAndroid Build Coastguard Worker     if (audio_object_type != AOT_ER_AAC_ELD &&
1078*15dc779aSAndroid Build Coastguard Worker         audio_object_type != AOT_ER_AAC_LD)
1079*15dc779aSAndroid Build Coastguard Worker       reserve_ov1 = reservea[1];
1080*15dc779aSAndroid Build Coastguard Worker     else
1081*15dc779aSAndroid Build Coastguard Worker       reserve_ov1 = reserve;
1082*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_dec->max_samp_val = ixheaac_min32(reserve, reserve_ov1);
1083*15dc779aSAndroid Build Coastguard Worker 
1084*15dc779aSAndroid Build Coastguard Worker     reserve_ov2 = (*ixheaacd_ixheaacd_expsubbandsamples)(
1085*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
1086*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 0, usb, 0,
1087*15dc779aSAndroid Build Coastguard Worker         LPC_ORDER, low_pow_flag);
1088*15dc779aSAndroid Build Coastguard Worker 
1089*15dc779aSAndroid Build Coastguard Worker     reserve_ov1 = ixheaac_min32(reserve_ov1, reserve_ov2);
1090*15dc779aSAndroid Build Coastguard Worker 
1091*15dc779aSAndroid Build Coastguard Worker     shift1 = ptr_sbr_dec->str_sbr_scale_fact.lb_scale + reserve;
1092*15dc779aSAndroid Build Coastguard Worker 
1093*15dc779aSAndroid Build Coastguard Worker     shift2 = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale + reserve_ov1;
1094*15dc779aSAndroid Build Coastguard Worker     min_shift = ixheaac_min32(shift1, shift2);
1095*15dc779aSAndroid Build Coastguard Worker     shift_over = (shift2 - min_shift);
1096*15dc779aSAndroid Build Coastguard Worker     reserve -= (shift1 - min_shift);
1097*15dc779aSAndroid Build Coastguard Worker 
1098*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale += (reserve_ov1 - shift_over);
1099*15dc779aSAndroid Build Coastguard Worker 
1100*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 0,
1101*15dc779aSAndroid Build Coastguard Worker                              op_delay, reserve_ov1 - shift_over, low_pow_flag);
1102*15dc779aSAndroid Build Coastguard Worker 
1103*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb,
1104*15dc779aSAndroid Build Coastguard Worker                              op_delay, (no_bins + op_delay), reserve,
1105*15dc779aSAndroid Build Coastguard Worker                              low_pow_flag);
1106*15dc779aSAndroid Build Coastguard Worker 
1107*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_adjust_scale)(ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
1108*15dc779aSAndroid Build Coastguard Worker                              ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag,
1109*15dc779aSAndroid Build Coastguard Worker                              0, usb, 0, LPC_ORDER, reserve_ov1 - shift_over,
1110*15dc779aSAndroid Build Coastguard Worker                              low_pow_flag);
1111*15dc779aSAndroid Build Coastguard Worker 
1112*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_dec->str_sbr_scale_fact.lb_scale += reserve;
1113*15dc779aSAndroid Build Coastguard Worker 
1114*15dc779aSAndroid Build Coastguard Worker     save_lb_scale = ptr_sbr_dec->str_sbr_scale_fact.lb_scale;
1115*15dc779aSAndroid Build Coastguard Worker   }
1116*15dc779aSAndroid Build Coastguard Worker 
1117*15dc779aSAndroid Build Coastguard Worker   {
1118*15dc779aSAndroid Build Coastguard Worker     WORD32 num = no_bins;
1119*15dc779aSAndroid Build Coastguard Worker     WORD32 *p_loc_qmf_real =
1120*15dc779aSAndroid Build Coastguard Worker         &p_arr_qmf_buf_real[op_delay][NO_ANALYSIS_CHANNELS];
1121*15dc779aSAndroid Build Coastguard Worker 
1122*15dc779aSAndroid Build Coastguard Worker     if (!low_pow_flag) {
1123*15dc779aSAndroid Build Coastguard Worker       num = num << 1;
1124*15dc779aSAndroid Build Coastguard Worker     }
1125*15dc779aSAndroid Build Coastguard Worker 
1126*15dc779aSAndroid Build Coastguard Worker     ixheaacd_clr_subsamples(p_loc_qmf_real, num - 1, (NO_SYN_ANA_CHANNELS));
1127*15dc779aSAndroid Build Coastguard Worker   }
1128*15dc779aSAndroid Build Coastguard Worker 
1129*15dc779aSAndroid Build Coastguard Worker   if (apply_processing) {
1130*15dc779aSAndroid Build Coastguard Worker     WORD16 degree_alias[NO_SYNTHESIS_CHANNELS];
1131*15dc779aSAndroid Build Coastguard Worker     WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
1132*15dc779aSAndroid Build Coastguard Worker 
1133*15dc779aSAndroid Build Coastguard Worker     if (low_pow_flag) {
1134*15dc779aSAndroid Build Coastguard Worker       memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16));
1135*15dc779aSAndroid Build Coastguard Worker     }
1136*15dc779aSAndroid Build Coastguard Worker 
1137*15dc779aSAndroid Build Coastguard Worker     if (low_pow_flag) {
1138*15dc779aSAndroid Build Coastguard Worker       WORD32 com_low_band_scale;
1139*15dc779aSAndroid Build Coastguard Worker       ixheaacd_low_pow_hf_generator(
1140*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->str_hf_generator, p_arr_qmf_buf_real, degree_alias,
1141*15dc779aSAndroid Build Coastguard Worker           border_vec[0] * ptr_header_data->time_step,
1142*15dc779aSAndroid Build Coastguard Worker           ptr_header_data->time_step *
1143*15dc779aSAndroid Build Coastguard Worker               ixheaac_sub16_sat(
1144*15dc779aSAndroid Build Coastguard Worker                   border_vec[ptr_frame_data->str_frame_info_details.num_env],
1145*15dc779aSAndroid Build Coastguard Worker                   ptr_header_data->num_time_slots),
1146*15dc779aSAndroid Build Coastguard Worker           ptr_header_data->pstr_freq_band_data->num_if_bands,
1147*15dc779aSAndroid Build Coastguard Worker           ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
1148*15dc779aSAndroid Build Coastguard Worker           ptr_frame_data_prev->sbr_invf_mode, ptr_sbr_dec->max_samp_val,
1149*15dc779aSAndroid Build Coastguard Worker           ptr_work_buf_core);
1150*15dc779aSAndroid Build Coastguard Worker 
1151*15dc779aSAndroid Build Coastguard Worker       com_low_band_scale =
1152*15dc779aSAndroid Build Coastguard Worker           ixheaac_min32(ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale,
1153*15dc779aSAndroid Build Coastguard Worker                          ptr_sbr_dec->str_sbr_scale_fact.lb_scale);
1154*15dc779aSAndroid Build Coastguard Worker 
1155*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->str_sbr_scale_fact.hb_scale =
1156*15dc779aSAndroid Build Coastguard Worker           (WORD16)(com_low_band_scale - 2);
1157*15dc779aSAndroid Build Coastguard Worker     } else {
1158*15dc779aSAndroid Build Coastguard Worker       if (ldmps_present == 1) {
1159*15dc779aSAndroid Build Coastguard Worker         err_code = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + (SBR_HF_ADJ_OFFSET),
1160*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->mps_qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
1161*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
1162*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
1163*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
1164*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
1165*15dc779aSAndroid Build Coastguard Worker                                         ptr_frame_data, ptr_header_data, ldmps_present,
1166*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
1167*15dc779aSAndroid Build Coastguard Worker         if (err_code) return err_code;
1168*15dc779aSAndroid Build Coastguard Worker       } else {
1169*15dc779aSAndroid Build Coastguard Worker         ixheaacd_hf_generator(
1170*15dc779aSAndroid Build Coastguard Worker             &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact,
1171*15dc779aSAndroid Build Coastguard Worker             p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step,
1172*15dc779aSAndroid Build Coastguard Worker             border_vec[0],
1173*15dc779aSAndroid Build Coastguard Worker             ixheaac_sub16_sat(
1174*15dc779aSAndroid Build Coastguard Worker                 border_vec[ptr_frame_data->str_frame_info_details.num_env],
1175*15dc779aSAndroid Build Coastguard Worker                 ptr_header_data->num_time_slots),
1176*15dc779aSAndroid Build Coastguard Worker             ptr_header_data->pstr_freq_band_data->num_if_bands,
1177*15dc779aSAndroid Build Coastguard Worker             ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
1178*15dc779aSAndroid Build Coastguard Worker             ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core,
1179*15dc779aSAndroid Build Coastguard Worker             audio_object_type);
1180*15dc779aSAndroid Build Coastguard Worker       }
1181*15dc779aSAndroid Build Coastguard Worker     }
1182*15dc779aSAndroid Build Coastguard Worker     if (ldmps_present == 1) {
1183*15dc779aSAndroid Build Coastguard Worker       ptr_frame_data->pstr_sbr_header = ptr_header_data;
1184*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaacd_sbr_env_calc(
1185*15dc779aSAndroid Build Coastguard Worker           ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
1186*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
1187*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
1188*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, ptr_sbr_dec->scratch_buff,
1189*15dc779aSAndroid Build Coastguard Worker           pvc_dec_out_buf, ldmps_present, ec_flag);
1190*15dc779aSAndroid Build Coastguard Worker 
1191*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + 2; j++) {
1192*15dc779aSAndroid Build Coastguard Worker         for (k = ptr_sbr_dec->str_codec_qmf_bank.usb; k < 64; k++) {
1193*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
1194*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->sbr_qmf_out_real[j][k];
1195*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
1196*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->sbr_qmf_out_imag[j][k];
1197*15dc779aSAndroid Build Coastguard Worker         }
1198*15dc779aSAndroid Build Coastguard Worker       }
1199*15dc779aSAndroid Build Coastguard Worker     } else {
1200*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaacd_calc_sbrenvelope(
1201*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env,
1202*15dc779aSAndroid Build Coastguard Worker           ptr_header_data, ptr_frame_data, ptr_frame_data_prev,
1203*15dc779aSAndroid Build Coastguard Worker           p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag,
1204*15dc779aSAndroid Build Coastguard Worker           sbr_tables_ptr, pstr_common_tables,
1205*15dc779aSAndroid Build Coastguard Worker           ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)),
1206*15dc779aSAndroid Build Coastguard Worker           audio_object_type);
1207*15dc779aSAndroid Build Coastguard Worker       if (err_code) return err_code;
1208*15dc779aSAndroid Build Coastguard Worker     }
1209*15dc779aSAndroid Build Coastguard Worker 
1210*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode,
1211*15dc779aSAndroid Build Coastguard Worker            ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32));
1212*15dc779aSAndroid Build Coastguard Worker 
1213*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data_prev->coupling_mode = ptr_frame_data->coupling_mode;
1214*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data_prev->max_qmf_subband_aac =
1215*15dc779aSAndroid Build Coastguard Worker         ptr_frame_data->max_qmf_subband_aac;
1216*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data_prev->end_position =
1217*15dc779aSAndroid Build Coastguard Worker         border_vec[ptr_frame_data->str_frame_info_details.num_env];
1218*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data_prev->amp_res = ptr_frame_data->amp_res;
1219*15dc779aSAndroid Build Coastguard Worker   } else {
1220*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_dec->str_sbr_scale_fact.hb_scale = save_lb_scale;
1221*15dc779aSAndroid Build Coastguard Worker   }
1222*15dc779aSAndroid Build Coastguard Worker 
1223*15dc779aSAndroid Build Coastguard Worker   if (!low_pow_flag) {
1224*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < LPC_ORDER; i++) {
1225*15dc779aSAndroid Build Coastguard Worker       WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
1226*15dc779aSAndroid Build Coastguard Worker       WORD32 *p_loc_qmf_imag = &p_arr_qmf_buf_imag[no_bins - LPC_ORDER + i][0];
1227*15dc779aSAndroid Build Coastguard Worker       WORD32 *plpc_filt_states_real =
1228*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
1229*15dc779aSAndroid Build Coastguard Worker       WORD32 *plpc_filt_states_imag =
1230*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[i][0];
1231*15dc779aSAndroid Build Coastguard Worker 
1232*15dc779aSAndroid Build Coastguard Worker       memcpy(plpc_filt_states_real, p_loc_qmf_real,
1233*15dc779aSAndroid Build Coastguard Worker              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1234*15dc779aSAndroid Build Coastguard Worker       memcpy(plpc_filt_states_imag, p_loc_qmf_imag,
1235*15dc779aSAndroid Build Coastguard Worker              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1236*15dc779aSAndroid Build Coastguard Worker     }
1237*15dc779aSAndroid Build Coastguard Worker   } else {
1238*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < LPC_ORDER; i++) {
1239*15dc779aSAndroid Build Coastguard Worker       WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
1240*15dc779aSAndroid Build Coastguard Worker       WORD32 *plpc_filt_states_real =
1241*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
1242*15dc779aSAndroid Build Coastguard Worker       memcpy(plpc_filt_states_real, p_loc_qmf_real,
1243*15dc779aSAndroid Build Coastguard Worker              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1244*15dc779aSAndroid Build Coastguard Worker     }
1245*15dc779aSAndroid Build Coastguard Worker   }
1246*15dc779aSAndroid Build Coastguard Worker 
1247*15dc779aSAndroid Build Coastguard Worker   if (apply_processing && ptr_header_data->channel_mode == PS_STEREO &&
1248*15dc779aSAndroid Build Coastguard Worker       ((audio_object_type != AOT_ER_AAC_ELD) &&
1249*15dc779aSAndroid Build Coastguard Worker        (audio_object_type != AOT_ER_AAC_LD))) {
1250*15dc779aSAndroid Build Coastguard Worker     WORD32 ps_scale;
1251*15dc779aSAndroid Build Coastguard Worker 
1252*15dc779aSAndroid Build Coastguard Worker     ixheaacd_init_ps_scale(ptr_ps_dec, &ptr_sbr_dec->str_sbr_scale_fact);
1253*15dc779aSAndroid Build Coastguard Worker 
1254*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1255*15dc779aSAndroid Build Coastguard Worker                                ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1256*15dc779aSAndroid Build Coastguard Worker                                &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
1257*15dc779aSAndroid Build Coastguard Worker                                &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
1258*15dc779aSAndroid Build Coastguard Worker                                1, 0, sbr_tables_ptr, pstr_common_tables, ch_fac,
1259*15dc779aSAndroid Build Coastguard Worker                                drc_on, drc_sbr_factors, audio_object_type);
1260*15dc779aSAndroid Build Coastguard Worker 
1261*15dc779aSAndroid Build Coastguard Worker     ps_scale = ptr_sbr_dec->str_sbr_scale_fact.ps_scale;
1262*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_sf_r->ov_lb_scale = ps_scale;
1263*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_sf_r->lb_scale = ps_scale;
1264*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_sf_r->hb_scale = ps_scale;
1265*15dc779aSAndroid Build Coastguard Worker 
1266*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1267*15dc779aSAndroid Build Coastguard Worker                                ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1268*15dc779aSAndroid Build Coastguard Worker                                ptr_sbr_sf_r, ptr_time_data + 1,
1269*15dc779aSAndroid Build Coastguard Worker                                ptr_qmf_synth_bank_r, ptr_ps_dec, 0, 0,
1270*15dc779aSAndroid Build Coastguard Worker                                sbr_tables_ptr, pstr_common_tables, ch_fac,
1271*15dc779aSAndroid Build Coastguard Worker                                drc_on, drc_sbr_factors, audio_object_type);
1272*15dc779aSAndroid Build Coastguard Worker   } else {
1273*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1274*15dc779aSAndroid Build Coastguard Worker                                ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1275*15dc779aSAndroid Build Coastguard Worker                                &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
1276*15dc779aSAndroid Build Coastguard Worker                                &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
1277*15dc779aSAndroid Build Coastguard Worker                                0, low_pow_flag, sbr_tables_ptr,
1278*15dc779aSAndroid Build Coastguard Worker                                pstr_common_tables, ch_fac, drc_on,
1279*15dc779aSAndroid Build Coastguard Worker                                drc_sbr_factors, audio_object_type);
1280*15dc779aSAndroid Build Coastguard Worker   }
1281*15dc779aSAndroid Build Coastguard Worker 
1282*15dc779aSAndroid Build Coastguard Worker   {
1283*15dc779aSAndroid Build Coastguard Worker     WORD32 num = op_delay;
1284*15dc779aSAndroid Build Coastguard Worker     if (audio_object_type != AOT_ER_AAC_ELD) {
1285*15dc779aSAndroid Build Coastguard Worker       WORD32 *p_loc_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
1286*15dc779aSAndroid Build Coastguard Worker       WORD32 *p_loc_qmf_real_1 = &p_arr_qmf_buf_real[no_bins][0];
1287*15dc779aSAndroid Build Coastguard Worker       memcpy(p_loc_qmf_real, p_loc_qmf_real_1,
1288*15dc779aSAndroid Build Coastguard Worker              sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
1289*15dc779aSAndroid Build Coastguard Worker     }
1290*15dc779aSAndroid Build Coastguard Worker 
1291*15dc779aSAndroid Build Coastguard Worker     if (!low_pow_flag) {
1292*15dc779aSAndroid Build Coastguard Worker       num = num << 1;
1293*15dc779aSAndroid Build Coastguard Worker     }
1294*15dc779aSAndroid Build Coastguard Worker 
1295*15dc779aSAndroid Build Coastguard Worker     if (ldmps_present == 1) {
1296*15dc779aSAndroid Build Coastguard Worker       memmove(&ptr_sbr_dec->mps_qmf_buf_real[0][0],
1297*15dc779aSAndroid Build Coastguard Worker               &ptr_sbr_dec->mps_qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank
1298*15dc779aSAndroid Build Coastguard Worker                                                  .num_time_slots][0],
1299*15dc779aSAndroid Build Coastguard Worker               SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
1300*15dc779aSAndroid Build Coastguard Worker 
1301*15dc779aSAndroid Build Coastguard Worker       memmove(&ptr_sbr_dec->mps_qmf_buf_imag[0][0],
1302*15dc779aSAndroid Build Coastguard Worker               &ptr_sbr_dec->mps_qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank
1303*15dc779aSAndroid Build Coastguard Worker                                                  .num_time_slots][0],
1304*15dc779aSAndroid Build Coastguard Worker               SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
1305*15dc779aSAndroid Build Coastguard Worker     }
1306*15dc779aSAndroid Build Coastguard Worker   }
1307*15dc779aSAndroid Build Coastguard Worker 
1308*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale;
1309*15dc779aSAndroid Build Coastguard Worker   return 0;
1310*15dc779aSAndroid Build Coastguard Worker }
1311*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_esbr_dec(ia_sbr_dec_struct * ptr_sbr_dec,ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,FLAG apply_processing,FLAG low_pow_flag,ia_sbr_tables_struct * ptr_sbr_tables,WORD ch_fac)1312*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec,
1313*15dc779aSAndroid Build Coastguard Worker                          ia_sbr_header_data_struct *ptr_header_data,
1314*15dc779aSAndroid Build Coastguard Worker                          ia_sbr_frame_info_data_struct *ptr_frame_data,
1315*15dc779aSAndroid Build Coastguard Worker                          FLAG apply_processing, FLAG low_pow_flag,
1316*15dc779aSAndroid Build Coastguard Worker                          ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) {
1317*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1318*15dc779aSAndroid Build Coastguard Worker   WORD32 op_delay;
1319*15dc779aSAndroid Build Coastguard Worker 
1320*15dc779aSAndroid Build Coastguard Worker   WORD32 codec_x_delay = 0;
1321*15dc779aSAndroid Build Coastguard Worker 
1322*15dc779aSAndroid Build Coastguard Worker   FLOAT32 **pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
1323*15dc779aSAndroid Build Coastguard Worker   FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
1324*15dc779aSAndroid Build Coastguard Worker 
1325*15dc779aSAndroid Build Coastguard Worker   WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
1326*15dc779aSAndroid Build Coastguard Worker 
1327*15dc779aSAndroid Build Coastguard Worker   WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
1328*15dc779aSAndroid Build Coastguard Worker   WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx;
1329*15dc779aSAndroid Build Coastguard Worker   WORD32 hbe_flag = ptr_header_data->hbe_flag;
1330*15dc779aSAndroid Build Coastguard Worker   WORD32 sbr_mode = ptr_frame_data->sbr_mode;
1331*15dc779aSAndroid Build Coastguard Worker 
1332*15dc779aSAndroid Build Coastguard Worker   op_delay = 6;
1333*15dc779aSAndroid Build Coastguard Worker   if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1334*15dc779aSAndroid Build Coastguard Worker     op_delay = 2 * 6;
1335*15dc779aSAndroid Build Coastguard Worker   }
1336*15dc779aSAndroid Build Coastguard Worker 
1337*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
1338*15dc779aSAndroid Build Coastguard Worker   {
1339*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag) {
1340*15dc779aSAndroid Build Coastguard Worker       codec_x_delay = 32;
1341*15dc779aSAndroid Build Coastguard Worker     }
1342*15dc779aSAndroid Build Coastguard Worker     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1343*15dc779aSAndroid Build Coastguard Worker       codec_x_delay = 2 * codec_x_delay;
1344*15dc779aSAndroid Build Coastguard Worker     }
1345*15dc779aSAndroid Build Coastguard Worker 
1346*15dc779aSAndroid Build Coastguard Worker     memmove(
1347*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->qmf_buf_real[0][0],
1348*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec
1349*15dc779aSAndroid Build Coastguard Worker              ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
1350*15dc779aSAndroid Build Coastguard Worker         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
1351*15dc779aSAndroid Build Coastguard Worker     memmove(
1352*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec->qmf_buf_imag[0][0],
1353*15dc779aSAndroid Build Coastguard Worker         &ptr_sbr_dec
1354*15dc779aSAndroid Build Coastguard Worker              ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
1355*15dc779aSAndroid Build Coastguard Worker         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
1356*15dc779aSAndroid Build Coastguard Worker 
1357*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
1358*15dc779aSAndroid Build Coastguard Worker             &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
1359*15dc779aSAndroid Build Coastguard Worker                                                .num_time_slots][0],
1360*15dc779aSAndroid Build Coastguard Worker             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
1361*15dc779aSAndroid Build Coastguard Worker     memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
1362*15dc779aSAndroid Build Coastguard Worker             &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
1363*15dc779aSAndroid Build Coastguard Worker                                                .num_time_slots][0],
1364*15dc779aSAndroid Build Coastguard Worker             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
1365*15dc779aSAndroid Build Coastguard Worker 
1366*15dc779aSAndroid Build Coastguard Worker     if (hbe_flag) {
1367*15dc779aSAndroid Build Coastguard Worker       memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
1368*15dc779aSAndroid Build Coastguard Worker               &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
1369*15dc779aSAndroid Build Coastguard Worker                                                   .num_time_slots][0],
1370*15dc779aSAndroid Build Coastguard Worker               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
1371*15dc779aSAndroid Build Coastguard Worker       memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
1372*15dc779aSAndroid Build Coastguard Worker               ptr_sbr_dec->ph_vocod_qmf_imag +
1373*15dc779aSAndroid Build Coastguard Worker                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1374*15dc779aSAndroid Build Coastguard Worker               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
1375*15dc779aSAndroid Build Coastguard Worker     }
1376*15dc779aSAndroid Build Coastguard Worker   }
1377*15dc779aSAndroid Build Coastguard Worker 
1378*15dc779aSAndroid Build Coastguard Worker   ixheaacd_esbr_analysis_filt_block(
1379*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec, ptr_sbr_tables,
1380*15dc779aSAndroid Build Coastguard Worker       op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
1381*15dc779aSAndroid Build Coastguard Worker 
1382*15dc779aSAndroid Build Coastguard Worker   if (hbe_flag) {
1383*15dc779aSAndroid Build Coastguard Worker     WORD32 err = ixheaacd_qmf_hbe_apply(
1384*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->p_hbe_txposer,
1385*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
1386*15dc779aSAndroid Build Coastguard Worker             ESBR_HBE_DELAY_OFFSET,
1387*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
1388*15dc779aSAndroid Build Coastguard Worker             ESBR_HBE_DELAY_OFFSET,
1389*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1390*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
1391*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
1392*15dc779aSAndroid Build Coastguard Worker         ptr_frame_data->pitch_in_bins, ptr_header_data);
1393*15dc779aSAndroid Build Coastguard Worker     if (err) return err;
1394*15dc779aSAndroid Build Coastguard Worker 
1395*15dc779aSAndroid Build Coastguard Worker     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1396*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_repl_spec(
1397*15dc779aSAndroid Build Coastguard Worker           &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
1398*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
1399*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
1400*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1401*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->p_hbe_txposer->max_stretch);
1402*15dc779aSAndroid Build Coastguard Worker     }
1403*15dc779aSAndroid Build Coastguard Worker   }
1404*15dc779aSAndroid Build Coastguard Worker   ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
1405*15dc779aSAndroid Build Coastguard Worker 
1406*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 64; i++) {
1407*15dc779aSAndroid Build Coastguard Worker     memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
1408*15dc779aSAndroid Build Coastguard Worker     memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
1409*15dc779aSAndroid Build Coastguard Worker   }
1410*15dc779aSAndroid Build Coastguard Worker 
1411*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
1412*15dc779aSAndroid Build Coastguard Worker 
1413*15dc779aSAndroid Build Coastguard Worker   ixheaacd_esbr_synthesis_filt_block(
1414*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
1415*15dc779aSAndroid Build Coastguard Worker       pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables,
1416*15dc779aSAndroid Build Coastguard Worker       mps_sbr_flag, ch_fac, 0, 0, NULL, 0, NULL);
1417*15dc779aSAndroid Build Coastguard Worker 
1418*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->prev_sbr_mode = sbr_mode;
1419*15dc779aSAndroid Build Coastguard Worker   return 0;
1420*15dc779aSAndroid Build Coastguard Worker }
1421*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_dec_from_mps(FLOAT32 * p_mps_qmf_output,VOID * p_sbr_dec,VOID * p_sbr_frame,VOID * p_sbr_header,WORD32 ec_flag)1422*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame,
1423*15dc779aSAndroid Build Coastguard Worker                                  VOID *p_sbr_header, WORD32 ec_flag) {
1424*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
1425*15dc779aSAndroid Build Coastguard Worker   ia_sbr_frame_info_data_struct *ptr_frame_data =
1426*15dc779aSAndroid Build Coastguard Worker       (ia_sbr_frame_info_data_struct *)p_sbr_frame;
1427*15dc779aSAndroid Build Coastguard Worker   ia_sbr_header_data_struct *ptr_header_data =
1428*15dc779aSAndroid Build Coastguard Worker       (ia_sbr_header_data_struct *)p_sbr_header;
1429*15dc779aSAndroid Build Coastguard Worker   ia_sbr_dec_struct *ptr_sbr_dec = (ia_sbr_dec_struct *)p_sbr_dec;
1430*15dc779aSAndroid Build Coastguard Worker   ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1431*15dc779aSAndroid Build Coastguard Worker   WORD32 no_bins;
1432*15dc779aSAndroid Build Coastguard Worker   WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
1433*15dc779aSAndroid Build Coastguard Worker   WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET;
1434*15dc779aSAndroid Build Coastguard Worker   WORD32 num_anal_bands = 40;
1435*15dc779aSAndroid Build Coastguard Worker   WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
1436*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
1437*15dc779aSAndroid Build Coastguard Worker 
1438*15dc779aSAndroid Build Coastguard Worker   if (ptr_header_data->is_usf_4) {
1439*15dc779aSAndroid Build Coastguard Worker     op_delay += 6;
1440*15dc779aSAndroid Build Coastguard Worker   }
1441*15dc779aSAndroid Build Coastguard Worker 
1442*15dc779aSAndroid Build Coastguard Worker   num_anal_bands = num_anal_bands - (upsample_ratio_idx << 3);
1443*15dc779aSAndroid Build Coastguard Worker 
1444*15dc779aSAndroid Build Coastguard Worker   if (!mps_sbr_flag) {
1445*15dc779aSAndroid Build Coastguard Worker     return 0;
1446*15dc779aSAndroid Build Coastguard Worker   } else {
1447*15dc779aSAndroid Build Coastguard Worker     ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
1448*15dc779aSAndroid Build Coastguard Worker   }
1449*15dc779aSAndroid Build Coastguard Worker 
1450*15dc779aSAndroid Build Coastguard Worker   no_bins = ptr_header_data->output_framesize / 64;
1451*15dc779aSAndroid Build Coastguard Worker 
1452*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < no_bins; i++) {
1453*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *p_loc_mps_qmf_output =
1454*15dc779aSAndroid Build Coastguard Worker         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
1455*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
1456*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_qmf_buf_real[op_delay + i][k] = *p_loc_mps_qmf_output++;
1457*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_qmf_buf_imag[op_delay + i][k] = *p_loc_mps_qmf_output++;
1458*15dc779aSAndroid Build Coastguard Worker 
1459*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k] =
1460*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1461*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k] =
1462*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1463*15dc779aSAndroid Build Coastguard Worker     }
1464*15dc779aSAndroid Build Coastguard Worker   }
1465*15dc779aSAndroid Build Coastguard Worker 
1466*15dc779aSAndroid Build Coastguard Worker   if (ptr_frame_data->reset_flag) {
1467*15dc779aSAndroid Build Coastguard Worker     WORD32 l;
1468*15dc779aSAndroid Build Coastguard Worker     WORD32 start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
1469*15dc779aSAndroid Build Coastguard Worker     WORD32 end_band = num_anal_bands;
1470*15dc779aSAndroid Build Coastguard Worker     WORD32 start_slot =
1471*15dc779aSAndroid Build Coastguard Worker         SBR_HF_ADJ_OFFSET + ptr_frame_data->rate * p_frame_info->border_vec[0];
1472*15dc779aSAndroid Build Coastguard Worker 
1473*15dc779aSAndroid Build Coastguard Worker     for (l = start_slot; l < op_delay; l++) {
1474*15dc779aSAndroid Build Coastguard Worker       for (k = start_band; k < end_band; k++) {
1475*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
1476*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
1477*15dc779aSAndroid Build Coastguard Worker       }
1478*15dc779aSAndroid Build Coastguard Worker     }
1479*15dc779aSAndroid Build Coastguard Worker 
1480*15dc779aSAndroid Build Coastguard Worker     for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) {
1481*15dc779aSAndroid Build Coastguard Worker       for (k = start_band; k < end_band; k++) {
1482*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
1483*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
1484*15dc779aSAndroid Build Coastguard Worker       }
1485*15dc779aSAndroid Build Coastguard Worker     }
1486*15dc779aSAndroid Build Coastguard Worker   }
1487*15dc779aSAndroid Build Coastguard Worker   ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
1488*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->pstr_freq_band_data->sub_band_start;
1489*15dc779aSAndroid Build Coastguard Worker 
1490*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1491*15dc779aSAndroid Build Coastguard Worker                              ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL,
1492*15dc779aSAndroid Build Coastguard Worker                              ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1493*15dc779aSAndroid Build Coastguard Worker                              ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1494*15dc779aSAndroid Build Coastguard Worker                              ptr_frame_data, ptr_header_data, 0,
1495*15dc779aSAndroid Build Coastguard Worker                              ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
1496*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
1497*15dc779aSAndroid Build Coastguard Worker 
1498*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->pstr_sbr_header = ptr_header_data;
1499*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->sbr_mode = ORIG_SBR;
1500*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->prev_sbr_mode = ORIG_SBR;
1501*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_sbr_env_calc(
1502*15dc779aSAndroid Build Coastguard Worker       ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1503*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1504*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1505*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1506*15dc779aSAndroid Build Coastguard Worker       (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
1507*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_dec->scratch_buff, NULL, 0, ec_flag);
1508*15dc779aSAndroid Build Coastguard Worker 
1509*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
1510*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < no_bins; i++) {
1511*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *p_loc_mps_qmf_output =
1512*15dc779aSAndroid Build Coastguard Worker         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
1513*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
1514*15dc779aSAndroid Build Coastguard Worker       *p_loc_mps_qmf_output++ =
1515*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1516*15dc779aSAndroid Build Coastguard Worker       *p_loc_mps_qmf_output++ =
1517*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
1518*15dc779aSAndroid Build Coastguard Worker     }
1519*15dc779aSAndroid Build Coastguard Worker     for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64;
1520*15dc779aSAndroid Build Coastguard Worker          k++) {
1521*15dc779aSAndroid Build Coastguard Worker       *p_loc_mps_qmf_output++ =
1522*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1523*15dc779aSAndroid Build Coastguard Worker       *p_loc_mps_qmf_output++ =
1524*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
1525*15dc779aSAndroid Build Coastguard Worker     }
1526*15dc779aSAndroid Build Coastguard Worker   }
1527*15dc779aSAndroid Build Coastguard Worker 
1528*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < op_delay; i++) {
1529*15dc779aSAndroid Build Coastguard Worker     memmove(ptr_sbr_dec->mps_qmf_buf_real[i],
1530*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32));
1531*15dc779aSAndroid Build Coastguard Worker 
1532*15dc779aSAndroid Build Coastguard Worker     memmove(ptr_sbr_dec->mps_qmf_buf_imag[i],
1533*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32));
1534*15dc779aSAndroid Build Coastguard Worker 
1535*15dc779aSAndroid Build Coastguard Worker     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i],
1536*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i],
1537*15dc779aSAndroid Build Coastguard Worker             64 * sizeof(FLOAT32));
1538*15dc779aSAndroid Build Coastguard Worker 
1539*15dc779aSAndroid Build Coastguard Worker     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i],
1540*15dc779aSAndroid Build Coastguard Worker             ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i],
1541*15dc779aSAndroid Build Coastguard Worker             64 * sizeof(FLOAT32));
1542*15dc779aSAndroid Build Coastguard Worker   }
1543*15dc779aSAndroid Build Coastguard Worker 
1544*15dc779aSAndroid Build Coastguard Worker   ptr_frame_data->reset_flag = 0;
1545*15dc779aSAndroid Build Coastguard Worker   return err;
1546*15dc779aSAndroid Build Coastguard Worker }
1547