xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_env_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 <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_dec.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #define add16_m(a, b) ((a) + (b))
48*15dc779aSAndroid Build Coastguard Worker #define sub16_m(a, b) ((a) - (b))
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker #define mult16x16_16(a, b) ixheaac_mult16((a), (b))
51*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dequant_esbr_env_data(FLOAT32 * ptr_env_sf,WORD32 num_env_sf,WORD32 num_noise_fac,WORD32 amp_res,FLOAT32 * ptr_noise_floor)52*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_dequant_esbr_env_data(FLOAT32 *ptr_env_sf,
53*15dc779aSAndroid Build Coastguard Worker                                            WORD32 num_env_sf,
54*15dc779aSAndroid Build Coastguard Worker                                            WORD32 num_noise_fac, WORD32 amp_res,
55*15dc779aSAndroid Build Coastguard Worker                                            FLOAT32 *ptr_noise_floor) {
56*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
57*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 array[2] = {0.5f, 1.0f};
58*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a_flt = array[amp_res];
59*15dc779aSAndroid Build Coastguard Worker 
60*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_env_sf; i++) {
61*15dc779aSAndroid Build Coastguard Worker     ptr_env_sf[i] = (FLOAT32)(pow(2, ptr_env_sf[i] * a_flt) * 64);
62*15dc779aSAndroid Build Coastguard Worker   }
63*15dc779aSAndroid Build Coastguard Worker 
64*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_noise_fac; i++) {
65*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp = ptr_noise_floor[i];
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker     temp = NOISE_FLOOR_OFFSET - temp;
68*15dc779aSAndroid Build Coastguard Worker     temp = (FLOAT32)pow(2.0f, temp);
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor[i] = temp;
71*15dc779aSAndroid Build Coastguard Worker   }
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dequant_pvc_env_data(WORD32 num_noise_fac,FLOAT32 * ptr_noise_floor)74*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_dequant_pvc_env_data(WORD32 num_noise_fac,
75*15dc779aSAndroid Build Coastguard Worker                                           FLOAT32 *ptr_noise_floor) {
76*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
77*15dc779aSAndroid Build Coastguard Worker 
78*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_noise_fac; i++) {
79*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp = ptr_noise_floor[i];
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker     temp = NOISE_FLOOR_OFFSET - temp;
82*15dc779aSAndroid Build Coastguard Worker     temp = (FLOAT32)pow(2.0f, temp);
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor[i] = temp;
85*15dc779aSAndroid Build Coastguard Worker   }
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_res_energy(WORD16 curr_val,WORD16 * prev_data,WORD32 ixheaacd_drc_offset,WORD32 index,WORD32 res)88*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_map_res_energy(WORD16 curr_val, WORD16 *prev_data,
89*15dc779aSAndroid Build Coastguard Worker                              WORD32 ixheaacd_drc_offset, WORD32 index,
90*15dc779aSAndroid Build Coastguard Worker                              WORD32 res) {
91*15dc779aSAndroid Build Coastguard Worker   if (res == LOW) {
92*15dc779aSAndroid Build Coastguard Worker     if (ixheaacd_drc_offset >= 0) {
93*15dc779aSAndroid Build Coastguard Worker       if (index < ixheaacd_drc_offset) {
94*15dc779aSAndroid Build Coastguard Worker         prev_data[index] = curr_val;
95*15dc779aSAndroid Build Coastguard Worker       } else {
96*15dc779aSAndroid Build Coastguard Worker         WORD32 index_2;
97*15dc779aSAndroid Build Coastguard Worker         index_2 = ((index + index) - ixheaacd_drc_offset);
98*15dc779aSAndroid Build Coastguard Worker         prev_data[index_2] = curr_val;
99*15dc779aSAndroid Build Coastguard Worker         prev_data[index_2 + 1] = curr_val;
100*15dc779aSAndroid Build Coastguard Worker       }
101*15dc779aSAndroid Build Coastguard Worker     } else {
102*15dc779aSAndroid Build Coastguard Worker       ixheaacd_drc_offset = -(ixheaacd_drc_offset);
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker       if (index < ixheaacd_drc_offset) {
105*15dc779aSAndroid Build Coastguard Worker         WORD32 index_3;
106*15dc779aSAndroid Build Coastguard Worker         index_3 = ((index + index) + index);
107*15dc779aSAndroid Build Coastguard Worker         prev_data[index_3] = curr_val;
108*15dc779aSAndroid Build Coastguard Worker         prev_data[index_3 + 1] = curr_val;
109*15dc779aSAndroid Build Coastguard Worker         prev_data[index_3 + 2] = curr_val;
110*15dc779aSAndroid Build Coastguard Worker       } else {
111*15dc779aSAndroid Build Coastguard Worker         WORD32 index_2;
112*15dc779aSAndroid Build Coastguard Worker         index_2 = ((index + index) + ixheaacd_drc_offset);
113*15dc779aSAndroid Build Coastguard Worker         prev_data[index_2] = curr_val;
114*15dc779aSAndroid Build Coastguard Worker         prev_data[index_2 + 1] = curr_val;
115*15dc779aSAndroid Build Coastguard Worker       }
116*15dc779aSAndroid Build Coastguard Worker     }
117*15dc779aSAndroid Build Coastguard Worker   } else {
118*15dc779aSAndroid Build Coastguard Worker     prev_data[index] = curr_val;
119*15dc779aSAndroid Build Coastguard Worker   }
120*15dc779aSAndroid Build Coastguard Worker }
121*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_process_del_cod_env_data(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data)122*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_process_del_cod_env_data(
123*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
124*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_sbr_data,
125*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_prev_data) {
126*15dc779aSAndroid Build Coastguard Worker   WORD32 i, dtdf_dir, num_sf_bands, band, freq_res;
127*15dc779aSAndroid Build Coastguard Worker   WORD16 temp_val;
128*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_prev_env_sf = ptr_prev_data->sfb_nrg_prev;
129*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_env_sf_float = ptr_sbr_data->flt_env_sf_arr;
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker   WORD32 ixheaacd_drc_offset;
134*15dc779aSAndroid Build Coastguard Worker   band = 0;
135*15dc779aSAndroid Build Coastguard Worker 
136*15dc779aSAndroid Build Coastguard Worker   ixheaacd_drc_offset =
137*15dc779aSAndroid Build Coastguard Worker       ((ptr_header_data->pstr_freq_band_data->num_sf_bands[LOW] << 1) -
138*15dc779aSAndroid Build Coastguard Worker        ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]);
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ptr_sbr_data->str_frame_info_details.num_env; i++) {
141*15dc779aSAndroid Build Coastguard Worker     dtdf_dir = ptr_sbr_data->del_cod_dir_arr[i];
142*15dc779aSAndroid Build Coastguard Worker     freq_res = ptr_sbr_data->str_frame_info_details.freq_res[i];
143*15dc779aSAndroid Build Coastguard Worker 
144*15dc779aSAndroid Build Coastguard Worker     num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands[freq_res];
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker     if (dtdf_dir == DTDF_DIR_FREQ) {
147*15dc779aSAndroid Build Coastguard Worker       ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf, ixheaacd_drc_offset,
148*15dc779aSAndroid Build Coastguard Worker                               0, freq_res);
149*15dc779aSAndroid Build Coastguard Worker       ptr_env_sf++;
150*15dc779aSAndroid Build Coastguard Worker 
151*15dc779aSAndroid Build Coastguard Worker       ptr_env_sf_float++;
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker       for (band = 1; band < num_sf_bands; band++) {
154*15dc779aSAndroid Build Coastguard Worker         *ptr_env_sf = *ptr_env_sf + *(ptr_env_sf - 1);
155*15dc779aSAndroid Build Coastguard Worker         ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf,
156*15dc779aSAndroid Build Coastguard Worker                                 ixheaacd_drc_offset, band, freq_res);
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker         *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
159*15dc779aSAndroid Build Coastguard Worker         ptr_env_sf_float++;
160*15dc779aSAndroid Build Coastguard Worker 
161*15dc779aSAndroid Build Coastguard Worker         ptr_env_sf++;
162*15dc779aSAndroid Build Coastguard Worker       }
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker     } else {
165*15dc779aSAndroid Build Coastguard Worker       if (freq_res == LOW) {
166*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_drc_offset < 0) {
167*15dc779aSAndroid Build Coastguard Worker           WORD32 tar, index_3;
168*15dc779aSAndroid Build Coastguard Worker           ixheaacd_drc_offset = -ixheaacd_drc_offset;
169*15dc779aSAndroid Build Coastguard Worker           tar = ixheaac_min32(ixheaacd_drc_offset, band);
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker           for (band = 0; band < tar; band++) {
172*15dc779aSAndroid Build Coastguard Worker             index_3 = ((band + band) + band);
173*15dc779aSAndroid Build Coastguard Worker             temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]);
174*15dc779aSAndroid Build Coastguard Worker 
175*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_3] = temp_val;
176*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_3 + 1] = temp_val;
177*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_3 + 2] = temp_val;
178*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf++ = temp_val;
179*15dc779aSAndroid Build Coastguard Worker 
180*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf_float = (FLOAT32)temp_val;
181*15dc779aSAndroid Build Coastguard Worker             ptr_env_sf_float++;
182*15dc779aSAndroid Build Coastguard Worker           }
183*15dc779aSAndroid Build Coastguard Worker 
184*15dc779aSAndroid Build Coastguard Worker           for (; band < num_sf_bands; band++) {
185*15dc779aSAndroid Build Coastguard Worker             index_3 = (band << 1) + ixheaacd_drc_offset;
186*15dc779aSAndroid Build Coastguard Worker             temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]);
187*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_3] = temp_val;
188*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_3 + 1] = temp_val;
189*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf++ = temp_val;
190*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf_float = (FLOAT32)temp_val;
191*15dc779aSAndroid Build Coastguard Worker             ptr_env_sf_float++;
192*15dc779aSAndroid Build Coastguard Worker           }
193*15dc779aSAndroid Build Coastguard Worker         } else {
194*15dc779aSAndroid Build Coastguard Worker           WORD32 tar, index_2;
195*15dc779aSAndroid Build Coastguard Worker           WORD16 *ptr2 = ptr_prev_env_sf;
196*15dc779aSAndroid Build Coastguard Worker           tar = ixheaac_min32(ixheaacd_drc_offset, band);
197*15dc779aSAndroid Build Coastguard Worker           for (band = 0; band < tar; band++) {
198*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
199*15dc779aSAndroid Build Coastguard Worker             *ptr2 = *ptr_env_sf;
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
202*15dc779aSAndroid Build Coastguard Worker             ptr_env_sf_float++;
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker             ptr2++;
205*15dc779aSAndroid Build Coastguard Worker             ptr_env_sf++;
206*15dc779aSAndroid Build Coastguard Worker           }
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker           for (; band < num_sf_bands; band++) {
209*15dc779aSAndroid Build Coastguard Worker             index_2 = (band < ixheaacd_drc_offset)
210*15dc779aSAndroid Build Coastguard Worker                           ? band
211*15dc779aSAndroid Build Coastguard Worker                           : ((band << 1) - ixheaacd_drc_offset);
212*15dc779aSAndroid Build Coastguard Worker             temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_2]);
213*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_2] = temp_val;
214*15dc779aSAndroid Build Coastguard Worker             ptr_prev_env_sf[index_2 + 1] = temp_val;
215*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf++ = temp_val;
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker             *ptr_env_sf_float = (FLOAT32)temp_val;
218*15dc779aSAndroid Build Coastguard Worker             ptr_env_sf_float++;
219*15dc779aSAndroid Build Coastguard Worker           }
220*15dc779aSAndroid Build Coastguard Worker         }
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker       } else {
223*15dc779aSAndroid Build Coastguard Worker         WORD16 *ptr2 = ptr_prev_env_sf;
224*15dc779aSAndroid Build Coastguard Worker         for (band = num_sf_bands - 1; band >= 0; band--) {
225*15dc779aSAndroid Build Coastguard Worker           *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
226*15dc779aSAndroid Build Coastguard Worker           *ptr2 = *ptr_env_sf;
227*15dc779aSAndroid Build Coastguard Worker           *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
228*15dc779aSAndroid Build Coastguard Worker           ptr_env_sf_float++;
229*15dc779aSAndroid Build Coastguard Worker           ptr2++;
230*15dc779aSAndroid Build Coastguard Worker           ptr_env_sf++;
231*15dc779aSAndroid Build Coastguard Worker         }
232*15dc779aSAndroid Build Coastguard Worker         band = num_sf_bands;
233*15dc779aSAndroid Build Coastguard Worker       }
234*15dc779aSAndroid Build Coastguard Worker     }
235*15dc779aSAndroid Build Coastguard Worker   }
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32
ixheaacd_wrong_timing_compensate(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data,ixheaacd_misc_tables * pstr_common_tables)239*15dc779aSAndroid Build Coastguard Worker ixheaacd_wrong_timing_compensate(ia_sbr_header_data_struct *ptr_header_data,
240*15dc779aSAndroid Build Coastguard Worker                                  ia_sbr_frame_info_data_struct *ptr_sbr_data,
241*15dc779aSAndroid Build Coastguard Worker                                  ia_sbr_prev_frame_data_struct *ptr_prev_data,
242*15dc779aSAndroid Build Coastguard Worker                                  ixheaacd_misc_tables *pstr_common_tables) {
243*15dc779aSAndroid Build Coastguard Worker   WORD32 i, num_env_sf;
244*15dc779aSAndroid Build Coastguard Worker   ia_frame_info_struct *p_frame_info = &ptr_sbr_data->str_frame_info_details;
245*15dc779aSAndroid Build Coastguard Worker   WORD16 *num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
246*15dc779aSAndroid Build Coastguard Worker   WORD32 start_pos_est;
247*15dc779aSAndroid Build Coastguard Worker   WORD32 ref_len, new_len, shift;
248*15dc779aSAndroid Build Coastguard Worker   WORD16 delta_exp;
249*15dc779aSAndroid Build Coastguard Worker 
250*15dc779aSAndroid Build Coastguard Worker   start_pos_est =
251*15dc779aSAndroid Build Coastguard Worker       (ptr_prev_data->end_position - ptr_header_data->num_time_slots);
252*15dc779aSAndroid Build Coastguard Worker 
253*15dc779aSAndroid Build Coastguard Worker   ref_len = (p_frame_info->border_vec[1] - p_frame_info->border_vec[0]);
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker   new_len = (p_frame_info->border_vec[1] - start_pos_est);
256*15dc779aSAndroid Build Coastguard Worker 
257*15dc779aSAndroid Build Coastguard Worker   if (new_len <= 0) {
258*15dc779aSAndroid Build Coastguard Worker     new_len = ref_len;
259*15dc779aSAndroid Build Coastguard Worker     start_pos_est = p_frame_info->border_vec[0];
260*15dc779aSAndroid Build Coastguard Worker   }
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker   delta_exp = pstr_common_tables->log_dual_is_table[ref_len];
263*15dc779aSAndroid Build Coastguard Worker   delta_exp -= pstr_common_tables->log_dual_is_table[new_len];
264*15dc779aSAndroid Build Coastguard Worker 
265*15dc779aSAndroid Build Coastguard Worker   shift = (SHORT_BITS - ENV_EXP_FRACT - 3 - ptr_sbr_data->amp_res);
266*15dc779aSAndroid Build Coastguard Worker   delta_exp = ixheaac_shr16(delta_exp, (WORD16)shift);
267*15dc779aSAndroid Build Coastguard Worker   p_frame_info->border_vec[0] = start_pos_est;
268*15dc779aSAndroid Build Coastguard Worker   p_frame_info->noise_border_vec[0] = start_pos_est;
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker   if (start_pos_est < 0) return -1;
271*15dc779aSAndroid Build Coastguard Worker 
272*15dc779aSAndroid Build Coastguard Worker   if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
273*15dc779aSAndroid Build Coastguard Worker     num_env_sf =
274*15dc779aSAndroid Build Coastguard Worker         ((p_frame_info->freq_res[0]) ? num_sf_bands[HIGH] : num_sf_bands[LOW]);
275*15dc779aSAndroid Build Coastguard Worker 
276*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_env_sf; i++) {
277*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->int_env_sf_arr[i] =
278*15dc779aSAndroid Build Coastguard Worker           add16_m(ptr_sbr_data->int_env_sf_arr[i], delta_exp);
279*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->flt_env_sf_arr[i] =
280*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(ptr_sbr_data->int_env_sf_arr[i]);
281*15dc779aSAndroid Build Coastguard Worker     }
282*15dc779aSAndroid Build Coastguard Worker   }
283*15dc779aSAndroid Build Coastguard Worker 
284*15dc779aSAndroid Build Coastguard Worker   return 0;
285*15dc779aSAndroid Build Coastguard Worker }
286*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_check_env_data(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data)287*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_check_env_data(ia_sbr_header_data_struct *ptr_header_data,
288*15dc779aSAndroid Build Coastguard Worker                                ia_sbr_frame_info_data_struct *ptr_sbr_data,
289*15dc779aSAndroid Build Coastguard Worker                                ia_sbr_prev_frame_data_struct *ptr_prev_data) {
290*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_evn_sf = ptr_sbr_data->int_env_sf_arr;
291*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_evn_sf_float = ptr_sbr_data->flt_env_sf_arr;
292*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_prev_evn_sf = ptr_prev_data->sfb_nrg_prev;
293*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
294*15dc779aSAndroid Build Coastguard Worker   FLAG error_code = 0;
295*15dc779aSAndroid Build Coastguard Worker   WORD16 sbr_max_env_sf;
296*15dc779aSAndroid Build Coastguard Worker   WORD32 amp_res = ptr_sbr_data->amp_res;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker   sbr_max_env_sf = (SBR_ENV_SF_MAX_VAL_1_5 >> amp_res);
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ptr_sbr_data->num_env_sfac; i++) {
301*15dc779aSAndroid Build Coastguard Worker     if (ptr_evn_sf[i] > sbr_max_env_sf) {
302*15dc779aSAndroid Build Coastguard Worker       error_code = 1;
303*15dc779aSAndroid Build Coastguard Worker     }
304*15dc779aSAndroid Build Coastguard Worker     if (ptr_evn_sf[i] < 0) {
305*15dc779aSAndroid Build Coastguard Worker       ptr_evn_sf[i] = 0;
306*15dc779aSAndroid Build Coastguard Worker       ptr_evn_sf_float[i] = 0;
307*15dc779aSAndroid Build Coastguard Worker     }
308*15dc779aSAndroid Build Coastguard Worker   }
309*15dc779aSAndroid Build Coastguard Worker 
310*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
311*15dc779aSAndroid Build Coastguard Worker        i++) {
312*15dc779aSAndroid Build Coastguard Worker     if (ptr_prev_evn_sf[i] < 0) {
313*15dc779aSAndroid Build Coastguard Worker       ptr_prev_evn_sf[i] = 0;
314*15dc779aSAndroid Build Coastguard Worker     } else {
315*15dc779aSAndroid Build Coastguard Worker       if (ptr_prev_evn_sf[i] > sbr_max_env_sf)
316*15dc779aSAndroid Build Coastguard Worker         ptr_prev_evn_sf[i] = sbr_max_env_sf;
317*15dc779aSAndroid Build Coastguard Worker     }
318*15dc779aSAndroid Build Coastguard Worker   }
319*15dc779aSAndroid Build Coastguard Worker   return (WORD16)(error_code);
320*15dc779aSAndroid Build Coastguard Worker }
321*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct * ptr_sbr_data,WORD32 amp_res)322*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct *ptr_sbr_data,
323*15dc779aSAndroid Build Coastguard Worker                                WORD32 amp_res) {
324*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
325*15dc779aSAndroid Build Coastguard Worker   WORD32 num_env_sf = ptr_sbr_data->num_env_sfac;
326*15dc779aSAndroid Build Coastguard Worker   WORD32 mantissa;
327*15dc779aSAndroid Build Coastguard Worker   WORD32 amp_res_1;
328*15dc779aSAndroid Build Coastguard Worker   WORD32 exponent;
329*15dc779aSAndroid Build Coastguard Worker   WORD32 exp_add = (7 + NRG_EXP_OFFSET);
330*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
331*15dc779aSAndroid Build Coastguard Worker   const WORD32 mant_arr[2] = {0x4000, 0x5a80};
332*15dc779aSAndroid Build Coastguard Worker 
333*15dc779aSAndroid Build Coastguard Worker   amp_res_1 = (1 - amp_res);
334*15dc779aSAndroid Build Coastguard Worker 
335*15dc779aSAndroid Build Coastguard Worker   for (i = num_env_sf - 1; i >= 0; i--) {
336*15dc779aSAndroid Build Coastguard Worker     exponent = *ptr_env_sf;
337*15dc779aSAndroid Build Coastguard Worker     mantissa = mant_arr[(exponent & amp_res_1)];
338*15dc779aSAndroid Build Coastguard Worker     exponent = (exponent >> amp_res_1);
339*15dc779aSAndroid Build Coastguard Worker     exponent = (exponent + exp_add);
340*15dc779aSAndroid Build Coastguard Worker     *ptr_env_sf++ = (WORD16)(mantissa | (exponent & MASK_FOR_EXP));
341*15dc779aSAndroid Build Coastguard Worker   }
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID
ixheaacd_limit_noise_floor_fac(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data)345*15dc779aSAndroid Build Coastguard Worker ixheaacd_limit_noise_floor_fac(ia_sbr_header_data_struct *ptr_header_data,
346*15dc779aSAndroid Build Coastguard Worker                                ia_sbr_frame_info_data_struct *ptr_sbr_data) {
347*15dc779aSAndroid Build Coastguard Worker   WORD32 i, tot_nf_bands;
348*15dc779aSAndroid Build Coastguard Worker   WORD32 value;
349*15dc779aSAndroid Build Coastguard Worker   WORD32 num_nf_bands;
350*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_noise_floor;
351*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_noise_floor_flt;
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker   num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   tot_nf_bands =
356*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->str_frame_info_details.num_noise_env * num_nf_bands;
357*15dc779aSAndroid Build Coastguard Worker 
358*15dc779aSAndroid Build Coastguard Worker   ptr_noise_floor = ptr_sbr_data->int_noise_floor;
359*15dc779aSAndroid Build Coastguard Worker 
360*15dc779aSAndroid Build Coastguard Worker   ptr_noise_floor_flt = &ptr_sbr_data->flt_noise_floor[0];
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker   for (i = tot_nf_bands - 1; i >= 0; i--) {
363*15dc779aSAndroid Build Coastguard Worker     value = *ptr_noise_floor;
364*15dc779aSAndroid Build Coastguard Worker     if (value > MAX_NOISE_FLOOR_FAC_VAL) {
365*15dc779aSAndroid Build Coastguard Worker       *ptr_noise_floor = MAX_NOISE_FLOOR_FAC_VAL;
366*15dc779aSAndroid Build Coastguard Worker       *ptr_noise_floor_flt = MAX_NOISE_FLOOR_FAC_VAL;
367*15dc779aSAndroid Build Coastguard Worker     } else {
368*15dc779aSAndroid Build Coastguard Worker       if (value < MIN_NOISE_FLOOR_FAC_VAL) {
369*15dc779aSAndroid Build Coastguard Worker         *ptr_noise_floor = MIN_NOISE_FLOOR_FAC_VAL;
370*15dc779aSAndroid Build Coastguard Worker         *ptr_noise_floor_flt = MIN_NOISE_FLOOR_FAC_VAL;
371*15dc779aSAndroid Build Coastguard Worker       }
372*15dc779aSAndroid Build Coastguard Worker     }
373*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor++;
374*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor_flt++;
375*15dc779aSAndroid Build Coastguard Worker   }
376*15dc779aSAndroid Build Coastguard Worker }
377*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_add_arr(WORD16 * ptr1,WORD16 * ptr2,WORD32 num)378*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_add_arr(WORD16 *ptr1, WORD16 *ptr2, WORD32 num) {
379*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
380*15dc779aSAndroid Build Coastguard Worker   for (i = num - 1; i >= 0; i--) {
381*15dc779aSAndroid Build Coastguard Worker     *ptr2 = (*ptr2 + *ptr1);
382*15dc779aSAndroid Build Coastguard Worker     ptr2++;
383*15dc779aSAndroid Build Coastguard Worker     ptr1++;
384*15dc779aSAndroid Build Coastguard Worker   }
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_add_farr(FLOAT32 * ptr1,FLOAT32 * ptr2,WORD32 num)387*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_add_farr(FLOAT32 *ptr1, FLOAT32 *ptr2, WORD32 num) {
388*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
389*15dc779aSAndroid Build Coastguard Worker   for (i = num - 1; i >= 0; i--) {
390*15dc779aSAndroid Build Coastguard Worker     *ptr2 = (*ptr2 + *ptr1);
391*15dc779aSAndroid Build Coastguard Worker     ptr2++;
392*15dc779aSAndroid Build Coastguard Worker     ptr1++;
393*15dc779aSAndroid Build Coastguard Worker   }
394*15dc779aSAndroid Build Coastguard Worker }
395*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_calc_noise_floor(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data,WORD32 audio_object_type)396*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_calc_noise_floor(
397*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
398*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_sbr_data,
399*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_prev_data,
400*15dc779aSAndroid Build Coastguard Worker     WORD32 audio_object_type) {
401*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
402*15dc779aSAndroid Build Coastguard Worker   WORD32 num_nf_bands;
403*15dc779aSAndroid Build Coastguard Worker   WORD32 num_noise_env;
404*15dc779aSAndroid Build Coastguard Worker   WORD32 ixheaacd_drc_offset;
405*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_noise_floor = ptr_sbr_data->int_noise_floor;
406*15dc779aSAndroid Build Coastguard Worker 
407*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_prev_noise_floor = ptr_prev_data->prev_noise_level;
408*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr1, *ptr2;
409*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *f_ptr1, *f_ptr2;
410*15dc779aSAndroid Build Coastguard Worker   WORD32 num;
411*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_noise_floor_float = ptr_sbr_data->flt_noise_floor;
412*15dc779aSAndroid Build Coastguard Worker 
413*15dc779aSAndroid Build Coastguard Worker   num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
414*15dc779aSAndroid Build Coastguard Worker   num_noise_env = ptr_sbr_data->str_frame_info_details.num_noise_env;
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker   if (ptr_sbr_data->del_cod_dir_noise_arr[0] == DTDF_DIR_FREQ) {
417*15dc779aSAndroid Build Coastguard Worker     ptr1 = ptr_noise_floor++;
418*15dc779aSAndroid Build Coastguard Worker     ptr2 = ptr_noise_floor;
419*15dc779aSAndroid Build Coastguard Worker     num = num_nf_bands - 1;
420*15dc779aSAndroid Build Coastguard Worker     f_ptr1 = &ptr_noise_floor_float[0];
421*15dc779aSAndroid Build Coastguard Worker     f_ptr2 = &ptr_noise_floor_float[1];
422*15dc779aSAndroid Build Coastguard Worker   } else {
423*15dc779aSAndroid Build Coastguard Worker     ptr1 = ptr_prev_noise_floor;
424*15dc779aSAndroid Build Coastguard Worker     ptr2 = ptr_sbr_data->int_noise_floor;
425*15dc779aSAndroid Build Coastguard Worker     f_ptr1 = &ptr_sbr_data->prev_noise_level[0];
426*15dc779aSAndroid Build Coastguard Worker     f_ptr2 = &ptr_noise_floor_float[0];
427*15dc779aSAndroid Build Coastguard Worker     num = num_nf_bands;
428*15dc779aSAndroid Build Coastguard Worker   }
429*15dc779aSAndroid Build Coastguard Worker 
430*15dc779aSAndroid Build Coastguard Worker   ixheaacd_add_arr(ptr1, ptr2, num);
431*15dc779aSAndroid Build Coastguard Worker   ixheaacd_add_farr(f_ptr1, f_ptr2, num);
432*15dc779aSAndroid Build Coastguard Worker 
433*15dc779aSAndroid Build Coastguard Worker   if (num_noise_env > 1) {
434*15dc779aSAndroid Build Coastguard Worker     if (ptr_sbr_data->del_cod_dir_noise_arr[1] == DTDF_DIR_FREQ) {
435*15dc779aSAndroid Build Coastguard Worker       ptr1 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
436*15dc779aSAndroid Build Coastguard Worker       ptr2 = &ptr_sbr_data->int_noise_floor[(num_nf_bands + 1)];
437*15dc779aSAndroid Build Coastguard Worker       f_ptr1 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
438*15dc779aSAndroid Build Coastguard Worker       f_ptr2 = &ptr_sbr_data->flt_noise_floor[(num_nf_bands + 1)];
439*15dc779aSAndroid Build Coastguard Worker       num = num_nf_bands - 1;
440*15dc779aSAndroid Build Coastguard Worker     } else {
441*15dc779aSAndroid Build Coastguard Worker       ptr1 = &ptr_sbr_data->int_noise_floor[0];
442*15dc779aSAndroid Build Coastguard Worker       ptr2 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
443*15dc779aSAndroid Build Coastguard Worker       f_ptr1 = &ptr_sbr_data->flt_noise_floor[0];
444*15dc779aSAndroid Build Coastguard Worker       f_ptr2 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
445*15dc779aSAndroid Build Coastguard Worker       num = num_nf_bands;
446*15dc779aSAndroid Build Coastguard Worker     }
447*15dc779aSAndroid Build Coastguard Worker     ixheaacd_add_arr(ptr1, ptr2, num);
448*15dc779aSAndroid Build Coastguard Worker     ixheaacd_add_farr(f_ptr1, f_ptr2, num);
449*15dc779aSAndroid Build Coastguard Worker   }
450*15dc779aSAndroid Build Coastguard Worker 
451*15dc779aSAndroid Build Coastguard Worker   ixheaacd_limit_noise_floor_fac(ptr_header_data, ptr_sbr_data);
452*15dc779aSAndroid Build Coastguard Worker 
453*15dc779aSAndroid Build Coastguard Worker   ixheaacd_drc_offset = num_nf_bands * (num_noise_env - 1);
454*15dc779aSAndroid Build Coastguard Worker   if (ixheaacd_drc_offset < 0 || ixheaacd_drc_offset >= MAX_NUM_NOISE_VALUES)
455*15dc779aSAndroid Build Coastguard Worker     return IA_FATAL_ERROR;
456*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_sbr_data->int_noise_floor[ixheaacd_drc_offset];
457*15dc779aSAndroid Build Coastguard Worker   ptr2 = ptr_prev_noise_floor;
458*15dc779aSAndroid Build Coastguard Worker 
459*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands));
460*15dc779aSAndroid Build Coastguard Worker   if (!ptr_header_data->usac_flag) {
461*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_nf_bands; i++) {
462*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data->prev_noise_level[i] = ptr_prev_noise_floor[i];
463*15dc779aSAndroid Build Coastguard Worker     }
464*15dc779aSAndroid Build Coastguard Worker   }
465*15dc779aSAndroid Build Coastguard Worker   if (audio_object_type != AOT_ER_AAC_ELD && ptr_header_data->enh_sbr) {
466*15dc779aSAndroid Build Coastguard Worker     WORD32 noise_floor_exp, tot_nf_bands;
467*15dc779aSAndroid Build Coastguard Worker 
468*15dc779aSAndroid Build Coastguard Worker     tot_nf_bands = (num_nf_bands * num_noise_env);
469*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
470*15dc779aSAndroid Build Coastguard Worker 
471*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < tot_nf_bands; i++) {
472*15dc779aSAndroid Build Coastguard Worker       noise_floor_exp =
473*15dc779aSAndroid Build Coastguard Worker           (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker       *ptr_noise_floor_float++ = *ptr_noise_floor;
476*15dc779aSAndroid Build Coastguard Worker       *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
477*15dc779aSAndroid Build Coastguard Worker     }
478*15dc779aSAndroid Build Coastguard Worker   } else {
479*15dc779aSAndroid Build Coastguard Worker     if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
480*15dc779aSAndroid Build Coastguard Worker       WORD32 noise_floor_exp, tot_nf_bands;
481*15dc779aSAndroid Build Coastguard Worker 
482*15dc779aSAndroid Build Coastguard Worker       tot_nf_bands = (num_nf_bands * num_noise_env);
483*15dc779aSAndroid Build Coastguard Worker       ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
484*15dc779aSAndroid Build Coastguard Worker 
485*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < tot_nf_bands; i++) {
486*15dc779aSAndroid Build Coastguard Worker         noise_floor_exp =
487*15dc779aSAndroid Build Coastguard Worker             (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
488*15dc779aSAndroid Build Coastguard Worker         *ptr_noise_floor_float++ = *ptr_noise_floor;
489*15dc779aSAndroid Build Coastguard Worker         *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
490*15dc779aSAndroid Build Coastguard Worker       }
491*15dc779aSAndroid Build Coastguard Worker     }
492*15dc779aSAndroid Build Coastguard Worker   }
493*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
494*15dc779aSAndroid Build Coastguard Worker }
495*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_sbrdata_for_pvc(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data,WORD32 audio_object_type)496*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_sbrdata_for_pvc(
497*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
498*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_sbr_data,
499*15dc779aSAndroid Build Coastguard Worker     ia_sbr_prev_frame_data_struct *ptr_prev_data,
500*15dc779aSAndroid Build Coastguard Worker     WORD32 audio_object_type) {
501*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
502*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data,
503*15dc779aSAndroid Build Coastguard Worker                                   audio_object_type);
504*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker   if (!ptr_sbr_data->coupling_mode) {
507*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_data->num_noise_sfac =
508*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->pstr_freq_band_data->num_nf_bands *
509*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_data->str_frame_info_details.num_noise_env;
510*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dequant_pvc_env_data(ptr_sbr_data->num_noise_sfac,
511*15dc779aSAndroid Build Coastguard Worker                                   ptr_sbr_data->flt_noise_floor);
512*15dc779aSAndroid Build Coastguard Worker   }
513*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
514*15dc779aSAndroid Build Coastguard Worker }
515*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_env_dequant_coup_fix(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_data_left,ia_sbr_frame_info_data_struct * ptr_data_right,ixheaacd_misc_tables * pstr_common_tables)516*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_sbr_env_dequant_coup_fix(
517*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *ptr_header_data,
518*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_data_left,
519*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_data_right,
520*15dc779aSAndroid Build Coastguard Worker     ixheaacd_misc_tables *pstr_common_tables) {
521*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
522*15dc779aSAndroid Build Coastguard Worker   WORD32 num_env_sf = ptr_data_left->num_env_sfac;
523*15dc779aSAndroid Build Coastguard Worker   WORD16 temp_left_mant, temp_right_mant, temp_right_plus1_mant, new_left_mant,
524*15dc779aSAndroid Build Coastguard Worker       new_right_mant;
525*15dc779aSAndroid Build Coastguard Worker   WORD16 temp_left_exp, temp_right_exp, temp_rightplus1_exp, new_left_exp,
526*15dc779aSAndroid Build Coastguard Worker       new_right_exp;
527*15dc779aSAndroid Build Coastguard Worker   WORD32 i_end;
528*15dc779aSAndroid Build Coastguard Worker   WORD16 *r_data = ptr_data_right->int_env_sf_arr;
529*15dc779aSAndroid Build Coastguard Worker   WORD16 *l_data = ptr_data_left->int_env_sf_arr;
530*15dc779aSAndroid Build Coastguard Worker 
531*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_env_sf; i++) {
532*15dc779aSAndroid Build Coastguard Worker     temp_right_mant = (WORD16)(*r_data & MASK_M);
533*15dc779aSAndroid Build Coastguard Worker     temp_right_exp = (WORD16)(*r_data & MASK_FOR_EXP);
534*15dc779aSAndroid Build Coastguard Worker 
535*15dc779aSAndroid Build Coastguard Worker     temp_right_exp = sub16_m(temp_right_exp, add16_m(18, NRG_EXP_OFFSET));
536*15dc779aSAndroid Build Coastguard Worker     temp_left_mant = (WORD16)(*l_data & MASK_M);
537*15dc779aSAndroid Build Coastguard Worker     temp_left_exp = (WORD16)(*l_data & MASK_FOR_EXP);
538*15dc779aSAndroid Build Coastguard Worker 
539*15dc779aSAndroid Build Coastguard Worker     temp_left_exp = sub16_m(temp_left_exp, NRG_EXP_OFFSET);
540*15dc779aSAndroid Build Coastguard Worker 
541*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fix_mant_exp_add(temp_right_mant, temp_right_exp, 0x4000, 1,
542*15dc779aSAndroid Build Coastguard Worker                               &temp_right_plus1_mant, &temp_rightplus1_exp);
543*15dc779aSAndroid Build Coastguard Worker 
544*15dc779aSAndroid Build Coastguard Worker     new_right_exp = ixheaacd_fix_mant_div(temp_left_mant, temp_right_plus1_mant,
545*15dc779aSAndroid Build Coastguard Worker                                           &new_right_mant, pstr_common_tables);
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker     new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
548*15dc779aSAndroid Build Coastguard Worker 
549*15dc779aSAndroid Build Coastguard Worker     new_left_mant = ixheaac_mult16_shl(temp_right_mant, new_right_mant);
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker     new_left_exp = add16_m(temp_right_exp, new_right_exp);
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker     *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
554*15dc779aSAndroid Build Coastguard Worker                          ((new_right_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
555*15dc779aSAndroid Build Coastguard Worker     *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
556*15dc779aSAndroid Build Coastguard Worker                          ((new_left_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
557*15dc779aSAndroid Build Coastguard Worker   }
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker   i_end = ptr_header_data->pstr_freq_band_data->num_nf_bands *
560*15dc779aSAndroid Build Coastguard Worker           ptr_data_left->str_frame_info_details.num_noise_env;
561*15dc779aSAndroid Build Coastguard Worker   r_data = ptr_data_right->int_noise_floor;
562*15dc779aSAndroid Build Coastguard Worker   l_data = ptr_data_left->int_noise_floor;
563*15dc779aSAndroid Build Coastguard Worker 
564*15dc779aSAndroid Build Coastguard Worker   for (i = i_end - 1; i >= 0; i--) {
565*15dc779aSAndroid Build Coastguard Worker     temp_left_exp =
566*15dc779aSAndroid Build Coastguard Worker         sub16_m((WORD16)(*l_data & (WORD16)MASK_FOR_EXP), NOISE_EXP_OFFSET);
567*15dc779aSAndroid Build Coastguard Worker     temp_right_exp = sub16_m(*r_data, 12);
568*15dc779aSAndroid Build Coastguard Worker 
569*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fix_mant_exp_add(0x4000, ixheaac_add16(1, temp_right_exp), 0x4000,
570*15dc779aSAndroid Build Coastguard Worker                               1, &temp_right_plus1_mant, &temp_rightplus1_exp);
571*15dc779aSAndroid Build Coastguard Worker 
572*15dc779aSAndroid Build Coastguard Worker     new_right_exp = ixheaacd_fix_mant_div(0x4000, temp_right_plus1_mant,
573*15dc779aSAndroid Build Coastguard Worker                                           &new_right_mant, pstr_common_tables);
574*15dc779aSAndroid Build Coastguard Worker 
575*15dc779aSAndroid Build Coastguard Worker     new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
576*15dc779aSAndroid Build Coastguard Worker 
577*15dc779aSAndroid Build Coastguard Worker     new_left_mant = new_right_mant;
578*15dc779aSAndroid Build Coastguard Worker     new_left_exp = add16_m(new_right_exp, temp_right_exp);
579*15dc779aSAndroid Build Coastguard Worker     *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
580*15dc779aSAndroid Build Coastguard Worker                          ((new_right_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
581*15dc779aSAndroid Build Coastguard Worker     *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
582*15dc779aSAndroid Build Coastguard Worker                          ((new_left_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
583*15dc779aSAndroid Build Coastguard Worker   }
584*15dc779aSAndroid Build Coastguard Worker }
585*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_env_dequant_coup(ia_sbr_frame_info_data_struct * ptr_data_ch_0,ia_sbr_frame_info_data_struct * ptr_data_ch_1)586*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_sbr_env_dequant_coup(
587*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_data_ch_0,
588*15dc779aSAndroid Build Coastguard Worker     ia_sbr_frame_info_data_struct *ptr_data_ch_1) {
589*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_env_sf_left = ptr_data_ch_0->flt_env_sf_arr;
590*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_env_sf_right = ptr_data_ch_1->flt_env_sf_arr;
591*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_noise_floor_left = ptr_data_ch_0->flt_noise_floor;
592*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_noise_floor_right = ptr_data_ch_1->flt_noise_floor;
593*15dc779aSAndroid Build Coastguard Worker   WORD32 num_env_sf = ptr_data_ch_0->num_env_sfac;
594*15dc779aSAndroid Build Coastguard Worker   WORD32 num_noise_fac = ptr_data_ch_0->num_noise_sfac;
595*15dc779aSAndroid Build Coastguard Worker   WORD32 amp_res = ptr_data_ch_0->amp_res;
596*15dc779aSAndroid Build Coastguard Worker 
597*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
598*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_l, temp_r;
599*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 pan_offset[2] = {24.0f, 12.0f};
600*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 a_arr[2] = {0.5f, 1.0f};
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker   FLOAT32 a = a_arr[amp_res];
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_env_sf; i++) {
605*15dc779aSAndroid Build Coastguard Worker     temp_l = ptr_env_sf_left[i];
606*15dc779aSAndroid Build Coastguard Worker     temp_r = ptr_env_sf_right[i];
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker     ptr_env_sf_left[i] =
609*15dc779aSAndroid Build Coastguard Worker         (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
610*15dc779aSAndroid Build Coastguard Worker                         (1 + pow(2, (pan_offset[amp_res] - temp_r) * a))));
611*15dc779aSAndroid Build Coastguard Worker     ptr_env_sf_right[i] =
612*15dc779aSAndroid Build Coastguard Worker         (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
613*15dc779aSAndroid Build Coastguard Worker                         (1 + pow(2, (temp_r - pan_offset[amp_res]) * a))));
614*15dc779aSAndroid Build Coastguard Worker   }
615*15dc779aSAndroid Build Coastguard Worker 
616*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_noise_fac; i++) {
617*15dc779aSAndroid Build Coastguard Worker     temp_l = ptr_noise_floor_left[i];
618*15dc779aSAndroid Build Coastguard Worker     temp_r = ptr_noise_floor_right[i];
619*15dc779aSAndroid Build Coastguard Worker 
620*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor_left[i] =
621*15dc779aSAndroid Build Coastguard Worker         (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
622*15dc779aSAndroid Build Coastguard Worker                   (1 + pow(2, pan_offset[1] - temp_r)));
623*15dc779aSAndroid Build Coastguard Worker     ptr_noise_floor_right[i] =
624*15dc779aSAndroid Build Coastguard Worker         (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
625*15dc779aSAndroid Build Coastguard Worker                   (1 + pow(2, temp_r - pan_offset[1])));
626*15dc779aSAndroid Build Coastguard Worker   }
627*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_dec_sbrdata(ia_sbr_header_data_struct * ptr_header_data_ch_0,ia_sbr_header_data_struct * ptr_header_data_ch_1,ia_sbr_frame_info_data_struct * ptr_sbr_data_ch_0,ia_sbr_prev_frame_data_struct * ptr_prev_data_ch_0,ia_sbr_frame_info_data_struct * ptr_sbr_data_ch_1,ia_sbr_prev_frame_data_struct * ptr_prev_data_ch_1,ixheaacd_misc_tables * ptr_common_tables,WORD32 ldmps_present,WORD32 audio_object_type,WORD32 ec_flag)628*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
629*15dc779aSAndroid Build Coastguard Worker                                   ia_sbr_header_data_struct *ptr_header_data_ch_1,
630*15dc779aSAndroid Build Coastguard Worker                                   ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
631*15dc779aSAndroid Build Coastguard Worker                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
632*15dc779aSAndroid Build Coastguard Worker                                   ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
633*15dc779aSAndroid Build Coastguard Worker                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
634*15dc779aSAndroid Build Coastguard Worker                                   ixheaacd_misc_tables *ptr_common_tables, WORD32 ldmps_present,
635*15dc779aSAndroid Build Coastguard Worker                                   WORD32 audio_object_type, WORD32 ec_flag) {
636*15dc779aSAndroid Build Coastguard Worker   FLAG error_code;
637*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
638*15dc779aSAndroid Build Coastguard Worker   WORD16 temp_sfb_nrg_prev[MAX_FREQ_COEFFS];
639*15dc779aSAndroid Build Coastguard Worker   WORD32 usac_flag = ptr_header_data_ch_0->usac_flag |
640*15dc779aSAndroid Build Coastguard Worker                      ptr_header_data_ch_0->enh_sbr;
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker   if (ec_flag) {
643*15dc779aSAndroid Build Coastguard Worker     memcpy(temp_sfb_nrg_prev, ptr_prev_data_ch_0->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof(WORD16));
644*15dc779aSAndroid Build Coastguard Worker   }
645*15dc779aSAndroid Build Coastguard Worker 
646*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
647*15dc779aSAndroid Build Coastguard Worker                               ptr_prev_data_ch_1, ptr_common_tables, audio_object_type, ec_flag);
648*15dc779aSAndroid Build Coastguard Worker 
649*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
650*15dc779aSAndroid Build Coastguard Worker 
651*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_calc_noise_floor(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
652*15dc779aSAndroid Build Coastguard Worker                                   ptr_prev_data_ch_0, audio_object_type);
653*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
654*15dc779aSAndroid Build Coastguard Worker   if ((!ptr_sbr_data_ch_0->coupling_mode &&
655*15dc779aSAndroid Build Coastguard Worker      ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) || ldmps_present) {
656*15dc779aSAndroid Build Coastguard Worker     ptr_sbr_data_ch_0->num_noise_sfac =
657*15dc779aSAndroid Build Coastguard Worker         ptr_header_data_ch_0->pstr_freq_band_data->num_nf_bands *
658*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_data_ch_0->str_frame_info_details.num_noise_env;
659*15dc779aSAndroid Build Coastguard Worker 
660*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dequant_esbr_env_data(
661*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_data_ch_0->flt_env_sf_arr, ptr_sbr_data_ch_0->num_env_sfac,
662*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_data_ch_0->num_noise_sfac, ptr_sbr_data_ch_0->amp_res,
663*15dc779aSAndroid Build Coastguard Worker         ptr_sbr_data_ch_0->flt_noise_floor);
664*15dc779aSAndroid Build Coastguard Worker   }
665*15dc779aSAndroid Build Coastguard Worker 
666*15dc779aSAndroid Build Coastguard Worker   if (ptr_sbr_data_ch_1 != NULL) {
667*15dc779aSAndroid Build Coastguard Worker     error_code = ptr_header_data_ch_0->err_flag;
668*15dc779aSAndroid Build Coastguard Worker     err =
669*15dc779aSAndroid Build Coastguard Worker         ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1, ptr_prev_data_ch_1,
670*15dc779aSAndroid Build Coastguard Worker                               ptr_prev_data_ch_0, ptr_common_tables, audio_object_type, ec_flag);
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker     if (err) return err;
673*15dc779aSAndroid Build Coastguard Worker 
674*15dc779aSAndroid Build Coastguard Worker     err = ixheaacd_calc_noise_floor(ptr_header_data_ch_1, ptr_sbr_data_ch_1,
675*15dc779aSAndroid Build Coastguard Worker                                     ptr_prev_data_ch_1, audio_object_type);
676*15dc779aSAndroid Build Coastguard Worker 
677*15dc779aSAndroid Build Coastguard Worker     if (err) return err;
678*15dc779aSAndroid Build Coastguard Worker 
679*15dc779aSAndroid Build Coastguard Worker     if (!ptr_sbr_data_ch_1->coupling_mode &&
680*15dc779aSAndroid Build Coastguard Worker         ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) {
681*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data_ch_1->num_noise_sfac =
682*15dc779aSAndroid Build Coastguard Worker           ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
683*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
684*15dc779aSAndroid Build Coastguard Worker 
685*15dc779aSAndroid Build Coastguard Worker       ixheaacd_dequant_esbr_env_data(
686*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_data_ch_1->flt_env_sf_arr, ptr_sbr_data_ch_1->num_env_sfac,
687*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_data_ch_1->num_noise_sfac, ptr_sbr_data_ch_1->amp_res,
688*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_data_ch_1->flt_noise_floor);
689*15dc779aSAndroid Build Coastguard Worker     }
690*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
691*15dc779aSAndroid Build Coastguard Worker       if ((!ptr_header_data_ch_0->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
692*15dc779aSAndroid Build Coastguard Worker         if (!error_code && ptr_header_data_ch_0->err_flag) {
693*15dc779aSAndroid Build Coastguard Worker           memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, temp_sfb_nrg_prev,
694*15dc779aSAndroid Build Coastguard Worker                  MAX_FREQ_COEFFS * sizeof(WORD16));
695*15dc779aSAndroid Build Coastguard Worker           err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
696*15dc779aSAndroid Build Coastguard Worker                                       ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
697*15dc779aSAndroid Build Coastguard Worker                                       ec_flag);
698*15dc779aSAndroid Build Coastguard Worker 
699*15dc779aSAndroid Build Coastguard Worker           if (err) return err;
700*15dc779aSAndroid Build Coastguard Worker         }
701*15dc779aSAndroid Build Coastguard Worker       }
702*15dc779aSAndroid Build Coastguard Worker     } else {
703*15dc779aSAndroid Build Coastguard Worker       if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
704*15dc779aSAndroid Build Coastguard Worker         if (!error_code && ptr_header_data_ch_0->err_flag) {
705*15dc779aSAndroid Build Coastguard Worker           err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
706*15dc779aSAndroid Build Coastguard Worker                                       ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
707*15dc779aSAndroid Build Coastguard Worker                                       ec_flag);
708*15dc779aSAndroid Build Coastguard Worker 
709*15dc779aSAndroid Build Coastguard Worker           if (err) return err;
710*15dc779aSAndroid Build Coastguard Worker         }
711*15dc779aSAndroid Build Coastguard Worker       }
712*15dc779aSAndroid Build Coastguard Worker     }
713*15dc779aSAndroid Build Coastguard Worker 
714*15dc779aSAndroid Build Coastguard Worker     if (ptr_sbr_data_ch_0->coupling_mode) {
715*15dc779aSAndroid Build Coastguard Worker       ptr_sbr_data_ch_0->num_noise_sfac =
716*15dc779aSAndroid Build Coastguard Worker           ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
717*15dc779aSAndroid Build Coastguard Worker           ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
718*15dc779aSAndroid Build Coastguard Worker       ixheaacd_sbr_env_dequant_coup_fix(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
719*15dc779aSAndroid Build Coastguard Worker                                         ptr_sbr_data_ch_1, ptr_common_tables);
720*15dc779aSAndroid Build Coastguard Worker 
721*15dc779aSAndroid Build Coastguard Worker       ixheaacd_sbr_env_dequant_coup(ptr_sbr_data_ch_0, ptr_sbr_data_ch_1);
722*15dc779aSAndroid Build Coastguard Worker     }
723*15dc779aSAndroid Build Coastguard Worker   }
724*15dc779aSAndroid Build Coastguard Worker 
725*15dc779aSAndroid Build Coastguard Worker   return 0;
726*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_dec_envelope(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_sbr_data,ia_sbr_prev_frame_data_struct * ptr_prev_data_ch_0,ia_sbr_prev_frame_data_struct * ptr_prev_data_ch_1,ixheaacd_misc_tables * pstr_common_tables,WORD32 audio_object_type,WORD32 ec_flag)727*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
728*15dc779aSAndroid Build Coastguard Worker                                    ia_sbr_frame_info_data_struct *ptr_sbr_data,
729*15dc779aSAndroid Build Coastguard Worker                                    ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
730*15dc779aSAndroid Build Coastguard Worker                                    ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
731*15dc779aSAndroid Build Coastguard Worker                                    ixheaacd_misc_tables *pstr_common_tables,
732*15dc779aSAndroid Build Coastguard Worker                                    WORD32 audio_object_type, WORD32 ec_flag) {
733*15dc779aSAndroid Build Coastguard Worker   FLAG error_code;
734*15dc779aSAndroid Build Coastguard Worker   WORD32 err;
735*15dc779aSAndroid Build Coastguard Worker   WORD16 env_sf_local_arr[MAX_FREQ_COEFFS];
736*15dc779aSAndroid Build Coastguard Worker   WORD32 enh_sbr = ptr_header_data->enh_sbr;
737*15dc779aSAndroid Build Coastguard Worker   WORD32 usac_flag = enh_sbr | ptr_header_data->usac_flag;
738*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_1 =
739*15dc779aSAndroid Build Coastguard Worker       ptr_prev_data_ch_0->end_position - ptr_header_data->num_time_slots;
740*15dc779aSAndroid Build Coastguard Worker 
741*15dc779aSAndroid Build Coastguard Worker   if (temp_1 < 0) return IA_FATAL_ERROR;
742*15dc779aSAndroid Build Coastguard Worker   temp_1 = ptr_sbr_data->str_frame_info_details.border_vec[0] - temp_1;
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker   if ((!ptr_header_data->err_flag_prev) && (!ptr_header_data->err_flag) &&
745*15dc779aSAndroid Build Coastguard Worker       (temp_1 != 0)) {
746*15dc779aSAndroid Build Coastguard Worker     if (ptr_sbr_data->del_cod_dir_arr[0] == DTDF_DIR_TIME) {
747*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->err_flag = 1;
748*15dc779aSAndroid Build Coastguard Worker     } else {
749*15dc779aSAndroid Build Coastguard Worker       ptr_header_data->err_flag_prev = 1;
750*15dc779aSAndroid Build Coastguard Worker     }
751*15dc779aSAndroid Build Coastguard Worker   }
752*15dc779aSAndroid Build Coastguard Worker   if (ec_flag) {
753*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->err_flag_prev && (!ptr_header_data->err_flag)) {
754*15dc779aSAndroid Build Coastguard Worker       if (ptr_sbr_data->del_cod_dir_arr[0] != 0) {
755*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->err_flag = 1;
756*15dc779aSAndroid Build Coastguard Worker       }
757*15dc779aSAndroid Build Coastguard Worker     }
758*15dc779aSAndroid Build Coastguard Worker   }
759*15dc779aSAndroid Build Coastguard Worker   if (ec_flag && ptr_header_data->err_flag &&
760*15dc779aSAndroid Build Coastguard Worker       ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
761*15dc779aSAndroid Build Coastguard Worker     ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
762*15dc779aSAndroid Build Coastguard Worker 
763*15dc779aSAndroid Build Coastguard Worker     ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
764*15dc779aSAndroid Build Coastguard Worker   } else if (ptr_header_data->err_flag &&
765*15dc779aSAndroid Build Coastguard Worker              ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
766*15dc779aSAndroid Build Coastguard Worker     ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
767*15dc779aSAndroid Build Coastguard Worker 
768*15dc779aSAndroid Build Coastguard Worker     ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
769*15dc779aSAndroid Build Coastguard Worker   } else {
770*15dc779aSAndroid Build Coastguard Worker     WORD32 num = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
771*15dc779aSAndroid Build Coastguard Worker     if (ptr_header_data->err_flag_prev && ((!usac_flag) ||
772*15dc779aSAndroid Build Coastguard Worker         (audio_object_type == AOT_ER_AAC_ELD))) {
773*15dc779aSAndroid Build Coastguard Worker       WORD16 *ptr1, *ptr2;
774*15dc779aSAndroid Build Coastguard Worker       WORD32 i;
775*15dc779aSAndroid Build Coastguard Worker 
776*15dc779aSAndroid Build Coastguard Worker       err = ixheaacd_wrong_timing_compensate(ptr_header_data, ptr_sbr_data,
777*15dc779aSAndroid Build Coastguard Worker                                              ptr_prev_data_ch_0,
778*15dc779aSAndroid Build Coastguard Worker                                              pstr_common_tables);
779*15dc779aSAndroid Build Coastguard Worker 
780*15dc779aSAndroid Build Coastguard Worker       if (err) return err;
781*15dc779aSAndroid Build Coastguard Worker 
782*15dc779aSAndroid Build Coastguard Worker       if (ptr_sbr_data->coupling_mode !=
783*15dc779aSAndroid Build Coastguard Worker           (WORD16)ptr_prev_data_ch_0->coupling_mode) {
784*15dc779aSAndroid Build Coastguard Worker         if (ptr_prev_data_ch_0->coupling_mode == COUPLING_BAL) {
785*15dc779aSAndroid Build Coastguard Worker           memcpy(ptr_prev_data_ch_0->sfb_nrg_prev,
786*15dc779aSAndroid Build Coastguard Worker                  ptr_prev_data_ch_1->sfb_nrg_prev, sizeof(WORD16) * num);
787*15dc779aSAndroid Build Coastguard Worker         } else {
788*15dc779aSAndroid Build Coastguard Worker           if (ptr_sbr_data->coupling_mode == COUPLING_LEVEL) {
789*15dc779aSAndroid Build Coastguard Worker             ptr1 = ptr_prev_data_ch_0->sfb_nrg_prev;
790*15dc779aSAndroid Build Coastguard Worker             ptr2 = ptr_prev_data_ch_1->sfb_nrg_prev;
791*15dc779aSAndroid Build Coastguard Worker 
792*15dc779aSAndroid Build Coastguard Worker             for (i = 0; i < num; i++) {
793*15dc779aSAndroid Build Coastguard Worker               *ptr1 = (add16_m(*ptr1, *ptr2) >> 1);
794*15dc779aSAndroid Build Coastguard Worker               ptr2++;
795*15dc779aSAndroid Build Coastguard Worker               ptr1++;
796*15dc779aSAndroid Build Coastguard Worker             }
797*15dc779aSAndroid Build Coastguard Worker           } else {
798*15dc779aSAndroid Build Coastguard Worker             if (ptr_sbr_data->coupling_mode == COUPLING_BAL) {
799*15dc779aSAndroid Build Coastguard Worker               memset(ptr_prev_data_ch_0->sfb_nrg_prev, SBR_ENERGY_PAN_OFFSET,
800*15dc779aSAndroid Build Coastguard Worker                      sizeof(WORD16) * num);
801*15dc779aSAndroid Build Coastguard Worker             }
802*15dc779aSAndroid Build Coastguard Worker           }
803*15dc779aSAndroid Build Coastguard Worker         }
804*15dc779aSAndroid Build Coastguard Worker       }
805*15dc779aSAndroid Build Coastguard Worker     }
806*15dc779aSAndroid Build Coastguard Worker 
807*15dc779aSAndroid Build Coastguard Worker     memcpy(env_sf_local_arr, ptr_prev_data_ch_0->sfb_nrg_prev,
808*15dc779aSAndroid Build Coastguard Worker            sizeof(WORD16) * MAX_FREQ_COEFFS);
809*15dc779aSAndroid Build Coastguard Worker 
810*15dc779aSAndroid Build Coastguard Worker     ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data,
811*15dc779aSAndroid Build Coastguard Worker                                       ptr_prev_data_ch_0);
812*15dc779aSAndroid Build Coastguard Worker 
813*15dc779aSAndroid Build Coastguard Worker     if ((!usac_flag)||(audio_object_type == AOT_ER_AAC_ELD)) {
814*15dc779aSAndroid Build Coastguard Worker       error_code = ixheaacd_check_env_data(ptr_header_data, ptr_sbr_data,
815*15dc779aSAndroid Build Coastguard Worker                                            ptr_prev_data_ch_0);
816*15dc779aSAndroid Build Coastguard Worker 
817*15dc779aSAndroid Build Coastguard Worker       if (error_code) {
818*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->err_flag = 1;
819*15dc779aSAndroid Build Coastguard Worker 
820*15dc779aSAndroid Build Coastguard Worker         memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, env_sf_local_arr,
821*15dc779aSAndroid Build Coastguard Worker                sizeof(WORD16) * MAX_FREQ_COEFFS);
822*15dc779aSAndroid Build Coastguard Worker 
823*15dc779aSAndroid Build Coastguard Worker         err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0,
824*15dc779aSAndroid Build Coastguard Worker                                     ptr_prev_data_ch_1, pstr_common_tables, audio_object_type,
825*15dc779aSAndroid Build Coastguard Worker                                     ec_flag);
826*15dc779aSAndroid Build Coastguard Worker 
827*15dc779aSAndroid Build Coastguard Worker         if (err) return err;
828*15dc779aSAndroid Build Coastguard Worker         return 0;
829*15dc779aSAndroid Build Coastguard Worker       }
830*15dc779aSAndroid Build Coastguard Worker     }
831*15dc779aSAndroid Build Coastguard Worker   }
832*15dc779aSAndroid Build Coastguard Worker   if (ec_flag) {
833*15dc779aSAndroid Build Coastguard Worker     if ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
834*15dc779aSAndroid Build Coastguard Worker       ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
835*15dc779aSAndroid Build Coastguard Worker     }
836*15dc779aSAndroid Build Coastguard Worker   } else {
837*15dc779aSAndroid Build Coastguard Worker     if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
838*15dc779aSAndroid Build Coastguard Worker       ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
839*15dc779aSAndroid Build Coastguard Worker     }
840*15dc779aSAndroid Build Coastguard Worker   }
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker   return 0;
843*15dc779aSAndroid Build Coastguard Worker }
844*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_adj_timeslot(WORD32 * ptr_buf_real,WORD32 * ptr_buf_imag,WORD16 * ptr_filt_buf,WORD16 * ptr_filt_buf_noise,WORD16 * ptr_gain_buf,WORD16 * ptr_noise_floor,WORD16 * ptr_sine_lvl_buf,WORD16 noise_floor_exp,WORD16 * ptr_harm_index,WORD16 sub_band_start,WORD16 num_sub_bands,WORD16 scale_change,WORD16 smooth_ratio,FLAG num_noise_flg,WORD16 * ptr_phase_index,ia_sbr_tables_struct * ptr_sbr_tables)845*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_adj_timeslot(WORD32 *ptr_buf_real, WORD32 *ptr_buf_imag,
846*15dc779aSAndroid Build Coastguard Worker                            WORD16 *ptr_filt_buf, WORD16 *ptr_filt_buf_noise,
847*15dc779aSAndroid Build Coastguard Worker                            WORD16 *ptr_gain_buf, WORD16 *ptr_noise_floor,
848*15dc779aSAndroid Build Coastguard Worker                            WORD16 *ptr_sine_lvl_buf, WORD16 noise_floor_exp,
849*15dc779aSAndroid Build Coastguard Worker                            WORD16 *ptr_harm_index, WORD16 sub_band_start,
850*15dc779aSAndroid Build Coastguard Worker                            WORD16 num_sub_bands, WORD16 scale_change,
851*15dc779aSAndroid Build Coastguard Worker                            WORD16 smooth_ratio, FLAG num_noise_flg,
852*15dc779aSAndroid Build Coastguard Worker                            WORD16 *ptr_phase_index,
853*15dc779aSAndroid Build Coastguard Worker                            ia_sbr_tables_struct *ptr_sbr_tables) {
854*15dc779aSAndroid Build Coastguard Worker   WORD16 k;
855*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_smoothed_gain, *ptr_smoothed_noise;
856*15dc779aSAndroid Build Coastguard Worker   WORD16 direct_ratio;
857*15dc779aSAndroid Build Coastguard Worker   WORD32 index = *ptr_phase_index;
858*15dc779aSAndroid Build Coastguard Worker   WORD32 harm_idx = *ptr_harm_index;
859*15dc779aSAndroid Build Coastguard Worker   WORD32 freq_inv_flag;
860*15dc779aSAndroid Build Coastguard Worker   const WORD32 *ptr_rand_ph_buf;
861*15dc779aSAndroid Build Coastguard Worker   WORD32 factor = 0;
862*15dc779aSAndroid Build Coastguard Worker 
863*15dc779aSAndroid Build Coastguard Worker   direct_ratio = ixheaac_sub16_sat(0x7fff, smooth_ratio);
864*15dc779aSAndroid Build Coastguard Worker   freq_inv_flag = (sub_band_start & 1);
865*15dc779aSAndroid Build Coastguard Worker 
866*15dc779aSAndroid Build Coastguard Worker   scale_change = scale_change - 1;
867*15dc779aSAndroid Build Coastguard Worker 
868*15dc779aSAndroid Build Coastguard Worker   ptr_rand_ph_buf = &ptr_sbr_tables->sbr_rand_ph[index];
869*15dc779aSAndroid Build Coastguard Worker   *ptr_phase_index =
870*15dc779aSAndroid Build Coastguard Worker       (WORD16)((index + num_sub_bands) & (SBR_NF_NO_RANDOM_VAL - 1));
871*15dc779aSAndroid Build Coastguard Worker 
872*15dc779aSAndroid Build Coastguard Worker   if (smooth_ratio) {
873*15dc779aSAndroid Build Coastguard Worker     WORD16 *ptr_filt_buf_local = &ptr_filt_buf[0];
874*15dc779aSAndroid Build Coastguard Worker     WORD16 *ptr_gain_buf_local = &ptr_gain_buf[0];
875*15dc779aSAndroid Build Coastguard Worker     WORD16 *ptr_filt_noise_local = &ptr_filt_buf_noise[0];
876*15dc779aSAndroid Build Coastguard Worker     WORD16 *ptr_noise_floor_local = &ptr_noise_floor[0];
877*15dc779aSAndroid Build Coastguard Worker 
878*15dc779aSAndroid Build Coastguard Worker     WORD16 tmp, tmp1;
879*15dc779aSAndroid Build Coastguard Worker 
880*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < num_sub_bands; k++) {
881*15dc779aSAndroid Build Coastguard Worker       tmp = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_buf_local),
882*15dc779aSAndroid Build Coastguard Worker                     mult16x16_16(direct_ratio, *ptr_gain_buf_local++));
883*15dc779aSAndroid Build Coastguard Worker 
884*15dc779aSAndroid Build Coastguard Worker       ptr_gain_buf_local++;
885*15dc779aSAndroid Build Coastguard Worker 
886*15dc779aSAndroid Build Coastguard Worker       tmp1 = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_noise_local),
887*15dc779aSAndroid Build Coastguard Worker                      mult16x16_16(direct_ratio, *ptr_noise_floor_local++));
888*15dc779aSAndroid Build Coastguard Worker 
889*15dc779aSAndroid Build Coastguard Worker       ptr_noise_floor_local++;
890*15dc779aSAndroid Build Coastguard Worker 
891*15dc779aSAndroid Build Coastguard Worker       *ptr_filt_buf_local++ = tmp << 1;
892*15dc779aSAndroid Build Coastguard Worker       ptr_filt_buf_local++;
893*15dc779aSAndroid Build Coastguard Worker       *ptr_filt_noise_local++ = tmp1 << 1;
894*15dc779aSAndroid Build Coastguard Worker     }
895*15dc779aSAndroid Build Coastguard Worker     ptr_smoothed_gain = ptr_filt_buf;
896*15dc779aSAndroid Build Coastguard Worker     ptr_smoothed_noise = ptr_filt_buf_noise;
897*15dc779aSAndroid Build Coastguard Worker     factor = 1;
898*15dc779aSAndroid Build Coastguard Worker   } else {
899*15dc779aSAndroid Build Coastguard Worker     ptr_smoothed_gain = ptr_gain_buf;
900*15dc779aSAndroid Build Coastguard Worker     ptr_smoothed_noise = ptr_noise_floor;
901*15dc779aSAndroid Build Coastguard Worker     factor = 2;
902*15dc779aSAndroid Build Coastguard Worker   }
903*15dc779aSAndroid Build Coastguard Worker 
904*15dc779aSAndroid Build Coastguard Worker   switch (harm_idx) {
905*15dc779aSAndroid Build Coastguard Worker     case 0:
906*15dc779aSAndroid Build Coastguard Worker     case 2:
907*15dc779aSAndroid Build Coastguard Worker       ixheaacd_harm_idx_zerotwo(num_noise_flg, num_sub_bands, ptr_buf_real,
908*15dc779aSAndroid Build Coastguard Worker                                 ptr_buf_imag, ptr_smoothed_gain,
909*15dc779aSAndroid Build Coastguard Worker                                 ptr_smoothed_noise, factor, ptr_gain_buf,
910*15dc779aSAndroid Build Coastguard Worker                                 scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf,
911*15dc779aSAndroid Build Coastguard Worker                                 noise_floor_exp, harm_idx);
912*15dc779aSAndroid Build Coastguard Worker       break;
913*15dc779aSAndroid Build Coastguard Worker     case 1:
914*15dc779aSAndroid Build Coastguard Worker     case 3:
915*15dc779aSAndroid Build Coastguard Worker       ixheaacd_harm_idx_onethree(
916*15dc779aSAndroid Build Coastguard Worker           num_noise_flg, num_sub_bands, ptr_buf_real, ptr_buf_imag,
917*15dc779aSAndroid Build Coastguard Worker           ptr_smoothed_gain, ptr_smoothed_noise, factor, ptr_gain_buf,
918*15dc779aSAndroid Build Coastguard Worker           scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf, noise_floor_exp,
919*15dc779aSAndroid Build Coastguard Worker           freq_inv_flag, harm_idx);
920*15dc779aSAndroid Build Coastguard Worker       break;
921*15dc779aSAndroid Build Coastguard Worker   }
922*15dc779aSAndroid Build Coastguard Worker   *ptr_harm_index = (WORD16)((harm_idx + 1) & 3);
923*15dc779aSAndroid Build Coastguard Worker }
924