xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_init_config.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 <stdio.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdarg.h>
23*15dc779aSAndroid Build Coastguard Worker #include <assert.h>
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
73*15dc779aSAndroid Build Coastguard Worker 
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
75*15dc779aSAndroid Build Coastguard Worker 
76*15dc779aSAndroid Build Coastguard Worker static const WORD32 sampling_rate_tbl[] = {
77*15dc779aSAndroid Build Coastguard Worker     96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,
78*15dc779aSAndroid Build Coastguard Worker     8000,  7350,  0,     0,     57600, 51200, 40000, 38400, 34150, 28800, 25600,
79*15dc779aSAndroid Build Coastguard Worker     20000, 19200, 17075, 14400, 12800, 9600,  0,     0,     0};
80*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx)81*15dc779aSAndroid Build Coastguard Worker UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx) {
82*15dc779aSAndroid Build Coastguard Worker   UWORD32 sbr_ratio_index = 0x0FF;
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker   switch (core_sbr_framelength_idx) {
85*15dc779aSAndroid Build Coastguard Worker     case 0:
86*15dc779aSAndroid Build Coastguard Worker     case 1:
87*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
88*15dc779aSAndroid Build Coastguard Worker       break;
89*15dc779aSAndroid Build Coastguard Worker     case 2:
90*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3;
91*15dc779aSAndroid Build Coastguard Worker       break;
92*15dc779aSAndroid Build Coastguard Worker     case 3:
93*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1;
94*15dc779aSAndroid Build Coastguard Worker       break;
95*15dc779aSAndroid Build Coastguard Worker     case 4:
96*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1;
97*15dc779aSAndroid Build Coastguard Worker       break;
98*15dc779aSAndroid Build Coastguard Worker   }
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker   return sbr_ratio_index;
101*15dc779aSAndroid Build Coastguard Worker }
102*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_sample_freq_indx(WORD32 sampling_freq)103*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_get_sample_freq_indx(WORD32 sampling_freq) {
104*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
105*15dc779aSAndroid Build Coastguard Worker   const WORD32 tbl_size = sizeof(sampling_rate_tbl) / sizeof(WORD32) - 1;
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker   for (index = 0; index < tbl_size; index++) {
108*15dc779aSAndroid Build Coastguard Worker     if (sampling_rate_tbl[index] == sampling_freq) break;
109*15dc779aSAndroid Build Coastguard Worker   }
110*15dc779aSAndroid Build Coastguard Worker   return index;
111*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx,WORD32 * output_framelength,WORD32 * block_size,WORD32 * output_samples,WORD32 * sample_rate_layer,UWORD32 * sample_freq_indx)112*15dc779aSAndroid Build Coastguard Worker UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx,
113*15dc779aSAndroid Build Coastguard Worker                             WORD32 *output_framelength, WORD32 *block_size,
114*15dc779aSAndroid Build Coastguard Worker                             WORD32 *output_samples, WORD32 *sample_rate_layer,
115*15dc779aSAndroid Build Coastguard Worker                             UWORD32 *sample_freq_indx) {
116*15dc779aSAndroid Build Coastguard Worker   UWORD32 sbr_ratio_index = 0x0FF;
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker   *output_framelength = -1;
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker   switch (core_sbr_framelength_idx) {
121*15dc779aSAndroid Build Coastguard Worker     case 0:
122*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
123*15dc779aSAndroid Build Coastguard Worker       *output_framelength = USAC_OUT_FRAMELENGTH_768;
124*15dc779aSAndroid Build Coastguard Worker       *block_size = 768;
125*15dc779aSAndroid Build Coastguard Worker       *output_samples = *block_size;
126*15dc779aSAndroid Build Coastguard Worker       break;
127*15dc779aSAndroid Build Coastguard Worker     case 1:
128*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
129*15dc779aSAndroid Build Coastguard Worker       *output_framelength = USAC_OUT_FRAMELENGTH_1024;
130*15dc779aSAndroid Build Coastguard Worker       *block_size = 1024;
131*15dc779aSAndroid Build Coastguard Worker       *output_samples = *block_size;
132*15dc779aSAndroid Build Coastguard Worker       break;
133*15dc779aSAndroid Build Coastguard Worker     case 2:
134*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3;
135*15dc779aSAndroid Build Coastguard Worker       *output_framelength = USAC_OUT_FRAMELENGTH_2048;
136*15dc779aSAndroid Build Coastguard Worker       *block_size = 768;
137*15dc779aSAndroid Build Coastguard Worker       *output_samples = (*block_size * 8) / 3;
138*15dc779aSAndroid Build Coastguard Worker       *sample_rate_layer = (*sample_rate_layer * 3) >> 3;
139*15dc779aSAndroid Build Coastguard Worker       break;
140*15dc779aSAndroid Build Coastguard Worker     case 3:
141*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1;
142*15dc779aSAndroid Build Coastguard Worker       *output_framelength = USAC_OUT_FRAMELENGTH_2048;
143*15dc779aSAndroid Build Coastguard Worker       *block_size = 1024;
144*15dc779aSAndroid Build Coastguard Worker       *output_samples = *block_size * 2;
145*15dc779aSAndroid Build Coastguard Worker       *sample_rate_layer = *sample_rate_layer >> 1;
146*15dc779aSAndroid Build Coastguard Worker       break;
147*15dc779aSAndroid Build Coastguard Worker     case 4:
148*15dc779aSAndroid Build Coastguard Worker       sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1;
149*15dc779aSAndroid Build Coastguard Worker       *output_framelength = USAC_OUT_FRAMELENGTH_4096;
150*15dc779aSAndroid Build Coastguard Worker       *block_size = 1024;
151*15dc779aSAndroid Build Coastguard Worker       *output_samples = *block_size * 4;
152*15dc779aSAndroid Build Coastguard Worker       *sample_rate_layer = *sample_rate_layer >> 2;
153*15dc779aSAndroid Build Coastguard Worker       break;
154*15dc779aSAndroid Build Coastguard Worker   }
155*15dc779aSAndroid Build Coastguard Worker 
156*15dc779aSAndroid Build Coastguard Worker   *sample_freq_indx = ixheaacd_get_sample_freq_indx(*sample_rate_layer);
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker   return sbr_ratio_index;
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_read_escape_value(ia_bit_buf_struct * it_bit_buff,UWORD32 * ext_ele_value,UWORD32 no_bits1,UWORD32 no_bits2,UWORD32 no_bits3)161*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_read_escape_value(ia_bit_buf_struct *it_bit_buff,
162*15dc779aSAndroid Build Coastguard Worker                                 UWORD32 *ext_ele_value, UWORD32 no_bits1,
163*15dc779aSAndroid Build Coastguard Worker                                 UWORD32 no_bits2, UWORD32 no_bits3) {
164*15dc779aSAndroid Build Coastguard Worker   UWORD32 value = 0;
165*15dc779aSAndroid Build Coastguard Worker   UWORD32 val_add = 0;
166*15dc779aSAndroid Build Coastguard Worker   UWORD32 max_val1 = (1 << no_bits1) - 1;
167*15dc779aSAndroid Build Coastguard Worker   UWORD32 max_val2 = (1 << no_bits2) - 1;
168*15dc779aSAndroid Build Coastguard Worker 
169*15dc779aSAndroid Build Coastguard Worker   value = ixheaacd_read_bits_buf(it_bit_buff, no_bits1);
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker   if (value == max_val1) {
172*15dc779aSAndroid Build Coastguard Worker     val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits2);
173*15dc779aSAndroid Build Coastguard Worker 
174*15dc779aSAndroid Build Coastguard Worker     value += val_add;
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker     if (val_add == max_val2) {
177*15dc779aSAndroid Build Coastguard Worker       val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits3);
178*15dc779aSAndroid Build Coastguard Worker 
179*15dc779aSAndroid Build Coastguard Worker       value += val_add;
180*15dc779aSAndroid Build Coastguard Worker     }
181*15dc779aSAndroid Build Coastguard Worker   }
182*15dc779aSAndroid Build Coastguard Worker 
183*15dc779aSAndroid Build Coastguard Worker   *ext_ele_value = value;
184*15dc779aSAndroid Build Coastguard Worker }
185*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_usac_chan_conf(ia_usac_config_struct * pstr_usac_config,UWORD32 ch_config_index,ia_bit_buf_struct * it_bit_buff,WORD32 ec_flag)186*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
187*15dc779aSAndroid Build Coastguard Worker                         UWORD32 ch_config_index, ia_bit_buf_struct *it_bit_buff, WORD32 ec_flag)
188*15dc779aSAndroid Build Coastguard Worker {
189*15dc779aSAndroid Build Coastguard Worker   switch (ch_config_index) {
190*15dc779aSAndroid Build Coastguard Worker     case 1:
191*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->num_out_channels = 1;
192*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_C;
193*15dc779aSAndroid Build Coastguard Worker       break;
194*15dc779aSAndroid Build Coastguard Worker     case 2:
195*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->num_out_channels = 2;
196*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_L;
197*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_R;
198*15dc779aSAndroid Build Coastguard Worker       break;
199*15dc779aSAndroid Build Coastguard Worker     case 8:
200*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->num_out_channels = 2;
201*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_NA;
202*15dc779aSAndroid Build Coastguard Worker       pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_NA;
203*15dc779aSAndroid Build Coastguard Worker       break;
204*15dc779aSAndroid Build Coastguard Worker 
205*15dc779aSAndroid Build Coastguard Worker     default:
206*15dc779aSAndroid Build Coastguard Worker       if (ec_flag)
207*15dc779aSAndroid Build Coastguard Worker         longjmp(*(it_bit_buff->xaac_jmp_buf),
208*15dc779aSAndroid Build Coastguard Worker             IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
209*15dc779aSAndroid Build Coastguard Worker       else
210*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
211*15dc779aSAndroid Build Coastguard Worker       break;
212*15dc779aSAndroid Build Coastguard Worker   }
213*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_sbr_config(ia_bit_buf_struct * it_bit_buff,ia_usac_dec_sbr_config_struct * pstr_usac_sbr_config)216*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff,
217*15dc779aSAndroid Build Coastguard Worker                          ia_usac_dec_sbr_config_struct *pstr_usac_sbr_config) {
218*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->harmonic_sbr = ixheaacd_read_bits_buf(it_bit_buff, 1);
219*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->bs_inter_tes = ixheaacd_read_bits_buf(it_bit_buff, 1);
220*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->bs_pvc = ixheaacd_read_bits_buf(it_bit_buff, 1);
221*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->dflt_start_freq =
222*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 4);
223*15dc779aSAndroid Build Coastguard Worker 
224*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->dflt_stop_freq = ixheaacd_read_bits_buf(it_bit_buff, 4);
225*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->dflt_header_extra1 =
226*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
227*15dc779aSAndroid Build Coastguard Worker   pstr_usac_sbr_config->dflt_header_extra2 =
228*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_sbr_config->dflt_header_extra1) {
231*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_freq_scale =
232*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
233*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_alter_scale =
234*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 1);
235*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_noise_bands =
236*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
237*15dc779aSAndroid Build Coastguard Worker   }
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_sbr_config->dflt_header_extra2) {
240*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_limiter_bands =
241*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
242*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_limiter_gains =
243*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
244*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_interpol_freq =
245*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 1);
246*15dc779aSAndroid Build Coastguard Worker     pstr_usac_sbr_config->dflt_smoothing_mode =
247*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 1);
248*15dc779aSAndroid Build Coastguard Worker   }
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_ext_element_config(ia_bit_buf_struct * it_bit_buff,ia_usac_dec_element_config_struct * pstr_usac_element_config,UWORD8 * ptr_usac_ext_ele_payload,WORD32 * ptr_usac_ext_ele_payload_len,WORD32 * preroll_flag)251*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_ext_element_config(
252*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
253*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_element_config_struct *pstr_usac_element_config,
254*15dc779aSAndroid Build Coastguard Worker     UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len,
255*15dc779aSAndroid Build Coastguard Worker     WORD32 *preroll_flag) {
256*15dc779aSAndroid Build Coastguard Worker   UWORD32 usac_ext_element_type, usac_ext_element_config_length, flag;
257*15dc779aSAndroid Build Coastguard Worker 
258*15dc779aSAndroid Build Coastguard Worker   UWORD32 i;
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_type), 4, 8, 16);
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_config_length), 4,
263*15dc779aSAndroid Build Coastguard Worker                              8, 16);
264*15dc779aSAndroid Build Coastguard Worker   if (usac_ext_element_config_length >= 768) return -1;
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker   flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker   *ptr_usac_ext_ele_payload_len = 0;
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker   if (flag) {
271*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_escape_value(
272*15dc779aSAndroid Build Coastguard Worker         it_bit_buff,
273*15dc779aSAndroid Build Coastguard Worker         (UWORD32 *)(&(pstr_usac_element_config->usac_ext_eleme_def_len)), 8, 16,
274*15dc779aSAndroid Build Coastguard Worker         0);
275*15dc779aSAndroid Build Coastguard Worker     pstr_usac_element_config->usac_ext_eleme_def_len += 1;
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker   } else {
278*15dc779aSAndroid Build Coastguard Worker     pstr_usac_element_config->usac_ext_eleme_def_len = 0;
279*15dc779aSAndroid Build Coastguard Worker   }
280*15dc779aSAndroid Build Coastguard Worker 
281*15dc779aSAndroid Build Coastguard Worker   pstr_usac_element_config->usac_ext_elem_pld_frag =
282*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
283*15dc779aSAndroid Build Coastguard Worker 
284*15dc779aSAndroid Build Coastguard Worker   switch (usac_ext_element_type) {
285*15dc779aSAndroid Build Coastguard Worker     case ID_EXT_ELE_FILL:
286*15dc779aSAndroid Build Coastguard Worker       break;
287*15dc779aSAndroid Build Coastguard Worker     case ID_EXT_ELE_AUDIOPREROLL:
288*15dc779aSAndroid Build Coastguard Worker       *preroll_flag = 1;
289*15dc779aSAndroid Build Coastguard Worker       break;
290*15dc779aSAndroid Build Coastguard Worker     case ID_EXT_ELE_UNI_DRC:
291*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < usac_ext_element_config_length; i++) {
292*15dc779aSAndroid Build Coastguard Worker         ptr_usac_ext_ele_payload[i] = ixheaacd_read_bits_buf(it_bit_buff, 8);
293*15dc779aSAndroid Build Coastguard Worker       }
294*15dc779aSAndroid Build Coastguard Worker       *ptr_usac_ext_ele_payload_len = usac_ext_element_config_length;
295*15dc779aSAndroid Build Coastguard Worker       break;
296*15dc779aSAndroid Build Coastguard Worker 
297*15dc779aSAndroid Build Coastguard Worker     default:
298*15dc779aSAndroid Build Coastguard Worker       if ((it_bit_buff->cnt_bits >> 3) < (WORD32)usac_ext_element_config_length)
299*15dc779aSAndroid Build Coastguard Worker         return -1;
300*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->ptr_read_next += usac_ext_element_config_length;
301*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->cnt_bits -= (usac_ext_element_config_length << 3);
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker       break;
304*15dc779aSAndroid Build Coastguard Worker   }
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker   return 0;
307*15dc779aSAndroid Build Coastguard Worker }
308*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps212_config(ia_bit_buf_struct * it_bit_buff,ia_usac_dec_mps_config_struct * pstr_usac_mps212_config,WORD32 stereo_config_index)309*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_mps212_config(
310*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
311*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_mps_config_struct *pstr_usac_mps212_config,
312*15dc779aSAndroid Build Coastguard Worker     WORD32 stereo_config_index) {
313*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
314*15dc779aSAndroid Build Coastguard Worker 
315*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_fixed_gain_dmx =
316*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 3);
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_temp_shape_config =
319*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 2);
320*15dc779aSAndroid Build Coastguard Worker 
321*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_decorr_config =
322*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 2);
323*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_mps212_config->bs_decorr_config > MAX_DECOR_CONFIG_IDX)
324*15dc779aSAndroid Build Coastguard Worker     return IA_FATAL_ERROR;
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_high_rate_mode =
327*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
328*15dc779aSAndroid Build Coastguard Worker 
329*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_phase_coding =
330*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker   pstr_usac_mps212_config->bs_ott_bands_phase_present =
333*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
334*15dc779aSAndroid Build Coastguard Worker 
335*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_mps212_config->bs_ott_bands_phase_present) {
336*15dc779aSAndroid Build Coastguard Worker     pstr_usac_mps212_config->bs_ott_bands_phase =
337*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 5);
338*15dc779aSAndroid Build Coastguard Worker     if (pstr_usac_mps212_config->bs_ott_bands_phase > MAX_PARAMETER_BANDS)
339*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
340*15dc779aSAndroid Build Coastguard Worker   }
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker   if (stereo_config_index > 1) {
343*15dc779aSAndroid Build Coastguard Worker     pstr_usac_mps212_config->bs_residual_bands =
344*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 5);
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker     if (pstr_usac_mps212_config->bs_residual_bands > MAX_PARAMETER_BANDS)
347*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker     pstr_usac_mps212_config->bs_ott_bands_phase =
350*15dc779aSAndroid Build Coastguard Worker         max(pstr_usac_mps212_config->bs_ott_bands_phase,
351*15dc779aSAndroid Build Coastguard Worker             pstr_usac_mps212_config->bs_residual_bands);
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker     pstr_usac_mps212_config->bs_pseudo_lr =
354*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 1);
355*15dc779aSAndroid Build Coastguard Worker   }
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_mps212_config->bs_temp_shape_config == 2)
358*15dc779aSAndroid Build Coastguard Worker     pstr_usac_mps212_config->bs_env_quant_mode =
359*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 1);
360*15dc779aSAndroid Build Coastguard Worker 
361*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
362*15dc779aSAndroid Build Coastguard Worker }
363*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_cpe_config(ia_bit_buf_struct * it_bit_buff,ia_usac_dec_element_config_struct * pstr_usac_element_config,WORD32 sbr_ratio_index)364*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_cpe_config(
365*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
366*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_element_config_struct *pstr_usac_element_config,
367*15dc779aSAndroid Build Coastguard Worker     WORD32 sbr_ratio_index) {
368*15dc779aSAndroid Build Coastguard Worker   pstr_usac_element_config->tw_mdct = ixheaacd_read_bits_buf(it_bit_buff, 1);
369*15dc779aSAndroid Build Coastguard Worker   pstr_usac_element_config->noise_filling =
370*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 1);
371*15dc779aSAndroid Build Coastguard Worker 
372*15dc779aSAndroid Build Coastguard Worker   if (sbr_ratio_index > 0) {
373*15dc779aSAndroid Build Coastguard Worker     ixheaacd_sbr_config(it_bit_buff,
374*15dc779aSAndroid Build Coastguard Worker                         &(pstr_usac_element_config->str_usac_sbr_config));
375*15dc779aSAndroid Build Coastguard Worker     pstr_usac_element_config->stereo_config_index =
376*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
377*15dc779aSAndroid Build Coastguard Worker 
378*15dc779aSAndroid Build Coastguard Worker   } else {
379*15dc779aSAndroid Build Coastguard Worker     pstr_usac_element_config->stereo_config_index = 0;
380*15dc779aSAndroid Build Coastguard Worker   }
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_element_config->stereo_config_index > 0)
383*15dc779aSAndroid Build Coastguard Worker     return ixheaacd_mps212_config(
384*15dc779aSAndroid Build Coastguard Worker         it_bit_buff, &(pstr_usac_element_config->str_usac_mps212_config),
385*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->stereo_config_index);
386*15dc779aSAndroid Build Coastguard Worker 
387*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decoder_config(ia_bit_buf_struct * it_bit_buff,ia_usac_decoder_config_struct * pstr_usac_decoder_config,WORD32 sbr_ratio_index,UINT32 * chan,WORD32 ec_flag)390*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_decoder_config(
391*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
392*15dc779aSAndroid Build Coastguard Worker     ia_usac_decoder_config_struct *pstr_usac_decoder_config,
393*15dc779aSAndroid Build Coastguard Worker     WORD32 sbr_ratio_index, UINT32 *chan, WORD32 ec_flag) {
394*15dc779aSAndroid Build Coastguard Worker   UWORD32 elem_idx = 0;
395*15dc779aSAndroid Build Coastguard Worker   UWORD32 err = 0;
396*15dc779aSAndroid Build Coastguard Worker   WORD32 num_channels = 0;
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_escape_value(
399*15dc779aSAndroid Build Coastguard Worker       it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16);
400*15dc779aSAndroid Build Coastguard Worker   pstr_usac_decoder_config->num_elements += 1;
401*15dc779aSAndroid Build Coastguard Worker   pstr_usac_decoder_config->preroll_flag = 0;
402*15dc779aSAndroid Build Coastguard Worker 
403*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) {
404*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
405*15dc779aSAndroid Build Coastguard Worker       pstr_usac_decoder_config->num_elements = USAC_MAX_ELEMENTS;
406*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
407*15dc779aSAndroid Build Coastguard Worker     } else {
408*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
409*15dc779aSAndroid Build Coastguard Worker     }
410*15dc779aSAndroid Build Coastguard Worker   }
411*15dc779aSAndroid Build Coastguard Worker 
412*15dc779aSAndroid Build Coastguard Worker   for (elem_idx = 0; elem_idx < pstr_usac_decoder_config->num_elements;
413*15dc779aSAndroid Build Coastguard Worker        elem_idx++) {
414*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_element_config_struct *pstr_usac_element_config =
415*15dc779aSAndroid Build Coastguard Worker         &(pstr_usac_decoder_config->str_usac_element_config[elem_idx]);
416*15dc779aSAndroid Build Coastguard Worker 
417*15dc779aSAndroid Build Coastguard Worker     pstr_usac_decoder_config->usac_element_type[elem_idx] =
418*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 2);
419*15dc779aSAndroid Build Coastguard Worker 
420*15dc779aSAndroid Build Coastguard Worker     switch (pstr_usac_decoder_config->usac_element_type[elem_idx]) {
421*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_SCE:
422*15dc779aSAndroid Build Coastguard Worker         num_channels++;
423*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->tw_mdct =
424*15dc779aSAndroid Build Coastguard Worker             ixheaacd_read_bits_buf(it_bit_buff, 1);
425*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->noise_filling =
426*15dc779aSAndroid Build Coastguard Worker             ixheaacd_read_bits_buf(it_bit_buff, 1);
427*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->stereo_config_index = 0;
428*15dc779aSAndroid Build Coastguard Worker         if (sbr_ratio_index > 0)
429*15dc779aSAndroid Build Coastguard Worker           ixheaacd_sbr_config(it_bit_buff,
430*15dc779aSAndroid Build Coastguard Worker                               &(pstr_usac_element_config->str_usac_sbr_config));
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker         break;
433*15dc779aSAndroid Build Coastguard Worker 
434*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_CPE:
435*15dc779aSAndroid Build Coastguard Worker         num_channels += 2;
436*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, sbr_ratio_index) !=
437*15dc779aSAndroid Build Coastguard Worker             IA_NO_ERROR) {
438*15dc779aSAndroid Build Coastguard Worker           if (ec_flag) {
439*15dc779aSAndroid Build Coastguard Worker             longjmp(*(it_bit_buff->xaac_jmp_buf),
440*15dc779aSAndroid Build Coastguard Worker                     IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
441*15dc779aSAndroid Build Coastguard Worker           } else {
442*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
443*15dc779aSAndroid Build Coastguard Worker           }
444*15dc779aSAndroid Build Coastguard Worker         }
445*15dc779aSAndroid Build Coastguard Worker         if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) {
446*15dc779aSAndroid Build Coastguard Worker           if (ec_flag) {
447*15dc779aSAndroid Build Coastguard Worker             longjmp(*(it_bit_buff->xaac_jmp_buf),
448*15dc779aSAndroid Build Coastguard Worker                     IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
449*15dc779aSAndroid Build Coastguard Worker           } else {
450*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
451*15dc779aSAndroid Build Coastguard Worker           }
452*15dc779aSAndroid Build Coastguard Worker         }
453*15dc779aSAndroid Build Coastguard Worker         break;
454*15dc779aSAndroid Build Coastguard Worker 
455*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_LFE:
456*15dc779aSAndroid Build Coastguard Worker         num_channels++;
457*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->tw_mdct = 0;
458*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->noise_filling = 0;
459*15dc779aSAndroid Build Coastguard Worker         pstr_usac_element_config->stereo_config_index = 0;
460*15dc779aSAndroid Build Coastguard Worker         break;
461*15dc779aSAndroid Build Coastguard Worker 
462*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_EXT:
463*15dc779aSAndroid Build Coastguard Worker         err = ixheaacd_ext_element_config(
464*15dc779aSAndroid Build Coastguard Worker             it_bit_buff, pstr_usac_element_config,
465*15dc779aSAndroid Build Coastguard Worker             &pstr_usac_decoder_config->usac_ext_ele_payload_buf[elem_idx][0],
466*15dc779aSAndroid Build Coastguard Worker             &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx],
467*15dc779aSAndroid Build Coastguard Worker             &(pstr_usac_decoder_config->preroll_flag));
468*15dc779aSAndroid Build Coastguard Worker 
469*15dc779aSAndroid Build Coastguard Worker         if (pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx] > 0) {
470*15dc779aSAndroid Build Coastguard Worker           pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 1;
471*15dc779aSAndroid Build Coastguard Worker         } else {
472*15dc779aSAndroid Build Coastguard Worker           pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 0;
473*15dc779aSAndroid Build Coastguard Worker         }
474*15dc779aSAndroid Build Coastguard Worker         if (err != 0) {
475*15dc779aSAndroid Build Coastguard Worker           if (ec_flag) {
476*15dc779aSAndroid Build Coastguard Worker             longjmp(*(it_bit_buff->xaac_jmp_buf),
477*15dc779aSAndroid Build Coastguard Worker                     IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
478*15dc779aSAndroid Build Coastguard Worker           } else {
479*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
480*15dc779aSAndroid Build Coastguard Worker           }
481*15dc779aSAndroid Build Coastguard Worker         }
482*15dc779aSAndroid Build Coastguard Worker         break;
483*15dc779aSAndroid Build Coastguard Worker       default:
484*15dc779aSAndroid Build Coastguard Worker         if (ec_flag) {
485*15dc779aSAndroid Build Coastguard Worker           longjmp(*(it_bit_buff->xaac_jmp_buf),
486*15dc779aSAndroid Build Coastguard Worker                   IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
487*15dc779aSAndroid Build Coastguard Worker         } else {
488*15dc779aSAndroid Build Coastguard Worker           return IA_FATAL_ERROR;
489*15dc779aSAndroid Build Coastguard Worker         }
490*15dc779aSAndroid Build Coastguard Worker         break;
491*15dc779aSAndroid Build Coastguard Worker     }
492*15dc779aSAndroid Build Coastguard Worker     if (num_channels > 2) {
493*15dc779aSAndroid Build Coastguard Worker       if (ec_flag) {
494*15dc779aSAndroid Build Coastguard Worker         longjmp(*(it_bit_buff->xaac_jmp_buf),
495*15dc779aSAndroid Build Coastguard Worker                 IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
496*15dc779aSAndroid Build Coastguard Worker       } else {
497*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
498*15dc779aSAndroid Build Coastguard Worker       }
499*15dc779aSAndroid Build Coastguard Worker     }
500*15dc779aSAndroid Build Coastguard Worker   }
501*15dc779aSAndroid Build Coastguard Worker   return err;
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_config_extension(ia_bit_buf_struct * it_bit_buff,ia_usac_decoder_config_struct * pstr_usac_decoder_config,WORD32 ec_flag)504*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_config_extension(ia_bit_buf_struct *it_bit_buff,
505*15dc779aSAndroid Build Coastguard Worker     ia_usac_decoder_config_struct *pstr_usac_decoder_config, WORD32 ec_flag) {
506*15dc779aSAndroid Build Coastguard Worker   UWORD32 i, j;
507*15dc779aSAndroid Build Coastguard Worker   UWORD32 num_config_extensions;
508*15dc779aSAndroid Build Coastguard Worker   UWORD32 usac_config_ext_type, usac_config_ext_len;
509*15dc779aSAndroid Build Coastguard Worker 
510*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_escape_value(it_bit_buff, &(num_config_extensions), 2, 4, 8);
511*15dc779aSAndroid Build Coastguard Worker   num_config_extensions += 1;
512*15dc779aSAndroid Build Coastguard Worker   if (USAC_MAX_CONFIG_EXTENSIONS < num_config_extensions) {
513*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
514*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
515*15dc779aSAndroid Build Coastguard Worker     } else {
516*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
517*15dc779aSAndroid Build Coastguard Worker     }
518*15dc779aSAndroid Build Coastguard Worker   }
519*15dc779aSAndroid Build Coastguard Worker 
520*15dc779aSAndroid Build Coastguard Worker   pstr_usac_decoder_config->num_config_extensions = num_config_extensions;
521*15dc779aSAndroid Build Coastguard Worker   memset(pstr_usac_decoder_config->usac_cfg_ext_info_len, 0,
522*15dc779aSAndroid Build Coastguard Worker          USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32));
523*15dc779aSAndroid Build Coastguard Worker   memset(pstr_usac_decoder_config->usac_cfg_ext_info_present, 0,
524*15dc779aSAndroid Build Coastguard Worker          USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32));
525*15dc779aSAndroid Build Coastguard Worker 
526*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < num_config_extensions; j++) {
527*15dc779aSAndroid Build Coastguard Worker     UWORD32 fill_byte_val = 0xa5;
528*15dc779aSAndroid Build Coastguard Worker 
529*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16);
530*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16);
531*15dc779aSAndroid Build Coastguard Worker 
532*15dc779aSAndroid Build Coastguard Worker     if (usac_config_ext_len > 768) {
533*15dc779aSAndroid Build Coastguard Worker       if (ec_flag) {
534*15dc779aSAndroid Build Coastguard Worker         longjmp(*(it_bit_buff->xaac_jmp_buf),
535*15dc779aSAndroid Build Coastguard Worker                 IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
536*15dc779aSAndroid Build Coastguard Worker       } else {
537*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
538*15dc779aSAndroid Build Coastguard Worker       }
539*15dc779aSAndroid Build Coastguard Worker     }
540*15dc779aSAndroid Build Coastguard Worker 
541*15dc779aSAndroid Build Coastguard Worker     switch (usac_config_ext_type) {
542*15dc779aSAndroid Build Coastguard Worker       case ID_CONFIG_EXT_FILL:
543*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < usac_config_ext_len; i++) {
544*15dc779aSAndroid Build Coastguard Worker           fill_byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
545*15dc779aSAndroid Build Coastguard Worker           if (fill_byte_val != 0xa5) {
546*15dc779aSAndroid Build Coastguard Worker             if (ec_flag) {
547*15dc779aSAndroid Build Coastguard Worker               longjmp(*(it_bit_buff->xaac_jmp_buf),
548*15dc779aSAndroid Build Coastguard Worker                       IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
549*15dc779aSAndroid Build Coastguard Worker             } else {
550*15dc779aSAndroid Build Coastguard Worker               return IA_FATAL_ERROR;
551*15dc779aSAndroid Build Coastguard Worker             }
552*15dc779aSAndroid Build Coastguard Worker           }
553*15dc779aSAndroid Build Coastguard Worker         }
554*15dc779aSAndroid Build Coastguard Worker         break;
555*15dc779aSAndroid Build Coastguard Worker       default:
556*15dc779aSAndroid Build Coastguard Worker         if ((WORD32)usac_config_ext_len > (it_bit_buff->cnt_bits >> 3)) {
557*15dc779aSAndroid Build Coastguard Worker           if (ec_flag) {
558*15dc779aSAndroid Build Coastguard Worker             longjmp(*(it_bit_buff->xaac_jmp_buf),
559*15dc779aSAndroid Build Coastguard Worker                     IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
560*15dc779aSAndroid Build Coastguard Worker           } else {
561*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
562*15dc779aSAndroid Build Coastguard Worker           }
563*15dc779aSAndroid Build Coastguard Worker         }
564*15dc779aSAndroid Build Coastguard Worker         if (ID_CONFIG_EXT_LOUDNESS_INFO == usac_config_ext_type) {
565*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < usac_config_ext_len; i++) {
566*15dc779aSAndroid Build Coastguard Worker             UWORD8 byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
567*15dc779aSAndroid Build Coastguard Worker             pstr_usac_decoder_config->usac_cfg_ext_info_buf[j][i] = byte_val;
568*15dc779aSAndroid Build Coastguard Worker           }
569*15dc779aSAndroid Build Coastguard Worker           pstr_usac_decoder_config->usac_cfg_ext_info_len[j] =
570*15dc779aSAndroid Build Coastguard Worker               usac_config_ext_len;
571*15dc779aSAndroid Build Coastguard Worker           pstr_usac_decoder_config->usac_cfg_ext_info_present[j] = 1;
572*15dc779aSAndroid Build Coastguard Worker         } else {
573*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < usac_config_ext_len; i++)
574*15dc779aSAndroid Build Coastguard Worker             ixheaacd_read_bits_buf(it_bit_buff, 8);
575*15dc779aSAndroid Build Coastguard Worker         }
576*15dc779aSAndroid Build Coastguard Worker         break;
577*15dc779aSAndroid Build Coastguard Worker     }
578*15dc779aSAndroid Build Coastguard Worker   }
579*15dc779aSAndroid Build Coastguard Worker 
580*15dc779aSAndroid Build Coastguard Worker   return 0;
581*15dc779aSAndroid Build Coastguard Worker }
582*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_config(ia_bit_buf_struct * it_bit_buff,ia_usac_config_struct * pstr_usac_conf,UINT32 * chan,WORD32 ec_flag)583*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, ia_usac_config_struct *pstr_usac_conf,
584*15dc779aSAndroid Build Coastguard Worker                        UINT32 *chan, WORD32 ec_flag) {
585*15dc779aSAndroid Build Coastguard Worker   WORD32 tmp, err;
586*15dc779aSAndroid Build Coastguard Worker   err = 0;
587*15dc779aSAndroid Build Coastguard Worker 
588*15dc779aSAndroid Build Coastguard Worker   pstr_usac_conf->usac_sampling_frequency_index =
589*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 5);
590*15dc779aSAndroid Build Coastguard Worker 
591*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_conf->usac_sampling_frequency_index == 0x1f) {
592*15dc779aSAndroid Build Coastguard Worker     pstr_usac_conf->usac_sampling_frequency =
593*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 24);
594*15dc779aSAndroid Build Coastguard Worker 
595*15dc779aSAndroid Build Coastguard Worker     if (pstr_usac_conf->usac_sampling_frequency > USAC_MAX_SAMPLE_RATE) {
596*15dc779aSAndroid Build Coastguard Worker       if (ec_flag) {
597*15dc779aSAndroid Build Coastguard Worker         longjmp(*(it_bit_buff->xaac_jmp_buf),
598*15dc779aSAndroid Build Coastguard Worker                 IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
599*15dc779aSAndroid Build Coastguard Worker       } else {
600*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
601*15dc779aSAndroid Build Coastguard Worker       }
602*15dc779aSAndroid Build Coastguard Worker     }
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker   } else {
605*15dc779aSAndroid Build Coastguard Worker     pstr_usac_conf->usac_sampling_frequency =
606*15dc779aSAndroid Build Coastguard Worker         sampling_rate_tbl[pstr_usac_conf->usac_sampling_frequency_index];
607*15dc779aSAndroid Build Coastguard Worker   }
608*15dc779aSAndroid Build Coastguard Worker 
609*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_conf->usac_sampling_frequency == 0) {
610*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
611*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
612*15dc779aSAndroid Build Coastguard Worker     } else {
613*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
614*15dc779aSAndroid Build Coastguard Worker     }
615*15dc779aSAndroid Build Coastguard Worker   }
616*15dc779aSAndroid Build Coastguard Worker   pstr_usac_conf->core_sbr_framelength_index =
617*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 3);
618*15dc779aSAndroid Build Coastguard Worker 
619*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_conf->core_sbr_framelength_index > MAX_CORE_SBR_FRAME_LEN_IDX) {
620*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
621*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
622*15dc779aSAndroid Build Coastguard Worker     } else {
623*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
624*15dc779aSAndroid Build Coastguard Worker     }
625*15dc779aSAndroid Build Coastguard Worker   }
626*15dc779aSAndroid Build Coastguard Worker 
627*15dc779aSAndroid Build Coastguard Worker   pstr_usac_conf->channel_configuration_index =
628*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 5);
629*15dc779aSAndroid Build Coastguard Worker   if ((pstr_usac_conf->channel_configuration_index >= 3) &&
630*15dc779aSAndroid Build Coastguard Worker       (pstr_usac_conf->channel_configuration_index != 8)) {
631*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
632*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
633*15dc779aSAndroid Build Coastguard Worker     } else {
634*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
635*15dc779aSAndroid Build Coastguard Worker     }
636*15dc779aSAndroid Build Coastguard Worker   }
637*15dc779aSAndroid Build Coastguard Worker 
638*15dc779aSAndroid Build Coastguard Worker   if (pstr_usac_conf->channel_configuration_index == 0) {
639*15dc779aSAndroid Build Coastguard Worker     UWORD32 i;
640*15dc779aSAndroid Build Coastguard Worker 
641*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_escape_value(it_bit_buff,
642*15dc779aSAndroid Build Coastguard Worker                                (UWORD32 *)(&(pstr_usac_conf->num_out_channels)),
643*15dc779aSAndroid Build Coastguard Worker                                5, 8, 16);
644*15dc779aSAndroid Build Coastguard Worker     if (BS_MAX_NUM_OUT_CHANNELS < pstr_usac_conf->num_out_channels) {
645*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
646*15dc779aSAndroid Build Coastguard Worker     }
647*15dc779aSAndroid Build Coastguard Worker     if (pstr_usac_conf->num_out_channels < 1) {
648*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
649*15dc779aSAndroid Build Coastguard Worker     }
650*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_usac_conf->num_out_channels; i++)
651*15dc779aSAndroid Build Coastguard Worker       pstr_usac_conf->output_channel_pos[i] =
652*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bits_buf(it_bit_buff, 5);
653*15dc779aSAndroid Build Coastguard Worker 
654*15dc779aSAndroid Build Coastguard Worker     if (ec_flag) {
655*15dc779aSAndroid Build Coastguard Worker       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
656*15dc779aSAndroid Build Coastguard Worker     }
657*15dc779aSAndroid Build Coastguard Worker   } else {
658*15dc779aSAndroid Build Coastguard Worker     err = ixheaacd_get_usac_chan_conf(pstr_usac_conf, pstr_usac_conf->channel_configuration_index,
659*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buff, ec_flag);
660*15dc779aSAndroid Build Coastguard Worker     if (err != 0)
661*15dc779aSAndroid Build Coastguard Worker       return err;
662*15dc779aSAndroid Build Coastguard Worker   }
663*15dc779aSAndroid Build Coastguard Worker 
664*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_decoder_config(
665*15dc779aSAndroid Build Coastguard Worker       it_bit_buff, &(pstr_usac_conf->str_usac_dec_config),
666*15dc779aSAndroid Build Coastguard Worker       ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan, ec_flag);
667*15dc779aSAndroid Build Coastguard Worker   if (err != 0) return err;
668*15dc779aSAndroid Build Coastguard Worker 
669*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker   if (tmp) {
672*15dc779aSAndroid Build Coastguard Worker     err = ixheaacd_config_extension(it_bit_buff,
673*15dc779aSAndroid Build Coastguard Worker                                     &pstr_usac_conf->str_usac_dec_config, ec_flag);
674*15dc779aSAndroid Build Coastguard Worker     if (err != 0) return -1;
675*15dc779aSAndroid Build Coastguard Worker   }
676*15dc779aSAndroid Build Coastguard Worker 
677*15dc779aSAndroid Build Coastguard Worker   return err;
678*15dc779aSAndroid Build Coastguard Worker }
679*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_conf_default(ia_usac_config_struct * pstr_usac_conf)680*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_conf_default(ia_usac_config_struct *pstr_usac_conf) {
681*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
682*15dc779aSAndroid Build Coastguard Worker 
683*15dc779aSAndroid Build Coastguard Worker   pstr_usac_conf->num_out_channels = 0;
684*15dc779aSAndroid Build Coastguard Worker 
685*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < BS_MAX_NUM_OUT_CHANNELS; i++)
686*15dc779aSAndroid Build Coastguard Worker     pstr_usac_conf->output_channel_pos[i] = BS_OUTPUT_CHANNEL_POS_NA;
687*15dc779aSAndroid Build Coastguard Worker 
688*15dc779aSAndroid Build Coastguard Worker   pstr_usac_conf->str_usac_dec_config.num_elements = 0;
689*15dc779aSAndroid Build Coastguard Worker 
690*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < USAC_MAX_ELEMENTS; i++)
691*15dc779aSAndroid Build Coastguard Worker     pstr_usac_conf->str_usac_dec_config.usac_element_type[i] = ID_USAC_INVALID;
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker   return;
694*15dc779aSAndroid Build Coastguard Worker }
695