xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_headerdecode.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 <stdlib.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
32*15dc779aSAndroid Build Coastguard Worker 
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_env_extr_part.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
44*15dc779aSAndroid Build Coastguard Worker 
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
51*15dc779aSAndroid Build Coastguard Worker 
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_definitions.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts_crc_check.h"
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_headerdecode.h"
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
86*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_interface.h"
87*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
90*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
91*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ld_mps_dec.h"
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
94*15dc779aSAndroid Build Coastguard Worker 
95*15dc779aSAndroid Build Coastguard Worker #define ELDEXT_SAOC 1
96*15dc779aSAndroid Build Coastguard Worker #define ELDEXT_TERM 0
97*15dc779aSAndroid Build Coastguard Worker #define ELDEXT_LDSAC 2
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_sampl_freq_idx_table[17];
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker #define AAC_LC_PROFILE (2)
102*15dc779aSAndroid Build Coastguard Worker 
103*15dc779aSAndroid Build Coastguard Worker #define ADTS_HEADER_LENGTH 7
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID
ixheaacd_aac_bytealign(struct ia_bit_buf_struct * it_bit_buff)106*15dc779aSAndroid Build Coastguard Worker ixheaacd_aac_bytealign(struct ia_bit_buf_struct *it_bit_buff) {
107*15dc779aSAndroid Build Coastguard Worker   WORD16 num_bit;
108*15dc779aSAndroid Build Coastguard Worker   num_bit = (it_bit_buff->bit_pos + 1);
109*15dc779aSAndroid Build Coastguard Worker   if (num_bit != 8) {
110*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->bit_pos = 7;
111*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->cnt_bits -= num_bit;
112*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->ptr_read_next += 1;
113*15dc779aSAndroid Build Coastguard Worker   }
114*15dc779aSAndroid Build Coastguard Worker }
115*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_read_pce_channel_info(WORD32 ch,WORD8 * ptr_is_cpe,WORD8 * ptr_tag_select,struct ia_bit_buf_struct * it_bit_buff)116*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_read_pce_channel_info(WORD32 ch, WORD8 *ptr_is_cpe,
117*15dc779aSAndroid Build Coastguard Worker                                       WORD8 *ptr_tag_select,
118*15dc779aSAndroid Build Coastguard Worker                                       struct ia_bit_buf_struct *it_bit_buff) {
119*15dc779aSAndroid Build Coastguard Worker   WORD32 num_ch = 0, i, tmp;
120*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ch; i++) {
121*15dc779aSAndroid Build Coastguard Worker     tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
122*15dc779aSAndroid Build Coastguard Worker     ptr_is_cpe[i] = (tmp & 0x10) >> 4;
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker     if (ptr_is_cpe[i]) {
125*15dc779aSAndroid Build Coastguard Worker       num_ch += 2;
126*15dc779aSAndroid Build Coastguard Worker     } else {
127*15dc779aSAndroid Build Coastguard Worker       num_ch++;
128*15dc779aSAndroid Build Coastguard Worker     }
129*15dc779aSAndroid Build Coastguard Worker 
130*15dc779aSAndroid Build Coastguard Worker     ptr_tag_select[i] = (tmp & 0xF);
131*15dc779aSAndroid Build Coastguard Worker   }
132*15dc779aSAndroid Build Coastguard Worker   return num_ch;
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_read_pce_mixdown_data(struct ia_bit_buf_struct * it_bit_buff,WORD32 mix_down_present,WORD32 mix_down_element_no)135*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_read_pce_mixdown_data(struct ia_bit_buf_struct *it_bit_buff,
136*15dc779aSAndroid Build Coastguard Worker                                     WORD32 mix_down_present,
137*15dc779aSAndroid Build Coastguard Worker                                     WORD32 mix_down_element_no) {
138*15dc779aSAndroid Build Coastguard Worker   WORD32 mix_down_flag = ixheaacd_read_bits_buf(it_bit_buff, mix_down_present);
139*15dc779aSAndroid Build Coastguard Worker   if (mix_down_flag == 1) {
140*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bits_buf(it_bit_buff, mix_down_element_no);
141*15dc779aSAndroid Build Coastguard Worker   }
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_skip_bits(struct ia_bit_buf_struct * it_bit_buff,WORD32 bits,WORD32 num_element)144*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_skip_bits(struct ia_bit_buf_struct *it_bit_buff, WORD32 bits,
145*15dc779aSAndroid Build Coastguard Worker                         WORD32 num_element) {
146*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
147*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_element; i++) {
148*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bits_buf(it_bit_buff, bits);
149*15dc779aSAndroid Build Coastguard Worker   }
150*15dc779aSAndroid Build Coastguard Worker }
151*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_read_prog_config_element(ia_program_config_struct * ptr_config_element,struct ia_bit_buf_struct * it_bit_buff)152*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_read_prog_config_element(
153*15dc779aSAndroid Build Coastguard Worker     ia_program_config_struct *ptr_config_element,
154*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct *it_bit_buff) {
155*15dc779aSAndroid Build Coastguard Worker   WORD32 i, tmp;
156*15dc779aSAndroid Build Coastguard Worker   WORD count = 0, num_ch = 0;
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
159*15dc779aSAndroid Build Coastguard Worker 
160*15dc779aSAndroid Build Coastguard Worker   ptr_config_element->element_instance_tag = (tmp >> 2);
161*15dc779aSAndroid Build Coastguard Worker   ptr_config_element->object_type = tmp & 0x3;
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker   if ((ptr_config_element->object_type + 1) != 2
164*15dc779aSAndroid Build Coastguard Worker 
165*15dc779aSAndroid Build Coastguard Worker       && (ptr_config_element->object_type + 1) != 4
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker       ) {
168*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
169*15dc779aSAndroid Build Coastguard Worker   }
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker   ptr_config_element->samp_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
172*15dc779aSAndroid Build Coastguard Worker   if (ptr_config_element->samp_freq_index > 11) {
173*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
174*15dc779aSAndroid Build Coastguard Worker   }
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker   count += ptr_config_element->num_front_channel_elements = (tmp >> 17);
179*15dc779aSAndroid Build Coastguard Worker   count += ptr_config_element->num_side_channel_elements =
180*15dc779aSAndroid Build Coastguard Worker       (tmp & 0x1E000) >> 13;
181*15dc779aSAndroid Build Coastguard Worker   count += ptr_config_element->num_back_channel_elements = (tmp & 0x1E00) >> 9;
182*15dc779aSAndroid Build Coastguard Worker   count += ptr_config_element->num_lfe_channel_elements = (tmp & 0x180) >> 7;
183*15dc779aSAndroid Build Coastguard Worker   ptr_config_element->num_assoc_data_elements = (tmp & 0x70) >> 4;
184*15dc779aSAndroid Build Coastguard Worker   count += ptr_config_element->num_valid_cc_elements = tmp & 0xF;
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker   if (count > MAX_BS_ELEMENT) {
187*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
188*15dc779aSAndroid Build Coastguard Worker   }
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
191*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
192*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 3);
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker   num_ch += ixheaacd_read_pce_channel_info(
195*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->num_front_channel_elements,
196*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->front_element_is_cpe,
197*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->front_element_tag_select, it_bit_buff);
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker   num_ch += ixheaacd_read_pce_channel_info(
200*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->num_side_channel_elements,
201*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->side_element_is_cpe,
202*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->side_element_tag_select, it_bit_buff);
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker   num_ch += ixheaacd_read_pce_channel_info(
205*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->num_back_channel_elements,
206*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->back_element_is_cpe,
207*15dc779aSAndroid Build Coastguard Worker       ptr_config_element->back_element_tag_select, it_bit_buff);
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker   num_ch += ptr_config_element->num_lfe_channel_elements;
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (ptr_config_element->num_lfe_channel_elements); i++) {
212*15dc779aSAndroid Build Coastguard Worker     ptr_config_element->lfe_element_tag_select[i] =
213*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 4);
214*15dc779aSAndroid Build Coastguard Worker   }
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker   ptr_config_element->channels = num_ch;
217*15dc779aSAndroid Build Coastguard Worker 
218*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (ptr_config_element->num_assoc_data_elements); i++) {
219*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bits_buf(it_bit_buff, 4);
220*15dc779aSAndroid Build Coastguard Worker   }
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker   ixheaacd_skip_bits(it_bit_buff, 5, ptr_config_element->num_valid_cc_elements);
223*15dc779aSAndroid Build Coastguard Worker 
224*15dc779aSAndroid Build Coastguard Worker   {
225*15dc779aSAndroid Build Coastguard Worker     WORD32 bits_to_read = ptr_config_element->alignment_bits;
226*15dc779aSAndroid Build Coastguard Worker     if (bits_to_read <= it_bit_buff->bit_pos) {
227*15dc779aSAndroid Build Coastguard Worker       bits_to_read = it_bit_buff->bit_pos - bits_to_read;
228*15dc779aSAndroid Build Coastguard Worker     } else {
229*15dc779aSAndroid Build Coastguard Worker       bits_to_read = 8 - (bits_to_read) + it_bit_buff->bit_pos;
230*15dc779aSAndroid Build Coastguard Worker     }
231*15dc779aSAndroid Build Coastguard Worker     tmp = ixheaacd_read_bits_buf(it_bit_buff, bits_to_read);
232*15dc779aSAndroid Build Coastguard Worker   }
233*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 8);
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker   ixheaacd_skip_bits(it_bit_buff, 8, tmp);
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker   return 0;
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decode_pce(struct ia_bit_buf_struct * it_bit_buff,UWORD32 * ui_pce_found_in_hdr,ia_program_config_struct * ptr_prog_config)240*15dc779aSAndroid Build Coastguard Worker WORD ixheaacd_decode_pce(struct ia_bit_buf_struct *it_bit_buff,
241*15dc779aSAndroid Build Coastguard Worker                          UWORD32 *ui_pce_found_in_hdr,
242*15dc779aSAndroid Build Coastguard Worker                          ia_program_config_struct *ptr_prog_config) {
243*15dc779aSAndroid Build Coastguard Worker   WORD32 error_code = 0;
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker   if (*ui_pce_found_in_hdr == 1 || *ui_pce_found_in_hdr == 3) {
246*15dc779aSAndroid Build Coastguard Worker     ia_program_config_struct ptr_config_element = {0};
247*15dc779aSAndroid Build Coastguard Worker     ptr_config_element.alignment_bits = ptr_prog_config->alignment_bits;
248*15dc779aSAndroid Build Coastguard Worker     error_code =
249*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_prog_config_element(&ptr_config_element, it_bit_buff);
250*15dc779aSAndroid Build Coastguard Worker     *ui_pce_found_in_hdr = 3;
251*15dc779aSAndroid Build Coastguard Worker   } else {
252*15dc779aSAndroid Build Coastguard Worker     error_code =
253*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_prog_config_element(ptr_prog_config, it_bit_buff);
254*15dc779aSAndroid Build Coastguard Worker     *ui_pce_found_in_hdr = 2;
255*15dc779aSAndroid Build Coastguard Worker   }
256*15dc779aSAndroid Build Coastguard Worker   return error_code;
257*15dc779aSAndroid Build Coastguard Worker }
258*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_adif_header(ia_adif_header_struct * adif,struct ia_bit_buf_struct * it_bit_buff)259*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_get_adif_header(
260*15dc779aSAndroid Build Coastguard Worker     ia_adif_header_struct *adif, struct ia_bit_buf_struct *it_bit_buff) {
261*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
262*15dc779aSAndroid Build Coastguard Worker   WORD32 ret_val = 0, tmp;
263*15dc779aSAndroid Build Coastguard Worker 
264*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_bits_buf(it_bit_buff, 16);
265*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 17);
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker   if (tmp & 0x1) {
268*15dc779aSAndroid Build Coastguard Worker     ixheaacd_skip_bits(it_bit_buff, 8, 9);
269*15dc779aSAndroid Build Coastguard Worker   }
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 3);
272*15dc779aSAndroid Build Coastguard Worker 
273*15dc779aSAndroid Build Coastguard Worker   adif->bit_stream_type = (tmp & 0x1);
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_bits_buf(it_bit_buff, 23);
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 4);
278*15dc779aSAndroid Build Coastguard Worker 
279*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i <= tmp; i++) {
280*15dc779aSAndroid Build Coastguard Worker     if (adif->bit_stream_type == 0) {
281*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 20);
282*15dc779aSAndroid Build Coastguard Worker     }
283*15dc779aSAndroid Build Coastguard Worker 
284*15dc779aSAndroid Build Coastguard Worker     adif->prog_config_present = 1;
285*15dc779aSAndroid Build Coastguard Worker     adif->str_prog_config.alignment_bits = 7;
286*15dc779aSAndroid Build Coastguard Worker     ret_val =
287*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_prog_config_element(&adif->str_prog_config, it_bit_buff);
288*15dc779aSAndroid Build Coastguard Worker     if (ret_val) {
289*15dc779aSAndroid Build Coastguard Worker       return ret_val;
290*15dc779aSAndroid Build Coastguard Worker     }
291*15dc779aSAndroid Build Coastguard Worker   }
292*15dc779aSAndroid Build Coastguard Worker 
293*15dc779aSAndroid Build Coastguard Worker   return 0;
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_find_syncword(ia_adts_header_struct * adts,struct ia_bit_buf_struct * it_bit_buff)296*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_find_syncword(ia_adts_header_struct *adts,
297*15dc779aSAndroid Build Coastguard Worker                               struct ia_bit_buf_struct *it_bit_buff) {
298*15dc779aSAndroid Build Coastguard Worker   adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
299*15dc779aSAndroid Build Coastguard Worker   if (adts->sync_word == 0xFFF) {
300*15dc779aSAndroid Build Coastguard Worker     return 0;
301*15dc779aSAndroid Build Coastguard Worker   }
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker   while (1) {
304*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bidirection(it_bit_buff, -4);
305*15dc779aSAndroid Build Coastguard Worker     if (it_bit_buff->cnt_bits < 12) {
306*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
307*15dc779aSAndroid Build Coastguard Worker     }
308*15dc779aSAndroid Build Coastguard Worker     adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
309*15dc779aSAndroid Build Coastguard Worker     if (adts->sync_word == 0xFFF) {
310*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bidirection(it_bit_buff, -12);
311*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
312*15dc779aSAndroid Build Coastguard Worker     }
313*15dc779aSAndroid Build Coastguard Worker   }
314*15dc779aSAndroid Build Coastguard Worker }
315*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_adtsframe(ia_adts_header_struct * adts,struct ia_bit_buf_struct * it_bit_buff)316*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts,
317*15dc779aSAndroid Build Coastguard Worker                           struct ia_bit_buf_struct *it_bit_buff) {
318*15dc779aSAndroid Build Coastguard Worker   WORD32 tmp;
319*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err = IA_NO_ERROR;
320*15dc779aSAndroid Build Coastguard Worker   WORD32 crc_reg;
321*15dc779aSAndroid Build Coastguard Worker   ia_adts_crc_info_struct *ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info;
322*15dc779aSAndroid Build Coastguard Worker   ptr_adts_crc_info->crc_active = 1;
323*15dc779aSAndroid Build Coastguard Worker   ptr_adts_crc_info->no_reg = 0;
324*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_bidirection(it_bit_buff, -12);
325*15dc779aSAndroid Build Coastguard Worker   crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
326*15dc779aSAndroid Build Coastguard Worker                                         CRC_ADTS_HEADER_LEN);
327*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_find_syncword(adts, it_bit_buff);
328*15dc779aSAndroid Build Coastguard Worker   if (err) return err;
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 10);
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker   adts->id = (tmp & 0x200) >> 9;
333*15dc779aSAndroid Build Coastguard Worker   adts->layer = (tmp & 0x180) >> 7;
334*15dc779aSAndroid Build Coastguard Worker   adts->protection_absent = (tmp & 0x40) >> 6;
335*15dc779aSAndroid Build Coastguard Worker   adts->profile = (tmp & 0x30) >> 4;
336*15dc779aSAndroid Build Coastguard Worker   { adts->profile++; }
337*15dc779aSAndroid Build Coastguard Worker   adts->samp_freq_index = (tmp & 0xF);
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker   if (((adts->profile != AAC_LC_PROFILE)) || (adts->samp_freq_index > 11))
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker   {
342*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
343*15dc779aSAndroid Build Coastguard Worker   }
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
346*15dc779aSAndroid Build Coastguard Worker 
347*15dc779aSAndroid Build Coastguard Worker   adts->channel_configuration = (WORD32)(tmp & 0xE0000) >> 17;
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker   adts->aac_frame_length = (tmp & 0x1FFF);
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 13);
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker   adts->no_raw_data_blocks = (tmp & 0x3);
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker   if (adts->protection_absent == 0) {
358*15dc779aSAndroid Build Coastguard Worker     ixheaacd_skip_bits(it_bit_buff, 16, adts->no_raw_data_blocks);
359*15dc779aSAndroid Build Coastguard Worker     adts->crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
360*15dc779aSAndroid Build Coastguard Worker 
361*15dc779aSAndroid Build Coastguard Worker     ptr_adts_crc_info->crc_active = 1;
362*15dc779aSAndroid Build Coastguard Worker     ptr_adts_crc_info->file_value = adts->crc_check;
363*15dc779aSAndroid Build Coastguard Worker   } else
364*15dc779aSAndroid Build Coastguard Worker     ptr_adts_crc_info->crc_active = 0;
365*15dc779aSAndroid Build Coastguard Worker 
366*15dc779aSAndroid Build Coastguard Worker   ixheaacd_aac_bytealign(it_bit_buff);
367*15dc779aSAndroid Build Coastguard Worker   return 0;
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_samp_rate(struct ia_bit_buf_struct * it_bit_buff,ia_sampling_rate_info_struct * pstr_samp_rate_info,ia_audio_specific_config_struct * pstr_audio_specific_config)370*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_get_samp_rate(
371*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct *it_bit_buff,
372*15dc779aSAndroid Build Coastguard Worker     ia_sampling_rate_info_struct *pstr_samp_rate_info,
373*15dc779aSAndroid Build Coastguard Worker     ia_audio_specific_config_struct *pstr_audio_specific_config) {
374*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
375*15dc779aSAndroid Build Coastguard Worker   WORD32 sampling_rate;
376*15dc779aSAndroid Build Coastguard Worker   index = ixheaacd_read_bits_buf(it_bit_buff, 4);
377*15dc779aSAndroid Build Coastguard Worker   pstr_audio_specific_config->samp_frequency_index = index;
378*15dc779aSAndroid Build Coastguard Worker 
379*15dc779aSAndroid Build Coastguard Worker   if (index == 0x0F) {
380*15dc779aSAndroid Build Coastguard Worker     sampling_rate = ixheaacd_read_bits_buf(it_bit_buff, 24);
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker     if (pstr_audio_specific_config->audio_object_type != AOT_USAC) {
383*15dc779aSAndroid Build Coastguard Worker       if (sampling_rate < 9391)
384*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 8000;
385*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 9391) && (sampling_rate < 11502))
386*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 11025;
387*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 11502) && (sampling_rate < 13856))
388*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 12000;
389*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 13856) && (sampling_rate < 18783))
390*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 16000;
391*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 18783) && (sampling_rate < 23004))
392*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 22050;
393*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 23004) && (sampling_rate < 27713))
394*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 24000;
395*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 27713) && (sampling_rate < 37566))
396*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 32000;
397*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 37566) && (sampling_rate < 46009))
398*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 44100;
399*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 46009) && (sampling_rate < 55426))
400*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 48000;
401*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 55426) && (sampling_rate < 75132))
402*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 64000;
403*15dc779aSAndroid Build Coastguard Worker       else if ((sampling_rate >= 75132) && (sampling_rate < 92017))
404*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 88200;
405*15dc779aSAndroid Build Coastguard Worker       else if (sampling_rate >= 92017)
406*15dc779aSAndroid Build Coastguard Worker         sampling_rate = 96000;
407*15dc779aSAndroid Build Coastguard Worker     }
408*15dc779aSAndroid Build Coastguard Worker     return sampling_rate;
409*15dc779aSAndroid Build Coastguard Worker   } else if ((index > 12) && (index < 15)) {
410*15dc779aSAndroid Build Coastguard Worker     return -1;
411*15dc779aSAndroid Build Coastguard Worker   } else {
412*15dc779aSAndroid Build Coastguard Worker     return ((pstr_samp_rate_info[index].sampling_frequency));
413*15dc779aSAndroid Build Coastguard Worker   }
414*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_get_ld_sbr_header(ia_bit_buf_struct * it_bit_buff,ia_sbr_header_data_struct * sbr_header_data)415*15dc779aSAndroid Build Coastguard Worker static int ixheaacd_get_ld_sbr_header(
416*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
417*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct *sbr_header_data) {
418*15dc779aSAndroid Build Coastguard Worker   WORD32 header_extra_1, header_extra_2;
419*15dc779aSAndroid Build Coastguard Worker   UWORD32 tmp, bit_cnt = 0;
420*15dc779aSAndroid Build Coastguard Worker 
421*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_read_bits_buf(it_bit_buff, 16);
422*15dc779aSAndroid Build Coastguard Worker   bit_cnt += 16;
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker   sbr_header_data->amp_res = (tmp & 0x8000) >> 15;
425*15dc779aSAndroid Build Coastguard Worker   sbr_header_data->start_freq = (tmp & 0x7800) >> 11;
426*15dc779aSAndroid Build Coastguard Worker   sbr_header_data->stop_freq = (tmp & 0x780) >> 7;
427*15dc779aSAndroid Build Coastguard Worker   sbr_header_data->xover_band = (tmp & 0x70) >> 4;
428*15dc779aSAndroid Build Coastguard Worker   header_extra_1 = (tmp & 0x0002) >> 1;
429*15dc779aSAndroid Build Coastguard Worker   header_extra_2 = (tmp & 0x0001);
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker   if (header_extra_1) {
432*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->freq_scale = ixheaacd_read_bits_buf(it_bit_buff, 2);
433*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->alter_scale = ixheaacd_read_bits_buf(it_bit_buff, 1);
434*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->noise_bands = ixheaacd_read_bits_buf(it_bit_buff, 2);
435*15dc779aSAndroid Build Coastguard Worker   } else {
436*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->freq_scale = 2;
437*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->alter_scale = 1;
438*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->noise_bands = 2;
439*15dc779aSAndroid Build Coastguard Worker   }
440*15dc779aSAndroid Build Coastguard Worker 
441*15dc779aSAndroid Build Coastguard Worker   if (header_extra_2) {
442*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->limiter_bands = ixheaacd_read_bits_buf(it_bit_buff, 2);
443*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->limiter_gains = ixheaacd_read_bits_buf(it_bit_buff, 2);
444*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->interpol_freq = ixheaacd_read_bits_buf(it_bit_buff, 1);
445*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->smoothing_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
446*15dc779aSAndroid Build Coastguard Worker   } else {
447*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->limiter_bands = 2;
448*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->limiter_gains = 2;
449*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->interpol_freq = 1;
450*15dc779aSAndroid Build Coastguard Worker     sbr_header_data->smoothing_mode = 1;
451*15dc779aSAndroid Build Coastguard Worker   }
452*15dc779aSAndroid Build Coastguard Worker 
453*15dc779aSAndroid Build Coastguard Worker   return (bit_cnt);
454*15dc779aSAndroid Build Coastguard Worker }
455*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_eld_sbr_header(ia_bit_buf_struct * it_bit_buff,WORD32 channels,ia_sbr_header_data_struct * pstr_sbr_config)456*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_eld_sbr_header(ia_bit_buf_struct *it_bit_buff, WORD32 channels,
457*15dc779aSAndroid Build Coastguard Worker                                ia_sbr_header_data_struct *pstr_sbr_config) {
458*15dc779aSAndroid Build Coastguard Worker   int num_sbr_header, el, bit_cnt = 0;
459*15dc779aSAndroid Build Coastguard Worker   switch (channels) {
460*15dc779aSAndroid Build Coastguard Worker     default:
461*15dc779aSAndroid Build Coastguard Worker       num_sbr_header = 0;
462*15dc779aSAndroid Build Coastguard Worker       break;
463*15dc779aSAndroid Build Coastguard Worker     case 1:
464*15dc779aSAndroid Build Coastguard Worker     case 2:
465*15dc779aSAndroid Build Coastguard Worker       num_sbr_header = 1;
466*15dc779aSAndroid Build Coastguard Worker       break;
467*15dc779aSAndroid Build Coastguard Worker     case 3:
468*15dc779aSAndroid Build Coastguard Worker       num_sbr_header = 2;
469*15dc779aSAndroid Build Coastguard Worker       break;
470*15dc779aSAndroid Build Coastguard Worker     case 4:
471*15dc779aSAndroid Build Coastguard Worker     case 5:
472*15dc779aSAndroid Build Coastguard Worker     case 6:
473*15dc779aSAndroid Build Coastguard Worker       num_sbr_header = 3;
474*15dc779aSAndroid Build Coastguard Worker       break;
475*15dc779aSAndroid Build Coastguard Worker     case 7:
476*15dc779aSAndroid Build Coastguard Worker       num_sbr_header = 4;
477*15dc779aSAndroid Build Coastguard Worker       break;
478*15dc779aSAndroid Build Coastguard Worker   }
479*15dc779aSAndroid Build Coastguard Worker   for (el = 0; el < num_sbr_header; el++) {
480*15dc779aSAndroid Build Coastguard Worker     bit_cnt = ixheaacd_get_ld_sbr_header(it_bit_buff, pstr_sbr_config);
481*15dc779aSAndroid Build Coastguard Worker   }
482*15dc779aSAndroid Build Coastguard Worker   return (bit_cnt);
483*15dc779aSAndroid Build Coastguard Worker }
484*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct * aac_state_struct,WORD32 header_len,WORD32 * bytes_consumed,ia_sampling_rate_info_struct * pstr_samp_rate_info,struct ia_bit_buf_struct * it_bit_buff)485*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
486*15dc779aSAndroid Build Coastguard Worker                            WORD32 header_len, WORD32 *bytes_consumed,
487*15dc779aSAndroid Build Coastguard Worker                            ia_sampling_rate_info_struct *pstr_samp_rate_info,
488*15dc779aSAndroid Build Coastguard Worker                            struct ia_bit_buf_struct *it_bit_buff) {
489*15dc779aSAndroid Build Coastguard Worker   WORD32 tmp;
490*15dc779aSAndroid Build Coastguard Worker   WORD32 cnt_bits = it_bit_buff->cnt_bits;
491*15dc779aSAndroid Build Coastguard Worker   UWORD32 aot_init;
492*15dc779aSAndroid Build Coastguard Worker   UWORD32 tmp_aot;
493*15dc779aSAndroid Build Coastguard Worker 
494*15dc779aSAndroid Build Coastguard Worker   ia_audio_specific_config_struct *pstr_audio_specific_config;
495*15dc779aSAndroid Build Coastguard Worker 
496*15dc779aSAndroid Build Coastguard Worker   memset(aac_state_struct->ia_audio_specific_config, 0,
497*15dc779aSAndroid Build Coastguard Worker          sizeof(ia_audio_specific_config_struct));
498*15dc779aSAndroid Build Coastguard Worker 
499*15dc779aSAndroid Build Coastguard Worker   memset(&(aac_state_struct->eld_specific_config), 0,
500*15dc779aSAndroid Build Coastguard Worker          sizeof(ia_eld_specific_config_struct));
501*15dc779aSAndroid Build Coastguard Worker 
502*15dc779aSAndroid Build Coastguard Worker   pstr_audio_specific_config = aac_state_struct->ia_audio_specific_config;
503*15dc779aSAndroid Build Coastguard Worker 
504*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->p_config->str_prog_config.alignment_bits =
505*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->bit_pos;
506*15dc779aSAndroid Build Coastguard Worker 
507*15dc779aSAndroid Build Coastguard Worker   aot_init = aac_state_struct->audio_object_type;
508*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->frame_length = FRAME_SIZE;
509*15dc779aSAndroid Build Coastguard Worker 
510*15dc779aSAndroid Build Coastguard Worker   tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5);
511*15dc779aSAndroid Build Coastguard Worker 
512*15dc779aSAndroid Build Coastguard Worker   if (tmp_aot == 31) {
513*15dc779aSAndroid Build Coastguard Worker     tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
514*15dc779aSAndroid Build Coastguard Worker     tmp_aot = 32 + tmp;
515*15dc779aSAndroid Build Coastguard Worker   }
516*15dc779aSAndroid Build Coastguard Worker 
517*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
518*15dc779aSAndroid Build Coastguard Worker     if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS)
519*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
520*15dc779aSAndroid Build Coastguard Worker   }
521*15dc779aSAndroid Build Coastguard Worker 
522*15dc779aSAndroid Build Coastguard Worker   pstr_audio_specific_config->audio_object_type =
523*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type = tmp_aot;
524*15dc779aSAndroid Build Coastguard Worker 
525*15dc779aSAndroid Build Coastguard Worker   tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
526*15dc779aSAndroid Build Coastguard Worker                                pstr_audio_specific_config);
527*15dc779aSAndroid Build Coastguard Worker   pstr_audio_specific_config->sampling_frequency = tmp;
528*15dc779aSAndroid Build Coastguard Worker 
529*15dc779aSAndroid Build Coastguard Worker   if (tmp == -1) {
530*15dc779aSAndroid Build Coastguard Worker     *bytes_consumed = 1;
531*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
532*15dc779aSAndroid Build Coastguard Worker   } else
533*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->sampling_rate = tmp;
534*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->p_config->ui_samp_freq = tmp;
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->ch_config = ixheaacd_read_bits_buf(it_bit_buff, 4);
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->audio_object_type == AOT_USAC &&
539*15dc779aSAndroid Build Coastguard Worker       ((aac_state_struct->ch_config >= 3) && (aac_state_struct->ch_config != 8))) {
540*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
541*15dc779aSAndroid Build Coastguard Worker   }
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker   pstr_audio_specific_config->channel_configuration =
544*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->ch_config;
545*15dc779aSAndroid Build Coastguard Worker 
546*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->audio_object_type == AOT_SBR ||
547*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type == AOT_PS) {
548*15dc779aSAndroid Build Coastguard Worker     tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
549*15dc779aSAndroid Build Coastguard Worker                                  pstr_audio_specific_config);
550*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->sbr_present_flag = 1;
551*15dc779aSAndroid Build Coastguard Worker     if (tmp == -1) {
552*15dc779aSAndroid Build Coastguard Worker       *bytes_consumed = 1;
553*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
554*15dc779aSAndroid Build Coastguard Worker     } else
555*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->extension_samp_rate = tmp;
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->audio_object_type =
558*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(it_bit_buff, 5);
559*15dc779aSAndroid Build Coastguard Worker   }
560*15dc779aSAndroid Build Coastguard Worker 
561*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
562*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type != aot_init) return IA_FATAL_ERROR;
563*15dc779aSAndroid Build Coastguard Worker   }
564*15dc779aSAndroid Build Coastguard Worker 
565*15dc779aSAndroid Build Coastguard Worker   if (((aac_state_struct->audio_object_type >= AOT_AAC_MAIN &&
566*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type <= AOT_AAC_LTP) ||
567*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_AAC_SCAL ||
568*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_TWIN_VQ ||
569*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
570*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
571*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL ||
572*15dc779aSAndroid Build Coastguard Worker        aac_state_struct->audio_object_type == AOT_ER_AAC_LC) &&
573*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_USAC)
574*15dc779aSAndroid Build Coastguard Worker 
575*15dc779aSAndroid Build Coastguard Worker   {
576*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->usac_flag = 0;
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->frame_len_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
579*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD) {
580*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->depends_on_core_coder =
581*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bits_buf(it_bit_buff, 1);
582*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->extension_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
583*15dc779aSAndroid Build Coastguard Worker 
584*15dc779aSAndroid Build Coastguard Worker       if (aac_state_struct->ch_config == 0) {
585*15dc779aSAndroid Build Coastguard Worker         WORD32 error_code;
586*15dc779aSAndroid Build Coastguard Worker         error_code = ixheaacd_read_prog_config_element(
587*15dc779aSAndroid Build Coastguard Worker             &aac_state_struct->p_config->str_prog_config, it_bit_buff);
588*15dc779aSAndroid Build Coastguard Worker         if (error_code != 0) {
589*15dc779aSAndroid Build Coastguard Worker           *bytes_consumed = 1;
590*15dc779aSAndroid Build Coastguard Worker           return error_code;
591*15dc779aSAndroid Build Coastguard Worker         }
592*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->p_config->ui_pce_found_in_hdr = 1;
593*15dc779aSAndroid Build Coastguard Worker       }
594*15dc779aSAndroid Build Coastguard Worker     }
595*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
596*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
597*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
598*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
599*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 0;
600*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 0;
601*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 0;
602*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.ep_config = 0;
603*15dc779aSAndroid Build Coastguard Worker       if ((aac_state_struct->extension_flag == 1) ||
604*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
605*15dc779aSAndroid Build Coastguard Worker         if (aac_state_struct->audio_object_type >= ER_OBJECT_START) {
606*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->eld_specific_config.aac_sect_data_resil_flag =
607*15dc779aSAndroid Build Coastguard Worker               ixheaacd_read_bits_buf(it_bit_buff, 1);
608*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->eld_specific_config.aac_sf_data_resil_flag =
609*15dc779aSAndroid Build Coastguard Worker               ixheaacd_read_bits_buf(it_bit_buff, 1);
610*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->eld_specific_config.aac_spect_data_resil_flag =
611*15dc779aSAndroid Build Coastguard Worker               ixheaacd_read_bits_buf(it_bit_buff, 1);
612*15dc779aSAndroid Build Coastguard Worker           if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
613*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->eld_specific_config.ep_config =
614*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_read_bits_buf(it_bit_buff, 2);
615*15dc779aSAndroid Build Coastguard Worker           if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD)
616*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->eld_specific_config.ld_sbr_flag_present =
617*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_read_bits_buf(it_bit_buff, 1);
618*15dc779aSAndroid Build Coastguard Worker         }
619*15dc779aSAndroid Build Coastguard Worker       }
620*15dc779aSAndroid Build Coastguard Worker     }
621*15dc779aSAndroid Build Coastguard Worker   }
622*15dc779aSAndroid Build Coastguard Worker   if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
623*15dc779aSAndroid Build Coastguard Worker     {
624*15dc779aSAndroid Build Coastguard Worker       pstr_audio_specific_config->sbr_present_flag = 0;
625*15dc779aSAndroid Build Coastguard Worker       pstr_audio_specific_config->ext_audio_object_type = 0;
626*15dc779aSAndroid Build Coastguard Worker     }
627*15dc779aSAndroid Build Coastguard Worker 
628*15dc779aSAndroid Build Coastguard Worker     {
629*15dc779aSAndroid Build Coastguard Worker       {
630*15dc779aSAndroid Build Coastguard Worker         SIZE_T tmp = 0xf;
631*15dc779aSAndroid Build Coastguard Worker         UWORD32 i;
632*15dc779aSAndroid Build Coastguard Worker         WORD32 err = 0;
633*15dc779aSAndroid Build Coastguard Worker 
634*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->usac_flag = 1;
635*15dc779aSAndroid Build Coastguard Worker 
636*15dc779aSAndroid Build Coastguard Worker         ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
637*15dc779aSAndroid Build Coastguard Worker         err = ixheaacd_config(it_bit_buff, &(pstr_audio_specific_config->str_usac_config),
638*15dc779aSAndroid Build Coastguard Worker                               &(pstr_audio_specific_config->channel_configuration),
639*15dc779aSAndroid Build Coastguard Worker                               aac_state_struct->ec_enable);
640*15dc779aSAndroid Build Coastguard Worker         if (err != 0) return err;
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker         pstr_audio_specific_config->sampling_frequency =
643*15dc779aSAndroid Build Coastguard Worker             pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
644*15dc779aSAndroid Build Coastguard Worker 
645*15dc779aSAndroid Build Coastguard Worker         if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
646*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->sbr_present_flag = 1;
647*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
648*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->ext_sampling_frequency =
649*15dc779aSAndroid Build Coastguard Worker               pstr_audio_specific_config->sampling_frequency;
650*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->ext_samp_frequency_index =
651*15dc779aSAndroid Build Coastguard Worker               pstr_audio_specific_config->samp_frequency_index;
652*15dc779aSAndroid Build Coastguard Worker 
653*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
654*15dc779aSAndroid Build Coastguard Worker                               sizeof(ixheaacd_sampl_freq_idx_table[0]);
655*15dc779aSAndroid Build Coastguard Worker                i++) {
656*15dc779aSAndroid Build Coastguard Worker             if (ixheaacd_sampl_freq_idx_table[i] ==
657*15dc779aSAndroid Build Coastguard Worker                 (int)(pstr_audio_specific_config->sampling_frequency)) {
658*15dc779aSAndroid Build Coastguard Worker               tmp = i;
659*15dc779aSAndroid Build Coastguard Worker               break;
660*15dc779aSAndroid Build Coastguard Worker             }
661*15dc779aSAndroid Build Coastguard Worker           }
662*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
663*15dc779aSAndroid Build Coastguard Worker         } else {
664*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config->sbr_present_flag = 0;
665*15dc779aSAndroid Build Coastguard Worker         }
666*15dc779aSAndroid Build Coastguard Worker       }
667*15dc779aSAndroid Build Coastguard Worker     }
668*15dc779aSAndroid Build Coastguard Worker 
669*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->bs_format != LOAS_BSFORMAT) {
670*15dc779aSAndroid Build Coastguard Worker       ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker       if ((SIZE_T)it_bit_buff->ptr_read_next ==
673*15dc779aSAndroid Build Coastguard Worker           (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
674*15dc779aSAndroid Build Coastguard Worker         *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
675*15dc779aSAndroid Build Coastguard Worker       } else {
676*15dc779aSAndroid Build Coastguard Worker         *bytes_consumed = (WORD32)((((((SIZE_T)it_bit_buff->ptr_read_next -
677*15dc779aSAndroid Build Coastguard Worker                               (SIZE_T)it_bit_buff->ptr_bit_buf_base))
678*15dc779aSAndroid Build Coastguard Worker                             << 3) +
679*15dc779aSAndroid Build Coastguard Worker                             7 - it_bit_buff->bit_pos + 7) >>
680*15dc779aSAndroid Build Coastguard Worker                             3);
681*15dc779aSAndroid Build Coastguard Worker       }
682*15dc779aSAndroid Build Coastguard Worker     }
683*15dc779aSAndroid Build Coastguard Worker     return 0;
684*15dc779aSAndroid Build Coastguard Worker   }
685*15dc779aSAndroid Build Coastguard Worker 
686*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->frame_length = FRAME_SIZE;
687*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->frame_len_flag)
688*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->frame_length = FRAME_SIZE_SMALL;
689*15dc779aSAndroid Build Coastguard Worker 
690*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->extension_flag)
691*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
694*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->frame_length >>= 1;
695*15dc779aSAndroid Build Coastguard Worker 
696*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
697*15dc779aSAndroid Build Coastguard Worker     aac_state_struct->frame_length >>= 1;
698*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
699*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
700*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bits_buf(it_bit_buff, 1);
701*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
702*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bits_buf(it_bit_buff, 1);
703*15dc779aSAndroid Build Coastguard Worker 
704*15dc779aSAndroid Build Coastguard Worker       ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
705*15dc779aSAndroid Build Coastguard Worker                               &aac_state_struct->str_sbr_config);
706*15dc779aSAndroid Build Coastguard Worker 
707*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->dwnsmp_signal =
708*15dc779aSAndroid Build Coastguard Worker           !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
709*15dc779aSAndroid Build Coastguard Worker     }
710*15dc779aSAndroid Build Coastguard Worker 
711*15dc779aSAndroid Build Coastguard Worker     {
712*15dc779aSAndroid Build Coastguard Worker       UWORD16 len, eld_ext_type;
713*15dc779aSAndroid Build Coastguard Worker       WORD32 err;
714*15dc779aSAndroid Build Coastguard Worker       UWORD16 cnt;
715*15dc779aSAndroid Build Coastguard Worker 
716*15dc779aSAndroid Build Coastguard Worker       if (ixheaacd_show_bits_buf(it_bit_buff, 4) != ELDEXT_TERM) {
717*15dc779aSAndroid Build Coastguard Worker         while ((eld_ext_type = ixheaacd_read_bits_buf(it_bit_buff, 4)) !=
718*15dc779aSAndroid Build Coastguard Worker                ELDEXT_TERM) {
719*15dc779aSAndroid Build Coastguard Worker           len = ixheaacd_read_bits_buf(it_bit_buff, 4);
720*15dc779aSAndroid Build Coastguard Worker           if (len == 15) {
721*15dc779aSAndroid Build Coastguard Worker             len += ixheaacd_read_bits_buf(it_bit_buff, 8);
722*15dc779aSAndroid Build Coastguard Worker           }
723*15dc779aSAndroid Build Coastguard Worker           if (len == 15 + 255) {
724*15dc779aSAndroid Build Coastguard Worker             len += ixheaacd_read_bits_buf(it_bit_buff, 16);
725*15dc779aSAndroid Build Coastguard Worker           }
726*15dc779aSAndroid Build Coastguard Worker 
727*15dc779aSAndroid Build Coastguard Worker           switch (eld_ext_type) {
728*15dc779aSAndroid Build Coastguard Worker             case ELDEXT_SAOC:
729*15dc779aSAndroid Build Coastguard Worker               break;
730*15dc779aSAndroid Build Coastguard Worker             case ELDEXT_LDSAC:
731*15dc779aSAndroid Build Coastguard Worker               aac_state_struct->ldmps_present = 1;
732*15dc779aSAndroid Build Coastguard Worker               aac_state_struct->mps_dec_handle.ldmps_config.ldmps_present_flag =
733*15dc779aSAndroid Build Coastguard Worker                   1;
734*15dc779aSAndroid Build Coastguard Worker               aac_state_struct->mps_dec_handle.object_type =
735*15dc779aSAndroid Build Coastguard Worker                   aac_state_struct->audio_object_type;
736*15dc779aSAndroid Build Coastguard Worker               aac_state_struct->mps_dec_handle.ec_flag = aac_state_struct->ec_enable;
737*15dc779aSAndroid Build Coastguard Worker               err = ixheaacd_ld_spatial_specific_config(
738*15dc779aSAndroid Build Coastguard Worker                   &(aac_state_struct->mps_dec_handle.ldmps_config), it_bit_buff);
739*15dc779aSAndroid Build Coastguard Worker               if (err) return err;
740*15dc779aSAndroid Build Coastguard Worker 
741*15dc779aSAndroid Build Coastguard Worker               if (ixheaacd_mps_create(
742*15dc779aSAndroid Build Coastguard Worker                       &aac_state_struct->mps_dec_handle,
743*15dc779aSAndroid Build Coastguard Worker                       aac_state_struct->mps_dec_handle.ldmps_config
744*15dc779aSAndroid Build Coastguard Worker                           .bs_frame_length,
745*15dc779aSAndroid Build Coastguard Worker                       0, &(aac_state_struct->mps_dec_handle.ldmps_config))) {
746*15dc779aSAndroid Build Coastguard Worker                 return -1;
747*15dc779aSAndroid Build Coastguard Worker               }
748*15dc779aSAndroid Build Coastguard Worker               break;
749*15dc779aSAndroid Build Coastguard Worker             default:
750*15dc779aSAndroid Build Coastguard Worker               for (cnt = 0; cnt < len; cnt++) {
751*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_read_bits_buf(it_bit_buff, 8);
752*15dc779aSAndroid Build Coastguard Worker               }
753*15dc779aSAndroid Build Coastguard Worker 
754*15dc779aSAndroid Build Coastguard Worker               break;
755*15dc779aSAndroid Build Coastguard Worker           }
756*15dc779aSAndroid Build Coastguard Worker           break;
757*15dc779aSAndroid Build Coastguard Worker         }
758*15dc779aSAndroid Build Coastguard Worker       }
759*15dc779aSAndroid Build Coastguard Worker     }
760*15dc779aSAndroid Build Coastguard Worker     if (!((aac_state_struct->ldmps_present == 1) &&
761*15dc779aSAndroid Build Coastguard Worker           !(it_bit_buff->cnt_bits >= 1)))
762*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bits_buf(it_bit_buff, 1);
763*15dc779aSAndroid Build Coastguard Worker   }
764*15dc779aSAndroid Build Coastguard Worker   if (!((aac_state_struct->ldmps_present == 1) && !(it_bit_buff->cnt_bits > 0))) {
765*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
766*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
767*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
768*15dc779aSAndroid Build Coastguard Worker       WORD32 ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
769*15dc779aSAndroid Build Coastguard Worker       if (ep_config == 2 || ep_config == 3) {
770*15dc779aSAndroid Build Coastguard Worker       }
771*15dc779aSAndroid Build Coastguard Worker       if (ep_config == 3) {
772*15dc779aSAndroid Build Coastguard Worker         WORD32 direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
773*15dc779aSAndroid Build Coastguard Worker         if (!direct_map) {
774*15dc779aSAndroid Build Coastguard Worker         }
775*15dc779aSAndroid Build Coastguard Worker       }
776*15dc779aSAndroid Build Coastguard Worker     }
777*15dc779aSAndroid Build Coastguard Worker 
778*15dc779aSAndroid Build Coastguard Worker     tmp = (header_len * 8) - it_bit_buff->cnt_bits;
779*15dc779aSAndroid Build Coastguard Worker 
780*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type != AOT_SBR &&
781*15dc779aSAndroid Build Coastguard Worker         (it_bit_buff->cnt_bits >= 16)) {
782*15dc779aSAndroid Build Coastguard Worker       tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
783*15dc779aSAndroid Build Coastguard Worker 
784*15dc779aSAndroid Build Coastguard Worker       if (tmp == 0x2b7) {
785*15dc779aSAndroid Build Coastguard Worker         tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
786*15dc779aSAndroid Build Coastguard Worker 
787*15dc779aSAndroid Build Coastguard Worker         if (tmp == AOT_SBR) {
788*15dc779aSAndroid Build Coastguard Worker           WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
789*15dc779aSAndroid Build Coastguard Worker           if (sbr_present_flag) {
790*15dc779aSAndroid Build Coastguard Worker             tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
791*15dc779aSAndroid Build Coastguard Worker                                          pstr_audio_specific_config);
792*15dc779aSAndroid Build Coastguard Worker             if (tmp == -1) {
793*15dc779aSAndroid Build Coastguard Worker               *bytes_consumed = 1;
794*15dc779aSAndroid Build Coastguard Worker               return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
795*15dc779aSAndroid Build Coastguard Worker             } else
796*15dc779aSAndroid Build Coastguard Worker               aac_state_struct->extension_samp_rate = tmp;
797*15dc779aSAndroid Build Coastguard Worker 
798*15dc779aSAndroid Build Coastguard Worker             if (it_bit_buff->cnt_bits >= 12) {
799*15dc779aSAndroid Build Coastguard Worker               tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
800*15dc779aSAndroid Build Coastguard Worker               if (tmp == 0x548) {
801*15dc779aSAndroid Build Coastguard Worker                 tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
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       } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
807*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -11);
808*15dc779aSAndroid Build Coastguard Worker       }
809*15dc779aSAndroid Build Coastguard Worker     }
810*15dc779aSAndroid Build Coastguard Worker   }
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker   if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
813*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_SBR &&
814*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_PS &&
815*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
816*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
817*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
818*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->audio_object_type != AOT_AAC_LTP) {
819*15dc779aSAndroid Build Coastguard Worker     *bytes_consumed = 1;
820*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
821*15dc779aSAndroid Build Coastguard Worker   } else {
822*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
823*15dc779aSAndroid Build Coastguard Worker       *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
824*15dc779aSAndroid Build Coastguard Worker       if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
825*15dc779aSAndroid Build Coastguard Worker 
826*15dc779aSAndroid Build Coastguard Worker     } else
827*15dc779aSAndroid Build Coastguard Worker       *bytes_consumed = header_len;
828*15dc779aSAndroid Build Coastguard Worker 
829*15dc779aSAndroid Build Coastguard Worker     return 0;
830*15dc779aSAndroid Build Coastguard Worker   }
831*15dc779aSAndroid Build Coastguard Worker }
832*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_check_if_adts(ia_adts_header_struct * adts,struct ia_bit_buf_struct * it_bit_buff,WORD32 usr_max_ch)833*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts,
834*15dc779aSAndroid Build Coastguard Worker                               struct ia_bit_buf_struct *it_bit_buff,
835*15dc779aSAndroid Build Coastguard Worker                               WORD32 usr_max_ch) {
836*15dc779aSAndroid Build Coastguard Worker   WORD32 max_frm_len_per_ch, result = 0;
837*15dc779aSAndroid Build Coastguard Worker 
838*15dc779aSAndroid Build Coastguard Worker   result = ixheaacd_adtsframe(adts, it_bit_buff);
839*15dc779aSAndroid Build Coastguard Worker 
840*15dc779aSAndroid Build Coastguard Worker   max_frm_len_per_ch = ixheaac_mult32(768, (adts->no_raw_data_blocks + 1));
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker   if (adts->channel_configuration != 0)
843*15dc779aSAndroid Build Coastguard Worker     max_frm_len_per_ch =
844*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32(max_frm_len_per_ch, adts->channel_configuration);
845*15dc779aSAndroid Build Coastguard Worker   else
846*15dc779aSAndroid Build Coastguard Worker     max_frm_len_per_ch = max_frm_len_per_ch * usr_max_ch;
847*15dc779aSAndroid Build Coastguard Worker 
848*15dc779aSAndroid Build Coastguard Worker   return ((result != 0) || (adts->aac_frame_length < 8) || (adts->layer != 0) ||
849*15dc779aSAndroid Build Coastguard Worker           (adts->profile != AAC_LC_PROFILE));
850*15dc779aSAndroid Build Coastguard Worker }
851*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_latm_header_decode(ia_aac_dec_state_struct * aac_state_struct,struct ia_bit_buf_struct * it_bit_buff,WORD32 * bytes_consumed,ia_sampling_rate_info_struct * pstr_samp_rate_info)852*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_latm_header_decode(
853*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_state_struct *aac_state_struct,
854*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct *it_bit_buff, WORD32 *bytes_consumed,
855*15dc779aSAndroid Build Coastguard Worker     ia_sampling_rate_info_struct *pstr_samp_rate_info) {
856*15dc779aSAndroid Build Coastguard Worker   WORD32 sync;
857*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE result;
858*15dc779aSAndroid Build Coastguard Worker   WORD32 next_sync, audio_mux_len_bytes_last;
859*15dc779aSAndroid Build Coastguard Worker   WORD32 audio_mux_len_bits_last;
860*15dc779aSAndroid Build Coastguard Worker   WORD32 sync_status = aac_state_struct->sync_status;
861*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_count = aac_state_struct->bit_count;
862*15dc779aSAndroid Build Coastguard Worker   WORD32 cnt_bits = it_bit_buff->cnt_bits;
863*15dc779aSAndroid Build Coastguard Worker 
864*15dc779aSAndroid Build Coastguard Worker   *bytes_consumed = 0;
865*15dc779aSAndroid Build Coastguard Worker 
866*15dc779aSAndroid Build Coastguard Worker   aac_state_struct->bs_format = LOAS_BSFORMAT;
867*15dc779aSAndroid Build Coastguard Worker 
868*15dc779aSAndroid Build Coastguard Worker   if (sync_status == 0) {
869*15dc779aSAndroid Build Coastguard Worker     do {
870*15dc779aSAndroid Build Coastguard Worker       sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
871*15dc779aSAndroid Build Coastguard Worker       bit_count += 11;
872*15dc779aSAndroid Build Coastguard Worker       while (sync != 0x2B7) {
873*15dc779aSAndroid Build Coastguard Worker         sync = ((sync & 0x3ff) << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1);
874*15dc779aSAndroid Build Coastguard Worker         bit_count += 1;
875*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 13) {
876*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff, -11);
877*15dc779aSAndroid Build Coastguard Worker           *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
878*15dc779aSAndroid Build Coastguard Worker           return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
879*15dc779aSAndroid Build Coastguard Worker         }
880*15dc779aSAndroid Build Coastguard Worker       }
881*15dc779aSAndroid Build Coastguard Worker 
882*15dc779aSAndroid Build Coastguard Worker       audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
883*15dc779aSAndroid Build Coastguard Worker       bit_count += 13;
884*15dc779aSAndroid Build Coastguard Worker       audio_mux_len_bits_last = audio_mux_len_bytes_last << 3;
885*15dc779aSAndroid Build Coastguard Worker       if (it_bit_buff->cnt_bits >= (audio_mux_len_bits_last + 11)) {
886*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bits_last);
887*15dc779aSAndroid Build Coastguard Worker         bit_count += audio_mux_len_bits_last;
888*15dc779aSAndroid Build Coastguard Worker 
889*15dc779aSAndroid Build Coastguard Worker         next_sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
890*15dc779aSAndroid Build Coastguard Worker         bit_count += 11;
891*15dc779aSAndroid Build Coastguard Worker 
892*15dc779aSAndroid Build Coastguard Worker         if (next_sync == 0x2B7) {
893*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff,
894*15dc779aSAndroid Build Coastguard Worker                                     -(11 + audio_mux_len_bits_last + 13 + 11));
895*15dc779aSAndroid Build Coastguard Worker           bit_count -= 11 + audio_mux_len_bits_last + 13 + 11;
896*15dc779aSAndroid Build Coastguard Worker           break;
897*15dc779aSAndroid Build Coastguard Worker         } else {
898*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff,
899*15dc779aSAndroid Build Coastguard Worker                                     -(audio_mux_len_bits_last + 24 + 11 - 1));
900*15dc779aSAndroid Build Coastguard Worker           bit_count -= audio_mux_len_bits_last + 24 + 11 - 1;
901*15dc779aSAndroid Build Coastguard Worker         }
902*15dc779aSAndroid Build Coastguard Worker 
903*15dc779aSAndroid Build Coastguard Worker       } else {
904*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits != audio_mux_len_bits_last) {
905*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
906*15dc779aSAndroid Build Coastguard Worker           bit_count -= (13 + 11);
907*15dc779aSAndroid Build Coastguard Worker           *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
908*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
909*15dc779aSAndroid Build Coastguard Worker         } else {
910*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
911*15dc779aSAndroid Build Coastguard Worker           bit_count -= (13 + 11);
912*15dc779aSAndroid Build Coastguard Worker           break;
913*15dc779aSAndroid Build Coastguard Worker         }
914*15dc779aSAndroid Build Coastguard Worker       }
915*15dc779aSAndroid Build Coastguard Worker     } while (1);
916*15dc779aSAndroid Build Coastguard Worker 
917*15dc779aSAndroid Build Coastguard Worker     do {
918*15dc779aSAndroid Build Coastguard Worker       WORD32 audio_mux_len_bytes_last;
919*15dc779aSAndroid Build Coastguard Worker       WORD32 use_same_stream_mux;
920*15dc779aSAndroid Build Coastguard Worker 
921*15dc779aSAndroid Build Coastguard Worker       sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
922*15dc779aSAndroid Build Coastguard Worker       bit_count += 11;
923*15dc779aSAndroid Build Coastguard Worker 
924*15dc779aSAndroid Build Coastguard Worker       if (sync != 0x2b7) {
925*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -25);
926*15dc779aSAndroid Build Coastguard Worker         bit_count -= 11;
927*15dc779aSAndroid Build Coastguard Worker         *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
928*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
929*15dc779aSAndroid Build Coastguard Worker       }
930*15dc779aSAndroid Build Coastguard Worker 
931*15dc779aSAndroid Build Coastguard Worker       audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
932*15dc779aSAndroid Build Coastguard Worker       bit_count += 13;
933*15dc779aSAndroid Build Coastguard Worker 
934*15dc779aSAndroid Build Coastguard Worker       use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1);
935*15dc779aSAndroid Build Coastguard Worker       bit_count += 1;
936*15dc779aSAndroid Build Coastguard Worker 
937*15dc779aSAndroid Build Coastguard Worker       if (!use_same_stream_mux) {
938*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -25);
939*15dc779aSAndroid Build Coastguard Worker         bit_count -= 25;
940*15dc779aSAndroid Build Coastguard Worker         sync_status = 1;
941*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->sync_status = sync_status;
942*15dc779aSAndroid Build Coastguard Worker         break;
943*15dc779aSAndroid Build Coastguard Worker       } else {
944*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -25);
945*15dc779aSAndroid Build Coastguard Worker         bit_count -= 25;
946*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->bit_count = bit_count;
947*15dc779aSAndroid Build Coastguard Worker         *bytes_consumed = 1;
948*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
949*15dc779aSAndroid Build Coastguard Worker       }
950*15dc779aSAndroid Build Coastguard Worker 
951*15dc779aSAndroid Build Coastguard Worker 
952*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bytes_last * 8 - 1);
953*15dc779aSAndroid Build Coastguard Worker       bit_count += audio_mux_len_bytes_last * 8 - 1;
954*15dc779aSAndroid Build Coastguard Worker 
955*15dc779aSAndroid Build Coastguard Worker     } while (sync_status == 0);
956*15dc779aSAndroid Build Coastguard Worker 
957*15dc779aSAndroid Build Coastguard Worker     *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
958*15dc779aSAndroid Build Coastguard Worker     {
959*15dc779aSAndroid Build Coastguard Worker       ixheaacd_latm_struct latm_struct_element;
960*15dc779aSAndroid Build Coastguard Worker       WORD32 sync;
961*15dc779aSAndroid Build Coastguard Worker       memset(&latm_struct_element, 0, sizeof(ixheaacd_latm_struct));
962*15dc779aSAndroid Build Coastguard Worker 
963*15dc779aSAndroid Build Coastguard Worker       sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
964*15dc779aSAndroid Build Coastguard Worker       if (sync == 0x2b7) {
965*15dc779aSAndroid Build Coastguard Worker         result = ixheaacd_latm_audio_mux_element(
966*15dc779aSAndroid Build Coastguard Worker             it_bit_buff, &latm_struct_element, aac_state_struct,
967*15dc779aSAndroid Build Coastguard Worker             pstr_samp_rate_info);
968*15dc779aSAndroid Build Coastguard Worker         if (result != 0) {
969*15dc779aSAndroid Build Coastguard Worker           sync_status = 0;
970*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->sync_status = sync_status;
971*15dc779aSAndroid Build Coastguard Worker 
972*15dc779aSAndroid Build Coastguard Worker           *bytes_consumed += 1;
973*15dc779aSAndroid Build Coastguard Worker           return result;
974*15dc779aSAndroid Build Coastguard Worker         }
975*15dc779aSAndroid Build Coastguard Worker       }
976*15dc779aSAndroid Build Coastguard Worker     }
977*15dc779aSAndroid Build Coastguard Worker   }
978*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
979*15dc779aSAndroid Build Coastguard Worker }
980*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_headerdecode(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,UWORD8 * buffer,WORD32 * bytes_consumed,const ia_aac_dec_huffman_tables_struct * pstr_huffmann_tables)981*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_aac_headerdecode(
982*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, UWORD8 *buffer,
983*15dc779aSAndroid Build Coastguard Worker     WORD32 *bytes_consumed,
984*15dc779aSAndroid Build Coastguard Worker     const ia_aac_dec_huffman_tables_struct *pstr_huffmann_tables) {
985*15dc779aSAndroid Build Coastguard Worker   struct ia_bit_buf_struct it_bit_buff = {0}, *handle_bit_buff;
986*15dc779aSAndroid Build Coastguard Worker   ia_adif_header_struct adif = {0};
987*15dc779aSAndroid Build Coastguard Worker   ia_adts_header_struct adts = {0};
988*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
989*15dc779aSAndroid Build Coastguard Worker   WORD32 header_len;
990*15dc779aSAndroid Build Coastguard Worker   WORD32 sync = 0;
991*15dc779aSAndroid Build Coastguard Worker 
992*15dc779aSAndroid Build Coastguard Worker   WORD32 disable_sync = p_obj_exhaacplus_dec->aac_config.ui_disable_sync;
993*15dc779aSAndroid Build Coastguard Worker   WORD32 is_ga_header = p_obj_exhaacplus_dec->aac_config.ui_mp4_flag;
994*15dc779aSAndroid Build Coastguard Worker 
995*15dc779aSAndroid Build Coastguard Worker   WORD32 loas_present = p_obj_exhaacplus_dec->aac_config.loas_present;
996*15dc779aSAndroid Build Coastguard Worker 
997*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *aac_state_struct =
998*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
999*15dc779aSAndroid Build Coastguard Worker   WORD32 usr_max_ch = aac_state_struct->p_config->ui_max_channels;
1000*15dc779aSAndroid Build Coastguard Worker 
1001*15dc779aSAndroid Build Coastguard Worker   ia_sampling_rate_info_struct *pstr_samp_rate_info =
1002*15dc779aSAndroid Build Coastguard Worker       (ia_sampling_rate_info_struct *)&pstr_huffmann_tables
1003*15dc779aSAndroid Build Coastguard Worker           ->str_sample_rate_info[0];
1004*15dc779aSAndroid Build Coastguard Worker 
1005*15dc779aSAndroid Build Coastguard Worker   if (buffer == 0) {
1006*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
1007*15dc779aSAndroid Build Coastguard Worker   }
1008*15dc779aSAndroid Build Coastguard Worker 
1009*15dc779aSAndroid Build Coastguard Worker   header_len = aac_state_struct->ui_in_bytes;
1010*15dc779aSAndroid Build Coastguard Worker 
1011*15dc779aSAndroid Build Coastguard Worker   handle_bit_buff = ixheaacd_create_bit_buf(&it_bit_buff, (UWORD8 *)buffer,
1012*15dc779aSAndroid Build Coastguard Worker                                             (WORD16)header_len);
1013*15dc779aSAndroid Build Coastguard Worker   handle_bit_buff->cnt_bits += (header_len << 3);
1014*15dc779aSAndroid Build Coastguard Worker   handle_bit_buff->xaac_jmp_buf = &aac_state_struct->xaac_jmp_buf;
1015*15dc779aSAndroid Build Coastguard Worker 
1016*15dc779aSAndroid Build Coastguard Worker   if (is_ga_header == 1) {
1017*15dc779aSAndroid Build Coastguard Worker     return ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed,
1018*15dc779aSAndroid Build Coastguard Worker                                pstr_samp_rate_info, handle_bit_buff);
1019*15dc779aSAndroid Build Coastguard Worker   } else if (loas_present) {
1020*15dc779aSAndroid Build Coastguard Worker     return ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff,
1021*15dc779aSAndroid Build Coastguard Worker                                        bytes_consumed, pstr_samp_rate_info);
1022*15dc779aSAndroid Build Coastguard Worker   }
1023*15dc779aSAndroid Build Coastguard Worker 
1024*15dc779aSAndroid Build Coastguard Worker   else {
1025*15dc779aSAndroid Build Coastguard Worker     WORD32 header_found = 0;
1026*15dc779aSAndroid Build Coastguard Worker     WORD32 bytes_taken = -1;
1027*15dc779aSAndroid Build Coastguard Worker     WORD32 prev_offset = 0;
1028*15dc779aSAndroid Build Coastguard Worker     WORD32 run_once = 1;
1029*15dc779aSAndroid Build Coastguard Worker     if (disable_sync == 0) run_once = 0;
1030*15dc779aSAndroid Build Coastguard Worker 
1031*15dc779aSAndroid Build Coastguard Worker     do {
1032*15dc779aSAndroid Build Coastguard Worker       bytes_taken++;
1033*15dc779aSAndroid Build Coastguard Worker       buffer += (bytes_taken - prev_offset);
1034*15dc779aSAndroid Build Coastguard Worker 
1035*15dc779aSAndroid Build Coastguard Worker       prev_offset = bytes_taken;
1036*15dc779aSAndroid Build Coastguard Worker 
1037*15dc779aSAndroid Build Coastguard Worker       handle_bit_buff = ixheaacd_create_bit_buf(
1038*15dc779aSAndroid Build Coastguard Worker           &it_bit_buff, (UWORD8 *)buffer, (WORD16)(header_len - bytes_taken));
1039*15dc779aSAndroid Build Coastguard Worker       handle_bit_buff->cnt_bits += (8 * (header_len - bytes_taken));
1040*15dc779aSAndroid Build Coastguard Worker 
1041*15dc779aSAndroid Build Coastguard Worker       handle_bit_buff->pstr_adts_crc_info = &handle_bit_buff->str_adts_crc_info;
1042*15dc779aSAndroid Build Coastguard Worker       ixheaacd_adts_crc_open(handle_bit_buff->pstr_adts_crc_info);
1043*15dc779aSAndroid Build Coastguard Worker 
1044*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->ldmps_present = 0;
1045*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->latm_initialized = 0;
1046*15dc779aSAndroid Build Coastguard Worker       memset(&aac_state_struct->mps_dec_handle, 0,
1047*15dc779aSAndroid Build Coastguard Worker              sizeof(aac_state_struct->mps_dec_handle));
1048*15dc779aSAndroid Build Coastguard Worker       memset(&aac_state_struct->eld_specific_config, 0,
1049*15dc779aSAndroid Build Coastguard Worker              sizeof(aac_state_struct->eld_specific_config));
1050*15dc779aSAndroid Build Coastguard Worker 
1051*15dc779aSAndroid Build Coastguard Worker       if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') &&
1052*15dc779aSAndroid Build Coastguard Worker           (buffer[3] == 'F')) {
1053*15dc779aSAndroid Build Coastguard Worker         adif.prog_config_present = 0;
1054*15dc779aSAndroid Build Coastguard Worker         result = ixheaacd_get_adif_header(&adif, handle_bit_buff);
1055*15dc779aSAndroid Build Coastguard Worker         if (result == 0) {
1056*15dc779aSAndroid Build Coastguard Worker           if (adif.prog_config_present == 1) {
1057*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->p_config->ui_pce_found_in_hdr = 1;
1058*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->p_config->str_prog_config = adif.str_prog_config;
1059*15dc779aSAndroid Build Coastguard Worker           }
1060*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->s_adif_hdr_present = 1;
1061*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->audio_object_type =
1062*15dc779aSAndroid Build Coastguard Worker               adif.str_prog_config.object_type;
1063*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->sampling_rate =
1064*15dc779aSAndroid Build Coastguard Worker               pstr_samp_rate_info[adif.str_prog_config.samp_freq_index]
1065*15dc779aSAndroid Build Coastguard Worker                   .sampling_frequency;
1066*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->ch_config = adif.str_prog_config.channels;
1067*15dc779aSAndroid Build Coastguard Worker           bytes_taken +=
1068*15dc779aSAndroid Build Coastguard Worker               ((handle_bit_buff->size - handle_bit_buff->cnt_bits) >> 3);
1069*15dc779aSAndroid Build Coastguard Worker 
1070*15dc779aSAndroid Build Coastguard Worker           header_found = 1;
1071*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->frame_length = FRAME_SIZE;
1072*15dc779aSAndroid Build Coastguard Worker           if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
1073*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->frame_length >>= 1;
1074*15dc779aSAndroid Build Coastguard Worker         }
1075*15dc779aSAndroid Build Coastguard Worker       }
1076*15dc779aSAndroid Build Coastguard Worker 
1077*15dc779aSAndroid Build Coastguard Worker       else if ((sync = ixheaacd_read_bits_buf(&it_bit_buff, 12)) == 0xfff) {
1078*15dc779aSAndroid Build Coastguard Worker         result = ixheaacd_check_if_adts(&adts, handle_bit_buff, usr_max_ch);
1079*15dc779aSAndroid Build Coastguard Worker         if (result != 0) {
1080*15dc779aSAndroid Build Coastguard Worker           continue;
1081*15dc779aSAndroid Build Coastguard Worker         }
1082*15dc779aSAndroid Build Coastguard Worker 
1083*15dc779aSAndroid Build Coastguard Worker         if ((adts.aac_frame_length + ADTS_HEADER_LENGTH) <
1084*15dc779aSAndroid Build Coastguard Worker             (header_len - bytes_taken)) {
1085*15dc779aSAndroid Build Coastguard Worker           ia_adts_header_struct adts_loc = {0};
1086*15dc779aSAndroid Build Coastguard Worker 
1087*15dc779aSAndroid Build Coastguard Worker           ixheaacd_create_init_bit_buf(
1088*15dc779aSAndroid Build Coastguard Worker               &it_bit_buff, (UWORD8 *)(buffer + adts.aac_frame_length),
1089*15dc779aSAndroid Build Coastguard Worker               (WORD16)(header_len - bytes_taken - adts.aac_frame_length));
1090*15dc779aSAndroid Build Coastguard Worker 
1091*15dc779aSAndroid Build Coastguard Worker           handle_bit_buff = &it_bit_buff;
1092*15dc779aSAndroid Build Coastguard Worker 
1093*15dc779aSAndroid Build Coastguard Worker           adts_loc.sync_word =
1094*15dc779aSAndroid Build Coastguard Worker               (WORD16)ixheaacd_read_bits_buf(handle_bit_buff, 12);
1095*15dc779aSAndroid Build Coastguard Worker 
1096*15dc779aSAndroid Build Coastguard Worker           if (adts_loc.sync_word != 0xFFF) {
1097*15dc779aSAndroid Build Coastguard Worker             continue;
1098*15dc779aSAndroid Build Coastguard Worker           }
1099*15dc779aSAndroid Build Coastguard Worker 
1100*15dc779aSAndroid Build Coastguard Worker           result =
1101*15dc779aSAndroid Build Coastguard Worker               ixheaacd_check_if_adts(&adts_loc, handle_bit_buff, usr_max_ch);
1102*15dc779aSAndroid Build Coastguard Worker           if ((result != 0) ||
1103*15dc779aSAndroid Build Coastguard Worker               (adts.samp_freq_index != adts_loc.samp_freq_index) ||
1104*15dc779aSAndroid Build Coastguard Worker               (adts.channel_configuration != adts_loc.channel_configuration)) {
1105*15dc779aSAndroid Build Coastguard Worker             continue;
1106*15dc779aSAndroid Build Coastguard Worker           }
1107*15dc779aSAndroid Build Coastguard Worker         }
1108*15dc779aSAndroid Build Coastguard Worker 
1109*15dc779aSAndroid Build Coastguard Worker         {
1110*15dc779aSAndroid Build Coastguard Worker           WORD32 obj_type;
1111*15dc779aSAndroid Build Coastguard Worker           obj_type = adts.profile;
1112*15dc779aSAndroid Build Coastguard Worker 
1113*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->audio_object_type = obj_type;
1114*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->sampling_rate =
1115*15dc779aSAndroid Build Coastguard Worker               ((pstr_samp_rate_info[adts.samp_freq_index].sampling_frequency));
1116*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->ch_config = adts.channel_configuration;
1117*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->s_adts_hdr_present = 1;
1118*15dc779aSAndroid Build Coastguard Worker           header_found = 1;
1119*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->bs_format = ADTS_BSFORMAT;
1120*15dc779aSAndroid Build Coastguard Worker           aac_state_struct->frame_length = FRAME_SIZE;
1121*15dc779aSAndroid Build Coastguard Worker           if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
1122*15dc779aSAndroid Build Coastguard Worker             aac_state_struct->frame_length >>= 1;
1123*15dc779aSAndroid Build Coastguard Worker         }
1124*15dc779aSAndroid Build Coastguard Worker       } else if (0x2b7 == (sync >> 1)) {
1125*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(&it_bit_buff, -12);
1126*15dc779aSAndroid Build Coastguard Worker         result =
1127*15dc779aSAndroid Build Coastguard Worker             ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff,
1128*15dc779aSAndroid Build Coastguard Worker                                         bytes_consumed, pstr_samp_rate_info);
1129*15dc779aSAndroid Build Coastguard Worker         if (result != 0) {
1130*15dc779aSAndroid Build Coastguard Worker           if ((result == (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
1131*15dc779aSAndroid Build Coastguard Worker               (result < 0)) {
1132*15dc779aSAndroid Build Coastguard Worker             bytes_taken += *bytes_consumed;
1133*15dc779aSAndroid Build Coastguard Worker             *bytes_consumed = bytes_taken;
1134*15dc779aSAndroid Build Coastguard Worker             return result;
1135*15dc779aSAndroid Build Coastguard Worker           } else
1136*15dc779aSAndroid Build Coastguard Worker             bytes_taken += *bytes_consumed - 1;
1137*15dc779aSAndroid Build Coastguard Worker           continue;
1138*15dc779aSAndroid Build Coastguard Worker         }
1139*15dc779aSAndroid Build Coastguard Worker         header_found = 1;
1140*15dc779aSAndroid Build Coastguard Worker         aac_state_struct->bs_format = LOAS_BSFORMAT;
1141*15dc779aSAndroid Build Coastguard Worker         bytes_taken += *bytes_consumed;
1142*15dc779aSAndroid Build Coastguard Worker       }
1143*15dc779aSAndroid Build Coastguard Worker 
1144*15dc779aSAndroid Build Coastguard Worker     } while ((header_found == 0 && ((bytes_taken + 1) < (header_len - 68))) &&
1145*15dc779aSAndroid Build Coastguard Worker              run_once != 1);
1146*15dc779aSAndroid Build Coastguard Worker 
1147*15dc779aSAndroid Build Coastguard Worker     if (header_found == 0 && disable_sync == 1) {
1148*15dc779aSAndroid Build Coastguard Worker       WORD32 err_code;
1149*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bidirection(&it_bit_buff, -12);
1150*15dc779aSAndroid Build Coastguard Worker       err_code =
1151*15dc779aSAndroid Build Coastguard Worker           ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed,
1152*15dc779aSAndroid Build Coastguard Worker                               pstr_samp_rate_info, handle_bit_buff);
1153*15dc779aSAndroid Build Coastguard Worker 
1154*15dc779aSAndroid Build Coastguard Worker       if (err_code == 0) p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 1;
1155*15dc779aSAndroid Build Coastguard Worker       return err_code;
1156*15dc779aSAndroid Build Coastguard Worker     }
1157*15dc779aSAndroid Build Coastguard Worker 
1158*15dc779aSAndroid Build Coastguard Worker     switch (aac_state_struct->audio_object_type) {
1159*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_MAIN:
1160*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_LC:
1161*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_SSR:
1162*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_LTP:
1163*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_SCAL:
1164*15dc779aSAndroid Build Coastguard Worker         case AOT_TWIN_VQ:
1165*15dc779aSAndroid Build Coastguard Worker         case AOT_ER_AAC_LD:
1166*15dc779aSAndroid Build Coastguard Worker         case AOT_ER_AAC_ELD:
1167*15dc779aSAndroid Build Coastguard Worker         case AOT_ER_AAC_LC:
1168*15dc779aSAndroid Build Coastguard Worker         case AOT_USAC:
1169*15dc779aSAndroid Build Coastguard Worker           break;
1170*15dc779aSAndroid Build Coastguard Worker         default:
1171*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
1172*15dc779aSAndroid Build Coastguard Worker       }
1173*15dc779aSAndroid Build Coastguard Worker 
1174*15dc779aSAndroid Build Coastguard Worker     if (aac_state_struct->audio_object_type != AOT_USAC)
1175*15dc779aSAndroid Build Coastguard Worker       aac_state_struct->usac_flag = 0;
1176*15dc779aSAndroid Build Coastguard Worker     *bytes_consumed = bytes_taken;
1177*15dc779aSAndroid Build Coastguard Worker 
1178*15dc779aSAndroid Build Coastguard Worker     if ((handle_bit_buff->cnt_bits < 0) &&
1179*15dc779aSAndroid Build Coastguard Worker         (handle_bit_buff->size <
1180*15dc779aSAndroid Build Coastguard Worker          (usr_max_ch * (IA_ENHAACPLUS_DEC_INP_BUF_SIZE << 3)))) {
1181*15dc779aSAndroid Build Coastguard Worker       return (WORD16)(
1182*15dc779aSAndroid Build Coastguard Worker           (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
1183*15dc779aSAndroid Build Coastguard Worker     }
1184*15dc779aSAndroid Build Coastguard Worker 
1185*15dc779aSAndroid Build Coastguard Worker     if (header_found == 0) {
1186*15dc779aSAndroid Build Coastguard Worker       *bytes_consumed = bytes_taken + 1;
1187*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
1188*15dc779aSAndroid Build Coastguard Worker     } else {
1189*15dc779aSAndroid Build Coastguard Worker       return 0;
1190*15dc779aSAndroid Build Coastguard Worker     }
1191*15dc779aSAndroid Build Coastguard Worker   }
1192*15dc779aSAndroid Build Coastguard Worker }
1193