xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_aacdecoder.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 <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_rom.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
71*15dc779aSAndroid Build Coastguard Worker 
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_payload.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_stereo.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_headerdecode.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_multichannel.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts_crc_check.h"
86*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ld_mps_dec.h"
87*15dc779aSAndroid Build Coastguard Worker 
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hcr.h"
89*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker #define SIZEOF_INT(x) ((sizeof(x) + sizeof(WORD32) - 1) / sizeof(WORD32))
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker #define EXT_FILL_DATA 1
94*15dc779aSAndroid Build Coastguard Worker #define EXT_FIL 0
95*15dc779aSAndroid Build Coastguard Worker #define EXT_DATA_LENGTH 3
96*15dc779aSAndroid Build Coastguard Worker #define EXT_LDSAC_DATA 9
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
99*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aacdec_decodeframe(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,ia_aac_dec_scratch_struct * aac_scratch_ptrs,VOID * time_data_tmp,FLAG frame_status,WORD * type,WORD * ch_idx,WORD init_flag,WORD channel,WORD * element_index_order,WORD skip_full_decode,WORD ch_fac,WORD slot_element,WORD max_channels,WORD32 total_channels,WORD32 frame_length,WORD32 frame_size,ia_drc_dec_struct * pstr_drc_dec,WORD32 object_type,WORD32 ch_config,ia_eld_specific_config_struct eld_specific_config,WORD16 adtsheader,ia_drc_dec_struct * drc_dummy,WORD32 ldmps_present,UWORD8 * slot_pos,UWORD8 * mps_buffer,WORD32 * mps_header,WORD32 * mps_bytes,WORD32 is_init,WORD32 first_frame)100*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_aacdec_decodeframe(
101*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
102*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data_tmp,
103*15dc779aSAndroid Build Coastguard Worker     FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
104*15dc779aSAndroid Build Coastguard Worker     WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
105*15dc779aSAndroid Build Coastguard Worker     WORD slot_element, WORD max_channels, WORD32 total_channels,
106*15dc779aSAndroid Build Coastguard Worker     WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
107*15dc779aSAndroid Build Coastguard Worker     WORD32 object_type, WORD32 ch_config,
108*15dc779aSAndroid Build Coastguard Worker     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
109*15dc779aSAndroid Build Coastguard Worker     ia_drc_dec_struct *drc_dummy, WORD32 ldmps_present, UWORD8 *slot_pos, UWORD8 *mps_buffer,
110*15dc779aSAndroid Build Coastguard Worker     WORD32 *mps_header, WORD32 *mps_bytes, WORD32 is_init, WORD32 first_frame) {
111*15dc779aSAndroid Build Coastguard Worker   WORD ch, ele_type;
112*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
113*15dc779aSAndroid Build Coastguard Worker   ia_aac_decoder_struct *aac_dec_handle;
114*15dc779aSAndroid Build Coastguard Worker   ia_bit_buf_struct *it_bit_buff;
115*15dc779aSAndroid Build Coastguard Worker   ixheaacd_latm_struct *latm_element;
116*15dc779aSAndroid Build Coastguard Worker 
117*15dc779aSAndroid Build Coastguard Worker   WORD error_code = (WORD)frame_status;
118*15dc779aSAndroid Build Coastguard Worker   WORD previous_element;
119*15dc779aSAndroid Build Coastguard Worker   WORD prev_data_ele_present = 0;
120*15dc779aSAndroid Build Coastguard Worker   WORD new_element;
121*15dc779aSAndroid Build Coastguard Worker   WORD32 num_ch = 0;
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker   WORD32 crc_reg = 0;
124*15dc779aSAndroid Build Coastguard Worker   ia_adts_crc_info_struct *ptr_adts_crc_info;
125*15dc779aSAndroid Build Coastguard Worker 
126*15dc779aSAndroid Build Coastguard Worker   WORD32 cnt_bits = 0;
127*15dc779aSAndroid Build Coastguard Worker 
128*15dc779aSAndroid Build Coastguard Worker   WORD32 eld_sbr_flag = eld_specific_config.ld_sbr_flag_present;
129*15dc779aSAndroid Build Coastguard Worker   WORD32 ld_sbr_crc_flag = eld_specific_config.ld_sbr_crc_flag;
130*15dc779aSAndroid Build Coastguard Worker   WORD32 aac_spect_data_resil_flag =
131*15dc779aSAndroid Build Coastguard Worker       eld_specific_config.aac_spect_data_resil_flag;
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker   WORD32 ele_ch = 0;
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker   ia_aac_sfb_code_book_struct *ptr_aac_sfb_code_book_data[CHANNELS];
136*15dc779aSAndroid Build Coastguard Worker   ia_pns_stereo_data_struct *ptr_pns_stereo_data;
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker   WORD32 *work_buffer_core = aac_scratch_ptrs->base_scr_8k;
139*15dc779aSAndroid Build Coastguard Worker   WORD32 *work_buffer_1 = aac_scratch_ptrs->extra_scr_4k[0];
140*15dc779aSAndroid Build Coastguard Worker   WORD32 *work_buffer_2 = aac_scratch_ptrs->extra_scr_4k[2];
141*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
142*15dc779aSAndroid Build Coastguard Worker 
143*15dc779aSAndroid Build Coastguard Worker   WORD32 *time_data = (WORD32 *)time_data_tmp;
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle = p_state_enhaacplus_dec->pstr_aac_dec_info[*ch_idx];
146*15dc779aSAndroid Build Coastguard Worker   it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream;
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker   ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   latm_element = &p_state_enhaacplus_dec->latm_struct_element;
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker   ptr_pns_stereo_data =
153*15dc779aSAndroid Build Coastguard Worker       (ia_pns_stereo_data_struct
154*15dc779aSAndroid Build Coastguard Worker            *)&work_buffer_1[2 * SIZEOF_INT(ia_aac_dec_channel_info_struct) +
155*15dc779aSAndroid Build Coastguard Worker                             2 * SIZEOF_INT(ia_aac_sfb_code_book_struct)];
156*15dc779aSAndroid Build Coastguard Worker 
157*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->frame_status = 1;
158*15dc779aSAndroid Build Coastguard Worker 
159*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < channel; ch++) {
160*15dc779aSAndroid Build Coastguard Worker     const ia_aac_dec_imdct_tables_struct *pstr_imdct_tables;
161*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch] =
162*15dc779aSAndroid Build Coastguard Worker         (ia_aac_dec_channel_info_struct
163*15dc779aSAndroid Build Coastguard Worker              *)&work_buffer_1[ch * SIZEOF_INT(ia_aac_dec_channel_info_struct)];
164*15dc779aSAndroid Build Coastguard Worker     ptr_aac_sfb_code_book_data[ch] =
165*15dc779aSAndroid Build Coastguard Worker         (ia_aac_sfb_code_book_struct
166*15dc779aSAndroid Build Coastguard Worker              *)&work_buffer_1[2 * SIZEOF_INT(ia_aac_dec_channel_info_struct) +
167*15dc779aSAndroid Build Coastguard Worker                               (ch * SIZEOF_INT(ia_aac_sfb_code_book_struct))];
168*15dc779aSAndroid Build Coastguard Worker 
169*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_scale_factor =
170*15dc779aSAndroid Build Coastguard Worker         ptr_aac_sfb_code_book_data[ch]->scale_factor;
171*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_code_book =
172*15dc779aSAndroid Build Coastguard Worker         ptr_aac_sfb_code_book_data[ch]->code_book;
173*15dc779aSAndroid Build Coastguard Worker 
174*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff =
175*15dc779aSAndroid Build Coastguard Worker         &work_buffer_core[ch * MAX_BINS_LONG];
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker     if (object_type == AOT_ER_AAC_ELD) {
178*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff =
179*15dc779aSAndroid Build Coastguard Worker           &work_buffer_core[2 * ch * MAX_BINS_LONG];
180*15dc779aSAndroid Build Coastguard Worker     }
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_stereo_info =
183*15dc779aSAndroid Build Coastguard Worker         &ptr_pns_stereo_data->str_stereo_info;
184*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_pns_corr_info =
185*15dc779aSAndroid Build Coastguard Worker         &ptr_pns_stereo_data->str_pns_corr_info;
186*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_pns_rand_vec_data =
187*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->pstr_pns_rand_vec_data;
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker     pstr_imdct_tables = aac_dec_handle->pstr_aac_tables->pstr_imdct_tables;
190*15dc779aSAndroid Build Coastguard Worker 
191*15dc779aSAndroid Build Coastguard Worker     if (960 != frame_length) {
192*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
193*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_sine;
194*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
195*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_sine;
196*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
197*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_kbd;
198*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
199*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_kbd;
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
202*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_sine;
203*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
204*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_sine;
205*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
206*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_kbd;
207*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
208*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_kbd;
209*15dc779aSAndroid Build Coastguard Worker     } else {
210*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
211*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_sine_960;
212*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
213*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_sine_120;
214*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
215*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_kbd_960;
216*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
217*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_kbd_120;
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
220*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_sine_960;
221*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
222*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_sine_120;
223*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
224*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_long_window_kbd_960;
225*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
226*15dc779aSAndroid Build Coastguard Worker           pstr_imdct_tables->only_short_window_kbd_120;
227*15dc779aSAndroid Build Coastguard Worker     }
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && frame_status == 0)
230*15dc779aSAndroid Build Coastguard Worker     {
231*15dc779aSAndroid Build Coastguard Worker       memset(&aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info, 0,
232*15dc779aSAndroid Build Coastguard Worker              sizeof(ia_ics_info_struct));
233*15dc779aSAndroid Build Coastguard Worker     }
234*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.frame_length = frame_length;
235*15dc779aSAndroid Build Coastguard Worker     if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD ||
236*15dc779aSAndroid Build Coastguard Worker         object_type == AOT_AAC_LTP) {
237*15dc779aSAndroid Build Coastguard Worker       if (512 == aac_dec_handle->samples_per_frame) {
238*15dc779aSAndroid Build Coastguard Worker         if (object_type != AOT_ER_AAC_ELD) {
239*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
240*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->low_overlap_win;
241*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
242*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_512;
243*15dc779aSAndroid Build Coastguard Worker 
244*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
245*15dc779aSAndroid Build Coastguard Worker               ->ptr_long_window[1] =
246*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->low_overlap_win;
247*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
248*15dc779aSAndroid Build Coastguard Worker               ->ptr_long_window[0] =
249*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_512;
250*15dc779aSAndroid Build Coastguard Worker         } else {
251*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
252*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_512_eld;
253*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
254*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_512_eld;
255*15dc779aSAndroid Build Coastguard Worker         }
256*15dc779aSAndroid Build Coastguard Worker       } else if (480 == aac_dec_handle->samples_per_frame) {
257*15dc779aSAndroid Build Coastguard Worker         if (object_type != AOT_ER_AAC_ELD) {
258*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
259*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->low_overlap_win_480;
260*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
261*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_480;
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
264*15dc779aSAndroid Build Coastguard Worker               ->ptr_long_window[1] =
265*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->low_overlap_win_480;
266*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
267*15dc779aSAndroid Build Coastguard Worker               ->ptr_long_window[0] =
268*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_480;
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker         } else {
271*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
272*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_480_eld;
273*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
274*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)pstr_imdct_tables->window_sine_480_eld;
275*15dc779aSAndroid Build Coastguard Worker         }
276*15dc779aSAndroid Build Coastguard Worker       }
277*15dc779aSAndroid Build Coastguard Worker     }
278*15dc779aSAndroid Build Coastguard Worker     if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
279*15dc779aSAndroid Build Coastguard Worker       if (aac_dec_handle->samples_per_frame <= 512) {
280*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp2.lag =
281*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag_1;
282*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.lag =
283*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag_2;
284*15dc779aSAndroid Build Coastguard Worker       }
285*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ltp_buf =
286*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_buf;
287*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ltp_lag =
288*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag_1;
289*15dc779aSAndroid Build Coastguard Worker     }
290*15dc779aSAndroid Build Coastguard Worker 
291*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->scratch_buf_ptr = work_buffer_2;
292*15dc779aSAndroid Build Coastguard Worker     if (object_type == AOT_ER_AAC_ELD) {
293*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->pulse_scratch =
294*15dc779aSAndroid Build Coastguard Worker           aac_scratch_ptrs->extra_scr_4k[3];
295*15dc779aSAndroid Build Coastguard Worker     }
296*15dc779aSAndroid Build Coastguard Worker   }
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker   if (channel == 2) {
299*15dc779aSAndroid Build Coastguard Worker     if (aac_dec_handle->pstr_aac_dec_ch_info[1]->ptr_spec_coeff ==
300*15dc779aSAndroid Build Coastguard Worker         aac_scratch_ptrs->extra_scr_4k[0]) {
301*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[1]->ptr_spec_coeff =
302*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_ch_info[0]->ptr_spec_coeff;
303*15dc779aSAndroid Build Coastguard Worker     }
304*15dc779aSAndroid Build Coastguard Worker   }
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < channel; ch++) {
307*15dc779aSAndroid Build Coastguard Worker     ia_pns_info_struct *ptr_pns_info =
308*15dc779aSAndroid Build Coastguard Worker         &aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_pns_info;
309*15dc779aSAndroid Build Coastguard Worker     memset(ptr_pns_info, 0, sizeof(ia_pns_info_struct));
310*15dc779aSAndroid Build Coastguard Worker   }
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker   if (channel > 0) {
313*15dc779aSAndroid Build Coastguard Worker     ia_pns_correlation_info_struct *ptr_corr_info =
314*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->pstr_aac_dec_ch_info[0]->pstr_pns_corr_info;
315*15dc779aSAndroid Build Coastguard Worker     memset(ptr_corr_info->correlated, 0, sizeof(UWORD8) * PNS_BAND_FLAGS_SIZE);
316*15dc779aSAndroid Build Coastguard Worker   }
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < channel; ch++) {
319*15dc779aSAndroid Build Coastguard Worker     memset(&aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_hcr_info, 0,
320*15dc779aSAndroid Build Coastguard Worker            sizeof(ia_hcr_info_struct));
321*15dc779aSAndroid Build Coastguard Worker     ixheaacd_huff_code_reorder_tbl_init(
322*15dc779aSAndroid Build Coastguard Worker         &aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_hcr_info);
323*15dc779aSAndroid Build Coastguard Worker   }
324*15dc779aSAndroid Build Coastguard Worker 
325*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < channel; ch++) {
326*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.data_present = 0;
327*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp2.data_present =
328*15dc779aSAndroid Build Coastguard Worker         0;
329*15dc779aSAndroid Build Coastguard Worker   }
330*15dc779aSAndroid Build Coastguard Worker 
331*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < channel; ch++) {
332*15dc779aSAndroid Build Coastguard Worker     if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD)
333*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->granule_len =
334*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->samples_per_frame;
335*15dc779aSAndroid Build Coastguard Worker     if (object_type == AOT_ER_AAC_LC)
336*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_dec_ch_info[ch]->granule_len =
337*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->samples_per_frame / 8;
338*15dc779aSAndroid Build Coastguard Worker   }
339*15dc779aSAndroid Build Coastguard Worker   previous_element = ID_END;
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->pstr_sbr_bitstream->no_elements = 0;
342*15dc779aSAndroid Build Coastguard Worker   new_element = 0;
343*15dc779aSAndroid Build Coastguard Worker   ele_type = *type;
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker   cnt_bits = it_bit_buff->cnt_bits;
346*15dc779aSAndroid Build Coastguard Worker 
347*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
348*15dc779aSAndroid Build Coastguard Worker   jmp_buf local;
349*15dc779aSAndroid Build Coastguard Worker 
350*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
351*15dc779aSAndroid Build Coastguard Worker     err = setjmp(local);
352*15dc779aSAndroid Build Coastguard Worker   }
353*15dc779aSAndroid Build Coastguard Worker 
354*15dc779aSAndroid Build Coastguard Worker   if (!err && frame_status) {
355*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
356*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->xaac_jmp_buf = &local;
357*15dc779aSAndroid Build Coastguard Worker     }
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker     if (((object_type != AOT_ER_AAC_ELD) && (object_type != AOT_ER_AAC_LD) &&
360*15dc779aSAndroid Build Coastguard Worker          (object_type != AOT_ER_AAC_LC)) ||
361*15dc779aSAndroid Build Coastguard Worker         (object_type < ER_OBJECT_START)) {
362*15dc779aSAndroid Build Coastguard Worker       while (ele_type != ID_END && aac_dec_handle->frame_status) {
363*15dc779aSAndroid Build Coastguard Worker         ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
364*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -3);
365*15dc779aSAndroid Build Coastguard Worker 
366*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 3) {
367*15dc779aSAndroid Build Coastguard Worker           it_bit_buff->cnt_bits = -1;
368*15dc779aSAndroid Build Coastguard Worker           error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
369*15dc779aSAndroid Build Coastguard Worker           break;
370*15dc779aSAndroid Build Coastguard Worker         }
371*15dc779aSAndroid Build Coastguard Worker 
372*15dc779aSAndroid Build Coastguard Worker         if ((ele_type == ID_FIL) || (ele_type == ID_DSE) || (new_element == 0)) {
373*15dc779aSAndroid Build Coastguard Worker           ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
374*15dc779aSAndroid Build Coastguard Worker           new_element = 1;
375*15dc779aSAndroid Build Coastguard Worker         } else if ((ele_type != ID_END)) {
376*15dc779aSAndroid Build Coastguard Worker           ele_type = -1;
377*15dc779aSAndroid Build Coastguard Worker           break;
378*15dc779aSAndroid Build Coastguard Worker         } else {
379*15dc779aSAndroid Build Coastguard Worker           ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
380*15dc779aSAndroid Build Coastguard Worker         }
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 0) {
383*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->frame_status = 0;
384*15dc779aSAndroid Build Coastguard Worker         }
385*15dc779aSAndroid Build Coastguard Worker 
386*15dc779aSAndroid Build Coastguard Worker         switch (ele_type) {
387*15dc779aSAndroid Build Coastguard Worker           case ID_SCE:
388*15dc779aSAndroid Build Coastguard Worker           case ID_CPE:
389*15dc779aSAndroid Build Coastguard Worker           case ID_LFE:
390*15dc779aSAndroid Build Coastguard Worker 
391*15dc779aSAndroid Build Coastguard Worker             if (aac_dec_handle->frame_status) {
392*15dc779aSAndroid Build Coastguard Worker               ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
393*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
394*15dc779aSAndroid Build Coastguard Worker               ia_ics_info_struct *ptr_ics_info = &pstr_aac_dec_ch_info->str_ics_info;
395*15dc779aSAndroid Build Coastguard Worker               ele_ch = 1;
396*15dc779aSAndroid Build Coastguard Worker               if (ele_type == ID_CPE) {
397*15dc779aSAndroid Build Coastguard Worker                 ele_ch = 2;
398*15dc779aSAndroid Build Coastguard Worker               } else {
399*15dc779aSAndroid Build Coastguard Worker                 ele_ch = 1;
400*15dc779aSAndroid Build Coastguard Worker               }
401*15dc779aSAndroid Build Coastguard Worker 
402*15dc779aSAndroid Build Coastguard Worker               prev_data_ele_present = 1;
403*15dc779aSAndroid Build Coastguard Worker 
404*15dc779aSAndroid Build Coastguard Worker               if (ptr_adts_crc_info->crc_active == 1 && ptr_adts_crc_info->no_reg < 7) {
405*15dc779aSAndroid Build Coastguard Worker                 crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
406*15dc779aSAndroid Build Coastguard Worker                                                       CRC_ADTS_RAW_DATA_BLK_LEN);
407*15dc779aSAndroid Build Coastguard Worker               }
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker               pstr_aac_dec_ch_info->element_instance_tag =
410*15dc779aSAndroid Build Coastguard Worker                   (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
411*15dc779aSAndroid Build Coastguard Worker 
412*15dc779aSAndroid Build Coastguard Worker               element_index_order[*ch_idx] = pstr_aac_dec_ch_info->element_instance_tag;
413*15dc779aSAndroid Build Coastguard Worker               pstr_aac_dec_ch_info->common_window = 0;
414*15dc779aSAndroid Build Coastguard Worker 
415*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info->num_swb_window = 0;
416*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info->sampling_rate_index = aac_dec_handle->sampling_rate_index;
417*15dc779aSAndroid Build Coastguard Worker               if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
418*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->ltp.data_present = 0;
419*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->ltp2.data_present = 0;
420*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->predictor_data_present = 0;
421*15dc779aSAndroid Build Coastguard Worker               }
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker               if (ele_ch > 1) {
424*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.num_swb_window = 0;
425*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.sampling_rate_index =
426*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->sampling_rate_index;
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker                 pstr_aac_dec_ch_info->common_window =
429*15dc779aSAndroid Build Coastguard Worker                     (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker                 if (pstr_aac_dec_ch_info->common_window) {
432*15dc779aSAndroid Build Coastguard Worker                   error_code = ixheaacd_ics_read(
433*15dc779aSAndroid Build Coastguard Worker                       it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window, object_type,
434*15dc779aSAndroid Build Coastguard Worker                       pstr_aac_dec_ch_info->common_window, aac_dec_handle->samples_per_frame);
435*15dc779aSAndroid Build Coastguard Worker                   if (error_code) {
436*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
437*15dc779aSAndroid Build Coastguard Worker                         aac_dec_handle->pstr_aac_dec_ch_info[LEFT]->str_ics_info;
438*15dc779aSAndroid Build Coastguard Worker                     if (it_bit_buff->cnt_bits < 0) {
439*15dc779aSAndroid Build Coastguard Worker                       error_code =
440*15dc779aSAndroid Build Coastguard Worker                           (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
441*15dc779aSAndroid Build Coastguard Worker                     }
442*15dc779aSAndroid Build Coastguard Worker 
443*15dc779aSAndroid Build Coastguard Worker                     goto _ia_handle_error;
444*15dc779aSAndroid Build Coastguard Worker                   }
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
447*15dc779aSAndroid Build Coastguard Worker                       pstr_aac_dec_ch_info->str_ics_info;
448*15dc779aSAndroid Build Coastguard Worker 
449*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
450*15dc779aSAndroid Build Coastguard Worker                 }
451*15dc779aSAndroid Build Coastguard Worker               }
452*15dc779aSAndroid Build Coastguard Worker 
453*15dc779aSAndroid Build Coastguard Worker               error_code = ixheaacd_individual_ch_stream(
454*15dc779aSAndroid Build Coastguard Worker                   it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type,
455*15dc779aSAndroid Build Coastguard Worker                   eld_specific_config, ele_type);
456*15dc779aSAndroid Build Coastguard Worker 
457*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
458*15dc779aSAndroid Build Coastguard Worker                 if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
459*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->frame_status = 0;
460*15dc779aSAndroid Build Coastguard Worker                 } else {
461*15dc779aSAndroid Build Coastguard Worker                   return error_code;
462*15dc779aSAndroid Build Coastguard Worker                 }
463*15dc779aSAndroid Build Coastguard Worker               }
464*15dc779aSAndroid Build Coastguard Worker 
465*15dc779aSAndroid Build Coastguard Worker               if (ptr_adts_crc_info->crc_active == 1) {
466*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
467*15dc779aSAndroid Build Coastguard Worker               }
468*15dc779aSAndroid Build Coastguard Worker 
469*15dc779aSAndroid Build Coastguard Worker               if (it_bit_buff->cnt_bits < 0) {
470*15dc779aSAndroid Build Coastguard Worker                 error_code =
471*15dc779aSAndroid Build Coastguard Worker                     (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
472*15dc779aSAndroid Build Coastguard Worker               }
473*15dc779aSAndroid Build Coastguard Worker 
474*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
475*15dc779aSAndroid Build Coastguard Worker                 goto _ia_handle_error;
476*15dc779aSAndroid Build Coastguard Worker               }
477*15dc779aSAndroid Build Coastguard Worker 
478*15dc779aSAndroid Build Coastguard Worker             _ia_handle_error:
479*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
480*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
481*15dc779aSAndroid Build Coastguard Worker                 if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) num_ch = num_ch + ele_ch;
482*15dc779aSAndroid Build Coastguard Worker                 break;
483*15dc779aSAndroid Build Coastguard Worker               } else {
484*15dc779aSAndroid Build Coastguard Worker                 error_code = ixheaacd_channel_pair_process(
485*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables,
486*15dc779aSAndroid Build Coastguard Worker                     total_channels, object_type, aac_spect_data_resil_flag,
487*15dc779aSAndroid Build Coastguard Worker                     eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
488*15dc779aSAndroid Build Coastguard Worker                     aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
489*15dc779aSAndroid Build Coastguard Worker                 if (error_code) {
490*15dc779aSAndroid Build Coastguard Worker                   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
491*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->frame_status = 0;
492*15dc779aSAndroid Build Coastguard Worker                   } else {
493*15dc779aSAndroid Build Coastguard Worker                     return error_code;
494*15dc779aSAndroid Build Coastguard Worker                   }
495*15dc779aSAndroid Build Coastguard Worker                 }
496*15dc779aSAndroid Build Coastguard Worker                 num_ch = num_ch + ele_ch;
497*15dc779aSAndroid Build Coastguard Worker               }
498*15dc779aSAndroid Build Coastguard Worker             }
499*15dc779aSAndroid Build Coastguard Worker 
500*15dc779aSAndroid Build Coastguard Worker             break;
501*15dc779aSAndroid Build Coastguard Worker           case ID_CCE:
502*15dc779aSAndroid Build Coastguard Worker             if (max_channels > 2) {
503*15dc779aSAndroid Build Coastguard Worker               prev_data_ele_present = 1;
504*15dc779aSAndroid Build Coastguard Worker               error_code = ixheaacd_dec_coupling_channel_element(
505*15dc779aSAndroid Build Coastguard Worker                   it_bit_buff, aac_dec_handle, aac_dec_handle->sampling_rate_index,
506*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->pstr_aac_tables, aac_dec_handle->pstr_common_tables,
507*15dc779aSAndroid Build Coastguard Worker                   &element_index_order[*ch_idx],
508*15dc779aSAndroid Build Coastguard Worker                   (ia_enhaacplus_dec_ind_cc *)aac_dec_handle->p_ind_channel_info, total_channels,
509*15dc779aSAndroid Build Coastguard Worker                   frame_length, object_type, eld_specific_config, ele_type);
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker               num_ch = num_ch + 1;
512*15dc779aSAndroid Build Coastguard Worker 
513*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
514*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
515*15dc779aSAndroid Build Coastguard Worker                 if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
516*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->frame_status = 0;
517*15dc779aSAndroid Build Coastguard Worker                 } else {
518*15dc779aSAndroid Build Coastguard Worker                   return error_code;
519*15dc779aSAndroid Build Coastguard Worker                 }
520*15dc779aSAndroid Build Coastguard Worker               } else {
521*15dc779aSAndroid Build Coastguard Worker                 error_code = ixheaacd_channel_pair_process(
522*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->pstr_aac_dec_ch_info, 1, aac_dec_handle->pstr_aac_tables,
523*15dc779aSAndroid Build Coastguard Worker                     total_channels, object_type, aac_spect_data_resil_flag,
524*15dc779aSAndroid Build Coastguard Worker                     eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
525*15dc779aSAndroid Build Coastguard Worker                     aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
526*15dc779aSAndroid Build Coastguard Worker                 if (error_code) {
527*15dc779aSAndroid Build Coastguard Worker                   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
528*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->frame_status = 0;
529*15dc779aSAndroid Build Coastguard Worker                   } else {
530*15dc779aSAndroid Build Coastguard Worker                     return error_code;
531*15dc779aSAndroid Build Coastguard Worker                   }
532*15dc779aSAndroid Build Coastguard Worker                 }
533*15dc779aSAndroid Build Coastguard Worker               }
534*15dc779aSAndroid Build Coastguard Worker             } else {
535*15dc779aSAndroid Build Coastguard Worker               error_code = (WORD32)((WORD32)IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE);
536*15dc779aSAndroid Build Coastguard Worker             }
537*15dc779aSAndroid Build Coastguard Worker             if (it_bit_buff->cnt_bits < 0) {
538*15dc779aSAndroid Build Coastguard Worker               error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
539*15dc779aSAndroid Build Coastguard Worker               goto _ia_handle_error;
540*15dc779aSAndroid Build Coastguard Worker             }
541*15dc779aSAndroid Build Coastguard Worker             break;
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker           case ID_DSE:
544*15dc779aSAndroid Build Coastguard Worker           case ID_PCE:
545*15dc779aSAndroid Build Coastguard Worker           case ID_FIL:
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker           {
548*15dc779aSAndroid Build Coastguard Worker             WORD32 flag = 1;
549*15dc779aSAndroid Build Coastguard Worker 
550*15dc779aSAndroid Build Coastguard Worker             if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1) &&
551*15dc779aSAndroid Build Coastguard Worker                 (ptr_adts_crc_info->no_reg < 7)) {
552*15dc779aSAndroid Build Coastguard Worker               crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, 0);
553*15dc779aSAndroid Build Coastguard Worker             }
554*15dc779aSAndroid Build Coastguard Worker             if (ele_type == ID_DSE) {
555*15dc779aSAndroid Build Coastguard Worker               ixheaacd_read_data_stream_element(it_bit_buff, &aac_dec_handle->byte_align_bits,
556*15dc779aSAndroid Build Coastguard Worker                                                 p_obj_exhaacplus_dec->p_state_aac->pstr_drc_dec);
557*15dc779aSAndroid Build Coastguard Worker             }
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker             else if (ele_type == ID_PCE) {
560*15dc779aSAndroid Build Coastguard Worker               error_code = ixheaacd_decode_pce(
561*15dc779aSAndroid Build Coastguard Worker                   it_bit_buff, &p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr,
562*15dc779aSAndroid Build Coastguard Worker                   &p_obj_exhaacplus_dec->aac_config.str_prog_config);
563*15dc779aSAndroid Build Coastguard Worker               if (error_code != 0) {
564*15dc779aSAndroid Build Coastguard Worker                 if (it_bit_buff->cnt_bits < 0) {
565*15dc779aSAndroid Build Coastguard Worker                   error_code =
566*15dc779aSAndroid Build Coastguard Worker                       (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
567*15dc779aSAndroid Build Coastguard Worker                   goto _ia_handle_error;
568*15dc779aSAndroid Build Coastguard Worker                 }
569*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
570*15dc779aSAndroid Build Coastguard Worker                 if (error_code > 0) {
571*15dc779aSAndroid Build Coastguard Worker                   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
572*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->frame_status = 0;
573*15dc779aSAndroid Build Coastguard Worker                   } else {
574*15dc779aSAndroid Build Coastguard Worker                     return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
575*15dc779aSAndroid Build Coastguard Worker                   }
576*15dc779aSAndroid Build Coastguard Worker                 } else {
577*15dc779aSAndroid Build Coastguard Worker                   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
578*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->frame_status = 0;
579*15dc779aSAndroid Build Coastguard Worker                   } else {
580*15dc779aSAndroid Build Coastguard Worker                     return error_code;
581*15dc779aSAndroid Build Coastguard Worker                   }
582*15dc779aSAndroid Build Coastguard Worker                 }
583*15dc779aSAndroid Build Coastguard Worker               }
584*15dc779aSAndroid Build Coastguard Worker             }
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker             else if (ele_type == ID_FIL) {
587*15dc779aSAndroid Build Coastguard Worker               WORD32 bits_decoded = 0;
588*15dc779aSAndroid Build Coastguard Worker               if (object_type == AOT_ER_AAC_ELD) {
589*15dc779aSAndroid Build Coastguard Worker                 bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
590*15dc779aSAndroid Build Coastguard Worker                 cnt_bits = (frame_size * 8 - bits_decoded);
591*15dc779aSAndroid Build Coastguard Worker                 if (adtsheader == 1) {
592*15dc779aSAndroid Build Coastguard Worker                   if (cnt_bits > it_bit_buff->cnt_bits) {
593*15dc779aSAndroid Build Coastguard Worker                     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
594*15dc779aSAndroid Build Coastguard Worker                       aac_dec_handle->frame_status = 0;
595*15dc779aSAndroid Build Coastguard Worker                     } else {
596*15dc779aSAndroid Build Coastguard Worker                       return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
597*15dc779aSAndroid Build Coastguard Worker                     }
598*15dc779aSAndroid Build Coastguard Worker                   }
599*15dc779aSAndroid Build Coastguard Worker                 }
600*15dc779aSAndroid Build Coastguard Worker               }
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker               if (ixheaacd_check_for_sbr_payload(
603*15dc779aSAndroid Build Coastguard Worker                       it_bit_buff, aac_dec_handle->pstr_sbr_bitstream, (WORD16)previous_element,
604*15dc779aSAndroid Build Coastguard Worker                       pstr_drc_dec, object_type, adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy,
605*15dc779aSAndroid Build Coastguard Worker                       mps_buffer, mps_header, mps_bytes, is_init, &aac_dec_handle->is_first,
606*15dc779aSAndroid Build Coastguard Worker                       p_obj_exhaacplus_dec->aac_config.ui_err_conceal)) {
607*15dc779aSAndroid Build Coastguard Worker                 flag = 0;
608*15dc779aSAndroid Build Coastguard Worker               }
609*15dc779aSAndroid Build Coastguard Worker             }
610*15dc779aSAndroid Build Coastguard Worker 
611*15dc779aSAndroid Build Coastguard Worker             if (it_bit_buff->cnt_bits < 0) {
612*15dc779aSAndroid Build Coastguard Worker               error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
613*15dc779aSAndroid Build Coastguard Worker               goto _ia_handle_error;
614*15dc779aSAndroid Build Coastguard Worker             }
615*15dc779aSAndroid Build Coastguard Worker 
616*15dc779aSAndroid Build Coastguard Worker             if (flag) {
617*15dc779aSAndroid Build Coastguard Worker               if (prev_data_ele_present == 0) {
618*15dc779aSAndroid Build Coastguard Worker                 new_element = 0;
619*15dc779aSAndroid Build Coastguard Worker               }
620*15dc779aSAndroid Build Coastguard Worker             }
621*15dc779aSAndroid Build Coastguard Worker             if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1)) {
622*15dc779aSAndroid Build Coastguard Worker               ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
623*15dc779aSAndroid Build Coastguard Worker             }
624*15dc779aSAndroid Build Coastguard Worker 
625*15dc779aSAndroid Build Coastguard Worker             if (ele_type == ID_PCE) {
626*15dc779aSAndroid Build Coastguard Worker               if (ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt) {
627*15dc779aSAndroid Build Coastguard Worker                 ptr_adts_crc_info->str_crc_reg_data[crc_reg].max_bits =
628*15dc779aSAndroid Build Coastguard Worker                     ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt;
629*15dc779aSAndroid Build Coastguard Worker               }
630*15dc779aSAndroid Build Coastguard Worker             }
631*15dc779aSAndroid Build Coastguard Worker           }
632*15dc779aSAndroid Build Coastguard Worker 
633*15dc779aSAndroid Build Coastguard Worker           break;
634*15dc779aSAndroid Build Coastguard Worker 
635*15dc779aSAndroid Build Coastguard Worker           case ID_END:
636*15dc779aSAndroid Build Coastguard Worker             error_code = 0;
637*15dc779aSAndroid Build Coastguard Worker             break;
638*15dc779aSAndroid Build Coastguard Worker         }
639*15dc779aSAndroid Build Coastguard Worker 
640*15dc779aSAndroid Build Coastguard Worker         previous_element = ele_type;
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker         if (init_flag) {
643*15dc779aSAndroid Build Coastguard Worker           if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) {
644*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_type;
645*15dc779aSAndroid Build Coastguard Worker           }
646*15dc779aSAndroid Build Coastguard Worker         }
647*15dc779aSAndroid Build Coastguard Worker       }
648*15dc779aSAndroid Build Coastguard Worker     } else {
649*15dc779aSAndroid Build Coastguard Worker       {
650*15dc779aSAndroid Build Coastguard Worker         switch (ch_config) {
651*15dc779aSAndroid Build Coastguard Worker           default:
652*15dc779aSAndroid Build Coastguard Worker             if (aac_dec_handle->frame_status) {
653*15dc779aSAndroid Build Coastguard Worker               ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
654*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
655*15dc779aSAndroid Build Coastguard Worker               ia_ics_info_struct *ptr_ics_info = &pstr_aac_dec_ch_info->str_ics_info;
656*15dc779aSAndroid Build Coastguard Worker 
657*15dc779aSAndroid Build Coastguard Worker               if (ch_config == 2)
658*15dc779aSAndroid Build Coastguard Worker                 ele_ch = 2, ele_type = 1;
659*15dc779aSAndroid Build Coastguard Worker               else
660*15dc779aSAndroid Build Coastguard Worker                 ele_ch = 1, ele_type = 0;
661*15dc779aSAndroid Build Coastguard Worker 
662*15dc779aSAndroid Build Coastguard Worker               prev_data_ele_present = 1;
663*15dc779aSAndroid Build Coastguard Worker 
664*15dc779aSAndroid Build Coastguard Worker               if ((ptr_adts_crc_info->crc_active == 1) && (ptr_adts_crc_info->no_reg < 7)) {
665*15dc779aSAndroid Build Coastguard Worker                 crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
666*15dc779aSAndroid Build Coastguard Worker                                                       CRC_ADTS_RAW_DATA_BLK_LEN);
667*15dc779aSAndroid Build Coastguard Worker               }
668*15dc779aSAndroid Build Coastguard Worker 
669*15dc779aSAndroid Build Coastguard Worker               if (object_type != AOT_ER_AAC_ELD)
670*15dc779aSAndroid Build Coastguard Worker                 pstr_aac_dec_ch_info->element_instance_tag =
671*15dc779aSAndroid Build Coastguard Worker                     (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
672*15dc779aSAndroid Build Coastguard Worker 
673*15dc779aSAndroid Build Coastguard Worker               element_index_order[*ch_idx] = pstr_aac_dec_ch_info->element_instance_tag;
674*15dc779aSAndroid Build Coastguard Worker               pstr_aac_dec_ch_info->common_window = 0;
675*15dc779aSAndroid Build Coastguard Worker 
676*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info->num_swb_window = 0;
677*15dc779aSAndroid Build Coastguard Worker               ptr_ics_info->sampling_rate_index = aac_dec_handle->sampling_rate_index;
678*15dc779aSAndroid Build Coastguard Worker 
679*15dc779aSAndroid Build Coastguard Worker               if (object_type == AOT_ER_AAC_LD) {
680*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->ltp.data_present = 0;
681*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->ltp2.data_present = 0;
682*15dc779aSAndroid Build Coastguard Worker                 ptr_ics_info->predictor_data_present = 0;
683*15dc779aSAndroid Build Coastguard Worker               }
684*15dc779aSAndroid Build Coastguard Worker               if (ele_ch > 1) {
685*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.num_swb_window = 0;
686*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.sampling_rate_index =
687*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->sampling_rate_index;
688*15dc779aSAndroid Build Coastguard Worker 
689*15dc779aSAndroid Build Coastguard Worker                 if (object_type != 39)
690*15dc779aSAndroid Build Coastguard Worker                   pstr_aac_dec_ch_info->common_window =
691*15dc779aSAndroid Build Coastguard Worker                       (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
692*15dc779aSAndroid Build Coastguard Worker                 else
693*15dc779aSAndroid Build Coastguard Worker                   pstr_aac_dec_ch_info->common_window = 1;
694*15dc779aSAndroid Build Coastguard Worker 
695*15dc779aSAndroid Build Coastguard Worker                 if (pstr_aac_dec_ch_info->common_window) {
696*15dc779aSAndroid Build Coastguard Worker                   error_code = ixheaacd_ics_read(
697*15dc779aSAndroid Build Coastguard Worker                       it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window, object_type,
698*15dc779aSAndroid Build Coastguard Worker                       pstr_aac_dec_ch_info->common_window, aac_dec_handle->samples_per_frame);
699*15dc779aSAndroid Build Coastguard Worker                   if (error_code) {
700*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
701*15dc779aSAndroid Build Coastguard Worker                         aac_dec_handle->pstr_aac_dec_ch_info[LEFT]->str_ics_info;
702*15dc779aSAndroid Build Coastguard Worker                     if (it_bit_buff->cnt_bits < 0) {
703*15dc779aSAndroid Build Coastguard Worker                       error_code =
704*15dc779aSAndroid Build Coastguard Worker                           (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
705*15dc779aSAndroid Build Coastguard Worker                     }
706*15dc779aSAndroid Build Coastguard Worker 
707*15dc779aSAndroid Build Coastguard Worker                     goto _ia_handle_error1;
708*15dc779aSAndroid Build Coastguard Worker                   }
709*15dc779aSAndroid Build Coastguard Worker 
710*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
711*15dc779aSAndroid Build Coastguard Worker                       pstr_aac_dec_ch_info->str_ics_info;
712*15dc779aSAndroid Build Coastguard Worker 
713*15dc779aSAndroid Build Coastguard Worker                   ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
714*15dc779aSAndroid Build Coastguard Worker 
715*15dc779aSAndroid Build Coastguard Worker                   {
716*15dc779aSAndroid Build Coastguard Worker                     if (object_type == AOT_ER_AAC_LD) {
717*15dc779aSAndroid Build Coastguard Worker                       IA_ERRORCODE temp =
718*15dc779aSAndroid Build Coastguard Worker                           ixheaacd_ltp_decode(it_bit_buff, ptr_ics_info, object_type,
719*15dc779aSAndroid Build Coastguard Worker                                               aac_dec_handle->samples_per_frame, LEFT);
720*15dc779aSAndroid Build Coastguard Worker 
721*15dc779aSAndroid Build Coastguard Worker                       if (temp != 0) {
722*15dc779aSAndroid Build Coastguard Worker                         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
723*15dc779aSAndroid Build Coastguard Worker                           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
724*15dc779aSAndroid Build Coastguard Worker                         } else {
725*15dc779aSAndroid Build Coastguard Worker                           return temp;
726*15dc779aSAndroid Build Coastguard Worker                         }
727*15dc779aSAndroid Build Coastguard Worker                       }
728*15dc779aSAndroid Build Coastguard Worker                     }
729*15dc779aSAndroid Build Coastguard Worker                   }
730*15dc779aSAndroid Build Coastguard Worker                 }
731*15dc779aSAndroid Build Coastguard Worker               }
732*15dc779aSAndroid Build Coastguard Worker 
733*15dc779aSAndroid Build Coastguard Worker               error_code = ixheaacd_individual_ch_stream(
734*15dc779aSAndroid Build Coastguard Worker                   it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type,
735*15dc779aSAndroid Build Coastguard Worker                   eld_specific_config, ele_type);
736*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
737*15dc779aSAndroid Build Coastguard Worker                 if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
738*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->frame_status = 0;
739*15dc779aSAndroid Build Coastguard Worker                 } else {
740*15dc779aSAndroid Build Coastguard Worker                   return error_code;
741*15dc779aSAndroid Build Coastguard Worker                 }
742*15dc779aSAndroid Build Coastguard Worker               }
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker               if (ptr_adts_crc_info->crc_active == 1) {
745*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
746*15dc779aSAndroid Build Coastguard Worker               }
747*15dc779aSAndroid Build Coastguard Worker 
748*15dc779aSAndroid Build Coastguard Worker               if (it_bit_buff->cnt_bits < 0) {
749*15dc779aSAndroid Build Coastguard Worker                 error_code =
750*15dc779aSAndroid Build Coastguard Worker                     (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
751*15dc779aSAndroid Build Coastguard Worker               }
752*15dc779aSAndroid Build Coastguard Worker 
753*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
754*15dc779aSAndroid Build Coastguard Worker                 goto _ia_handle_error1;
755*15dc779aSAndroid Build Coastguard Worker               }
756*15dc779aSAndroid Build Coastguard Worker 
757*15dc779aSAndroid Build Coastguard Worker             _ia_handle_error1:
758*15dc779aSAndroid Build Coastguard Worker               if (error_code) {
759*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
760*15dc779aSAndroid Build Coastguard Worker                 if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) num_ch = num_ch + ele_ch;
761*15dc779aSAndroid Build Coastguard Worker                 break;
762*15dc779aSAndroid Build Coastguard Worker               } else {
763*15dc779aSAndroid Build Coastguard Worker                 error_code = ixheaacd_channel_pair_process(
764*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables,
765*15dc779aSAndroid Build Coastguard Worker                     total_channels, object_type, aac_spect_data_resil_flag,
766*15dc779aSAndroid Build Coastguard Worker                     eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
767*15dc779aSAndroid Build Coastguard Worker                     aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
768*15dc779aSAndroid Build Coastguard Worker                 if (error_code) {
769*15dc779aSAndroid Build Coastguard Worker                   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
770*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->frame_status = 0;
771*15dc779aSAndroid Build Coastguard Worker                   } else {
772*15dc779aSAndroid Build Coastguard Worker                     return error_code;
773*15dc779aSAndroid Build Coastguard Worker                   }
774*15dc779aSAndroid Build Coastguard Worker                 }
775*15dc779aSAndroid Build Coastguard Worker                 num_ch = num_ch + ele_ch;
776*15dc779aSAndroid Build Coastguard Worker               }
777*15dc779aSAndroid Build Coastguard Worker             }
778*15dc779aSAndroid Build Coastguard Worker 
779*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_ch - 1;
780*15dc779aSAndroid Build Coastguard Worker             break;
781*15dc779aSAndroid Build Coastguard Worker         }
782*15dc779aSAndroid Build Coastguard Worker 
783*15dc779aSAndroid Build Coastguard Worker         if ((object_type == AOT_ER_AAC_LC) || (!eld_sbr_flag)) {
784*15dc779aSAndroid Build Coastguard Worker           WORD32 cnt_bits;
785*15dc779aSAndroid Build Coastguard Worker           cnt_bits = it_bit_buff->cnt_bits;
786*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
787*15dc779aSAndroid Build Coastguard Worker 
788*15dc779aSAndroid Build Coastguard Worker           if (cnt_bits >= 8) {
789*15dc779aSAndroid Build Coastguard Worker             error_code = ixheaacd_extension_payload(
790*15dc779aSAndroid Build Coastguard Worker                 it_bit_buff, &cnt_bits, &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
791*15dc779aSAndroid Build Coastguard Worker             if (error_code) {
792*15dc779aSAndroid Build Coastguard Worker               if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
793*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
794*15dc779aSAndroid Build Coastguard Worker               } else {
795*15dc779aSAndroid Build Coastguard Worker                 return error_code;
796*15dc779aSAndroid Build Coastguard Worker               }
797*15dc779aSAndroid Build Coastguard Worker             }
798*15dc779aSAndroid Build Coastguard Worker           }
799*15dc779aSAndroid Build Coastguard Worker 
800*15dc779aSAndroid Build Coastguard Worker           if (it_bit_buff->cnt_bits) {
801*15dc779aSAndroid Build Coastguard Worker             WORD32 alignment = it_bit_buff->bit_pos & 0x07;
802*15dc779aSAndroid Build Coastguard Worker             it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7;
803*15dc779aSAndroid Build Coastguard Worker             it_bit_buff->bit_pos = 7;
804*15dc779aSAndroid Build Coastguard Worker             it_bit_buff->ptr_read_next++;
805*15dc779aSAndroid Build Coastguard Worker           }
806*15dc779aSAndroid Build Coastguard Worker         }
807*15dc779aSAndroid Build Coastguard Worker 
808*15dc779aSAndroid Build Coastguard Worker         else if ((object_type != AOT_ER_AAC_ELD) || (!eld_sbr_flag)) {
809*15dc779aSAndroid Build Coastguard Worker           WORD32 bits_decoded, cnt_bits;
810*15dc779aSAndroid Build Coastguard Worker           bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker           cnt_bits = (frame_size * 8 - bits_decoded);
813*15dc779aSAndroid Build Coastguard Worker 
814*15dc779aSAndroid Build Coastguard Worker           if (object_type == AOT_ER_AAC_LC) cnt_bits = it_bit_buff->cnt_bits;
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
817*15dc779aSAndroid Build Coastguard Worker 
818*15dc779aSAndroid Build Coastguard Worker           if (cnt_bits >= 8) {
819*15dc779aSAndroid Build Coastguard Worker             error_code = ixheaacd_extension_payload(
820*15dc779aSAndroid Build Coastguard Worker                 it_bit_buff, &cnt_bits, &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
821*15dc779aSAndroid Build Coastguard Worker             if (error_code) {
822*15dc779aSAndroid Build Coastguard Worker               if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
823*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
824*15dc779aSAndroid Build Coastguard Worker               } else {
825*15dc779aSAndroid Build Coastguard Worker                 return error_code;
826*15dc779aSAndroid Build Coastguard Worker               }
827*15dc779aSAndroid Build Coastguard Worker             }
828*15dc779aSAndroid Build Coastguard Worker           }
829*15dc779aSAndroid Build Coastguard Worker 
830*15dc779aSAndroid Build Coastguard Worker           if (((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)) &&
831*15dc779aSAndroid Build Coastguard Worker               (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) {
832*15dc779aSAndroid Build Coastguard Worker             if (it_bit_buff->cnt_bits) {
833*15dc779aSAndroid Build Coastguard Worker               WORD32 alignment = it_bit_buff->bit_pos & 0x07;
834*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7;
835*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->bit_pos = 7;
836*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->ptr_read_next++;
837*15dc779aSAndroid Build Coastguard Worker             }
838*15dc779aSAndroid Build Coastguard Worker           } else {
839*15dc779aSAndroid Build Coastguard Worker             if (it_bit_buff->bit_pos != 7) {
840*15dc779aSAndroid Build Coastguard Worker               WORD32 alignment = it_bit_buff->bit_pos & 0x07;
841*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->cnt_bits -= alignment + 1;
842*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->bit_pos += 7 - alignment;
843*15dc779aSAndroid Build Coastguard Worker               it_bit_buff->ptr_read_next++;
844*15dc779aSAndroid Build Coastguard Worker             }
845*15dc779aSAndroid Build Coastguard Worker           }
846*15dc779aSAndroid Build Coastguard Worker         } else {
847*15dc779aSAndroid Build Coastguard Worker           WORD32 bits_decoded, cnt_bits;
848*15dc779aSAndroid Build Coastguard Worker           bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
849*15dc779aSAndroid Build Coastguard Worker           cnt_bits = (frame_size * 8 - bits_decoded);
850*15dc779aSAndroid Build Coastguard Worker           if (adtsheader == 1) {
851*15dc779aSAndroid Build Coastguard Worker             if (cnt_bits > it_bit_buff->cnt_bits) {
852*15dc779aSAndroid Build Coastguard Worker               if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
853*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->frame_status = 0;
854*15dc779aSAndroid Build Coastguard Worker               } else {
855*15dc779aSAndroid Build Coastguard Worker                 return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
856*15dc779aSAndroid Build Coastguard Worker               }
857*15dc779aSAndroid Build Coastguard Worker             }
858*15dc779aSAndroid Build Coastguard Worker           }
859*15dc779aSAndroid Build Coastguard Worker           ixheaacd_check_for_sbr_payload(
860*15dc779aSAndroid Build Coastguard Worker               it_bit_buff, aac_dec_handle->pstr_sbr_bitstream, (WORD16)(ch_config - 1),
861*15dc779aSAndroid Build Coastguard Worker               pstr_drc_dec, object_type, adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy,
862*15dc779aSAndroid Build Coastguard Worker               mps_buffer, mps_header, mps_bytes, is_init, &aac_dec_handle->is_first,
863*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.ui_err_conceal);
864*15dc779aSAndroid Build Coastguard Worker         }
865*15dc779aSAndroid Build Coastguard Worker       }
866*15dc779aSAndroid Build Coastguard Worker     }
867*15dc779aSAndroid Build Coastguard Worker   }
868*15dc779aSAndroid Build Coastguard Worker   if ((err || (aac_dec_handle->frame_status == 0) || (frame_status == 0)) && (!is_init)) {
869*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
870*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->frame_status = 0;
871*15dc779aSAndroid Build Coastguard Worker       error_code = 0;
872*15dc779aSAndroid Build Coastguard Worker       num_ch = channel;
873*15dc779aSAndroid Build Coastguard Worker       ele_type = ID_END;
874*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.frame_status = 0;
875*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->cnt_bits = 0;
876*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->byte_align_bits = 0;
877*15dc779aSAndroid Build Coastguard Worker     } else {
878*15dc779aSAndroid Build Coastguard Worker       return err;
879*15dc779aSAndroid Build Coastguard Worker     }
880*15dc779aSAndroid Build Coastguard Worker   }
881*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && aac_dec_handle->conceal_count == 0) {
882*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < channel; ch++) {
883*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_ec_init(&aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->str_ec_state);
884*15dc779aSAndroid Build Coastguard Worker     }
885*15dc779aSAndroid Build Coastguard Worker   }
886*15dc779aSAndroid Build Coastguard Worker 
887*15dc779aSAndroid Build Coastguard Worker   if (ele_type == ID_END && p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
888*15dc779aSAndroid Build Coastguard Worker     WORD32 tmp;
889*15dc779aSAndroid Build Coastguard Worker     tmp = ((WORD32)latm_element->layer_info[0][0].frame_len_bits) -
890*15dc779aSAndroid Build Coastguard Worker           (it_bit_buff->initial_cnt_bits - it_bit_buff->cnt_bits);
891*15dc779aSAndroid Build Coastguard Worker 
892*15dc779aSAndroid Build Coastguard Worker     if (tmp > 0) ixheaacd_read_bidirection(it_bit_buff, tmp);
893*15dc779aSAndroid Build Coastguard Worker 
894*15dc779aSAndroid Build Coastguard Worker     if (latm_element->other_data_present) {
895*15dc779aSAndroid Build Coastguard Worker       WORD32 count_bits = (WORD32)latm_element->other_data_length;
896*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bidirection(it_bit_buff, count_bits);
897*15dc779aSAndroid Build Coastguard Worker     }
898*15dc779aSAndroid Build Coastguard Worker   }
899*15dc779aSAndroid Build Coastguard Worker 
900*15dc779aSAndroid Build Coastguard Worker   if (object_type == AOT_ER_AAC_LD) {
901*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < channel; ch++) {
902*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag_1 =
903*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp2.lag;
904*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag_2 =
905*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.lag;
906*15dc779aSAndroid Build Coastguard Worker     }
907*15dc779aSAndroid Build Coastguard Worker   }
908*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->frame_status = aac_dec_handle->frame_status && frame_status;
909*15dc779aSAndroid Build Coastguard Worker 
910*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->channels = num_ch;
911*15dc779aSAndroid Build Coastguard Worker 
912*15dc779aSAndroid Build Coastguard Worker   if (error_code == 0)
913*15dc779aSAndroid Build Coastguard Worker     if ((skip_full_decode == 0) || ((skip_full_decode == 1) && error_code)) {
914*15dc779aSAndroid Build Coastguard Worker       ia_ics_info_struct str_ics_info[2];
915*15dc779aSAndroid Build Coastguard Worker       WORD32 *spec_coef[2];
916*15dc779aSAndroid Build Coastguard Worker       WORD32 *scratch[2];
917*15dc779aSAndroid Build Coastguard Worker 
918*15dc779aSAndroid Build Coastguard Worker       for (ch = 0; ch < channel; ch++) {
919*15dc779aSAndroid Build Coastguard Worker         str_ics_info[ch] = aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info;
920*15dc779aSAndroid Build Coastguard Worker         spec_coef[ch] = aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff;
921*15dc779aSAndroid Build Coastguard Worker       }
922*15dc779aSAndroid Build Coastguard Worker 
923*15dc779aSAndroid Build Coastguard Worker       scratch[0] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[2];
924*15dc779aSAndroid Build Coastguard Worker       scratch[1] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[1];
925*15dc779aSAndroid Build Coastguard Worker 
926*15dc779aSAndroid Build Coastguard Worker       error_code = ixheaacd_drc_map_channels(
927*15dc779aSAndroid Build Coastguard Worker           pstr_drc_dec, aac_dec_handle->channels,
928*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->pstr_aac_dec_ch_info[0]->str_ics_info.frame_length);
929*15dc779aSAndroid Build Coastguard Worker       if (error_code) {
930*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
931*15dc779aSAndroid Build Coastguard Worker           error_code = 0;
932*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->frame_status = 0;
933*15dc779aSAndroid Build Coastguard Worker         } else {
934*15dc779aSAndroid Build Coastguard Worker           return error_code;
935*15dc779aSAndroid Build Coastguard Worker         }
936*15dc779aSAndroid Build Coastguard Worker       }
937*15dc779aSAndroid Build Coastguard Worker 
938*15dc779aSAndroid Build Coastguard Worker       for (ch = 0; ch < aac_dec_handle->channels; ch++) {
939*15dc779aSAndroid Build Coastguard Worker         WORD32 *overlap1 =
940*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->overlap_add_data.ptr_overlap_buf;
941*15dc779aSAndroid Build Coastguard Worker         const WORD16 *ptr_long_window_next =
942*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
943*15dc779aSAndroid Build Coastguard Worker                 ->ptr_long_window[(int)str_ics_info[ch].window_shape];
944*15dc779aSAndroid Build Coastguard Worker         const WORD16 *ptr_short_window_next =
945*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
946*15dc779aSAndroid Build Coastguard Worker                 ->ptr_short_window[(int)str_ics_info[ch].window_shape];
947*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
948*15dc779aSAndroid Build Coastguard Worker           ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info =
949*15dc779aSAndroid Build Coastguard Worker               aac_dec_handle->pstr_aac_dec_ch_info[ch];
950*15dc779aSAndroid Build Coastguard Worker           ia_aac_dec_channel_info *pstr_aac_dec_static_channel_info =
951*15dc779aSAndroid Build Coastguard Worker               aac_dec_handle->ptr_aac_dec_static_channel_info[ch];
952*15dc779aSAndroid Build Coastguard Worker 
953*15dc779aSAndroid Build Coastguard Worker           ia_aac_dec_channel_info_struct **ppstr_aac_dec_channel_info =
954*15dc779aSAndroid Build Coastguard Worker               &pstr_aac_dec_channel_info;
955*15dc779aSAndroid Build Coastguard Worker           ia_aac_dec_channel_info **ppstr_aac_dec_static_channel_info =
956*15dc779aSAndroid Build Coastguard Worker               &pstr_aac_dec_static_channel_info;
957*15dc779aSAndroid Build Coastguard Worker           ia_audio_specific_config_struct *pstr_audio_specific_config;
958*15dc779aSAndroid Build Coastguard Worker           pstr_audio_specific_config = p_state_enhaacplus_dec->ia_audio_specific_config;
959*15dc779aSAndroid Build Coastguard Worker 
960*15dc779aSAndroid Build Coastguard Worker           if (str_ics_info[ch].max_sfb > str_ics_info[ch].num_swb_window) {
961*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->frame_status = 0;
962*15dc779aSAndroid Build Coastguard Worker           }
963*15dc779aSAndroid Build Coastguard Worker 
964*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_apply_ec(
965*15dc779aSAndroid Build Coastguard Worker               &(*ppstr_aac_dec_static_channel_info)->str_ec_state, *ppstr_aac_dec_channel_info,
966*15dc779aSAndroid Build Coastguard Worker               &ixheaacd_samp_rate_info[pstr_audio_specific_config->samp_frequency_index],
967*15dc779aSAndroid Build Coastguard Worker               aac_dec_handle->samples_per_frame, &str_ics_info[ch], aac_dec_handle->frame_status);
968*15dc779aSAndroid Build Coastguard Worker 
969*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->conceal_count = aac_dec_handle->conceal_count + 1;
970*15dc779aSAndroid Build Coastguard Worker           if (aac_dec_handle->frame_status) {
971*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->sbr_num_elements = aac_dec_handle->pstr_sbr_bitstream->no_elements;
972*15dc779aSAndroid Build Coastguard Worker           } else {
973*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->pstr_sbr_bitstream->no_elements = aac_dec_handle->sbr_num_elements;
974*15dc779aSAndroid Build Coastguard Worker           }
975*15dc779aSAndroid Build Coastguard Worker           if (first_frame == 1)
976*15dc779aSAndroid Build Coastguard Worker             skip_full_decode = 1;
977*15dc779aSAndroid Build Coastguard Worker           else
978*15dc779aSAndroid Build Coastguard Worker             skip_full_decode = 0;
979*15dc779aSAndroid Build Coastguard Worker         }
980*15dc779aSAndroid Build Coastguard Worker         if (pstr_drc_dec->drc_on) {
981*15dc779aSAndroid Build Coastguard Worker           ixheaacd_drc_apply(pstr_drc_dec, spec_coef[ch],
982*15dc779aSAndroid Build Coastguard Worker                              str_ics_info[ch].window_sequence, ch,
983*15dc779aSAndroid Build Coastguard Worker                              str_ics_info[ch].frame_length,
984*15dc779aSAndroid Build Coastguard Worker                              p_obj_exhaacplus_dec->aac_config.ui_enh_sbr, object_type);
985*15dc779aSAndroid Build Coastguard Worker         }
986*15dc779aSAndroid Build Coastguard Worker         if (skip_full_decode == 0) {
987*15dc779aSAndroid Build Coastguard Worker           ixheaacd_imdct_process(aac_dec_handle->pstr_aac_dec_overlap_info[ch],
988*15dc779aSAndroid Build Coastguard Worker                                  spec_coef[ch], &str_ics_info[ch],
989*15dc779aSAndroid Build Coastguard Worker                                  time_data + slot_element, ch_fac, scratch[ch],
990*15dc779aSAndroid Build Coastguard Worker                                  aac_dec_handle->pstr_aac_tables, object_type,
991*15dc779aSAndroid Build Coastguard Worker                                  ldmps_present, slot_element);
992*15dc779aSAndroid Build Coastguard Worker 
993*15dc779aSAndroid Build Coastguard Worker           if (slot_pos != NULL) *slot_pos = slot_element;
994*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->qshift_cnt > 15) {
995*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
996*15dc779aSAndroid Build Coastguard Worker           }
997*15dc779aSAndroid Build Coastguard Worker 
998*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac
999*15dc779aSAndroid Build Coastguard Worker               ->qshift_adj[p_obj_exhaacplus_dec->p_state_aac->qshift_cnt++] =
1000*15dc779aSAndroid Build Coastguard Worker               str_ics_info[ch].qshift_adj;
1001*15dc779aSAndroid Build Coastguard Worker 
1002*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
1003*15dc779aSAndroid Build Coastguard Worker               ->overlap_add_data.win_shape = str_ics_info[ch].window_shape;
1004*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
1005*15dc779aSAndroid Build Coastguard Worker               ->overlap_add_data.win_seq = str_ics_info[ch].window_sequence;
1006*15dc779aSAndroid Build Coastguard Worker           if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
1007*15dc779aSAndroid Build Coastguard Worker             {
1008*15dc779aSAndroid Build Coastguard Worker               if ((str_ics_info[ch].window_sequence == ONLY_LONG_SEQUENCE) ||
1009*15dc779aSAndroid Build Coastguard Worker                   (str_ics_info[ch].window_sequence == LONG_STOP_SEQUENCE)) {
1010*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_lt_update_state(
1011*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
1012*15dc779aSAndroid Build Coastguard Worker                         ->ltp_buf,
1013*15dc779aSAndroid Build Coastguard Worker                     time_data + slot_element, overlap1,
1014*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->samples_per_frame, object_type,
1015*15dc779aSAndroid Build Coastguard Worker                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
1016*15dc779aSAndroid Build Coastguard Worker                     (WORD16 *)ptr_long_window_next, slot_element);
1017*15dc779aSAndroid Build Coastguard Worker               } else {
1018*15dc779aSAndroid Build Coastguard Worker                 ixheaacd_lt_update_state(
1019*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
1020*15dc779aSAndroid Build Coastguard Worker                         ->ltp_buf,
1021*15dc779aSAndroid Build Coastguard Worker                     time_data + slot_element, overlap1,
1022*15dc779aSAndroid Build Coastguard Worker                     aac_dec_handle->samples_per_frame, object_type,
1023*15dc779aSAndroid Build Coastguard Worker                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
1024*15dc779aSAndroid Build Coastguard Worker                     (WORD16 *)ptr_short_window_next, slot_element);
1025*15dc779aSAndroid Build Coastguard Worker               }
1026*15dc779aSAndroid Build Coastguard Worker             }
1027*15dc779aSAndroid Build Coastguard Worker           }
1028*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
1029*15dc779aSAndroid Build Coastguard Worker             ia_aac_dec_channel_info *pstr_aac_dec_static_channel_info =
1030*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->ptr_aac_dec_static_channel_info[ch];
1031*15dc779aSAndroid Build Coastguard Worker             ia_ec_state_str *pstr_ec_state = &pstr_aac_dec_static_channel_info->str_ec_state;
1032*15dc779aSAndroid Build Coastguard Worker             WORD32 k;
1033*15dc779aSAndroid Build Coastguard Worker 
1034*15dc779aSAndroid Build Coastguard Worker             if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
1035*15dc779aSAndroid Build Coastguard Worker               WORD32 fade_fac = ia_ec_fade_factors_fix[pstr_ec_state->fade_idx];
1036*15dc779aSAndroid Build Coastguard Worker               for (k = 0; k < str_ics_info[ch].frame_length; k++) {
1037*15dc779aSAndroid Build Coastguard Worker                 time_data[k] = ixheaac_mul32_sh(time_data[k], fade_fac, 30);
1038*15dc779aSAndroid Build Coastguard Worker               }
1039*15dc779aSAndroid Build Coastguard Worker             } else {
1040*15dc779aSAndroid Build Coastguard Worker               memset(time_data, 0, str_ics_info[ch].frame_length * sizeof(time_data[0]));
1041*15dc779aSAndroid Build Coastguard Worker             }
1042*15dc779aSAndroid Build Coastguard Worker           }
1043*15dc779aSAndroid Build Coastguard Worker           slot_element++;
1044*15dc779aSAndroid Build Coastguard Worker         }
1045*15dc779aSAndroid Build Coastguard Worker       }
1046*15dc779aSAndroid Build Coastguard Worker     }
1047*15dc779aSAndroid Build Coastguard Worker 
1048*15dc779aSAndroid Build Coastguard Worker   if (ele_type == ID_END) {
1049*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
1050*15dc779aSAndroid Build Coastguard Worker       if (err && !is_init) {
1051*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->frame_status = 0;
1052*15dc779aSAndroid Build Coastguard Worker       } else {
1053*15dc779aSAndroid Build Coastguard Worker         ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
1054*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
1055*15dc779aSAndroid Build Coastguard Worker           ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
1056*15dc779aSAndroid Build Coastguard Worker         }
1057*15dc779aSAndroid Build Coastguard Worker       }
1058*15dc779aSAndroid Build Coastguard Worker     } else {
1059*15dc779aSAndroid Build Coastguard Worker       ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
1060*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
1061*15dc779aSAndroid Build Coastguard Worker         ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
1062*15dc779aSAndroid Build Coastguard Worker       }
1063*15dc779aSAndroid Build Coastguard Worker     }
1064*15dc779aSAndroid Build Coastguard Worker   }
1065*15dc779aSAndroid Build Coastguard Worker   *type = ele_type;
1066*15dc779aSAndroid Build Coastguard Worker 
1067*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->block_number =
1068*15dc779aSAndroid Build Coastguard Worker       ixheaac_add32(aac_dec_handle->block_number, 1);
1069*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
1070*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.frame_status = aac_dec_handle->frame_status;
1071*15dc779aSAndroid Build Coastguard Worker     return IA_NO_ERROR;
1072*15dc779aSAndroid Build Coastguard Worker   } else {
1073*15dc779aSAndroid Build Coastguard Worker     return error_code;
1074*15dc779aSAndroid Build Coastguard Worker   }
1075*15dc779aSAndroid Build Coastguard Worker }
1076*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_extension_payload(ia_bit_buf_struct * it_bit_buff,WORD32 * cnt,ia_mps_dec_state_struct * self)1077*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 *cnt,
1078*15dc779aSAndroid Build Coastguard Worker                                   ia_mps_dec_state_struct *self) {
1079*15dc779aSAndroid Build Coastguard Worker   WORD16 extension_type;
1080*15dc779aSAndroid Build Coastguard Worker   WORD32 len, add_len;
1081*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1082*15dc779aSAndroid Build Coastguard Worker   WORD32 fill_nibble;
1083*15dc779aSAndroid Build Coastguard Worker 
1084*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
1085*15dc779aSAndroid Build Coastguard Worker   extension_type = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
1086*15dc779aSAndroid Build Coastguard Worker   switch (extension_type) {
1087*15dc779aSAndroid Build Coastguard Worker     case EXT_FILL_DATA:
1088*15dc779aSAndroid Build Coastguard Worker 
1089*15dc779aSAndroid Build Coastguard Worker       fill_nibble = ixheaacd_read_bits_buf(it_bit_buff, 4);
1090*15dc779aSAndroid Build Coastguard Worker 
1091*15dc779aSAndroid Build Coastguard Worker       if (fill_nibble == 0) {
1092*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < (*cnt >> 3) - 1; i++) {
1093*15dc779aSAndroid Build Coastguard Worker           if (it_bit_buff->cnt_bits >= 8)
1094*15dc779aSAndroid Build Coastguard Worker             ixheaacd_read_bits_buf(it_bit_buff, 8);
1095*15dc779aSAndroid Build Coastguard Worker           else
1096*15dc779aSAndroid Build Coastguard Worker             ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
1097*15dc779aSAndroid Build Coastguard Worker         }
1098*15dc779aSAndroid Build Coastguard Worker 
1099*15dc779aSAndroid Build Coastguard Worker       } else
1100*15dc779aSAndroid Build Coastguard Worker           err = -1;
1101*15dc779aSAndroid Build Coastguard Worker       *cnt = it_bit_buff->cnt_bits;
1102*15dc779aSAndroid Build Coastguard Worker       break;
1103*15dc779aSAndroid Build Coastguard Worker 
1104*15dc779aSAndroid Build Coastguard Worker     case EXT_DATA_LENGTH:
1105*15dc779aSAndroid Build Coastguard Worker 
1106*15dc779aSAndroid Build Coastguard Worker       len = ixheaacd_read_bits_buf(it_bit_buff, 4);
1107*15dc779aSAndroid Build Coastguard Worker 
1108*15dc779aSAndroid Build Coastguard Worker       if (len == 15) {
1109*15dc779aSAndroid Build Coastguard Worker         add_len = ixheaacd_read_bits_buf(it_bit_buff, 8);
1110*15dc779aSAndroid Build Coastguard Worker         len += add_len;
1111*15dc779aSAndroid Build Coastguard Worker 
1112*15dc779aSAndroid Build Coastguard Worker         if (add_len == 255) {
1113*15dc779aSAndroid Build Coastguard Worker           len += ixheaacd_read_bits_buf(it_bit_buff, 16);
1114*15dc779aSAndroid Build Coastguard Worker         }
1115*15dc779aSAndroid Build Coastguard Worker       }
1116*15dc779aSAndroid Build Coastguard Worker       len <<= 3;
1117*15dc779aSAndroid Build Coastguard Worker 
1118*15dc779aSAndroid Build Coastguard Worker       ixheaacd_extension_payload(it_bit_buff, cnt, self);
1119*15dc779aSAndroid Build Coastguard Worker       break;
1120*15dc779aSAndroid Build Coastguard Worker 
1121*15dc779aSAndroid Build Coastguard Worker     case EXT_LDSAC_DATA:
1122*15dc779aSAndroid Build Coastguard Worker 
1123*15dc779aSAndroid Build Coastguard Worker       self->parse_nxt_frame = 1;
1124*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 2);/*anc_type*/
1125*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(it_bit_buff, 2);/*anc_start_stop*/
1126*15dc779aSAndroid Build Coastguard Worker 
1127*15dc779aSAndroid Build Coastguard Worker       if (self->ldmps_config.ldmps_present_flag == 1) {
1128*15dc779aSAndroid Build Coastguard Worker         err = ixheaacd_ld_mps_frame_parsing(self, it_bit_buff);
1129*15dc779aSAndroid Build Coastguard Worker         if (err) return err;
1130*15dc779aSAndroid Build Coastguard Worker       }
1131*15dc779aSAndroid Build Coastguard Worker 
1132*15dc779aSAndroid Build Coastguard Worker       *cnt = it_bit_buff->cnt_bits;
1133*15dc779aSAndroid Build Coastguard Worker       break;
1134*15dc779aSAndroid Build Coastguard Worker     case EXT_FIL:
1135*15dc779aSAndroid Build Coastguard Worker     default:
1136*15dc779aSAndroid Build Coastguard Worker 
1137*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < (*cnt) - 4; i++) {
1138*15dc779aSAndroid Build Coastguard Worker          ixheaacd_skip_bits_buf(it_bit_buff, 1);/*discard*/
1139*15dc779aSAndroid Build Coastguard Worker       }
1140*15dc779aSAndroid Build Coastguard Worker 
1141*15dc779aSAndroid Build Coastguard Worker       *cnt = it_bit_buff->cnt_bits;
1142*15dc779aSAndroid Build Coastguard Worker       break;
1143*15dc779aSAndroid Build Coastguard Worker   }
1144*15dc779aSAndroid Build Coastguard Worker 
1145*15dc779aSAndroid Build Coastguard Worker   return err;
1146*15dc779aSAndroid Build Coastguard Worker }
1147