xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_api.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_apicmd_standards.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_config.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_api_defs.h"
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_definitions.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_bitdec.h"
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
71*15dc779aSAndroid Build Coastguard Worker 
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_freq_sca.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
91*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
92*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
93*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
94*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
95*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_headerdecode.h"
96*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_adts_crc_check.h"
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_multichannel.h"
99*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ver_number.h"
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
102*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
107*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
108*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
109*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
112*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_arith_dec.h"
113*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_create.h"
114*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
115*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ld_mps_dec.h"
116*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_tables.h"
117*15dc779aSAndroid Build Coastguard Worker #define MAX_TRACKS_PER_LAYER 50
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker #define IA_ENHAACPDEC_NUM_MEMTABS (4)
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker #define NUM_AAC_TABLES 8
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker #define LD_OBJ -2
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker #define SCR_BASE_SCR_8K_SIZE \
128*15dc779aSAndroid Build Coastguard Worker   (IXHEAAC_GET_SIZE_ALIGNED((2 * CHANNELS * MAX_BINS_LONG * sizeof(WORD32)), BYTE_ALIGN_8))
129*15dc779aSAndroid Build Coastguard Worker #define SCR_EXTRA_SCR_4K_0_SIZE                                                           \
130*15dc779aSAndroid Build Coastguard Worker   (2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_channel_info_struct), sizeof(WORD32)) + \
131*15dc779aSAndroid Build Coastguard Worker    2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_sfb_code_book_struct), sizeof(WORD32)) +    \
132*15dc779aSAndroid Build Coastguard Worker    IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_pns_stereo_data_struct), sizeof(WORD32)))
133*15dc779aSAndroid Build Coastguard Worker #define SCR_EXTRA_SCR_4K_2_SIZE \
134*15dc779aSAndroid Build Coastguard Worker   (IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD32)), BYTE_ALIGN_8))
135*15dc779aSAndroid Build Coastguard Worker #define SCR_EXTRA_SCR_4K_3_SIZE \
136*15dc779aSAndroid Build Coastguard Worker   (IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD32)), BYTE_ALIGN_8))
137*15dc779aSAndroid Build Coastguard Worker #define SCR_OUT_DATA_SIZE \
138*15dc779aSAndroid Build Coastguard Worker   (IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD32)), BYTE_ALIGN_8))
139*15dc779aSAndroid Build Coastguard Worker #define SCR_IN_DATA_SIZE                                                                \
140*15dc779aSAndroid Build Coastguard Worker   (2 * IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD32)), \
141*15dc779aSAndroid Build Coastguard Worker                                 BYTE_ALIGN_8))
142*15dc779aSAndroid Build Coastguard Worker #define SCR_INTER_SCR_SIZE                                                          \
143*15dc779aSAndroid Build Coastguard Worker   (MAX_CHANNEL_COUNT *                                                              \
144*15dc779aSAndroid Build Coastguard Worker    IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD16)), \
145*15dc779aSAndroid Build Coastguard Worker                             BYTE_ALIGN_8))
146*15dc779aSAndroid Build Coastguard Worker #define SCR_COUP_CH_OUT_SIZE                                                        \
147*15dc779aSAndroid Build Coastguard Worker   (MAX_CHANNEL_COUNT *                                                              \
148*15dc779aSAndroid Build Coastguard Worker    IXHEAAC_GET_SIZE_ALIGNED((IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD16)), \
149*15dc779aSAndroid Build Coastguard Worker                             BYTE_ALIGN_8))
150*15dc779aSAndroid Build Coastguard Worker 
151*15dc779aSAndroid Build Coastguard Worker #define P_IND_CH_INFO_OFFSET \
152*15dc779aSAndroid Build Coastguard Worker   (SCR_BASE_SCR_8K_SIZE + SCR_EXTRA_SCR_4K_0_SIZE + SCR_EXTRA_SCR_4K_2_SIZE)
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker #define HEAACV2_MAX_SIZE                                                          \
155*15dc779aSAndroid Build Coastguard Worker   (max(SCR_BASE_SCR_8K_SIZE + SCR_EXTRA_SCR_4K_0_SIZE + SCR_EXTRA_SCR_4K_2_SIZE + \
156*15dc779aSAndroid Build Coastguard Worker            SCR_INTER_SCR_SIZE + SCR_COUP_CH_OUT_SIZE,                             \
157*15dc779aSAndroid Build Coastguard Worker        MPS_SCRATCH_MEM_SIZE))
158*15dc779aSAndroid Build Coastguard Worker #define ELDV2_MAX_SIZE                                                            \
159*15dc779aSAndroid Build Coastguard Worker   (max(SCR_BASE_SCR_8K_SIZE + SCR_EXTRA_SCR_4K_0_SIZE + SCR_EXTRA_SCR_4K_2_SIZE + \
160*15dc779aSAndroid Build Coastguard Worker            SCR_EXTRA_SCR_4K_3_SIZE + SCR_INTER_SCR_SIZE + SCR_COUP_CH_OUT_SIZE,   \
161*15dc779aSAndroid Build Coastguard Worker        MPS_SCRATCH_MEM_SIZE))
162*15dc779aSAndroid Build Coastguard Worker #define LD_MAX_SIZE                                                                          \
163*15dc779aSAndroid Build Coastguard Worker   (max(SCR_BASE_SCR_8K_SIZE + SCR_EXTRA_SCR_4K_0_SIZE + SCR_EXTRA_SCR_4K_2_SIZE +            \
164*15dc779aSAndroid Build Coastguard Worker            SCR_OUT_DATA_SIZE + SCR_IN_DATA_SIZE + SCR_INTER_SCR_SIZE + SCR_COUP_CH_OUT_SIZE, \
165*15dc779aSAndroid Build Coastguard Worker        MPS_SCRATCH_MEM_SIZE))
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker #define MAX_SCR_SIZE (max(max(HEAACV2_MAX_SIZE, ELDV2_MAX_SIZE), LD_MAX_SIZE))
168*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_mem_api(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,WORD32 i_cmd,WORD32 i_idx,VOID * pv_value)169*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_mem_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
170*15dc779aSAndroid Build Coastguard Worker                                   WORD32 i_cmd, WORD32 i_idx, VOID *pv_value) {
171*15dc779aSAndroid Build Coastguard Worker   pUWORD32 pui_value = pv_value;
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker   if (i_idx < 0 || i_idx >= IA_ENHAACPDEC_NUM_MEMTABS) {
174*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
175*15dc779aSAndroid Build Coastguard Worker   }
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker   if (i_cmd == IA_API_CMD_SET_MEM_PTR) {
178*15dc779aSAndroid Build Coastguard Worker     if (pv_value == 0) {
179*15dc779aSAndroid Build Coastguard Worker       return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
180*15dc779aSAndroid Build Coastguard Worker     }
181*15dc779aSAndroid Build Coastguard Worker     if (((SIZE_T)pv_value %
182*15dc779aSAndroid Build Coastguard Worker          p_obj_exhaacplus_dec->p_mem_info_aac[i_idx].ui_alignment) != 0) {
183*15dc779aSAndroid Build Coastguard Worker       return (IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN);
184*15dc779aSAndroid Build Coastguard Worker     }
185*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->pp_mem_aac[i_idx] = pv_value;
186*15dc779aSAndroid Build Coastguard Worker     memset(p_obj_exhaacplus_dec->pp_mem_aac[i_idx], 0,
187*15dc779aSAndroid Build Coastguard Worker            p_obj_exhaacplus_dec->p_mem_info_aac[i_idx].ui_size);
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker     if (i_idx == IA_ENHAACPLUS_DEC_PERSIST_IDX) {
190*15dc779aSAndroid Build Coastguard Worker       pUWORD8 p_temp = pv_value;
191*15dc779aSAndroid Build Coastguard Worker       UWORD32 *meminfo =
192*15dc779aSAndroid Build Coastguard Worker           (UWORD32 *)p_obj_exhaacplus_dec->p_mem_info_aac + i_idx;
193*15dc779aSAndroid Build Coastguard Worker       UWORD32 pers_size = meminfo[0];
194*15dc779aSAndroid Build Coastguard Worker       p_temp = p_temp + pers_size -
195*15dc779aSAndroid Build Coastguard Worker                (IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8) +
196*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_audio_specific_config_struct), BYTE_ALIGN_8) +
197*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(MAX_HEADER_BUF_SIZE, BYTE_ALIGN_8));
198*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac = pv_value;
199*15dc779aSAndroid Build Coastguard Worker       memset(p_obj_exhaacplus_dec->p_state_aac, 0,
200*15dc779aSAndroid Build Coastguard Worker              IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_state_struct), BYTE_ALIGN_8));
201*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data = p_temp;
202*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config =
203*15dc779aSAndroid Build Coastguard Worker           p_temp + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8);
204*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->header_ptr =
205*15dc779aSAndroid Build Coastguard Worker           p_temp + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8) +
206*15dc779aSAndroid Build Coastguard Worker           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_audio_specific_config_struct), BYTE_ALIGN_8);
207*15dc779aSAndroid Build Coastguard Worker     }
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker   } else {
210*15dc779aSAndroid Build Coastguard Worker     UWORD32 *meminfo =
211*15dc779aSAndroid Build Coastguard Worker         (UWORD32 *)(p_obj_exhaacplus_dec->p_mem_info_aac + i_idx);
212*15dc779aSAndroid Build Coastguard Worker     *pui_value = *(meminfo + (i_cmd - IA_API_CMD_GET_MEM_INFO_SIZE));
213*15dc779aSAndroid Build Coastguard Worker   }
214*15dc779aSAndroid Build Coastguard Worker 
215*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker 
218*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID
ixheaacd_init_sbr_tables(ia_sbr_tables_struct * ptr_sbr_tables)219*15dc779aSAndroid Build Coastguard Worker ixheaacd_init_sbr_tables(ia_sbr_tables_struct *ptr_sbr_tables) {
220*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_tables->env_calc_tables_ptr =
221*15dc779aSAndroid Build Coastguard Worker       (ia_env_calc_tables_struct *)&ixheaacd_aac_dec_env_calc_tables;
222*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_tables->qmf_dec_tables_ptr =
223*15dc779aSAndroid Build Coastguard Worker       (ia_qmf_dec_tables_struct *)&ixheaacd_aac_qmf_dec_tables;
224*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_tables->env_extr_tables_ptr =
225*15dc779aSAndroid Build Coastguard Worker       (ia_env_extr_tables_struct *)&ixheaacd_aac_dec_env_extr_tables;
226*15dc779aSAndroid Build Coastguard Worker   ptr_sbr_tables->ps_tables_ptr =
227*15dc779aSAndroid Build Coastguard Worker       (ia_ps_tables_struct *)&ixheaacd_aac_dec_ps_tables;
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_updatebytesconsumed(ia_aac_dec_state_struct * p_state_enhaacplus_dec,struct ia_bit_buf_struct * it_bit_buff)230*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_updatebytesconsumed(
231*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_state_struct *p_state_enhaacplus_dec,
232*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct *it_bit_buff) {
233*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->i_bytes_consumed =
234*15dc779aSAndroid Build Coastguard Worker       (WORD32)(it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
235*15dc779aSAndroid Build Coastguard Worker   if ((p_state_enhaacplus_dec->i_bytes_consumed == 0) &&
236*15dc779aSAndroid Build Coastguard Worker       (it_bit_buff->cnt_bits == 0)) {
237*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed =
238*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ui_in_bytes;
239*15dc779aSAndroid Build Coastguard Worker   }
240*15dc779aSAndroid Build Coastguard Worker   if (it_bit_buff->cnt_bits < 0) {
241*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed = 0;
242*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ui_out_bytes = 0;
243*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
244*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
245*15dc779aSAndroid Build Coastguard Worker   }
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker 
copy_qmf_to_ldmps(ia_mps_dec_state_struct * mps_dec_handle,VOID * sbr_persistent_mem_v)248*15dc779aSAndroid Build Coastguard Worker static VOID copy_qmf_to_ldmps(ia_mps_dec_state_struct *mps_dec_handle,
249*15dc779aSAndroid Build Coastguard Worker                               VOID *sbr_persistent_mem_v) {
250*15dc779aSAndroid Build Coastguard Worker   ia_sbr_pers_struct *sbr_persistent_mem =
251*15dc779aSAndroid Build Coastguard Worker       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
252*15dc779aSAndroid Build Coastguard Worker   memcpy(&mps_dec_handle->str_mps_qmf_bank,
253*15dc779aSAndroid Build Coastguard Worker          &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]
254*15dc779aSAndroid Build Coastguard Worker               ->str_sbr_dec.str_codec_qmf_bank,
255*15dc779aSAndroid Build Coastguard Worker          sizeof(ia_sbr_qmf_filter_bank_struct));
256*15dc779aSAndroid Build Coastguard Worker 
257*15dc779aSAndroid Build Coastguard Worker   mps_dec_handle->sbr_tables_ptr =
258*15dc779aSAndroid Build Coastguard Worker       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables;
259*15dc779aSAndroid Build Coastguard Worker   mps_dec_handle->qmf_dec_tables_ptr =
260*15dc779aSAndroid Build Coastguard Worker       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr;
261*15dc779aSAndroid Build Coastguard Worker   mps_dec_handle->str_sbr_scale_fact =
262*15dc779aSAndroid Build Coastguard Worker       &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]
263*15dc779aSAndroid Build Coastguard Worker            ->str_sbr_dec.str_sbr_scale_fact;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_readifadts(ia_aac_dec_state_struct * p_state_enhaacplus_dec,struct ia_bit_buf_struct * it_bit_buff,ia_adts_header_struct * adts)266*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_readifadts(ia_aac_dec_state_struct *p_state_enhaacplus_dec,
267*15dc779aSAndroid Build Coastguard Worker                            struct ia_bit_buf_struct *it_bit_buff,
268*15dc779aSAndroid Build Coastguard Worker                            ia_adts_header_struct *adts) {
269*15dc779aSAndroid Build Coastguard Worker   WORD error;
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker   if ((error = ixheaacd_find_syncword(adts, it_bit_buff)) != 0) {
272*15dc779aSAndroid Build Coastguard Worker     ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
273*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
274*15dc779aSAndroid Build Coastguard Worker   }
275*15dc779aSAndroid Build Coastguard Worker   if ((error = ixheaacd_check_if_adts(
276*15dc779aSAndroid Build Coastguard Worker            adts, it_bit_buff,
277*15dc779aSAndroid Build Coastguard Worker            p_state_enhaacplus_dec->p_config->ui_max_channels)) != 0) {
278*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed = 1;
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker     if (it_bit_buff->cnt_bits < 0) {
281*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = 0;
282*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->ui_out_bytes = 0;
283*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
284*15dc779aSAndroid Build Coastguard Worker       error = IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
285*15dc779aSAndroid Build Coastguard Worker       return error;
286*15dc779aSAndroid Build Coastguard Worker     }
287*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
288*15dc779aSAndroid Build Coastguard Worker   }
289*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->b_n_raw_data_blk =
290*15dc779aSAndroid Build Coastguard Worker       (WORD8)(adts->no_raw_data_blocks + 1);
291*15dc779aSAndroid Build Coastguard Worker   return 0;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_allocate_aac_scr(ia_aac_dec_scratch_struct * aac_scratch_struct,VOID * base_scratch_ptr,VOID * output_ptr,WORD channel,WORD max_channel,WORD32 audio_object_type)294*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_allocate_aac_scr(
295*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_scratch_struct *aac_scratch_struct, VOID *base_scratch_ptr,
296*15dc779aSAndroid Build Coastguard Worker     VOID *output_ptr, WORD channel, WORD max_channel,
297*15dc779aSAndroid Build Coastguard Worker     WORD32 audio_object_type) {
298*15dc779aSAndroid Build Coastguard Worker   WORD32 scratch_used = 0;
299*15dc779aSAndroid Build Coastguard Worker   aac_scratch_struct->base_scr_8k = base_scratch_ptr;
300*15dc779aSAndroid Build Coastguard Worker   aac_scratch_struct->extra_scr_4k[1] = (WORD8 *)base_scratch_ptr;
301*15dc779aSAndroid Build Coastguard Worker   scratch_used += SCR_BASE_SCR_8K_SIZE;
302*15dc779aSAndroid Build Coastguard Worker   if (channel == 1) {
303*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[0] = (WORD8 *)base_scratch_ptr + scratch_used;
304*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_0_SIZE;
305*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[2] = (WORD8 *)base_scratch_ptr + scratch_used;
306*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_2_SIZE;
307*15dc779aSAndroid Build Coastguard Worker   } else {
308*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[0] = output_ptr;
309*15dc779aSAndroid Build Coastguard Worker 
310*15dc779aSAndroid Build Coastguard Worker     if (max_channel > 2) {
311*15dc779aSAndroid Build Coastguard Worker       aac_scratch_struct->extra_scr_4k[0] = (WORD8 *)base_scratch_ptr + scratch_used;
312*15dc779aSAndroid Build Coastguard Worker       scratch_used += SCR_EXTRA_SCR_4K_0_SIZE;
313*15dc779aSAndroid Build Coastguard Worker     }
314*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[2] = (WORD8 *)base_scratch_ptr + scratch_used;
315*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_2_SIZE;
316*15dc779aSAndroid Build Coastguard Worker   }
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker   if (audio_object_type == AOT_ER_AAC_ELD || audio_object_type == AOT_ER_AAC_LD) {
319*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[0] = (WORD8 *)base_scratch_ptr + scratch_used;
320*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_0_SIZE;
321*15dc779aSAndroid Build Coastguard Worker 
322*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[2] = (WORD8 *)base_scratch_ptr + scratch_used;
323*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_2_SIZE;
324*15dc779aSAndroid Build Coastguard Worker 
325*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->extra_scr_4k[3] = (WORD8 *)base_scratch_ptr + scratch_used;
326*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_EXTRA_SCR_4K_3_SIZE;
327*15dc779aSAndroid Build Coastguard Worker   }
328*15dc779aSAndroid Build Coastguard Worker   if ((audio_object_type == AOT_ER_AAC_LD) || (audio_object_type == AOT_AAC_LTP)) {
329*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->out_data = (WORD32 *)((WORD8 *)base_scratch_ptr + scratch_used);
330*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_OUT_DATA_SIZE;
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker     aac_scratch_struct->in_data = (WORD32 *)((WORD8 *)base_scratch_ptr + scratch_used);
333*15dc779aSAndroid Build Coastguard Worker     scratch_used += SCR_IN_DATA_SIZE;
334*15dc779aSAndroid Build Coastguard Worker   }
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct * sbr_scratch_struct,VOID * base_scratch_ptr,VOID * output_ptr,WORD32 total_channels,WORD8 * p_qshift_arr,UWORD8 slot_pos,UWORD8 num_ch)337*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct, VOID *base_scratch_ptr,
338*15dc779aSAndroid Build Coastguard Worker                                VOID *output_ptr, WORD32 total_channels, WORD8 *p_qshift_arr,
339*15dc779aSAndroid Build Coastguard Worker                                UWORD8 slot_pos, UWORD8 num_ch) {
340*15dc779aSAndroid Build Coastguard Worker   WORD32 j, i;
341*15dc779aSAndroid Build Coastguard Worker   sbr_scratch_struct->ptr_work_buf_core = base_scratch_ptr;
342*15dc779aSAndroid Build Coastguard Worker 
343*15dc779aSAndroid Build Coastguard Worker   if (p_qshift_arr != NULL && *p_qshift_arr != LD_OBJ) {
344*15dc779aSAndroid Build Coastguard Worker     WORD32 *tmp_buf = (WORD32 *)output_ptr;
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker     for (j = 1; j < num_ch; j++) {
347*15dc779aSAndroid Build Coastguard Worker       if ((*p_qshift_arr + j) == 0)
348*15dc779aSAndroid Build Coastguard Worker         *(p_qshift_arr + j) = *(p_qshift_arr + j - 1);
349*15dc779aSAndroid Build Coastguard Worker     }
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker     if (total_channels > 2) {
352*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < num_ch; j++) {
353*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < 1024; i++) {
354*15dc779aSAndroid Build Coastguard Worker           *((WORD16 *)tmp_buf + slot_pos + total_channels * i + j) =
355*15dc779aSAndroid Build Coastguard Worker               ixheaac_round16(ixheaac_shl32_sat(
356*15dc779aSAndroid Build Coastguard Worker                   *(tmp_buf + slot_pos + total_channels * i + j),
357*15dc779aSAndroid Build Coastguard Worker                   *(p_qshift_arr + j)));
358*15dc779aSAndroid Build Coastguard Worker         }
359*15dc779aSAndroid Build Coastguard Worker       }
360*15dc779aSAndroid Build Coastguard Worker     } else {
361*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < num_ch; j++) {
362*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < 1024; i++) {
363*15dc779aSAndroid Build Coastguard Worker           *((WORD16 *)tmp_buf + total_channels * i + j) =
364*15dc779aSAndroid Build Coastguard Worker               ixheaac_round16(ixheaac_shl32_sat(
365*15dc779aSAndroid Build Coastguard Worker                   *(tmp_buf + total_channels * i + j), *(p_qshift_arr + j)));
366*15dc779aSAndroid Build Coastguard Worker         }
367*15dc779aSAndroid Build Coastguard Worker       }
368*15dc779aSAndroid Build Coastguard Worker     }
369*15dc779aSAndroid Build Coastguard Worker   }
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_lib_id_strings(pVOID pv_output)372*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_get_lib_id_strings(pVOID pv_output) {
373*15dc779aSAndroid Build Coastguard Worker   ia_lib_info_struct *pstr_lib_info = (ia_lib_info_struct *)pv_output;
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker   pstr_lib_info->p_lib_name = (WORD8 *)LIBNAME;
376*15dc779aSAndroid Build Coastguard Worker   pstr_lib_info->p_version_num = (WORD8 *)xHE_AAC_DEC_ITTIAM_VER;
377*15dc779aSAndroid Build Coastguard Worker 
378*15dc779aSAndroid Build Coastguard Worker   return;
379*15dc779aSAndroid Build Coastguard Worker }
380*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)381*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd,
382*15dc779aSAndroid Build Coastguard Worker                               WORD32 i_idx, pVOID pv_value) {
383*15dc779aSAndroid Build Coastguard Worker   ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec = p_ia_xheaac_dec_obj;
384*15dc779aSAndroid Build Coastguard Worker   pUWORD32 pui_value = pv_value;
385*15dc779aSAndroid Build Coastguard Worker   pWORD32 pui_value_signed = pv_value;
386*15dc779aSAndroid Build Coastguard Worker   pWORD8 pb_value = pv_value;
387*15dc779aSAndroid Build Coastguard Worker   pVOID *pp_value = (pVOID *)pv_value;
388*15dc779aSAndroid Build Coastguard Worker   float *pf_value = pv_value;
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker   if ((i_cmd != IA_API_CMD_GET_API_SIZE) &&
391*15dc779aSAndroid Build Coastguard Worker       (i_cmd != IA_API_CMD_GET_LIB_ID_STRINGS)) {
392*15dc779aSAndroid Build Coastguard Worker     if (p_ia_xheaac_dec_obj == 0) {
393*15dc779aSAndroid Build Coastguard Worker       return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
394*15dc779aSAndroid Build Coastguard Worker     }
395*15dc779aSAndroid Build Coastguard Worker     if (((SIZE_T)p_ia_xheaac_dec_obj & 3) != 0) {
396*15dc779aSAndroid Build Coastguard Worker       return (IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN);
397*15dc779aSAndroid Build Coastguard Worker     }
398*15dc779aSAndroid Build Coastguard Worker   }
399*15dc779aSAndroid Build Coastguard Worker 
400*15dc779aSAndroid Build Coastguard Worker   switch (i_cmd) {
401*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_MEM_INFO_SIZE:
402*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT:
403*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_MEM_INFO_TYPE:
404*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_SET_MEM_PTR: {
405*15dc779aSAndroid Build Coastguard Worker       return ixheaacd_dec_mem_api(p_ia_xheaac_dec_obj, i_cmd, i_idx,
406*15dc779aSAndroid Build Coastguard Worker                                   pv_value);
407*15dc779aSAndroid Build Coastguard Worker     }
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_TABLE_INFO_SIZE:
410*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_TABLE_INFO_ALIGNMENT:
411*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_SET_TABLE_PTR:
412*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_TABLE_PTR: {
413*15dc779aSAndroid Build Coastguard Worker       return ixheaacd_dec_table_api(p_ia_xheaac_dec_obj, i_cmd, i_idx,
414*15dc779aSAndroid Build Coastguard Worker                                     pv_value);
415*15dc779aSAndroid Build Coastguard Worker     }
416*15dc779aSAndroid Build Coastguard Worker   };
417*15dc779aSAndroid Build Coastguard Worker 
418*15dc779aSAndroid Build Coastguard Worker   switch (i_cmd) {
419*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_LIB_ID_STRINGS: {
420*15dc779aSAndroid Build Coastguard Worker       WORD8 *i1_ver;
421*15dc779aSAndroid Build Coastguard Worker       WORD8 ver_char;
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker       if (i_idx == IA_CMD_TYPE_LIB_NAME)
424*15dc779aSAndroid Build Coastguard Worker         i1_ver = (WORD8 *)LIBNAME;
425*15dc779aSAndroid Build Coastguard Worker       else if (i_idx == IA_CMD_TYPE_LIB_VERSION)
426*15dc779aSAndroid Build Coastguard Worker         i1_ver = (WORD8 *)xHE_AAC_DEC_ITTIAM_VER;
427*15dc779aSAndroid Build Coastguard Worker       else
428*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX;
429*15dc779aSAndroid Build Coastguard Worker 
430*15dc779aSAndroid Build Coastguard Worker       ver_char = *i1_ver++;
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker       for (; ver_char != '\0';) {
433*15dc779aSAndroid Build Coastguard Worker         if (ver_char != '$') {
434*15dc779aSAndroid Build Coastguard Worker           *pb_value++ = ver_char;
435*15dc779aSAndroid Build Coastguard Worker         }
436*15dc779aSAndroid Build Coastguard Worker         ver_char = *i1_ver++;
437*15dc779aSAndroid Build Coastguard Worker       }
438*15dc779aSAndroid Build Coastguard Worker       *pb_value = ver_char;
439*15dc779aSAndroid Build Coastguard Worker 
440*15dc779aSAndroid Build Coastguard Worker       break;
441*15dc779aSAndroid Build Coastguard Worker     }
442*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_API_SIZE: {
443*15dc779aSAndroid Build Coastguard Worker       *pui_value = sizeof(ia_exhaacplus_dec_api_struct);
444*15dc779aSAndroid Build Coastguard Worker       break;
445*15dc779aSAndroid Build Coastguard Worker     }
446*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_INIT: {
447*15dc779aSAndroid Build Coastguard Worker       switch (i_idx) {
448*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: {
449*15dc779aSAndroid Build Coastguard Worker           memset(p_obj_exhaacplus_dec, 0, sizeof(*p_obj_exhaacplus_dec));
450*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
451*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
452*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_08khz_out = 0;
453*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_16khz_out = 0;
454*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 0;
455*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.down_sample_flag = 0;
456*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.header_dec_done = 0;
457*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 1;
458*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 0;
459*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
460*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 1;
461*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_samp_freq = 0;
462*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_frame_size = 0;
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_n_channels = 2;
465*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.i_channel_mask = 3;
466*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 3;
467*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
468*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_effect_type = 0;
469*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_target_loudness = -24;
470*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag = 0;
471*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = 0;
472*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_enh_sbr = 1;
473*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = 0;
474*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
475*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.loas_present = 0;
476*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ld_decoder = 0;
477*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
478*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
479*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
480*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0;
481*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
482*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.output_level = -1;
483*15dc779aSAndroid Build Coastguard Worker 
484*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6;
485*15dc779aSAndroid Build Coastguard Worker 
486*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
487*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.downmix = 0;
488*15dc779aSAndroid Build Coastguard Worker 
489*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_err_conceal = 0;
490*15dc779aSAndroid Build Coastguard Worker 
491*15dc779aSAndroid Build Coastguard Worker           {
492*15dc779aSAndroid Build Coastguard Worker             ia_aac_dec_tables_struct *pstr_aac_tables =
493*15dc779aSAndroid Build Coastguard Worker                 &p_obj_exhaacplus_dec->aac_tables;
494*15dc779aSAndroid Build Coastguard Worker             pstr_aac_tables->pstr_huffmann_tables =
495*15dc779aSAndroid Build Coastguard Worker                 (ia_aac_dec_huffman_tables_struct
496*15dc779aSAndroid Build Coastguard Worker                      *)&ixheaacd_aac_huffmann_tables;
497*15dc779aSAndroid Build Coastguard Worker             pstr_aac_tables->pstr_block_tables =
498*15dc779aSAndroid Build Coastguard Worker                 (ia_aac_dec_block_tables_struct *)&ixheaacd_aac_block_tables;
499*15dc779aSAndroid Build Coastguard Worker             pstr_aac_tables->pstr_imdct_tables =
500*15dc779aSAndroid Build Coastguard Worker                 (ia_aac_dec_imdct_tables_struct *)&ixheaacd_imdct_tables;
501*15dc779aSAndroid Build Coastguard Worker 
502*15dc779aSAndroid Build Coastguard Worker             ixheaacd_huff_tables_create(pstr_aac_tables);
503*15dc779aSAndroid Build Coastguard Worker           }
504*15dc779aSAndroid Build Coastguard Worker           ixheaacd_init_sbr_tables(&p_obj_exhaacplus_dec->str_sbr_tables);
505*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->common_tables =
506*15dc779aSAndroid Build Coastguard Worker               (ixheaacd_misc_tables *)&ixheaacd_str_fft_n_transcendent_tables;
507*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_qmf_bands = 64;
508*15dc779aSAndroid Build Coastguard Worker 
509*15dc779aSAndroid Build Coastguard Worker           break;
510*15dc779aSAndroid Build Coastguard Worker         }
511*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: {
512*15dc779aSAndroid Build Coastguard Worker           ixheaacd_fill_aac_mem_tables(p_obj_exhaacplus_dec);
513*15dc779aSAndroid Build Coastguard Worker           break;
514*15dc779aSAndroid Build Coastguard Worker         }
515*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_INIT_PROCESS: {
516*15dc779aSAndroid Build Coastguard Worker           WORD32 err_code = 0;
517*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) {
518*15dc779aSAndroid Build Coastguard Worker             err_code = IA_FATAL_ERROR;
519*15dc779aSAndroid Build Coastguard Worker           } else {
520*15dc779aSAndroid Build Coastguard Worker             err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
521*15dc779aSAndroid Build Coastguard Worker             if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
522*15dc779aSAndroid Build Coastguard Worker               if (err_code & IA_FATAL_ERROR) {
523*15dc779aSAndroid Build Coastguard Worker                 err_code = IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
524*15dc779aSAndroid Build Coastguard Worker               } else {
525*15dc779aSAndroid Build Coastguard Worker                 err_code = IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
526*15dc779aSAndroid Build Coastguard Worker               }
527*15dc779aSAndroid Build Coastguard Worker             }
528*15dc779aSAndroid Build Coastguard Worker           }
529*15dc779aSAndroid Build Coastguard Worker           if (err_code != 0) {
530*15dc779aSAndroid Build Coastguard Worker             if (err_code < 0)
531*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present = 1;
532*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
533*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
534*15dc779aSAndroid Build Coastguard Worker           }
535*15dc779aSAndroid Build Coastguard Worker           return err_code;
536*15dc779aSAndroid Build Coastguard Worker           break;
537*15dc779aSAndroid Build Coastguard Worker         }
538*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_INIT_DONE_QUERY: {
539*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->ui_init_done == 1) {
540*15dc779aSAndroid Build Coastguard Worker             *pui_value = 1;
541*15dc779aSAndroid Build Coastguard Worker           } else {
542*15dc779aSAndroid Build Coastguard Worker             *pui_value = 0;
543*15dc779aSAndroid Build Coastguard Worker           }
544*15dc779aSAndroid Build Coastguard Worker           break;
545*15dc779aSAndroid Build Coastguard Worker         }
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_GA_HDR: {
548*15dc779aSAndroid Build Coastguard Worker           return ixheaacd_decoder_2_ga_hdr(p_obj_exhaacplus_dec);
549*15dc779aSAndroid Build Coastguard Worker           break;
550*15dc779aSAndroid Build Coastguard Worker         }
551*15dc779aSAndroid Build Coastguard Worker 
552*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_FLUSH_MEM: {
553*15dc779aSAndroid Build Coastguard Worker           return ixheaacd_decoder_flush_api(p_obj_exhaacplus_dec);
554*15dc779aSAndroid Build Coastguard Worker           break;
555*15dc779aSAndroid Build Coastguard Worker         }
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker         default: {
558*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED;
559*15dc779aSAndroid Build Coastguard Worker         }
560*15dc779aSAndroid Build Coastguard Worker       };
561*15dc779aSAndroid Build Coastguard Worker       break;
562*15dc779aSAndroid Build Coastguard Worker     }
563*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_SET_CONFIG_PARAM: {
564*15dc779aSAndroid Build Coastguard Worker       switch (i_idx) {
565*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ: {
566*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value < 8000) || (*pui_value > 96000)) {
567*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE);
568*15dc779aSAndroid Build Coastguard Worker           }
569*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_samp_freq = *pui_value;
570*15dc779aSAndroid Build Coastguard Worker           break;
571*15dc779aSAndroid Build Coastguard Worker         }
572*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG: {
573*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
574*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMELENGTHFLAG);
575*15dc779aSAndroid Build Coastguard Worker           }
576*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_frame_size = *pui_value;
577*15dc779aSAndroid Build Coastguard Worker           break;
578*15dc779aSAndroid Build Coastguard Worker         }
579*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ: {
580*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 16) && (*pui_value != 24)) {
581*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
582*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ);
583*15dc779aSAndroid Build Coastguard Worker           }
584*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = *pui_value;
585*15dc779aSAndroid Build Coastguard Worker           break;
586*15dc779aSAndroid Build Coastguard Worker         }
587*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX: {
588*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
589*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
590*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX);
591*15dc779aSAndroid Build Coastguard Worker           }
592*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_downmix = *pui_value;
593*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.downmix = *pui_value;
594*15dc779aSAndroid Build Coastguard Worker           break;
595*15dc779aSAndroid Build Coastguard Worker         }
596*15dc779aSAndroid Build Coastguard Worker 
597*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_TOSTEREO: {
598*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
599*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 1;
600*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TOSTEREO);
601*15dc779aSAndroid Build Coastguard Worker           }
602*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_to_stereo = *pui_value;
603*15dc779aSAndroid Build Coastguard Worker           break;
604*15dc779aSAndroid Build Coastguard Worker         }
605*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DSAMPLE: {
606*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
607*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.down_sample_flag = 0;
608*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DSAMPLE);
609*15dc779aSAndroid Build Coastguard Worker           }
610*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.down_sample_flag = *pui_value;
611*15dc779aSAndroid Build Coastguard Worker           break;
612*15dc779aSAndroid Build Coastguard Worker         }
613*15dc779aSAndroid Build Coastguard Worker 
614*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_MP4FLAG: {
615*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
616*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 0;
617*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MP4FLAG);
618*15dc779aSAndroid Build Coastguard Worker           }
619*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = *pui_value;
620*15dc779aSAndroid Build Coastguard Worker           break;
621*15dc779aSAndroid Build Coastguard Worker         }
622*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_CUT: {
623*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
624*15dc779aSAndroid Build Coastguard Worker           if (*pf_value > 1) {
625*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
626*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT);
627*15dc779aSAndroid Build Coastguard Worker           }
628*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_cut =
629*15dc779aSAndroid Build Coastguard Worker               (WORD32)((*pf_value) * 100);
630*15dc779aSAndroid Build Coastguard Worker           break;
631*15dc779aSAndroid Build Coastguard Worker         }
632*15dc779aSAndroid Build Coastguard Worker 
633*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_BOOST: {
634*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
635*15dc779aSAndroid Build Coastguard Worker           if (*pf_value > 1) {
636*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
637*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST);
638*15dc779aSAndroid Build Coastguard Worker           }
639*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_boost =
640*15dc779aSAndroid Build Coastguard Worker               (WORD32)((*pf_value) * 100);
641*15dc779aSAndroid Build Coastguard Worker           break;
642*15dc779aSAndroid Build Coastguard Worker         }
643*15dc779aSAndroid Build Coastguard Worker 
644*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL: {
645*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
646*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.i_loud_ref_level = *pui_value_signed;
647*15dc779aSAndroid Build Coastguard Worker           if (*pui_value > 127) {
648*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
649*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET);
650*15dc779aSAndroid Build Coastguard Worker           }
651*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = *pui_value;
652*15dc779aSAndroid Build Coastguard Worker           break;
653*15dc779aSAndroid Build Coastguard Worker         }
654*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_HEAVY_COMP: {
655*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
656*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
657*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_drc_heavy_comp = 0;
658*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG);
659*15dc779aSAndroid Build Coastguard Worker           }
660*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_heavy_comp = *pui_value;
661*15dc779aSAndroid Build Coastguard Worker           break;
662*15dc779aSAndroid Build Coastguard Worker         }
663*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_DISABLE_SYNC: {
664*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
665*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
666*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SYNCFLAG);
667*15dc779aSAndroid Build Coastguard Worker           }
668*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_disable_sync = *pui_value;
669*15dc779aSAndroid Build Coastguard Worker           break;
670*15dc779aSAndroid Build Coastguard Worker         }
671*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE: {
672*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
673*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 0;
674*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SBRUPFLAG);
675*15dc779aSAndroid Build Coastguard Worker           }
676*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = *pui_value;
677*15dc779aSAndroid Build Coastguard Worker           break;
678*15dc779aSAndroid Build Coastguard Worker         }
679*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_MAX_CHANNEL: {
680*15dc779aSAndroid Build Coastguard Worker           if (*pui_value > 8) {
681*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_max_channels = 8;
682*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
683*15dc779aSAndroid Build Coastguard Worker           }
684*15dc779aSAndroid Build Coastguard Worker           if (*pui_value < 2) {
685*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_max_channels = 2;
686*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
687*15dc779aSAndroid Build Coastguard Worker           }
688*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_max_channels = *pui_value;
689*15dc779aSAndroid Build Coastguard Worker           break;
690*15dc779aSAndroid Build Coastguard Worker         }
691*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_FRAMESIZE: {
692*15dc779aSAndroid Build Coastguard Worker           if (*pui_value == 1) {
693*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.framesize_480 = 1;
694*15dc779aSAndroid Build Coastguard Worker           } else if (*pui_value == 0) {
695*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.framesize_480 = 0;
696*15dc779aSAndroid Build Coastguard Worker           } else {
697*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMSZ);
698*15dc779aSAndroid Build Coastguard Worker           }
699*15dc779aSAndroid Build Coastguard Worker           break;
700*15dc779aSAndroid Build Coastguard Worker         }
701*15dc779aSAndroid Build Coastguard Worker 
702*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_LD_TESTING: {
703*15dc779aSAndroid Build Coastguard Worker           if (*pui_value == 1) {
704*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ld_decoder = 1;
705*15dc779aSAndroid Build Coastguard Worker           } else if (*pui_value == 0) {
706*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ld_decoder = 0;
707*15dc779aSAndroid Build Coastguard Worker           } else {
708*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_LD_CONFIG);
709*15dc779aSAndroid Build Coastguard Worker           }
710*15dc779aSAndroid Build Coastguard Worker           break;
711*15dc779aSAndroid Build Coastguard Worker         }
712*15dc779aSAndroid Build Coastguard Worker 
713*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_COUP_CHANNEL: {
714*15dc779aSAndroid Build Coastguard Worker           if (*pui_value > 16) {
715*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 1;
716*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_COUP_CHANNEL);
717*15dc779aSAndroid Build Coastguard Worker           }
718*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = *pui_value;
719*15dc779aSAndroid Build Coastguard Worker           break;
720*15dc779aSAndroid Build Coastguard Worker         }
721*15dc779aSAndroid Build Coastguard Worker 
722*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX_STEREO: {
723*15dc779aSAndroid Build Coastguard Worker           if ((*pui_value != 1) && (*pui_value != 0)) {
724*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.downmix = 0;
725*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX_STEREO);
726*15dc779aSAndroid Build Coastguard Worker           }
727*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.downmix = *pui_value;
728*15dc779aSAndroid Build Coastguard Worker           break;
729*15dc779aSAndroid Build Coastguard Worker         }
730*15dc779aSAndroid Build Coastguard Worker 
731*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE: {
732*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) > 8) || ((*pui_value_signed) < -1)) {
733*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_effect_type = -1;
734*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_EFFECT_TYPE);
735*15dc779aSAndroid Build Coastguard Worker           }
736*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_effect_type = *pui_value_signed;
737*15dc779aSAndroid Build Coastguard Worker           break;
738*15dc779aSAndroid Build Coastguard Worker         }
739*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS: {
740*15dc779aSAndroid Build Coastguard Worker           if (*pui_value_signed >= 0) {
741*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag = 1;
742*15dc779aSAndroid Build Coastguard Worker           }
743*15dc779aSAndroid Build Coastguard Worker           *pui_value_signed = -(*pui_value_signed >> 2);
744*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) > 0) || ((*pui_value_signed) < -63)) {
745*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_target_loudness = 0;
746*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS);
747*15dc779aSAndroid Build Coastguard Worker           }
748*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_target_loudness =
749*15dc779aSAndroid Build Coastguard Worker               *pui_value_signed;
750*15dc779aSAndroid Build Coastguard Worker           break;
751*15dc779aSAndroid Build Coastguard Worker         }
752*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_HQ_ESBR: {
753*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
754*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = 0;
755*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_HQ_FLAG);
756*15dc779aSAndroid Build Coastguard Worker           }
757*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = *pui_value_signed;
758*15dc779aSAndroid Build Coastguard Worker           break;
759*15dc779aSAndroid Build Coastguard Worker         }
760*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_PS_ENABLE: {
761*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
762*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = 0;
763*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_PS_FLAG);
764*15dc779aSAndroid Build Coastguard Worker           }
765*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = *pui_value_signed;
766*15dc779aSAndroid Build Coastguard Worker           break;
767*15dc779aSAndroid Build Coastguard Worker         }
768*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_PEAK_LIMITER: {
769*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
770*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.peak_limiter_off = 0;
771*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PEAK_LIM_FLAG_TYPE);
772*15dc779aSAndroid Build Coastguard Worker           }
773*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.peak_limiter_off = *pui_value_signed;
774*15dc779aSAndroid Build Coastguard Worker           break;
775*15dc779aSAndroid Build Coastguard Worker         }
776*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT: {
777*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
778*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_err_conceal = 0;
779*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ERR_CONCEAL_FLAG_TYPE);
780*15dc779aSAndroid Build Coastguard Worker           }
781*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_err_conceal = *pui_value_signed;
782*15dc779aSAndroid Build Coastguard Worker           break;
783*15dc779aSAndroid Build Coastguard Worker         }
784*15dc779aSAndroid Build Coastguard Worker         case IA_XHEAAC_DEC_CONFIG_PARAM_ESBR: {
785*15dc779aSAndroid Build Coastguard Worker           if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
786*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr = 1;
787*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_FLAG);
788*15dc779aSAndroid Build Coastguard Worker           }
789*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_enh_sbr = *pui_value_signed;
790*15dc779aSAndroid Build Coastguard Worker           break;
791*15dc779aSAndroid Build Coastguard Worker         }
792*15dc779aSAndroid Build Coastguard Worker         default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM; }
793*15dc779aSAndroid Build Coastguard Worker       }
794*15dc779aSAndroid Build Coastguard Worker       break;
795*15dc779aSAndroid Build Coastguard Worker     }
796*15dc779aSAndroid Build Coastguard Worker 
797*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_CONFIG_PARAM: {
798*15dc779aSAndroid Build Coastguard Worker       UWORD32 i;
799*15dc779aSAndroid Build Coastguard Worker       WORD32 *pvalue =
800*15dc779aSAndroid Build Coastguard Worker           (WORD32 *)(&p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz);
801*15dc779aSAndroid Build Coastguard Worker       if (IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS == i_idx) {
802*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->p_state_aac != NULL &&
803*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
804*15dc779aSAndroid Build Coastguard Worker                     .heaac_mps_present == 1) {
805*15dc779aSAndroid Build Coastguard Worker           *pui_value = p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
806*15dc779aSAndroid Build Coastguard Worker                            .num_output_channels_at;
807*15dc779aSAndroid Build Coastguard Worker         } else {
808*15dc779aSAndroid Build Coastguard Worker           *pui_value = pvalue[i_idx];
809*15dc779aSAndroid Build Coastguard Worker         }
810*15dc779aSAndroid Build Coastguard Worker       } else if (IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MASK == i_idx) {
811*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->p_state_aac != NULL &&
812*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
813*15dc779aSAndroid Build Coastguard Worker                     .heaac_mps_present == 1) {
814*15dc779aSAndroid Build Coastguard Worker           *pui_value = p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
815*15dc779aSAndroid Build Coastguard Worker                            .bs_config.ui_channel_mask;
816*15dc779aSAndroid Build Coastguard Worker         } else {
817*15dc779aSAndroid Build Coastguard Worker           *pui_value = pvalue[i_idx];
818*15dc779aSAndroid Build Coastguard Worker         }
819*15dc779aSAndroid Build Coastguard Worker       } else
820*15dc779aSAndroid Build Coastguard Worker       if (i_idx >= 0 && i_idx <= 8) {
821*15dc779aSAndroid Build Coastguard Worker         *pui_value = pvalue[i_idx];
822*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES == i_idx) {
823*15dc779aSAndroid Build Coastguard Worker         WORD32 *ptri_value = (WORD32 *)pv_value;
824*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
825*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
826*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
827*15dc779aSAndroid Build Coastguard Worker 
828*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < MAX_AUDIO_PREROLLS + 1; i++) {
829*15dc779aSAndroid Build Coastguard Worker           if (ptr_audio_specific_config->str_usac_config.str_usac_dec_config
830*15dc779aSAndroid Build Coastguard Worker                   .preroll_bytes[i] == 0) {
831*15dc779aSAndroid Build Coastguard Worker             break;
832*15dc779aSAndroid Build Coastguard Worker           }
833*15dc779aSAndroid Build Coastguard Worker         }
834*15dc779aSAndroid Build Coastguard Worker 
835*15dc779aSAndroid Build Coastguard Worker         *ptri_value = i;
836*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR == i_idx) {
837*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
838*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
839*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
840*15dc779aSAndroid Build Coastguard Worker 
841*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < ptr_audio_specific_config->str_usac_config
842*15dc779aSAndroid Build Coastguard Worker                             .str_usac_dec_config.num_config_extensions;
843*15dc779aSAndroid Build Coastguard Worker              i++) {
844*15dc779aSAndroid Build Coastguard Worker           pp_value[i] = ptr_audio_specific_config->str_usac_config
845*15dc779aSAndroid Build Coastguard Worker                             .str_usac_dec_config.usac_cfg_ext_info_buf[i];
846*15dc779aSAndroid Build Coastguard Worker         }
847*15dc779aSAndroid Build Coastguard Worker 
848*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < ptr_audio_specific_config->str_usac_config
849*15dc779aSAndroid Build Coastguard Worker                             .str_usac_dec_config.num_elements;
850*15dc779aSAndroid Build Coastguard Worker              i++) {
851*15dc779aSAndroid Build Coastguard Worker           if (ptr_audio_specific_config->str_usac_config.str_usac_dec_config
852*15dc779aSAndroid Build Coastguard Worker                   .usac_ext_ele_payload_present[i]) {
853*15dc779aSAndroid Build Coastguard Worker             pp_value[i + 16] =
854*15dc779aSAndroid Build Coastguard Worker                 ptr_audio_specific_config->str_usac_config.str_usac_dec_config
855*15dc779aSAndroid Build Coastguard Worker                     .usac_ext_ele_payload_buf[i];
856*15dc779aSAndroid Build Coastguard Worker           }
857*15dc779aSAndroid Build Coastguard Worker         }
858*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES == i_idx) {
859*15dc779aSAndroid Build Coastguard Worker         WORD32 *ptri_value = (WORD32 *)pv_value;
860*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
861*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
862*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
863*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < ptr_audio_specific_config->str_usac_config
864*15dc779aSAndroid Build Coastguard Worker                             .str_usac_dec_config.num_config_extensions;
865*15dc779aSAndroid Build Coastguard Worker              i++) {
866*15dc779aSAndroid Build Coastguard Worker           ptri_value[i] = ptr_audio_specific_config->str_usac_config
867*15dc779aSAndroid Build Coastguard Worker                               .str_usac_dec_config.usac_cfg_ext_info_len[i];
868*15dc779aSAndroid Build Coastguard Worker         }
869*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < ptr_audio_specific_config->str_usac_config
870*15dc779aSAndroid Build Coastguard Worker                             .str_usac_dec_config.num_elements;
871*15dc779aSAndroid Build Coastguard Worker              i++) {
872*15dc779aSAndroid Build Coastguard Worker           ptri_value[i + 16] =
873*15dc779aSAndroid Build Coastguard Worker               ptr_audio_specific_config->str_usac_config.str_usac_dec_config
874*15dc779aSAndroid Build Coastguard Worker                   .usac_ext_ele_payload_len[i];
875*15dc779aSAndroid Build Coastguard Worker         }
876*15dc779aSAndroid Build Coastguard Worker 
877*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_DRC_IS_CONFIG_CHANGED == i_idx) {
878*15dc779aSAndroid Build Coastguard Worker         *pui_value = p_obj_exhaacplus_dec->p_state_aac->drc_config_changed;
879*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_DRC_APPLY_CROSSFADE == i_idx) {
880*15dc779aSAndroid Build Coastguard Worker         *pui_value = p_obj_exhaacplus_dec->p_state_aac->apply_crossfade;
881*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE == i_idx) {
882*15dc779aSAndroid Build Coastguard Worker         UWORD32 *ptri_value = (UWORD32 *)pv_value;
883*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
884*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
885*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
886*15dc779aSAndroid Build Coastguard Worker         *ptri_value = ptr_audio_specific_config->str_usac_config
887*15dc779aSAndroid Build Coastguard Worker                           .str_usac_dec_config.num_elements;
888*15dc779aSAndroid Build Coastguard Worker 
889*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT == i_idx) {
890*15dc779aSAndroid Build Coastguard Worker         UWORD32 *ptri_value = (UWORD32 *)pv_value;
891*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
892*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
893*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
894*15dc779aSAndroid Build Coastguard Worker         *ptri_value = ptr_audio_specific_config->str_usac_config
895*15dc779aSAndroid Build Coastguard Worker                           .str_usac_dec_config.num_config_extensions;
896*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN == i_idx) {
897*15dc779aSAndroid Build Coastguard Worker         UWORD32 *ptri_value = (UWORD32 *)pv_value;
898*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
899*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
900*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
901*15dc779aSAndroid Build Coastguard Worker         WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config
902*15dc779aSAndroid Build Coastguard Worker                                      .str_usac_dec_config.preroll_counter;
903*15dc779aSAndroid Build Coastguard Worker         *ptri_value =
904*15dc779aSAndroid Build Coastguard Worker             ptr_audio_specific_config->str_usac_config.str_usac_dec_config
905*15dc779aSAndroid Build Coastguard Worker                 .usac_ext_gain_payload_len[preroll_counter];
906*15dc779aSAndroid Build Coastguard Worker       } else if (IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF == i_idx) {
907*15dc779aSAndroid Build Coastguard Worker         WORD32 payload_buffer_offeset = 0;
908*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
909*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
910*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
911*15dc779aSAndroid Build Coastguard Worker         WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config
912*15dc779aSAndroid Build Coastguard Worker                                      .str_usac_dec_config.preroll_counter;
913*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < (UWORD32)preroll_counter; i++)
914*15dc779aSAndroid Build Coastguard Worker           payload_buffer_offeset +=
915*15dc779aSAndroid Build Coastguard Worker               ptr_audio_specific_config->str_usac_config.str_usac_dec_config
916*15dc779aSAndroid Build Coastguard Worker                   .usac_ext_gain_payload_len[i] *
917*15dc779aSAndroid Build Coastguard Worker               sizeof(WORD8);
918*15dc779aSAndroid Build Coastguard Worker         *pp_value = ptr_audio_specific_config->str_usac_config
919*15dc779aSAndroid Build Coastguard Worker                         .str_usac_dec_config.usac_ext_gain_payload_buf +
920*15dc779aSAndroid Build Coastguard Worker                     payload_buffer_offeset;
921*15dc779aSAndroid Build Coastguard Worker       } else if (IA_XHEAAC_DEC_CONFIG_PARAM_AOT == i_idx) {
922*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
923*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag == 1) {
924*15dc779aSAndroid Build Coastguard Worker             ia_audio_specific_config_struct *ptr_audio_specific_config =
925*15dc779aSAndroid Build Coastguard Worker                 ((ia_audio_specific_config_struct *)
926*15dc779aSAndroid Build Coastguard Worker                     p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
927*15dc779aSAndroid Build Coastguard Worker             *pui_value = ptr_audio_specific_config->audio_object_type;
928*15dc779aSAndroid Build Coastguard Worker           } else {
929*15dc779aSAndroid Build Coastguard Worker             *pui_value = p_obj_exhaacplus_dec->p_state_aac->audio_object_type;
930*15dc779aSAndroid Build Coastguard Worker           }
931*15dc779aSAndroid Build Coastguard Worker         } else {
932*15dc779aSAndroid Build Coastguard Worker           *pui_value = AOT_AAC_LC;
933*15dc779aSAndroid Build Coastguard Worker         }
934*15dc779aSAndroid Build Coastguard Worker       } else {
935*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM;
936*15dc779aSAndroid Build Coastguard Worker       }
937*15dc779aSAndroid Build Coastguard Worker       break;
938*15dc779aSAndroid Build Coastguard Worker     }
939*15dc779aSAndroid Build Coastguard Worker 
940*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_MEMTABS_SIZE: {
941*15dc779aSAndroid Build Coastguard Worker       *pui_value = (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) *
942*15dc779aSAndroid Build Coastguard Worker                    (IA_ENHAACPDEC_NUM_MEMTABS);
943*15dc779aSAndroid Build Coastguard Worker       break;
944*15dc779aSAndroid Build Coastguard Worker     }
945*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_LOUDNESS_VAL: {
946*15dc779aSAndroid Build Coastguard Worker       *pui_value = p_obj_exhaacplus_dec->aac_config.output_level;
947*15dc779aSAndroid Build Coastguard Worker       break;
948*15dc779aSAndroid Build Coastguard Worker     }
949*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_SET_MEMTABS_PTR: {
950*15dc779aSAndroid Build Coastguard Worker       if (pv_value == NULL) return IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC;
951*15dc779aSAndroid Build Coastguard Worker       memset(pv_value, 0, (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) *
952*15dc779aSAndroid Build Coastguard Worker                               (IA_ENHAACPDEC_NUM_MEMTABS));
953*15dc779aSAndroid Build Coastguard Worker 
954*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_mem_info_aac = pv_value;
955*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->pp_mem_aac =
956*15dc779aSAndroid Build Coastguard Worker           (pVOID *)((WORD8 *)pv_value +
957*15dc779aSAndroid Build Coastguard Worker                     sizeof(ia_mem_info_struct) * IA_ENHAACPDEC_NUM_MEMTABS);
958*15dc779aSAndroid Build Coastguard Worker 
959*15dc779aSAndroid Build Coastguard Worker       break;
960*15dc779aSAndroid Build Coastguard Worker     }
961*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_N_MEMTABS: {
962*15dc779aSAndroid Build Coastguard Worker       *pui_value = IA_ENHAACPDEC_NUM_MEMTABS;
963*15dc779aSAndroid Build Coastguard Worker       break;
964*15dc779aSAndroid Build Coastguard Worker     }
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_N_TABLES: {
967*15dc779aSAndroid Build Coastguard Worker       *pui_value = NUM_AAC_TABLES + NUM_MPS_TABLES;
968*15dc779aSAndroid Build Coastguard Worker       break;
969*15dc779aSAndroid Build Coastguard Worker     }
970*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_EXECUTE: {
971*15dc779aSAndroid Build Coastguard Worker       switch (i_idx) {
972*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_DO_EXECUTE: {
973*15dc779aSAndroid Build Coastguard Worker           WORD32 err_code = 0;
974*15dc779aSAndroid Build Coastguard Worker           if (!p_obj_exhaacplus_dec->p_state_aac->ui_init_done ||
975*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) {
976*15dc779aSAndroid Build Coastguard Worker             err_code = IA_FATAL_ERROR;
977*15dc779aSAndroid Build Coastguard Worker           } else {
978*15dc779aSAndroid Build Coastguard Worker             memset(p_obj_exhaacplus_dec->p_state_aac->qshift_adj, 0,
979*15dc779aSAndroid Build Coastguard Worker                    sizeof(p_obj_exhaacplus_dec->p_state_aac->qshift_adj));
980*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->qshift_cnt = 0;
981*15dc779aSAndroid Build Coastguard Worker             err_code = ixheaacd_dec_execute(p_obj_exhaacplus_dec);
982*15dc779aSAndroid Build Coastguard Worker           }
983*15dc779aSAndroid Build Coastguard Worker           if (err_code != IA_NO_ERROR) {
984*15dc779aSAndroid Build Coastguard Worker             if (err_code < 0) {
985*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present = 1;
986*15dc779aSAndroid Build Coastguard Worker             }
987*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
988*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
989*15dc779aSAndroid Build Coastguard Worker           }
990*15dc779aSAndroid Build Coastguard Worker           return err_code;
991*15dc779aSAndroid Build Coastguard Worker           break;
992*15dc779aSAndroid Build Coastguard Worker         }
993*15dc779aSAndroid Build Coastguard Worker         case IA_CMD_TYPE_DONE_QUERY: {
994*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 1) {
995*15dc779aSAndroid Build Coastguard Worker             *pui_value = 1;
996*15dc779aSAndroid Build Coastguard Worker           } else {
997*15dc779aSAndroid Build Coastguard Worker             *pui_value = 0;
998*15dc779aSAndroid Build Coastguard Worker           }
999*15dc779aSAndroid Build Coastguard Worker 
1000*15dc779aSAndroid Build Coastguard Worker           break;
1001*15dc779aSAndroid Build Coastguard Worker         }
1002*15dc779aSAndroid Build Coastguard Worker         default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_EXECUTE_TYPE; }
1003*15dc779aSAndroid Build Coastguard Worker       };
1004*15dc779aSAndroid Build Coastguard Worker       break;
1005*15dc779aSAndroid Build Coastguard Worker     }
1006*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_CURIDX_INPUT_BUF: {
1007*15dc779aSAndroid Build Coastguard Worker       *pui_value = p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed;
1008*15dc779aSAndroid Build Coastguard Worker       break;
1009*15dc779aSAndroid Build Coastguard Worker     }
1010*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_SET_INPUT_BYTES: {
1011*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes = *pui_value;
1012*15dc779aSAndroid Build Coastguard Worker       break;
1013*15dc779aSAndroid Build Coastguard Worker     }
1014*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_GET_OUTPUT_BYTES: {
1015*15dc779aSAndroid Build Coastguard Worker       if (1 == i_idx) {
1016*15dc779aSAndroid Build Coastguard Worker         *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_mps_out_bytes;
1017*15dc779aSAndroid Build Coastguard Worker       } else {
1018*15dc779aSAndroid Build Coastguard Worker         *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes;
1019*15dc779aSAndroid Build Coastguard Worker       }
1020*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_USAC) {
1021*15dc779aSAndroid Build Coastguard Worker         ia_audio_specific_config_struct *ptr_audio_specific_config =
1022*15dc779aSAndroid Build Coastguard Worker             ((ia_audio_specific_config_struct *)
1023*15dc779aSAndroid Build Coastguard Worker                  p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
1024*15dc779aSAndroid Build Coastguard Worker 
1025*15dc779aSAndroid Build Coastguard Worker         WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config
1026*15dc779aSAndroid Build Coastguard Worker                                      .str_usac_dec_config.preroll_counter;
1027*15dc779aSAndroid Build Coastguard Worker 
1028*15dc779aSAndroid Build Coastguard Worker         *pui_value = ptr_audio_specific_config->str_usac_config
1029*15dc779aSAndroid Build Coastguard Worker                          .str_usac_dec_config.preroll_bytes[preroll_counter];
1030*15dc779aSAndroid Build Coastguard Worker 
1031*15dc779aSAndroid Build Coastguard Worker         preroll_counter++;
1032*15dc779aSAndroid Build Coastguard Worker         if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) return IA_FATAL_ERROR;
1033*15dc779aSAndroid Build Coastguard Worker         ptr_audio_specific_config->str_usac_config.str_usac_dec_config
1034*15dc779aSAndroid Build Coastguard Worker             .preroll_counter = preroll_counter;
1035*15dc779aSAndroid Build Coastguard Worker       }
1036*15dc779aSAndroid Build Coastguard Worker       break;
1037*15dc779aSAndroid Build Coastguard Worker     }
1038*15dc779aSAndroid Build Coastguard Worker     case IA_API_CMD_INPUT_OVER: {
1039*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_input_over = 1;
1040*15dc779aSAndroid Build Coastguard Worker       break;
1041*15dc779aSAndroid Build Coastguard Worker     }
1042*15dc779aSAndroid Build Coastguard Worker     default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_CMD; }
1043*15dc779aSAndroid Build Coastguard Worker   };
1044*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1045*15dc779aSAndroid Build Coastguard Worker }
1046*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decoder_2_ga_hdr(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)1047*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_decoder_2_ga_hdr(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
1048*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1049*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
1050*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
1051*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
1052*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_08khz_out = 0;
1053*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_16khz_out = 0;
1054*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 0;
1055*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.down_sample_flag = 0;
1056*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.header_dec_done = 0;
1057*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.frame_status = 1;
1058*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 1;
1059*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
1060*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 1;
1061*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = 0;
1062*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 3;
1063*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 2;
1064*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
1065*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.loas_present = 0;
1066*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
1067*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
1068*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
1069*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0;
1070*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 1;
1071*15dc779aSAndroid Build Coastguard Worker 
1072*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6;
1073*15dc779aSAndroid Build Coastguard Worker 
1074*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
1075*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.downmix = 0;
1076*15dc779aSAndroid Build Coastguard Worker 
1077*15dc779aSAndroid Build Coastguard Worker     {
1078*15dc779aSAndroid Build Coastguard Worker       ia_aac_dec_tables_struct *pstr_aac_tables =
1079*15dc779aSAndroid Build Coastguard Worker           &p_obj_exhaacplus_dec->aac_tables;
1080*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_huffmann_tables =
1081*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_huffman_tables_struct *)&ixheaacd_aac_huffmann_tables;
1082*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_block_tables =
1083*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_block_tables_struct *)&ixheaacd_aac_block_tables;
1084*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_imdct_tables =
1085*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_imdct_tables_struct *)&ixheaacd_imdct_tables;
1086*15dc779aSAndroid Build Coastguard Worker 
1087*15dc779aSAndroid Build Coastguard Worker       ixheaacd_huff_tables_create(pstr_aac_tables);
1088*15dc779aSAndroid Build Coastguard Worker     }
1089*15dc779aSAndroid Build Coastguard Worker     ixheaacd_init_sbr_tables(&p_obj_exhaacplus_dec->str_sbr_tables);
1090*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->common_tables =
1091*15dc779aSAndroid Build Coastguard Worker         (ixheaacd_misc_tables *)&ixheaacd_str_fft_n_transcendent_tables;
1092*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_qmf_bands = 64;
1093*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_init_done = 0;
1094*15dc779aSAndroid Build Coastguard Worker 
1095*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
1096*15dc779aSAndroid Build Coastguard Worker   } else {
1097*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
1098*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
1099*15dc779aSAndroid Build Coastguard Worker   }
1100*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
1101*15dc779aSAndroid Build Coastguard Worker     if (err_code & IA_FATAL_ERROR) {
1102*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
1103*15dc779aSAndroid Build Coastguard Worker     } else {
1104*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
1105*15dc779aSAndroid Build Coastguard Worker     }
1106*15dc779aSAndroid Build Coastguard Worker   } else {
1107*15dc779aSAndroid Build Coastguard Worker     return err_code;
1108*15dc779aSAndroid Build Coastguard Worker   }
1109*15dc779aSAndroid Build Coastguard Worker }
1110*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decoder_flush_api(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)1111*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_decoder_flush_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
1112*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1113*15dc779aSAndroid Build Coastguard Worker   UWORD8 *header_temp_ptr;
1114*15dc779aSAndroid Build Coastguard Worker   WORD32 header_length;
1115*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
1116*15dc779aSAndroid Build Coastguard Worker     header_temp_ptr = p_obj_exhaacplus_dec->p_state_aac->header_ptr;
1117*15dc779aSAndroid Build Coastguard Worker     header_length = p_obj_exhaacplus_dec->p_state_aac->header_length;
1118*15dc779aSAndroid Build Coastguard Worker     memset(p_obj_exhaacplus_dec->p_state_aac, 0,
1119*15dc779aSAndroid Build Coastguard Worker            IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_state_struct), BYTE_ALIGN_8));
1120*15dc779aSAndroid Build Coastguard Worker     {
1121*15dc779aSAndroid Build Coastguard Worker       pUWORD8 p_temp = (pUWORD8)p_obj_exhaacplus_dec->p_state_aac;
1122*15dc779aSAndroid Build Coastguard Worker       UWORD32 *meminfo = (UWORD32 *)p_obj_exhaacplus_dec->p_mem_info_aac;
1123*15dc779aSAndroid Build Coastguard Worker       UWORD32 pers_size = meminfo[0];
1124*15dc779aSAndroid Build Coastguard Worker       p_temp = p_temp + pers_size -
1125*15dc779aSAndroid Build Coastguard Worker                (IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8) +
1126*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_audio_specific_config_struct), BYTE_ALIGN_8) +
1127*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(MAX_HEADER_BUF_SIZE, BYTE_ALIGN_8));
1128*15dc779aSAndroid Build Coastguard Worker 
1129*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data = p_temp;
1130*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config =
1131*15dc779aSAndroid Build Coastguard Worker           p_temp + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8);
1132*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->header_ptr =
1133*15dc779aSAndroid Build Coastguard Worker           p_temp + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8) +
1134*15dc779aSAndroid Build Coastguard Worker           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_audio_specific_config_struct), BYTE_ALIGN_8);
1135*15dc779aSAndroid Build Coastguard Worker     }
1136*15dc779aSAndroid Build Coastguard Worker     memset(&(p_obj_exhaacplus_dec->aac_config), 0,
1137*15dc779aSAndroid Build Coastguard Worker            sizeof(ia_aac_dec_config_struct));
1138*15dc779aSAndroid Build Coastguard Worker 
1139*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
1140*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
1141*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_08khz_out = 0;
1142*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_16khz_out = 0;
1143*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 0;
1144*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.down_sample_flag = 0;
1145*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.header_dec_done = 0;
1146*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.frame_status = 1;
1147*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 1;
1148*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
1149*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 1;
1150*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = 0;
1151*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 3;
1152*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 2;
1153*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
1154*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.loas_present = 0;
1155*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
1156*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
1157*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
1158*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0;
1159*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 1;
1160*15dc779aSAndroid Build Coastguard Worker 
1161*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6;
1162*15dc779aSAndroid Build Coastguard Worker 
1163*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
1164*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.downmix = 0;
1165*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 0;
1166*15dc779aSAndroid Build Coastguard Worker 
1167*15dc779aSAndroid Build Coastguard Worker     {
1168*15dc779aSAndroid Build Coastguard Worker       ia_aac_dec_tables_struct *pstr_aac_tables =
1169*15dc779aSAndroid Build Coastguard Worker           &p_obj_exhaacplus_dec->aac_tables;
1170*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_huffmann_tables =
1171*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_huffman_tables_struct *)&ixheaacd_aac_huffmann_tables;
1172*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_block_tables =
1173*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_block_tables_struct *)&ixheaacd_aac_block_tables;
1174*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tables->pstr_imdct_tables =
1175*15dc779aSAndroid Build Coastguard Worker           (ia_aac_dec_imdct_tables_struct *)&ixheaacd_imdct_tables;
1176*15dc779aSAndroid Build Coastguard Worker 
1177*15dc779aSAndroid Build Coastguard Worker       ixheaacd_huff_tables_create(pstr_aac_tables);
1178*15dc779aSAndroid Build Coastguard Worker     }
1179*15dc779aSAndroid Build Coastguard Worker     ixheaacd_init_sbr_tables(&p_obj_exhaacplus_dec->str_sbr_tables);
1180*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->common_tables =
1181*15dc779aSAndroid Build Coastguard Worker         (ixheaacd_misc_tables *)&ixheaacd_str_fft_n_transcendent_tables;
1182*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_qmf_bands = 64;
1183*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->header_ptr = header_temp_ptr;
1184*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes = header_length;
1185*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->header_length = header_length;
1186*15dc779aSAndroid Build Coastguard Worker 
1187*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
1188*15dc779aSAndroid Build Coastguard Worker   } else {
1189*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
1190*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
1191*15dc779aSAndroid Build Coastguard Worker   }
1192*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
1193*15dc779aSAndroid Build Coastguard Worker     if (err_code & IA_FATAL_ERROR) {
1194*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
1195*15dc779aSAndroid Build Coastguard Worker     } else {
1196*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
1197*15dc779aSAndroid Build Coastguard Worker     }
1198*15dc779aSAndroid Build Coastguard Worker   } else {
1199*15dc779aSAndroid Build Coastguard Worker     return err_code;
1200*15dc779aSAndroid Build Coastguard Worker   }
1201*15dc779aSAndroid Build Coastguard Worker }
1202*15dc779aSAndroid Build Coastguard Worker 
1203*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32
ixheaacd_persistent_buffer_sizes(WORD32 num_channel)1204*15dc779aSAndroid Build Coastguard Worker ixheaacd_persistent_buffer_sizes(WORD32 num_channel) {
1205*15dc779aSAndroid Build Coastguard Worker   WORD32 size_buffers = 0;
1206*15dc779aSAndroid Build Coastguard Worker 
1207*15dc779aSAndroid Build Coastguard Worker   WORD32 temp;
1208*15dc779aSAndroid Build Coastguard Worker   WORD32 max_channels;
1209*15dc779aSAndroid Build Coastguard Worker 
1210*15dc779aSAndroid Build Coastguard Worker   size_buffers += IXHEAAC_GET_SIZE_ALIGNED(4 * 512 * num_channel * sizeof(WORD32), BYTE_ALIGN_8);
1211*15dc779aSAndroid Build Coastguard Worker 
1212*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1213*15dc779aSAndroid Build Coastguard Worker       num_channel * IXHEAAC_GET_SIZE_ALIGNED(ltp_buffer_size * sizeof(WORD16), BYTE_ALIGN_8);
1214*15dc779aSAndroid Build Coastguard Worker 
1215*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1216*15dc779aSAndroid Build Coastguard Worker       num_channel * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_channel_info), BYTE_ALIGN_8);
1217*15dc779aSAndroid Build Coastguard Worker 
1218*15dc779aSAndroid Build Coastguard Worker   if (num_channel > 2) {
1219*15dc779aSAndroid Build Coastguard Worker     max_channels = MAX_BS_ELEMENT;
1220*15dc779aSAndroid Build Coastguard Worker   } else {
1221*15dc779aSAndroid Build Coastguard Worker     max_channels = 2;
1222*15dc779aSAndroid Build Coastguard Worker   }
1223*15dc779aSAndroid Build Coastguard Worker   size_buffers += (max_channels)*2 *
1224*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_sbr_bitstream_struct), BYTE_ALIGN_8);
1225*15dc779aSAndroid Build Coastguard Worker 
1226*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1227*15dc779aSAndroid Build Coastguard Worker       num_channel * IXHEAAC_GET_SIZE_ALIGNED(MAXSBRBYTES * sizeof(WORD8), BYTE_ALIGN_8);
1228*15dc779aSAndroid Build Coastguard Worker 
1229*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1230*15dc779aSAndroid Build Coastguard Worker       num_channel * IXHEAAC_GET_SIZE_ALIGNED(MAXSBRBYTES * sizeof(WORD8), BYTE_ALIGN_8);
1231*15dc779aSAndroid Build Coastguard Worker 
1232*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1233*15dc779aSAndroid Build Coastguard Worker       2 * num_channel *
1234*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(
1235*15dc779aSAndroid Build Coastguard Worker           (QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) * sizeof(WORD16), BYTE_ALIGN_8);
1236*15dc779aSAndroid Build Coastguard Worker 
1237*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1238*15dc779aSAndroid Build Coastguard Worker       2 * num_channel *
1239*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(
1240*15dc779aSAndroid Build Coastguard Worker           (QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) * sizeof(WORD32), BYTE_ALIGN_8);
1241*15dc779aSAndroid Build Coastguard Worker 
1242*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1243*15dc779aSAndroid Build Coastguard Worker       2 * num_channel *
1244*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(
1245*15dc779aSAndroid Build Coastguard Worker           (QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) * sizeof(WORD16), BYTE_ALIGN_8);
1246*15dc779aSAndroid Build Coastguard Worker 
1247*15dc779aSAndroid Build Coastguard Worker   size_buffers +=
1248*15dc779aSAndroid Build Coastguard Worker       2 * num_channel *
1249*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(
1250*15dc779aSAndroid Build Coastguard Worker           (QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) * sizeof(WORD32), BYTE_ALIGN_8);
1251*15dc779aSAndroid Build Coastguard Worker 
1252*15dc779aSAndroid Build Coastguard Worker   size_buffers += num_channel * 2 *
1253*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32),
1254*15dc779aSAndroid Build Coastguard Worker                                            BYTE_ALIGN_8);
1255*15dc779aSAndroid Build Coastguard Worker 
1256*15dc779aSAndroid Build Coastguard Worker   size_buffers += 2 * LPC_ORDER * num_channel *
1257*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(NO_ANALYSIS_CHANNELS * sizeof(WORD32), BYTE_ALIGN_8);
1258*15dc779aSAndroid Build Coastguard Worker 
1259*15dc779aSAndroid Build Coastguard Worker   size_buffers += 2 * IXHEAAC_GET_SIZE_ALIGNED(LPC_ORDER * sizeof(WORD32 *), BYTE_ALIGN_8);
1260*15dc779aSAndroid Build Coastguard Worker 
1261*15dc779aSAndroid Build Coastguard Worker   size_buffers += 2 * LPC_ORDER * num_channel *
1262*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(NO_ANALYSIS_CHANNELS * sizeof(WORD32), BYTE_ALIGN_8);
1263*15dc779aSAndroid Build Coastguard Worker 
1264*15dc779aSAndroid Build Coastguard Worker   size_buffers += 2 * num_channel * 3 *
1265*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(MAX_FREQ_COEFFS * sizeof(WORD16), BYTE_ALIGN_8);
1266*15dc779aSAndroid Build Coastguard Worker 
1267*15dc779aSAndroid Build Coastguard Worker   temp = IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_freq_band_data_struct), BYTE_ALIGN_8) +
1268*15dc779aSAndroid Build Coastguard Worker          IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_prev_frame_data_struct), BYTE_ALIGN_8) +
1269*15dc779aSAndroid Build Coastguard Worker          IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_channel_struct), BYTE_ALIGN_8) +
1270*15dc779aSAndroid Build Coastguard Worker          IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_header_data_struct), BYTE_ALIGN_8);
1271*15dc779aSAndroid Build Coastguard Worker   size_buffers += 2 * num_channel * temp;
1272*15dc779aSAndroid Build Coastguard Worker 
1273*15dc779aSAndroid Build Coastguard Worker   size_buffers += MAX_BS_ELEMENT *
1274*15dc779aSAndroid Build Coastguard Worker                   IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaac_drc_bs_data_struct *), BYTE_ALIGN_8);
1275*15dc779aSAndroid Build Coastguard Worker 
1276*15dc779aSAndroid Build Coastguard Worker   size_buffers += num_channel * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_ps_dec_struct), BYTE_ALIGN_8);
1277*15dc779aSAndroid Build Coastguard Worker 
1278*15dc779aSAndroid Build Coastguard Worker   {
1279*15dc779aSAndroid Build Coastguard Worker     WORD32 temp_size = 0;
1280*15dc779aSAndroid Build Coastguard Worker     size_buffers += (num_channel * 2 *
1281*15dc779aSAndroid Build Coastguard Worker                      IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_frame_info_data_struct) +
1282*15dc779aSAndroid Build Coastguard Worker                                                   MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8,
1283*15dc779aSAndroid Build Coastguard Worker                                               BYTE_ALIGN_8));
1284*15dc779aSAndroid Build Coastguard Worker     temp_size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_pvc_data_struct), BYTE_ALIGN_8);
1285*15dc779aSAndroid Build Coastguard Worker     temp_size += 2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8);
1286*15dc779aSAndroid Build Coastguard Worker     temp_size += 2 * IXHEAAC_GET_SIZE_ALIGNED(MAX_HBE_PERSISTENT_SIZE, BYTE_ALIGN_8);
1287*15dc779aSAndroid Build Coastguard Worker     temp_size +=
1288*15dc779aSAndroid Build Coastguard Worker         2 * 2 * IXHEAAC_GET_SIZE_ALIGNED(MAX_QMF_BUF_LEN * sizeof(FLOAT32 *), BYTE_ALIGN_8);
1289*15dc779aSAndroid Build Coastguard Worker     temp_size += 2 * 2 * MAX_QMF_BUF_LEN *
1290*15dc779aSAndroid Build Coastguard Worker                  IXHEAAC_GET_SIZE_ALIGNED(MAX_QMF_BUF_LEN * sizeof(FLOAT32), BYTE_ALIGN_8);
1291*15dc779aSAndroid Build Coastguard Worker     temp_size += 2 * 2 * MAX_ENV_COLS *
1292*15dc779aSAndroid Build Coastguard Worker                  IXHEAAC_GET_SIZE_ALIGNED(MAX_QMF_BUF_LEN * sizeof(WORD32), BYTE_ALIGN_8);
1293*15dc779aSAndroid Build Coastguard Worker     size_buffers += num_channel * temp_size;
1294*15dc779aSAndroid Build Coastguard Worker   }
1295*15dc779aSAndroid Build Coastguard Worker 
1296*15dc779aSAndroid Build Coastguard Worker   return (size_buffers);
1297*15dc779aSAndroid Build Coastguard Worker }
1298*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fill_aac_mem_tables(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)1299*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fill_aac_mem_tables(
1300*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
1301*15dc779aSAndroid Build Coastguard Worker   ia_mem_info_struct *p_mem_info_aac;
1302*15dc779aSAndroid Build Coastguard Worker 
1303*15dc779aSAndroid Build Coastguard Worker   WORD32 num_channels;
1304*15dc779aSAndroid Build Coastguard Worker   WORD32 channels;
1305*15dc779aSAndroid Build Coastguard Worker   WORD32 buffer_size;
1306*15dc779aSAndroid Build Coastguard Worker 
1307*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
1308*15dc779aSAndroid Build Coastguard Worker     num_channels = (p_obj_exhaacplus_dec->aac_config.ui_max_channels + 1);
1309*15dc779aSAndroid Build Coastguard Worker   } else
1310*15dc779aSAndroid Build Coastguard Worker 
1311*15dc779aSAndroid Build Coastguard Worker   {
1312*15dc779aSAndroid Build Coastguard Worker     num_channels = p_obj_exhaacplus_dec->aac_config.ui_max_channels;
1313*15dc779aSAndroid Build Coastguard Worker   }
1314*15dc779aSAndroid Build Coastguard Worker 
1315*15dc779aSAndroid Build Coastguard Worker   channels = num_channels;
1316*15dc779aSAndroid Build Coastguard Worker   buffer_size = ixheaacd_persistent_buffer_sizes(num_channels);
1317*15dc779aSAndroid Build Coastguard Worker 
1318*15dc779aSAndroid Build Coastguard Worker   {
1319*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac =
1320*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
1321*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size =
1322*15dc779aSAndroid Build Coastguard Worker         IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_state_struct), BYTE_ALIGN_8) +
1323*15dc779aSAndroid Build Coastguard Worker         channels *
1324*15dc779aSAndroid Build Coastguard Worker             IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ia_aac_persistent_struct), BYTE_ALIGN_8) +
1325*15dc779aSAndroid Build Coastguard Worker         buffer_size + channels * ixheaacd_getsize_sbr_persistent() + channels * 16 +
1326*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mps_persistent_buffer_sizes();
1327*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8);
1328*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size +=
1329*15dc779aSAndroid Build Coastguard Worker         IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_audio_specific_config_struct), BYTE_ALIGN_8);
1330*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size += IXHEAAC_GET_SIZE_ALIGNED(MAX_HEADER_BUF_SIZE, BYTE_ALIGN_8);
1331*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_alignment = 16;
1332*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_type = IA_MEMTYPE_PERSIST;
1333*15dc779aSAndroid Build Coastguard Worker   }
1334*15dc779aSAndroid Build Coastguard Worker 
1335*15dc779aSAndroid Build Coastguard Worker   {
1336*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac =
1337*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_SCRATCH_IDX];
1338*15dc779aSAndroid Build Coastguard Worker 
1339*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size = MAX_SCR_SIZE;
1340*15dc779aSAndroid Build Coastguard Worker 
1341*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_alignment = 8;
1342*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_type = IA_MEMTYPE_SCRATCH;
1343*15dc779aSAndroid Build Coastguard Worker   }
1344*15dc779aSAndroid Build Coastguard Worker   {
1345*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac =
1346*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_INPUT_IDX];
1347*15dc779aSAndroid Build Coastguard Worker 
1348*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size = IA_MAX_INP_BUFFER_SIZE;
1349*15dc779aSAndroid Build Coastguard Worker 
1350*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_alignment = 8;
1351*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_type = IA_MEMTYPE_INPUT;
1352*15dc779aSAndroid Build Coastguard Worker   }
1353*15dc779aSAndroid Build Coastguard Worker   {
1354*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac =
1355*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX];
1356*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_size = IA_ENHAACPLUS_DEC_OUT_BUF_SIZE;
1357*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_alignment = 8;
1358*15dc779aSAndroid Build Coastguard Worker     p_mem_info_aac->ui_type = IA_MEMTYPE_OUTPUT;
1359*15dc779aSAndroid Build Coastguard Worker   }
1360*15dc779aSAndroid Build Coastguard Worker   return;
1361*15dc779aSAndroid Build Coastguard Worker }
1362*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_table_api(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)1363*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_table_api(
1364*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
1365*15dc779aSAndroid Build Coastguard Worker     WORD32 i_idx, pVOID pv_value) {
1366*15dc779aSAndroid Build Coastguard Worker   ia_heaac_mps_state_struct *pstr_mps_state =
1367*15dc779aSAndroid Build Coastguard Worker       &p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle;
1368*15dc779aSAndroid Build Coastguard Worker   pUWORD32 pui_value = pv_value;
1369*15dc779aSAndroid Build Coastguard Worker   pUWORD32 *p_pui_value = pv_value;
1370*15dc779aSAndroid Build Coastguard Worker   SIZE_T ui_get_vals[5];
1371*15dc779aSAndroid Build Coastguard Worker 
1372*15dc779aSAndroid Build Coastguard Worker   pVOID *table_ptrs[8 + NUM_MPS_TABLES];
1373*15dc779aSAndroid Build Coastguard Worker   UWORD32 table_sizes[8 + NUM_MPS_TABLES] = {
1374*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_huffmann_tables),
1375*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_block_tables),
1376*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_imdct_tables),
1377*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_str_fft_n_transcendent_tables),
1378*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_dec_env_calc_tables),
1379*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_qmf_dec_tables),
1380*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_dec_env_extr_tables),
1381*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_aac_dec_ps_tables),
1382*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_qmf_tables),
1383*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_common_tables),
1384*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_hybrid_tables),
1385*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_m1_m2_tables),
1386*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_decorr_tables),
1387*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_tp_process_tables),
1388*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_mdct2qmf_table),
1389*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_tonality_tables),
1390*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_bitdec_tables),
1391*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_blind_tables),
1392*15dc779aSAndroid Build Coastguard Worker       sizeof(ixheaacd_mps_dec_mdct2qmf_tables),
1393*15dc779aSAndroid Build Coastguard Worker       sizeof(ia_mps_dec_mdct2qmf_cos_table_struct),
1394*15dc779aSAndroid Build Coastguard Worker       sizeof(ia_mps_dec_residual_aac_tables_struct)};
1395*15dc779aSAndroid Build Coastguard Worker   table_ptrs[0] =
1396*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&(p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables);
1397*15dc779aSAndroid Build Coastguard Worker   table_ptrs[1] =
1398*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&(p_obj_exhaacplus_dec->aac_tables.pstr_block_tables);
1399*15dc779aSAndroid Build Coastguard Worker   table_ptrs[2] =
1400*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&(p_obj_exhaacplus_dec->aac_tables.pstr_imdct_tables);
1401*15dc779aSAndroid Build Coastguard Worker   table_ptrs[3] = (pVOID *)&(p_obj_exhaacplus_dec->common_tables);
1402*15dc779aSAndroid Build Coastguard Worker   table_ptrs[4] =
1403*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.env_calc_tables_ptr;
1404*15dc779aSAndroid Build Coastguard Worker   table_ptrs[5] =
1405*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.qmf_dec_tables_ptr;
1406*15dc779aSAndroid Build Coastguard Worker   table_ptrs[6] =
1407*15dc779aSAndroid Build Coastguard Worker       (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.env_extr_tables_ptr;
1408*15dc779aSAndroid Build Coastguard Worker   table_ptrs[7] = (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.ps_tables_ptr;
1409*15dc779aSAndroid Build Coastguard Worker   table_ptrs[8] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
1410*15dc779aSAndroid Build Coastguard Worker   table_ptrs[9] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr);
1411*15dc779aSAndroid Build Coastguard Worker   table_ptrs[10] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.hybrid_table_ptr);
1412*15dc779aSAndroid Build Coastguard Worker   table_ptrs[11] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr);
1413*15dc779aSAndroid Build Coastguard Worker   table_ptrs[12] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.decor_table_ptr);
1414*15dc779aSAndroid Build Coastguard Worker   table_ptrs[13] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr);
1415*15dc779aSAndroid Build Coastguard Worker   table_ptrs[14] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmf_table_ptr);
1416*15dc779aSAndroid Build Coastguard Worker   table_ptrs[15] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr);
1417*15dc779aSAndroid Build Coastguard Worker   table_ptrs[16] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
1418*15dc779aSAndroid Build Coastguard Worker   table_ptrs[17] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.blind_table_ptr);
1419*15dc779aSAndroid Build Coastguard Worker   table_ptrs[18] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr);
1420*15dc779aSAndroid Build Coastguard Worker   table_ptrs[19] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_tab_ptr);
1421*15dc779aSAndroid Build Coastguard Worker   table_ptrs[20] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.aac_tab);
1422*15dc779aSAndroid Build Coastguard Worker 
1423*15dc779aSAndroid Build Coastguard Worker   if (i_idx < 0 || i_idx >= (NUM_AAC_TABLES + NUM_MPS_TABLES)) {
1424*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
1425*15dc779aSAndroid Build Coastguard Worker   }
1426*15dc779aSAndroid Build Coastguard Worker 
1427*15dc779aSAndroid Build Coastguard Worker   ui_get_vals[0] = table_sizes[i_idx];
1428*15dc779aSAndroid Build Coastguard Worker   ui_get_vals[1] = 4;
1429*15dc779aSAndroid Build Coastguard Worker   ui_get_vals[4] = (SIZE_T)(*table_ptrs[i_idx]);
1430*15dc779aSAndroid Build Coastguard Worker 
1431*15dc779aSAndroid Build Coastguard Worker   if (i_cmd == IA_API_CMD_SET_TABLE_PTR) {
1432*15dc779aSAndroid Build Coastguard Worker     if (pv_value == 0) {
1433*15dc779aSAndroid Build Coastguard Worker       return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
1434*15dc779aSAndroid Build Coastguard Worker     }
1435*15dc779aSAndroid Build Coastguard Worker     if (((SIZE_T)pv_value) & 3) {
1436*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN;
1437*15dc779aSAndroid Build Coastguard Worker     }
1438*15dc779aSAndroid Build Coastguard Worker 
1439*15dc779aSAndroid Build Coastguard Worker     *table_ptrs[i_idx] = pv_value;
1440*15dc779aSAndroid Build Coastguard Worker 
1441*15dc779aSAndroid Build Coastguard Worker     if (i_idx == 0) {
1442*15dc779aSAndroid Build Coastguard Worker       ixheaacd_huff_tables_create(&p_obj_exhaacplus_dec->aac_tables);
1443*15dc779aSAndroid Build Coastguard Worker     }
1444*15dc779aSAndroid Build Coastguard Worker 
1445*15dc779aSAndroid Build Coastguard Worker   }
1446*15dc779aSAndroid Build Coastguard Worker 
1447*15dc779aSAndroid Build Coastguard Worker   else if (i_cmd == IA_API_CMD_GET_TABLE_PTR) {
1448*15dc779aSAndroid Build Coastguard Worker     *p_pui_value = (UWORD32 *)((SIZE_T)(
1449*15dc779aSAndroid Build Coastguard Worker         ui_get_vals[i_cmd - IA_API_CMD_GET_TABLE_INFO_SIZE]));
1450*15dc779aSAndroid Build Coastguard Worker   } else {
1451*15dc779aSAndroid Build Coastguard Worker     *pui_value = (WORD32)(ui_get_vals[i_cmd - IA_API_CMD_GET_TABLE_INFO_SIZE]);
1452*15dc779aSAndroid Build Coastguard Worker   }
1453*15dc779aSAndroid Build Coastguard Worker 
1454*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1455*15dc779aSAndroid Build Coastguard Worker }
1456*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_payload(ia_handle_sbr_dec_inst_struct self,ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)1457*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_payload(ia_handle_sbr_dec_inst_struct self,
1458*15dc779aSAndroid Build Coastguard Worker                           ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
1459*15dc779aSAndroid Build Coastguard Worker   struct ia_bit_buf_struct local_bit_buff;
1460*15dc779aSAndroid Build Coastguard Worker   struct ia_bit_buf_struct *it_bit_buff;
1461*15dc779aSAndroid Build Coastguard Worker   if (self->ptr_mps_data != NULL) {
1462*15dc779aSAndroid Build Coastguard Worker     ixheaacd_create_init_bit_buf(&local_bit_buff, (UWORD8 *)self->ptr_mps_data,
1463*15dc779aSAndroid Build Coastguard Worker                                  (self->left_mps_bits >> 3) + 1);
1464*15dc779aSAndroid Build Coastguard Worker   }
1465*15dc779aSAndroid Build Coastguard Worker 
1466*15dc779aSAndroid Build Coastguard Worker   local_bit_buff.xaac_jmp_buf =
1467*15dc779aSAndroid Build Coastguard Worker       &p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf;
1468*15dc779aSAndroid Build Coastguard Worker 
1469*15dc779aSAndroid Build Coastguard Worker   it_bit_buff = &local_bit_buff;
1470*15dc779aSAndroid Build Coastguard Worker 
1471*15dc779aSAndroid Build Coastguard Worker   it_bit_buff->bit_pos = self->mps_bits_pos;
1472*15dc779aSAndroid Build Coastguard Worker   it_bit_buff->cnt_bits = self->left_mps_bits;
1473*15dc779aSAndroid Build Coastguard Worker 
1474*15dc779aSAndroid Build Coastguard Worker   while (self->left_mps_bits >= 8) {
1475*15dc779aSAndroid Build Coastguard Worker     ixheaacd_extension_payload(
1476*15dc779aSAndroid Build Coastguard Worker         it_bit_buff, &self->left_mps_bits,
1477*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
1478*15dc779aSAndroid Build Coastguard Worker   }
1479*15dc779aSAndroid Build Coastguard Worker }
1480*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_init(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)1481*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_init(
1482*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
1483*15dc779aSAndroid Build Coastguard Worker   FLAG frame_status = 1;
1484*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_size_1;
1485*15dc779aSAndroid Build Coastguard Worker   WORD32 sample_rate_1;
1486*15dc779aSAndroid Build Coastguard Worker   WORD16 num_channels_1;
1487*15dc779aSAndroid Build Coastguard Worker   WORD32 ps_detected = 0;
1488*15dc779aSAndroid Build Coastguard Worker   UWORD8 *in_buffer;
1489*15dc779aSAndroid Build Coastguard Worker   WORD16 *time_data;
1490*15dc779aSAndroid Build Coastguard Worker   WORD ch_idx;
1491*15dc779aSAndroid Build Coastguard Worker   WORD sbr_present_flag = 0;
1492*15dc779aSAndroid Build Coastguard Worker   UWORD8 *mps_buffer;
1493*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
1494*15dc779aSAndroid Build Coastguard Worker 
1495*15dc779aSAndroid Build Coastguard Worker   WORD32 error_code = IA_NO_ERROR;
1496*15dc779aSAndroid Build Coastguard Worker   WORD32 persistent_used = 0;
1497*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1498*15dc779aSAndroid Build Coastguard Worker   struct ia_aac_persistent_struct *aac_persistent_mem;
1499*15dc779aSAndroid Build Coastguard Worker   struct ia_sbr_pers_struct *sbr_persistent_mem;
1500*15dc779aSAndroid Build Coastguard Worker   WORD32 ret_val;
1501*15dc779aSAndroid Build Coastguard Worker 
1502*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac =
1503*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
1504*15dc779aSAndroid Build Coastguard Worker 
1505*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac->ui_init_done)
1506*15dc779aSAndroid Build Coastguard Worker   {
1507*15dc779aSAndroid Build Coastguard Worker     return IA_NO_ERROR;
1508*15dc779aSAndroid Build Coastguard Worker   }
1509*15dc779aSAndroid Build Coastguard Worker 
1510*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac->preroll_config_present = 0;
1511*15dc779aSAndroid Build Coastguard Worker 
1512*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
1513*15dc779aSAndroid Build Coastguard Worker     ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf);
1514*15dc779aSAndroid Build Coastguard Worker     if (ret_val != 0) {
1515*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
1516*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
1517*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
1518*15dc779aSAndroid Build Coastguard Worker       return IA_NO_ERROR;
1519*15dc779aSAndroid Build Coastguard Worker     }
1520*15dc779aSAndroid Build Coastguard Worker   }
1521*15dc779aSAndroid Build Coastguard Worker 
1522*15dc779aSAndroid Build Coastguard Worker   time_data = (WORD16 *)(p_obj_exhaacplus_dec
1523*15dc779aSAndroid Build Coastguard Worker                              ->pp_mem_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX]);
1524*15dc779aSAndroid Build Coastguard Worker 
1525*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
1526*15dc779aSAndroid Build Coastguard Worker     in_buffer = p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_INPUT_IDX];
1527*15dc779aSAndroid Build Coastguard Worker   } else {
1528*15dc779aSAndroid Build Coastguard Worker     in_buffer = p_obj_exhaacplus_dec->p_state_aac->header_ptr;
1529*15dc779aSAndroid Build Coastguard Worker   }
1530*15dc779aSAndroid Build Coastguard Worker 
1531*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
1532*15dc779aSAndroid Build Coastguard Worker 
1533*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->aac_scratch_mem_v =
1534*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_SCRATCH_IDX];
1535*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac->huffman_code_book_scl =
1536*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
1537*15dc779aSAndroid Build Coastguard Worker           ->huffman_code_book_scl;
1538*15dc779aSAndroid Build Coastguard Worker   mps_buffer = p_obj_exhaacplus_dec->p_state_aac->mps_buffer;
1539*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->mps_header = -1;
1540*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac->huffman_code_book_scl_index =
1541*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
1542*15dc779aSAndroid Build Coastguard Worker           ->huffman_code_book_scl_index;
1543*15dc779aSAndroid Build Coastguard Worker 
1544*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->pstr_aac_tables = &p_obj_exhaacplus_dec->aac_tables;
1545*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done == 0)
1546*15dc779aSAndroid Build Coastguard Worker   {
1547*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.header_dec_done = 0;
1548*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.ldmps_present_flag = 0;
1549*15dc779aSAndroid Build Coastguard Worker   }
1550*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.header_dec_done == 0) {
1551*15dc779aSAndroid Build Coastguard Worker     WORD32 channels;
1552*15dc779aSAndroid Build Coastguard Worker     UWORD32 total_persistent_used = 0;
1553*15dc779aSAndroid Build Coastguard Worker 
1554*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->p_config =
1555*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->aac_config;
1556*15dc779aSAndroid Build Coastguard Worker 
1557*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->pstr_stream_sbr =
1558*15dc779aSAndroid Build Coastguard Worker         (pVOID)((pWORD8)p_obj_exhaacplus_dec->p_state_aac +
1559*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_state_struct), BYTE_ALIGN_8));
1560*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
1561*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->aac_persistent_mem_v =
1562*15dc779aSAndroid Build Coastguard Worker           (pVOID)((pWORD8)p_obj_exhaacplus_dec->p_state_aac->pstr_stream_sbr +
1563*15dc779aSAndroid Build Coastguard Worker                   (MAX_BS_ELEMENT)*2 *
1564*15dc779aSAndroid Build Coastguard Worker                       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_sbr_bitstream_struct),
1565*15dc779aSAndroid Build Coastguard Worker                                                BYTE_ALIGN_8));
1566*15dc779aSAndroid Build Coastguard Worker 
1567*15dc779aSAndroid Build Coastguard Worker       memset(p_obj_exhaacplus_dec->p_state_aac->pstr_stream_sbr, 0,
1568*15dc779aSAndroid Build Coastguard Worker              (MAX_BS_ELEMENT)*2 *
1569*15dc779aSAndroid Build Coastguard Worker                  IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_sbr_bitstream_struct), BYTE_ALIGN_8));
1570*15dc779aSAndroid Build Coastguard Worker     } else {
1571*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->aac_persistent_mem_v =
1572*15dc779aSAndroid Build Coastguard Worker           (pVOID)((pWORD8)p_obj_exhaacplus_dec->p_state_aac->pstr_stream_sbr +
1573*15dc779aSAndroid Build Coastguard Worker                   (2) * 2 *
1574*15dc779aSAndroid Build Coastguard Worker                       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_sbr_bitstream_struct),
1575*15dc779aSAndroid Build Coastguard Worker                                                BYTE_ALIGN_8));
1576*15dc779aSAndroid Build Coastguard Worker 
1577*15dc779aSAndroid Build Coastguard Worker       memset(p_obj_exhaacplus_dec->p_state_aac->pstr_stream_sbr, 0,
1578*15dc779aSAndroid Build Coastguard Worker              (2) * 2 *
1579*15dc779aSAndroid Build Coastguard Worker                  IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_sbr_bitstream_struct), BYTE_ALIGN_8));
1580*15dc779aSAndroid Build Coastguard Worker     }
1581*15dc779aSAndroid Build Coastguard Worker     if (1 == p_obj_exhaacplus_dec->aac_config.ui_max_channels)
1582*15dc779aSAndroid Build Coastguard Worker       channels = 1;
1583*15dc779aSAndroid Build Coastguard Worker     else
1584*15dc779aSAndroid Build Coastguard Worker       channels = 2;
1585*15dc779aSAndroid Build Coastguard Worker 
1586*15dc779aSAndroid Build Coastguard Worker     persistent_used = ixheaacd_set_aac_persistent_buffers(
1587*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->aac_persistent_mem_v, channels);
1588*15dc779aSAndroid Build Coastguard Worker 
1589*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->sbr_persistent_mem_v =
1590*15dc779aSAndroid Build Coastguard Worker         (pVOID)((pWORD8)p_state_enhaacplus_dec->aac_persistent_mem_v +
1591*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(persistent_used, BYTE_ALIGN_8));
1592*15dc779aSAndroid Build Coastguard Worker     total_persistent_used += IXHEAAC_GET_SIZE_ALIGNED(persistent_used, BYTE_ALIGN_8);
1593*15dc779aSAndroid Build Coastguard Worker 
1594*15dc779aSAndroid Build Coastguard Worker     persistent_used = ixheaacd_getsize_sbr_persistent();
1595*15dc779aSAndroid Build Coastguard Worker     ixheaacd_set_sbr_persistent_buffers(
1596*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->sbr_persistent_mem_v, &persistent_used,
1597*15dc779aSAndroid Build Coastguard Worker         channels, 1);
1598*15dc779aSAndroid Build Coastguard Worker 
1599*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->heaac_mps_handle.mps_persistent_mem_v =
1600*15dc779aSAndroid Build Coastguard Worker         (pVOID)((pWORD8)p_state_enhaacplus_dec->sbr_persistent_mem_v +
1601*15dc779aSAndroid Build Coastguard Worker                 IXHEAAC_GET_SIZE_ALIGNED(persistent_used, BYTE_ALIGN_8));
1602*15dc779aSAndroid Build Coastguard Worker     total_persistent_used += IXHEAAC_GET_SIZE_ALIGNED(persistent_used, BYTE_ALIGN_8);
1603*15dc779aSAndroid Build Coastguard Worker 
1604*15dc779aSAndroid Build Coastguard Worker     persistent_used = ixheaacd_getsize_mps_persistent();
1605*15dc779aSAndroid Build Coastguard Worker 
1606*15dc779aSAndroid Build Coastguard Worker     ixheaacd_set_mps_persistent_buffers(
1607*15dc779aSAndroid Build Coastguard Worker         &p_state_enhaacplus_dec->heaac_mps_handle, &persistent_used, channels,
1608*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->heaac_mps_handle.mps_persistent_mem_v);
1609*15dc779aSAndroid Build Coastguard Worker     total_persistent_used += IXHEAAC_GET_SIZE_ALIGNED(persistent_used, BYTE_ALIGN_8);
1610*15dc779aSAndroid Build Coastguard Worker 
1611*15dc779aSAndroid Build Coastguard Worker     if (total_persistent_used >
1612*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX].ui_size) {
1613*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
1614*15dc779aSAndroid Build Coastguard Worker     }
1615*15dc779aSAndroid Build Coastguard Worker 
1616*15dc779aSAndroid Build Coastguard Worker     aac_persistent_mem = (struct ia_aac_persistent_struct *)
1617*15dc779aSAndroid Build Coastguard Worker                              p_state_enhaacplus_dec->aac_persistent_mem_v;
1618*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
1619*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
1620*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_len_flag =
1621*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.framesize_480;
1622*15dc779aSAndroid Build Coastguard Worker 
1623*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ptr_overlap_buf =
1624*15dc779aSAndroid Build Coastguard Worker         aac_persistent_mem->overlap_buffer;
1625*15dc779aSAndroid Build Coastguard Worker 
1626*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->bit_count = 0;
1627*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ec_enable = p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
1628*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->sync_status = 0;
1629*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->bs_format = ADTS_BSFORMAT;
1630*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->latm_initialized = 0;
1631*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->frame_size = 0;
1632*15dc779aSAndroid Build Coastguard Worker     memset(&p_state_enhaacplus_dec->latm_struct_element, 0,
1633*15dc779aSAndroid Build Coastguard Worker            sizeof(ixheaacd_latm_struct));
1634*15dc779aSAndroid Build Coastguard Worker     memset(&p_state_enhaacplus_dec->b_n_raw_data_blk, 0,
1635*15dc779aSAndroid Build Coastguard Worker            sizeof(WORD32) * (9 + MAX_BS_ELEMENT));
1636*15dc779aSAndroid Build Coastguard Worker 
1637*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->sbr_present_flag = 0;
1638*15dc779aSAndroid Build Coastguard Worker 
1639*15dc779aSAndroid Build Coastguard Worker     for (ch_idx = 0; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
1640*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
1641*15dc779aSAndroid Build Coastguard Worker     }
1642*15dc779aSAndroid Build Coastguard Worker 
1643*15dc779aSAndroid Build Coastguard Worker     memset(&p_state_enhaacplus_dec->ind_cc_info, 0,
1644*15dc779aSAndroid Build Coastguard Worker            sizeof(ia_enhaacplus_dec_ind_cc));
1645*15dc779aSAndroid Build Coastguard Worker 
1646*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->last_frame_ok = 1;
1647*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.header_dec_done = 1;
1648*15dc779aSAndroid Build Coastguard Worker 
1649*15dc779aSAndroid Build Coastguard Worker     aac_persistent_mem->str_aac_decoder.pstr_aac_tables =
1650*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->aac_tables;
1651*15dc779aSAndroid Build Coastguard Worker     aac_persistent_mem->str_aac_decoder.pstr_common_tables =
1652*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->common_tables;
1653*15dc779aSAndroid Build Coastguard Worker 
1654*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->sbr_persistent_mem_u =
1655*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->sbr_persistent_mem_v;
1656*15dc779aSAndroid Build Coastguard Worker 
1657*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->sbr_scratch_mem_u =
1658*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->aac_scratch_mem_v;
1659*15dc779aSAndroid Build Coastguard Worker 
1660*15dc779aSAndroid Build Coastguard Worker     ixheaacd_set_sbr_persistent_table_pointer(
1661*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->sbr_persistent_mem_v,
1662*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->str_sbr_tables,
1663*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->common_tables);
1664*15dc779aSAndroid Build Coastguard Worker     ixheaacd_set_scratch_buffers(
1665*15dc779aSAndroid Build Coastguard Worker         &p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle,
1666*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->aac_scratch_mem_v);
1667*15dc779aSAndroid Build Coastguard Worker   }
1668*15dc779aSAndroid Build Coastguard Worker 
1669*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 1) {
1670*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
1671*15dc779aSAndroid Build Coastguard Worker   }
1672*15dc779aSAndroid Build Coastguard Worker 
1673*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done == 0) {
1674*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
1675*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
1676*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_len_flag =
1677*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.framesize_480;
1678*15dc779aSAndroid Build Coastguard Worker 
1679*15dc779aSAndroid Build Coastguard Worker     aac_persistent_mem = (struct ia_aac_persistent_struct *)
1680*15dc779aSAndroid Build Coastguard Worker                              p_state_enhaacplus_dec->aac_persistent_mem_v;
1681*15dc779aSAndroid Build Coastguard Worker     sbr_persistent_mem = (struct ia_sbr_pers_struct *)
1682*15dc779aSAndroid Build Coastguard Worker                              p_state_enhaacplus_dec->sbr_persistent_mem_v;
1683*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
1684*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->first_frame = 1;
1685*15dc779aSAndroid Build Coastguard Worker     }
1686*15dc779aSAndroid Build Coastguard Worker 
1687*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_samp_freq == 0) {
1688*15dc779aSAndroid Build Coastguard Worker       WORD32 header_bytes_consumed, return_val;
1689*15dc779aSAndroid Build Coastguard Worker 
1690*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
1691*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = 0;
1692*15dc779aSAndroid Build Coastguard Worker         return IA_NO_ERROR;
1693*15dc779aSAndroid Build Coastguard Worker       }
1694*15dc779aSAndroid Build Coastguard Worker 
1695*15dc779aSAndroid Build Coastguard Worker       if (1 == p_obj_exhaacplus_dec->aac_config.ui_frame_size) {
1696*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_len_flag = 1;
1697*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_length = 960;
1698*15dc779aSAndroid Build Coastguard Worker       } else {
1699*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_len_flag = 0;
1700*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_length = 1024;
1701*15dc779aSAndroid Build Coastguard Worker       }
1702*15dc779aSAndroid Build Coastguard Worker 
1703*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->ui_init_done = 0;
1704*15dc779aSAndroid Build Coastguard Worker       memset(&(p_state_enhaacplus_dec->eld_specific_config), 0,
1705*15dc779aSAndroid Build Coastguard Worker              sizeof(ia_eld_specific_config_struct));
1706*15dc779aSAndroid Build Coastguard Worker       return_val = ixheaacd_aac_headerdecode(
1707*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec, (UWORD8 *)in_buffer, &header_bytes_consumed,
1708*15dc779aSAndroid Build Coastguard Worker           aac_persistent_mem->str_aac_decoder.pstr_aac_tables
1709*15dc779aSAndroid Build Coastguard Worker               ->pstr_huffmann_tables);
1710*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
1711*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
1712*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
1713*15dc779aSAndroid Build Coastguard Worker         *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[0] =
1714*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->str_sbr_config;
1715*15dc779aSAndroid Build Coastguard Worker         *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[1] =
1716*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->str_sbr_config;
1717*15dc779aSAndroid Build Coastguard Worker       } else {
1718*15dc779aSAndroid Build Coastguard Worker         memset(&(p_state_enhaacplus_dec->eld_specific_config), 0,
1719*15dc779aSAndroid Build Coastguard Worker                sizeof(ia_eld_specific_config_struct));
1720*15dc779aSAndroid Build Coastguard Worker       }
1721*15dc779aSAndroid Build Coastguard Worker 
1722*15dc779aSAndroid Build Coastguard Worker       if (return_val < 0) {
1723*15dc779aSAndroid Build Coastguard Worker         if (return_val ==
1724*15dc779aSAndroid Build Coastguard Worker             (WORD32)IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX) {
1725*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = header_bytes_consumed;
1726*15dc779aSAndroid Build Coastguard Worker           return return_val;
1727*15dc779aSAndroid Build Coastguard Worker         }
1728*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = 1;
1729*15dc779aSAndroid Build Coastguard Worker 
1730*15dc779aSAndroid Build Coastguard Worker         return return_val;
1731*15dc779aSAndroid Build Coastguard Worker       }
1732*15dc779aSAndroid Build Coastguard Worker 
1733*15dc779aSAndroid Build Coastguard Worker       if (return_val ==
1734*15dc779aSAndroid Build Coastguard Worker           IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) {
1735*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = header_bytes_consumed;
1736*15dc779aSAndroid Build Coastguard Worker         return return_val;
1737*15dc779aSAndroid Build Coastguard Worker       }
1738*15dc779aSAndroid Build Coastguard Worker 
1739*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = header_bytes_consumed;
1740*15dc779aSAndroid Build Coastguard Worker 
1741*15dc779aSAndroid Build Coastguard Worker       if ((return_val == 0) &&
1742*15dc779aSAndroid Build Coastguard Worker           (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_USAC)) {
1743*15dc779aSAndroid Build Coastguard Worker         {
1744*15dc779aSAndroid Build Coastguard Worker           WORD32 pcm_size = p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz;
1745*15dc779aSAndroid Build Coastguard Worker           WORD8 *inbuffer =
1746*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_INPUT_IDX];
1747*15dc779aSAndroid Build Coastguard Worker           WORD8 *outbuffer =
1748*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX];
1749*15dc779aSAndroid Build Coastguard Worker           WORD32 out_bytes = 0;
1750*15dc779aSAndroid Build Coastguard Worker           WORD32 frames_done = p_obj_exhaacplus_dec->p_state_aac->frame_counter;
1751*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->decode_create_done = 0;
1752*15dc779aSAndroid Build Coastguard Worker 
1753*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 0) {
1754*15dc779aSAndroid Build Coastguard Worker             error_code = ixheaacd_dec_main(
1755*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec, inbuffer, outbuffer, &out_bytes,
1756*15dc779aSAndroid Build Coastguard Worker                 frames_done, pcm_size,
1757*15dc779aSAndroid Build Coastguard Worker                 &p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch);
1758*15dc779aSAndroid Build Coastguard Worker             if (error_code) return error_code;
1759*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->frame_counter++;
1760*15dc779aSAndroid Build Coastguard Worker           } else {
1761*15dc779aSAndroid Build Coastguard Worker             out_bytes = 0;
1762*15dc779aSAndroid Build Coastguard Worker           }
1763*15dc779aSAndroid Build Coastguard Worker 
1764*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_n_channels =
1765*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch;
1766*15dc779aSAndroid Build Coastguard Worker         }
1767*15dc779aSAndroid Build Coastguard Worker         if (return_val == 0)
1768*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->ui_init_done = 1;
1769*15dc779aSAndroid Build Coastguard Worker         return return_val;
1770*15dc779aSAndroid Build Coastguard Worker       }
1771*15dc779aSAndroid Build Coastguard Worker 
1772*15dc779aSAndroid Build Coastguard Worker       if (return_val == 0) {
1773*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->header_dec_done = 1;
1774*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
1775*15dc779aSAndroid Build Coastguard Worker           memcpy(p_state_enhaacplus_dec->header_ptr, in_buffer,
1776*15dc779aSAndroid Build Coastguard Worker                  header_bytes_consumed * sizeof(UWORD8));
1777*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->header_length = header_bytes_consumed;
1778*15dc779aSAndroid Build Coastguard Worker         }
1779*15dc779aSAndroid Build Coastguard Worker       }
1780*15dc779aSAndroid Build Coastguard Worker 
1781*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done != 1)
1782*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
1783*15dc779aSAndroid Build Coastguard Worker 
1784*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->dwnsmp_signal == 1 &&
1785*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
1786*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.down_sample_flag = 1;
1787*15dc779aSAndroid Build Coastguard Worker 
1788*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->sampling_rate ==
1789*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->extension_samp_rate) {
1790*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.down_sample_flag = 1;
1791*15dc779aSAndroid Build Coastguard Worker       }
1792*15dc779aSAndroid Build Coastguard Worker 
1793*15dc779aSAndroid Build Coastguard Worker     } else {
1794*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->header_dec_done = 1;
1795*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = 0;
1796*15dc779aSAndroid Build Coastguard Worker 
1797*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->sampling_rate =
1798*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_samp_freq;
1799*15dc779aSAndroid Build Coastguard Worker 
1800*15dc779aSAndroid Build Coastguard Worker       if (1 == p_obj_exhaacplus_dec->aac_config.ui_frame_size) {
1801*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_len_flag = 1;
1802*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_length = 960;
1803*15dc779aSAndroid Build Coastguard Worker       } else {
1804*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_len_flag = 0;
1805*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_length = 1024;
1806*15dc779aSAndroid Build Coastguard Worker       }
1807*15dc779aSAndroid Build Coastguard Worker     }
1808*15dc779aSAndroid Build Coastguard Worker 
1809*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_bit_buf = ixheaacd_create_bit_buf(
1810*15dc779aSAndroid Build Coastguard Worker         &p_state_enhaacplus_dec->str_bit_buf, (UWORD8 *)in_buffer,
1811*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_INPUT_IDX]
1812*15dc779aSAndroid Build Coastguard Worker             .ui_size);
1813*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_bit_buf->xaac_jmp_buf =
1814*15dc779aSAndroid Build Coastguard Worker         &(p_state_enhaacplus_dec->xaac_jmp_buf);
1815*15dc779aSAndroid Build Coastguard Worker 
1816*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ptr_bit_stream =
1817*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_bit_buf;
1818*15dc779aSAndroid Build Coastguard Worker 
1819*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->s_adts_hdr_present) {
1820*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.ld_decoder == 1)
1821*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->audio_object_type = 23;
1822*15dc779aSAndroid Build Coastguard Worker     }
1823*15dc779aSAndroid Build Coastguard Worker 
1824*15dc779aSAndroid Build Coastguard Worker     if ((p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) ||
1825*15dc779aSAndroid Build Coastguard Worker         (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD))
1826*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->s_adts_hdr_present) {
1827*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) {
1828*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->eld_specific_config.ld_sbr_samp_rate = 1;
1829*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->eld_specific_config.ld_sbr_crc_flag = 0;
1830*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present = 0;
1831*15dc779aSAndroid Build Coastguard Worker 
1832*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.eld_sbr_present == 1) {
1833*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present = 1;
1834*15dc779aSAndroid Build Coastguard Worker           }
1835*15dc779aSAndroid Build Coastguard Worker         }
1836*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.framesize_480)
1837*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->frame_length = 480;
1838*15dc779aSAndroid Build Coastguard Worker         else
1839*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->frame_length = 512;
1840*15dc779aSAndroid Build Coastguard Worker       }
1841*15dc779aSAndroid Build Coastguard Worker 
1842*15dc779aSAndroid Build Coastguard Worker     {
1843*15dc779aSAndroid Build Coastguard Worker       for (ch_idx = 0; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
1844*15dc779aSAndroid Build Coastguard Worker         WORD32 channels;
1845*15dc779aSAndroid Build Coastguard Worker         channels = 2;
1846*15dc779aSAndroid Build Coastguard Worker 
1847*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx] =
1848*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_decoder_init(
1849*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec,
1850*15dc779aSAndroid Build Coastguard Worker 
1851*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->pstr_stream_sbr[0], channels,
1852*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->aac_persistent_mem_v,
1853*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->frame_length);
1854*15dc779aSAndroid Build Coastguard Worker 
1855*15dc779aSAndroid Build Coastguard Worker         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
1856*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 1;
1857*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
1858*15dc779aSAndroid Build Coastguard Worker         }
1859*15dc779aSAndroid Build Coastguard Worker       }
1860*15dc779aSAndroid Build Coastguard Worker 
1861*15dc779aSAndroid Build Coastguard Worker       {
1862*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_drc_dec =
1863*15dc779aSAndroid Build Coastguard Worker             &p_state_enhaacplus_dec->str_drc_dec_info;
1864*15dc779aSAndroid Build Coastguard Worker         ixheaacd_drc_dec_create(p_state_enhaacplus_dec->pstr_drc_dec, 127, 127);
1865*15dc779aSAndroid Build Coastguard Worker       }
1866*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_drc_dec->cut_factor =
1867*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_cut;
1868*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_drc_dec->boost_factor =
1869*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_boost;
1870*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_drc_dec->target_ref_level =
1871*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level;
1872*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_drc_dec->prog_ref_level =
1873*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level;
1874*15dc779aSAndroid Build Coastguard Worker 
1875*15dc779aSAndroid Build Coastguard Worker       if (1 == p_obj_exhaacplus_dec->aac_config.ui_drc_set) {
1876*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_drc_heavy_comp == 1) {
1877*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_drc_dec->drc_on = 1;
1878*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_drc_dec->heavy_mode = 1;
1879*15dc779aSAndroid Build Coastguard Worker         } else {
1880*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_drc_dec->heavy_mode = 0;
1881*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->pstr_drc_dec->target_ref_level > 127)
1882*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_drc_dec->target_ref_level = 127;
1883*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->pstr_drc_dec->target_ref_level < 0) {
1884*15dc779aSAndroid Build Coastguard Worker             if (p_state_enhaacplus_dec->pstr_drc_dec->cut_factor > 0 ||
1885*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->pstr_drc_dec->boost_factor > 0)
1886*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->pstr_drc_dec->drc_on = 1;
1887*15dc779aSAndroid Build Coastguard Worker             else
1888*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->pstr_drc_dec->drc_on = 0;
1889*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_drc_dec->drc_dig_norm = 0;
1890*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_drc_dec->target_ref_level = 108;
1891*15dc779aSAndroid Build Coastguard Worker           } else {
1892*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_drc_dec->drc_on = 1;
1893*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_drc_dec->drc_dig_norm = 1;
1894*15dc779aSAndroid Build Coastguard Worker           }
1895*15dc779aSAndroid Build Coastguard Worker         }
1896*15dc779aSAndroid Build Coastguard Worker       }
1897*15dc779aSAndroid Build Coastguard Worker     }
1898*15dc779aSAndroid Build Coastguard Worker   } else {
1899*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct temp_bit_buff = {0};
1900*15dc779aSAndroid Build Coastguard Worker     ia_adts_header_struct adts;
1901*15dc779aSAndroid Build Coastguard Worker     struct ia_bit_buf_struct *it_bit_buff;
1902*15dc779aSAndroid Build Coastguard Worker 
1903*15dc779aSAndroid Build Coastguard Worker     WORD16 frame_size_2 = 0;
1904*15dc779aSAndroid Build Coastguard Worker     WORD32 sample_rate_2 = 0;
1905*15dc779aSAndroid Build Coastguard Worker     WORD32 sample_rate = 0;
1906*15dc779aSAndroid Build Coastguard Worker     WORD type, i;
1907*15dc779aSAndroid Build Coastguard Worker     WORD elements_number;
1908*15dc779aSAndroid Build Coastguard Worker 
1909*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->audio_object_type == AOT_USAC)
1910*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
1911*15dc779aSAndroid Build Coastguard Worker 
1912*15dc779aSAndroid Build Coastguard Worker     memset(&adts, 0, sizeof(ia_adts_header_struct));
1913*15dc779aSAndroid Build Coastguard Worker 
1914*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < MAX_BS_ELEMENT + 1; i++) {
1915*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.element_type[i] = -1;
1916*15dc779aSAndroid Build Coastguard Worker     }
1917*15dc779aSAndroid Build Coastguard Worker 
1918*15dc779aSAndroid Build Coastguard Worker     it_bit_buff = p_state_enhaacplus_dec->pstr_bit_buf;
1919*15dc779aSAndroid Build Coastguard Worker 
1920*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
1921*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
1922*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
1923*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
1924*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = 0;
1925*15dc779aSAndroid Build Coastguard Worker       return IA_NO_ERROR;
1926*15dc779aSAndroid Build Coastguard Worker     }
1927*15dc779aSAndroid Build Coastguard Worker 
1928*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
1929*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) {
1930*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag)
1931*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->frame_size =
1932*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->ui_in_bytes;
1933*15dc779aSAndroid Build Coastguard Worker     }
1934*15dc779aSAndroid Build Coastguard Worker 
1935*15dc779aSAndroid Build Coastguard Worker     ixheaacd_create_init_bit_buf(it_bit_buff, in_buffer,
1936*15dc779aSAndroid Build Coastguard Worker                                  p_state_enhaacplus_dec->ui_in_bytes);
1937*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_bit_buf->xaac_jmp_buf =
1938*15dc779aSAndroid Build Coastguard Worker         &(p_state_enhaacplus_dec->xaac_jmp_buf);
1939*15dc779aSAndroid Build Coastguard Worker 
1940*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->adts_header_present =
1941*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->s_adts_hdr_present;
1942*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->no_raw_data_blocks =
1943*15dc779aSAndroid Build Coastguard Worker         (WORD8)p_state_enhaacplus_dec->b_n_raw_data_blk;
1944*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->protection_absent = p_state_enhaacplus_dec->protection_absent;
1945*15dc779aSAndroid Build Coastguard Worker 
1946*15dc779aSAndroid Build Coastguard Worker     memcpy(&temp_bit_buff, it_bit_buff, sizeof(struct ia_bit_buf_struct));
1947*15dc779aSAndroid Build Coastguard Worker 
1948*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2)
1949*15dc779aSAndroid Build Coastguard Worker       elements_number = MAX_BS_ELEMENT;
1950*15dc779aSAndroid Build Coastguard Worker     else
1951*15dc779aSAndroid Build Coastguard Worker       elements_number = 2;
1952*15dc779aSAndroid Build Coastguard Worker 
1953*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < elements_number; i++)
1954*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_stream_sbr[i][0].no_elements = 0;
1955*15dc779aSAndroid Build Coastguard Worker 
1956*15dc779aSAndroid Build Coastguard Worker     { it_bit_buff->initial_cnt_bits = it_bit_buff->cnt_bits; }
1957*15dc779aSAndroid Build Coastguard Worker 
1958*15dc779aSAndroid Build Coastguard Worker     ixheaacd_byte_align(
1959*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ptr_bit_stream,
1960*15dc779aSAndroid Build Coastguard Worker         &p_state_enhaacplus_dec->pstr_aac_dec_info[0]->byte_align_bits);
1961*15dc779aSAndroid Build Coastguard Worker 
1962*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->s_adts_hdr_present) {
1963*15dc779aSAndroid Build Coastguard Worker       WORD32 error;
1964*15dc779aSAndroid Build Coastguard Worker 
1965*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->b_n_raw_data_blk == 0) {
1966*15dc779aSAndroid Build Coastguard Worker         error = ixheaacd_readifadts(p_state_enhaacplus_dec, it_bit_buff, &adts);
1967*15dc779aSAndroid Build Coastguard Worker 
1968*15dc779aSAndroid Build Coastguard Worker         if (error) return error;
1969*15dc779aSAndroid Build Coastguard Worker 
1970*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->protection_absent = adts.protection_absent;
1971*15dc779aSAndroid Build Coastguard Worker 
1972*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
1973*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) {
1974*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->frame_size = adts.aac_frame_length;
1975*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.framesize_480)
1976*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->frame_length = 480;
1977*15dc779aSAndroid Build Coastguard Worker           else
1978*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->frame_length = 512;
1979*15dc779aSAndroid Build Coastguard Worker         }
1980*15dc779aSAndroid Build Coastguard Worker       }
1981*15dc779aSAndroid Build Coastguard Worker     }
1982*15dc779aSAndroid Build Coastguard Worker 
1983*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
1984*15dc779aSAndroid Build Coastguard Worker       WORD32 result;
1985*15dc779aSAndroid Build Coastguard Worker       WORD32 sync;
1986*15dc779aSAndroid Build Coastguard Worker       WORD32 cnt_bits;
1987*15dc779aSAndroid Build Coastguard Worker 
1988*15dc779aSAndroid Build Coastguard Worker       sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
1989*15dc779aSAndroid Build Coastguard Worker       cnt_bits = it_bit_buff->cnt_bits;
1990*15dc779aSAndroid Build Coastguard Worker       if (it_bit_buff->cnt_bits <= 24) {
1991*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_NONFATAL_INSUFFICIENT_INPUT_BYTES;
1992*15dc779aSAndroid Build Coastguard Worker       }
1993*15dc779aSAndroid Build Coastguard Worker 
1994*15dc779aSAndroid Build Coastguard Worker       while (sync != 0x2b7) {
1995*15dc779aSAndroid Build Coastguard Worker         sync = ((sync & 0x3ff) << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1);
1996*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 11) {
1997*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff, -11);
1998*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed =
1999*15dc779aSAndroid Build Coastguard Worker               (cnt_bits - it_bit_buff->cnt_bits) / 8;
2000*15dc779aSAndroid Build Coastguard Worker           return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
2001*15dc779aSAndroid Build Coastguard Worker         }
2002*15dc779aSAndroid Build Coastguard Worker       }
2003*15dc779aSAndroid Build Coastguard Worker 
2004*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->audio_mux_align = it_bit_buff->cnt_bits - 13;
2005*15dc779aSAndroid Build Coastguard Worker 
2006*15dc779aSAndroid Build Coastguard Worker       if (sync == 0x2b7) {
2007*15dc779aSAndroid Build Coastguard Worker         result = ixheaacd_latm_audio_mux_element(
2008*15dc779aSAndroid Build Coastguard Worker             it_bit_buff, &p_state_enhaacplus_dec->latm_struct_element,
2009*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec,
2010*15dc779aSAndroid Build Coastguard Worker             (ia_sampling_rate_info_struct *)&p_obj_exhaacplus_dec->aac_tables
2011*15dc779aSAndroid Build Coastguard Worker                 .pstr_huffmann_tables->str_sample_rate_info[0]);
2012*15dc779aSAndroid Build Coastguard Worker         if (result < 0) {
2013*15dc779aSAndroid Build Coastguard Worker           return result;
2014*15dc779aSAndroid Build Coastguard Worker         }
2015*15dc779aSAndroid Build Coastguard Worker       }
2016*15dc779aSAndroid Build Coastguard Worker     }
2017*15dc779aSAndroid Build Coastguard Worker 
2018*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_aac_dec_info[0]->byte_align_bits =
2019*15dc779aSAndroid Build Coastguard Worker         it_bit_buff->cnt_bits;
2020*15dc779aSAndroid Build Coastguard Worker 
2021*15dc779aSAndroid Build Coastguard Worker     type = -1;
2022*15dc779aSAndroid Build Coastguard Worker     ch_idx = 0;
2023*15dc779aSAndroid Build Coastguard Worker 
2024*15dc779aSAndroid Build Coastguard Worker     while ((type != 7)) {
2025*15dc779aSAndroid Build Coastguard Worker       ia_aac_dec_scratch_struct aac_scratch_struct;
2026*15dc779aSAndroid Build Coastguard Worker       memset(&aac_scratch_struct, 0, sizeof(aac_scratch_struct));
2027*15dc779aSAndroid Build Coastguard Worker 
2028*15dc779aSAndroid Build Coastguard Worker       if (ch_idx >= elements_number) {
2029*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = 1;
2030*15dc779aSAndroid Build Coastguard Worker 
2031*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
2032*15dc779aSAndroid Build Coastguard Worker       }
2033*15dc779aSAndroid Build Coastguard Worker 
2034*15dc779aSAndroid Build Coastguard Worker       ixheaacd_allocate_aac_scr(
2035*15dc779aSAndroid Build Coastguard Worker           &aac_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
2036*15dc779aSAndroid Build Coastguard Worker           time_data, 1, p_obj_exhaacplus_dec->aac_config.ui_max_channels,
2037*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type);
2038*15dc779aSAndroid Build Coastguard Worker 
2039*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->p_ind_channel_info =
2040*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->ind_cc_info;
2041*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2042*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.first_frame = 1;
2043*15dc779aSAndroid Build Coastguard Worker       }
2044*15dc779aSAndroid Build Coastguard Worker 
2045*15dc779aSAndroid Build Coastguard Worker       error_code = ixheaacd_aacdec_decodeframe(
2046*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec, &aac_scratch_struct, time_data, frame_status, &type, &ch_idx, 1,
2047*15dc779aSAndroid Build Coastguard Worker           2, p_obj_exhaacplus_dec->aac_config.element_instance_order, 0, 1, 0,
2048*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_max_channels, 2,
2049*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->frame_length,
2050*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->frame_size, p_state_enhaacplus_dec->pstr_drc_dec,
2051*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type, p_state_enhaacplus_dec->ch_config,
2052*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present,
2053*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->drc_dummy, p_state_enhaacplus_dec->ldmps_present,
2054*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->slot_pos, mps_buffer, &p_state_enhaacplus_dec->mps_header,
2055*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->ui_mps_out_bytes, 1,
2056*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.first_frame);
2057*15dc779aSAndroid Build Coastguard Worker 
2058*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->pstr_drc_dec->drc_element_found == 1) {
2059*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.i_loud_ref_level < 0) {
2060*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.output_level =
2061*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->pstr_drc_dec->prog_ref_level;
2062*15dc779aSAndroid Build Coastguard Worker         } else {
2063*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.output_level =
2064*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.i_loud_ref_level;
2065*15dc779aSAndroid Build Coastguard Worker         }
2066*15dc779aSAndroid Build Coastguard Worker       }
2067*15dc779aSAndroid Build Coastguard Worker 
2068*15dc779aSAndroid Build Coastguard Worker       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
2069*15dc779aSAndroid Build Coastguard Worker                    ->pstr_aac_dec_ch_info[0]
2070*15dc779aSAndroid Build Coastguard Worker                    ->str_ics_info.ltp),
2071*15dc779aSAndroid Build Coastguard Worker              0, sizeof(ltp_info));
2072*15dc779aSAndroid Build Coastguard Worker       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
2073*15dc779aSAndroid Build Coastguard Worker                    ->pstr_aac_dec_ch_info[0]
2074*15dc779aSAndroid Build Coastguard Worker                    ->str_ics_info.ltp2),
2075*15dc779aSAndroid Build Coastguard Worker              0, sizeof(ltp_info));
2076*15dc779aSAndroid Build Coastguard Worker       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
2077*15dc779aSAndroid Build Coastguard Worker                    ->pstr_aac_dec_ch_info[1]
2078*15dc779aSAndroid Build Coastguard Worker                    ->str_ics_info.ltp),
2079*15dc779aSAndroid Build Coastguard Worker              0, sizeof(ltp_info));
2080*15dc779aSAndroid Build Coastguard Worker       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
2081*15dc779aSAndroid Build Coastguard Worker                    ->pstr_aac_dec_ch_info[1]
2082*15dc779aSAndroid Build Coastguard Worker                    ->str_ics_info.ltp2),
2083*15dc779aSAndroid Build Coastguard Worker              0, sizeof(ltp_info));
2084*15dc779aSAndroid Build Coastguard Worker 
2085*15dc779aSAndroid Build Coastguard Worker       {
2086*15dc779aSAndroid Build Coastguard Worker 
2087*15dc779aSAndroid Build Coastguard Worker         frame_size_1 = p_state_enhaacplus_dec->frame_length;
2088*15dc779aSAndroid Build Coastguard Worker         sample_rate_1 =
2089*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->sampling_rate;
2090*15dc779aSAndroid Build Coastguard Worker         num_channels_1 =
2091*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->channels;
2092*15dc779aSAndroid Build Coastguard Worker       }
2093*15dc779aSAndroid Build Coastguard Worker 
2094*15dc779aSAndroid Build Coastguard Worker       if ((p_obj_exhaacplus_dec->aac_config.ui_max_channels <= 2) &&
2095*15dc779aSAndroid Build Coastguard Worker           (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 2)) {
2096*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = 1;
2097*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_FATAL_UNIMPLEMENTED_CCE;
2098*15dc779aSAndroid Build Coastguard Worker       }
2099*15dc779aSAndroid Build Coastguard Worker 
2100*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
2101*15dc779aSAndroid Build Coastguard Worker         sbr_present_flag = 1;
2102*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 1;
2103*15dc779aSAndroid Build Coastguard Worker       }
2104*15dc779aSAndroid Build Coastguard Worker 
2105*15dc779aSAndroid Build Coastguard Worker       if (error_code) {
2106*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->ui_input_over) {
2107*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
2108*15dc779aSAndroid Build Coastguard Worker         }
2109*15dc779aSAndroid Build Coastguard Worker 
2110*15dc779aSAndroid Build Coastguard Worker         ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
2111*15dc779aSAndroid Build Coastguard Worker         return error_code;
2112*15dc779aSAndroid Build Coastguard Worker       }
2113*15dc779aSAndroid Build Coastguard Worker 
2114*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->s_adts_hdr_present) {
2115*15dc779aSAndroid Build Coastguard Worker         if (adts.no_raw_data_blocks != 0) {
2116*15dc779aSAndroid Build Coastguard Worker           if (adts.protection_absent == 0 && it_bit_buff->cnt_bits >= 16) {
2117*15dc779aSAndroid Build Coastguard Worker             adts.crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
2118*15dc779aSAndroid Build Coastguard Worker           }
2119*15dc779aSAndroid Build Coastguard Worker         }
2120*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->b_n_raw_data_blk--;
2121*15dc779aSAndroid Build Coastguard Worker       }
2122*15dc779aSAndroid Build Coastguard Worker 
2123*15dc779aSAndroid Build Coastguard Worker       sample_rate_2 = sample_rate_1;
2124*15dc779aSAndroid Build Coastguard Worker       frame_size_2 = frame_size_1;
2125*15dc779aSAndroid Build Coastguard Worker 
2126*15dc779aSAndroid Build Coastguard Worker       if (!p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
2127*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
2128*15dc779aSAndroid Build Coastguard Worker         WORD32 harmonic_sbr_flag = 0;
2129*15dc779aSAndroid Build Coastguard Worker         if ((p_obj_exhaacplus_dec->aac_config.flag_16khz_out == 1) &&
2130*15dc779aSAndroid Build Coastguard Worker             (sample_rate_1 == 8000)) {
2131*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_16khz_out = 0;
2132*15dc779aSAndroid Build Coastguard Worker         }
2133*15dc779aSAndroid Build Coastguard Worker 
2134*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = ixheaacd_init_sbr(
2135*15dc779aSAndroid Build Coastguard Worker             sample_rate_1, frame_size_1,
2136*15dc779aSAndroid Build Coastguard Worker             (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
2137*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->sbr_persistent_mem_v,
2138*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->ptr_overlap_buf, MAXNRSBRCHANNELS, (WORD)1,
2139*15dc779aSAndroid Build Coastguard Worker             1, frame_size_1 * 2, &harmonic_sbr_flag, NULL,
2140*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->str_sbr_config,
2141*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->audio_object_type,
2142*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2143*15dc779aSAndroid Build Coastguard Worker                 .ldmps_present_flag,
2144*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2145*15dc779aSAndroid Build Coastguard Worker                 .no_ldsbr_present);
2146*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
2147*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
2148*15dc779aSAndroid Build Coastguard Worker               &(p_state_enhaacplus_dec->xaac_jmp_buf);
2149*15dc779aSAndroid Build Coastguard Worker         }
2150*15dc779aSAndroid Build Coastguard Worker       } else {
2151*15dc779aSAndroid Build Coastguard Worker       }
2152*15dc779aSAndroid Build Coastguard Worker 
2153*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
2154*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
2155*15dc779aSAndroid Build Coastguard Worker         ia_sbr_scr_struct sbr_scratch_struct;
2156*15dc779aSAndroid Build Coastguard Worker         WORD16 num_channels_1_t = num_channels_1;
2157*15dc779aSAndroid Build Coastguard Worker         ixheaacd_allocate_sbr_scr(&sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
2158*15dc779aSAndroid Build Coastguard Worker                                   time_data, 0, NULL, 0, 0);
2159*15dc779aSAndroid Build Coastguard Worker         {
2160*15dc779aSAndroid Build Coastguard Worker           WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
2161*15dc779aSAndroid Build Coastguard Worker 
2162*15dc779aSAndroid Build Coastguard Worker           if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
2163*15dc779aSAndroid Build Coastguard Worker             WORD32 i = 0;
2164*15dc779aSAndroid Build Coastguard Worker             ia_dec_data_struct *pstr_dec_data =
2165*15dc779aSAndroid Build Coastguard Worker                 (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
2166*15dc779aSAndroid Build Coastguard Worker             if (num_channels_1 == 1) {
2167*15dc779aSAndroid Build Coastguard Worker               for (; i < 1024; i++) {
2168*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
2169*15dc779aSAndroid Build Coastguard Worker                     ((FLOAT32)time_data[i]);
2170*15dc779aSAndroid Build Coastguard Worker               }
2171*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
2172*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
2173*15dc779aSAndroid Build Coastguard Worker 
2174*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
2175*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
2176*15dc779aSAndroid Build Coastguard Worker             } else if (num_channels_1 == 2) {
2177*15dc779aSAndroid Build Coastguard Worker               for (; i < 1024; i++) {
2178*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
2179*15dc779aSAndroid Build Coastguard Worker                     ((FLOAT32)time_data[2 * i + 0]);
2180*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
2181*15dc779aSAndroid Build Coastguard Worker                     ((FLOAT32)time_data[2 * i + 1]);
2182*15dc779aSAndroid Build Coastguard Worker               }
2183*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
2184*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
2185*15dc779aSAndroid Build Coastguard Worker 
2186*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
2187*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
2188*15dc779aSAndroid Build Coastguard Worker             }
2189*15dc779aSAndroid Build Coastguard Worker           }
2190*15dc779aSAndroid Build Coastguard Worker         }
2191*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->ec_flag =
2192*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
2193*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->esbr_hq =
2194*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_hq_esbr;
2195*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr =
2196*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr;
2197*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr_ps =
2198*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps;
2199*15dc779aSAndroid Build Coastguard Worker 
2200*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
2201*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
2202*15dc779aSAndroid Build Coastguard Worker               &(p_state_enhaacplus_dec->xaac_jmp_buf);
2203*15dc779aSAndroid Build Coastguard Worker         }
2204*15dc779aSAndroid Build Coastguard Worker 
2205*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_applysbr(p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
2206*15dc779aSAndroid Build Coastguard Worker                               &p_state_enhaacplus_dec->pstr_stream_sbr[0][0], time_data,
2207*15dc779aSAndroid Build Coastguard Worker                               &num_channels_1, frame_status,
2208*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.down_sample_flag, 0,
2209*15dc779aSAndroid Build Coastguard Worker                               &sbr_scratch_struct, 1, 1, 0, NULL, NULL,
2210*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
2211*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->audio_object_type, 1,
2212*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->ldmps_present, frame_size_1,
2213*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present,
2214*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.ui_err_conceal,
2215*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.first_frame) != SBRDEC_OK) {
2216*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
2217*15dc779aSAndroid Build Coastguard Worker           return -1;
2218*15dc779aSAndroid Build Coastguard Worker         } else {
2219*15dc779aSAndroid Build Coastguard Worker           if (!p_obj_exhaacplus_dec->aac_config.down_sample_flag) {
2220*15dc779aSAndroid Build Coastguard Worker             sample_rate_1 *= 2;
2221*15dc779aSAndroid Build Coastguard Worker           }
2222*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present == 1) {
2223*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.pre_mix_req = 1;
2224*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mps_payload(
2225*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
2226*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec);
2227*15dc779aSAndroid Build Coastguard Worker           }
2228*15dc779aSAndroid Build Coastguard Worker         }
2229*15dc779aSAndroid Build Coastguard Worker         {
2230*15dc779aSAndroid Build Coastguard Worker           WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
2231*15dc779aSAndroid Build Coastguard Worker 
2232*15dc779aSAndroid Build Coastguard Worker           if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
2233*15dc779aSAndroid Build Coastguard Worker             WORD32 out_bytes = 0;
2234*15dc779aSAndroid Build Coastguard Worker             ia_dec_data_struct *pstr_dec_data =
2235*15dc779aSAndroid Build Coastguard Worker                 (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
2236*15dc779aSAndroid Build Coastguard Worker             ixheaacd_samples_sat((WORD8 *)time_data, 2048, 16,
2237*15dc779aSAndroid Build Coastguard Worker                                  pstr_dec_data->str_usac_data.time_sample_vector, &out_bytes, 1);
2238*15dc779aSAndroid Build Coastguard Worker           }
2239*15dc779aSAndroid Build Coastguard Worker         }
2240*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.flag_downmix) {
2241*15dc779aSAndroid Build Coastguard Worker           num_channels_1 = 1;
2242*15dc779aSAndroid Build Coastguard Worker         }
2243*15dc779aSAndroid Build Coastguard Worker         if (num_channels_1_t == 1 && num_channels_1 == 2) ps_detected = 1;
2244*15dc779aSAndroid Build Coastguard Worker       } else {
2245*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
2246*15dc779aSAndroid Build Coastguard Worker       }
2247*15dc779aSAndroid Build Coastguard Worker 
2248*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = 0;
2249*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_bit_buf = it_bit_buff;
2250*15dc779aSAndroid Build Coastguard Worker 
2251*15dc779aSAndroid Build Coastguard Worker       {
2252*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx] =
2253*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_decoder_init(
2254*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec,
2255*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->pstr_stream_sbr[0], 2,
2256*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->aac_persistent_mem_v,
2257*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->frame_length);
2258*15dc779aSAndroid Build Coastguard Worker 
2259*15dc779aSAndroid Build Coastguard Worker         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
2260*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 1;
2261*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
2262*15dc779aSAndroid Build Coastguard Worker         }
2263*15dc779aSAndroid Build Coastguard Worker 
2264*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
2265*15dc779aSAndroid Build Coastguard Worker           WORD32 harmonic_sbr_flag = 0;
2266*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = ixheaacd_init_sbr(
2267*15dc779aSAndroid Build Coastguard Worker               sample_rate_2, frame_size_2,
2268*15dc779aSAndroid Build Coastguard Worker               (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
2269*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->sbr_persistent_mem_v,
2270*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->ptr_overlap_buf, MAXNRSBRCHANNELS, 1, 1,
2271*15dc779aSAndroid Build Coastguard Worker               frame_size_2 * 2, &harmonic_sbr_flag, NULL,
2272*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_config,
2273*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->audio_object_type,
2274*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2275*15dc779aSAndroid Build Coastguard Worker                 .ldmps_present_flag,
2276*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2277*15dc779aSAndroid Build Coastguard Worker                 .no_ldsbr_present);
2278*15dc779aSAndroid Build Coastguard Worker         }
2279*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
2280*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
2281*15dc779aSAndroid Build Coastguard Worker               &(p_state_enhaacplus_dec->xaac_jmp_buf);
2282*15dc779aSAndroid Build Coastguard Worker         }
2283*15dc779aSAndroid Build Coastguard Worker       }
2284*15dc779aSAndroid Build Coastguard Worker 
2285*15dc779aSAndroid Build Coastguard Worker       if (sample_rate < sample_rate_1) sample_rate = sample_rate_1;
2286*15dc779aSAndroid Build Coastguard Worker 
2287*15dc779aSAndroid Build Coastguard Worker       ch_idx++;
2288*15dc779aSAndroid Build Coastguard Worker 
2289*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->audio_object_type >= ER_OBJECT_START &&
2290*15dc779aSAndroid Build Coastguard Worker           (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
2291*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
2292*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC))
2293*15dc779aSAndroid Build Coastguard Worker         break;
2294*15dc779aSAndroid Build Coastguard Worker     }
2295*15dc779aSAndroid Build Coastguard Worker 
2296*15dc779aSAndroid Build Coastguard Worker     {
2297*15dc779aSAndroid Build Coastguard Worker       ia_adts_crc_info_struct *ptr_adts_crc_info =
2298*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->ptr_bit_stream->pstr_adts_crc_info;
2299*15dc779aSAndroid Build Coastguard Worker       if (ptr_adts_crc_info->crc_active == 1) {
2300*15dc779aSAndroid Build Coastguard Worker         if ((error_code = ixheaacd_adts_crc_check_crc(ptr_adts_crc_info))) {
2301*15dc779aSAndroid Build Coastguard Worker           return error_code;
2302*15dc779aSAndroid Build Coastguard Worker         }
2303*15dc779aSAndroid Build Coastguard Worker       }
2304*15dc779aSAndroid Build Coastguard Worker     }
2305*15dc779aSAndroid Build Coastguard Worker 
2306*15dc779aSAndroid Build Coastguard Worker     {
2307*15dc779aSAndroid Build Coastguard Worker       VOID *temp;
2308*15dc779aSAndroid Build Coastguard Worker       WORD prev_persistent_used_t;
2309*15dc779aSAndroid Build Coastguard Worker       WORD prev_sbrpersistent_used_t;
2310*15dc779aSAndroid Build Coastguard Worker       WORD ps_enable;
2311*15dc779aSAndroid Build Coastguard Worker       WORD ch_idx_err = 0;
2312*15dc779aSAndroid Build Coastguard Worker       WORD persistent_used_t = 0;
2313*15dc779aSAndroid Build Coastguard Worker       WORD channel_check = 0;
2314*15dc779aSAndroid Build Coastguard Worker       WORD cc_channel_check = 0;
2315*15dc779aSAndroid Build Coastguard Worker       WORD max_ch_num = p_obj_exhaacplus_dec->aac_config.ui_max_channels;
2316*15dc779aSAndroid Build Coastguard Worker       WORD32 harmonic_sbr_flag = 0;
2317*15dc779aSAndroid Build Coastguard Worker       i = 0;
2318*15dc779aSAndroid Build Coastguard Worker 
2319*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.ui_n_channels = ch_idx;
2320*15dc779aSAndroid Build Coastguard Worker       while (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx_err] <= 3 &&
2321*15dc779aSAndroid Build Coastguard Worker              p_obj_exhaacplus_dec->aac_config.element_type[ch_idx_err] >= 0) {
2322*15dc779aSAndroid Build Coastguard Worker         ch_idx_err++;
2323*15dc779aSAndroid Build Coastguard Worker       }
2324*15dc779aSAndroid Build Coastguard Worker 
2325*15dc779aSAndroid Build Coastguard Worker       if (ch_idx_err == 0) {
2326*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->header_dec_done = 0;
2327*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = (WORD32)(
2328*15dc779aSAndroid Build Coastguard Worker             it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
2329*15dc779aSAndroid Build Coastguard Worker         return IA_XHEAAC_DEC_INIT_NONFATAL_DECODE_FRAME_ERROR;
2330*15dc779aSAndroid Build Coastguard Worker       }
2331*15dc779aSAndroid Build Coastguard Worker 
2332*15dc779aSAndroid Build Coastguard Worker       if (ch_idx_err == 1)
2333*15dc779aSAndroid Build Coastguard Worker         ps_enable = 1;
2334*15dc779aSAndroid Build Coastguard Worker       else
2335*15dc779aSAndroid Build Coastguard Worker         ps_enable = 0;
2336*15dc779aSAndroid Build Coastguard Worker 
2337*15dc779aSAndroid Build Coastguard Worker       while (p_obj_exhaacplus_dec->aac_config.element_type[i] >= 0 &&
2338*15dc779aSAndroid Build Coastguard Worker              p_obj_exhaacplus_dec->aac_config.element_type[i] <= 3) {
2339*15dc779aSAndroid Build Coastguard Worker         WORD32 channel = 0;
2340*15dc779aSAndroid Build Coastguard Worker         switch (p_obj_exhaacplus_dec->aac_config.element_type[i]) {
2341*15dc779aSAndroid Build Coastguard Worker           case 0:
2342*15dc779aSAndroid Build Coastguard Worker           case 3:
2343*15dc779aSAndroid Build Coastguard Worker             channel = 1;
2344*15dc779aSAndroid Build Coastguard Worker             break;
2345*15dc779aSAndroid Build Coastguard Worker           case 1:
2346*15dc779aSAndroid Build Coastguard Worker             channel = 2;
2347*15dc779aSAndroid Build Coastguard Worker             break;
2348*15dc779aSAndroid Build Coastguard Worker           case 2:
2349*15dc779aSAndroid Build Coastguard Worker             if (max_ch_num > 2) {
2350*15dc779aSAndroid Build Coastguard Worker               if (p_obj_exhaacplus_dec->aac_config.element_instance_order[i] !=
2351*15dc779aSAndroid Build Coastguard Worker                   p_obj_exhaacplus_dec->aac_config.ui_coupling_channel) {
2352*15dc779aSAndroid Build Coastguard Worker                 i++;
2353*15dc779aSAndroid Build Coastguard Worker                 continue;
2354*15dc779aSAndroid Build Coastguard Worker               }
2355*15dc779aSAndroid Build Coastguard Worker               channel = 1;
2356*15dc779aSAndroid Build Coastguard Worker             } else {
2357*15dc779aSAndroid Build Coastguard Worker               i++;
2358*15dc779aSAndroid Build Coastguard Worker               continue;
2359*15dc779aSAndroid Build Coastguard Worker             }
2360*15dc779aSAndroid Build Coastguard Worker             cc_channel_check++;
2361*15dc779aSAndroid Build Coastguard Worker             break;
2362*15dc779aSAndroid Build Coastguard Worker           default:
2363*15dc779aSAndroid Build Coastguard Worker             return -1;
2364*15dc779aSAndroid Build Coastguard Worker         }
2365*15dc779aSAndroid Build Coastguard Worker 
2366*15dc779aSAndroid Build Coastguard Worker         if (cc_channel_check > MAX_CC_CHANNEL_NUM)
2367*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
2368*15dc779aSAndroid Build Coastguard Worker         if (ps_enable == 1) {
2369*15dc779aSAndroid Build Coastguard Worker           channel = 2;
2370*15dc779aSAndroid Build Coastguard Worker         }
2371*15dc779aSAndroid Build Coastguard Worker 
2372*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.element_type[i] != 2) {
2373*15dc779aSAndroid Build Coastguard Worker           channel_check += channel;
2374*15dc779aSAndroid Build Coastguard Worker         }
2375*15dc779aSAndroid Build Coastguard Worker 
2376*15dc779aSAndroid Build Coastguard Worker         if (channel_check > max_ch_num) {
2377*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 1;
2378*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
2379*15dc779aSAndroid Build Coastguard Worker         }
2380*15dc779aSAndroid Build Coastguard Worker 
2381*15dc779aSAndroid Build Coastguard Worker         temp = p_state_enhaacplus_dec->aac_persistent_mem_v;
2382*15dc779aSAndroid Build Coastguard Worker 
2383*15dc779aSAndroid Build Coastguard Worker         prev_persistent_used_t = persistent_used_t;
2384*15dc779aSAndroid Build Coastguard Worker 
2385*15dc779aSAndroid Build Coastguard Worker         ixheaacd_allocate_mem_persistent(
2386*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec, p_state_enhaacplus_dec, channel,
2387*15dc779aSAndroid Build Coastguard Worker             &persistent_used_t, &prev_sbrpersistent_used_t, ps_enable);
2388*15dc779aSAndroid Build Coastguard Worker 
2389*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->aac_persistent_mem_v = temp;
2390*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->last_frame_ok = 1;
2391*15dc779aSAndroid Build Coastguard Worker 
2392*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->num_channel_last = 0;
2393*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ui_init_done = 0;
2394*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ui_input_over = 0;
2395*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ptr_bit_stream =
2396*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_bit_buf;
2397*15dc779aSAndroid Build Coastguard Worker 
2398*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[i] = 0;
2399*15dc779aSAndroid Build Coastguard Worker 
2400*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[i] =
2401*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_decoder_init(
2402*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec,
2403*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->pstr_stream_sbr[i], channel,
2404*15dc779aSAndroid Build Coastguard Worker                 (WORD8 *)p_state_enhaacplus_dec->aac_persistent_mem_v +
2405*15dc779aSAndroid Build Coastguard Worker                     prev_persistent_used_t,
2406*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->frame_length);
2407*15dc779aSAndroid Build Coastguard Worker 
2408*15dc779aSAndroid Build Coastguard Worker         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[i]) {
2409*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 1;
2410*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
2411*15dc779aSAndroid Build Coastguard Worker         }
2412*15dc779aSAndroid Build Coastguard Worker 
2413*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[i] = ixheaacd_init_sbr(
2414*15dc779aSAndroid Build Coastguard Worker             sample_rate_2, frame_size_2,
2415*15dc779aSAndroid Build Coastguard Worker             (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
2416*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->sbr_persistent_mem_v,
2417*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->ptr_overlap_buf, channel, ps_enable, 1,
2418*15dc779aSAndroid Build Coastguard Worker             frame_size_2 * 2, &harmonic_sbr_flag, NULL,
2419*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->str_sbr_config,
2420*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->audio_object_type,
2421*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2422*15dc779aSAndroid Build Coastguard Worker                 .ldmps_present_flag,
2423*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2424*15dc779aSAndroid Build Coastguard Worker                 .no_ldsbr_present);
2425*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[i]) {
2426*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[i]->xaac_jmp_buf =
2427*15dc779aSAndroid Build Coastguard Worker               &(p_state_enhaacplus_dec->xaac_jmp_buf);
2428*15dc779aSAndroid Build Coastguard Worker         }
2429*15dc779aSAndroid Build Coastguard Worker         if ((sbr_present_flag &&
2430*15dc779aSAndroid Build Coastguard Worker             ((p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
2431*15dc779aSAndroid Build Coastguard Worker               AOT_AAC_LC) ||
2432*15dc779aSAndroid Build Coastguard Worker              (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
2433*15dc779aSAndroid Build Coastguard Worker               AOT_SBR) ||
2434*15dc779aSAndroid Build Coastguard Worker              (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
2435*15dc779aSAndroid Build Coastguard Worker                AOT_PS))) ||
2436*15dc779aSAndroid Build Coastguard Worker             ((p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
2437*15dc779aSAndroid Build Coastguard Worker                   .ldmps_present_flag == 1) &&
2438*15dc779aSAndroid Build Coastguard Worker              (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
2439*15dc779aSAndroid Build Coastguard Worker               AOT_ER_AAC_ELD)))
2440*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 1;
2441*15dc779aSAndroid Build Coastguard Worker         copy_qmf_to_ldmps(&p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle,
2442*15dc779aSAndroid Build Coastguard Worker                           p_state_enhaacplus_dec->sbr_persistent_mem_v);
2443*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->audio_object_type == AOT_AAC_LC &&
2444*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->ui_mps_out_bytes != 0) {
2445*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present = 1;
2446*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
2447*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.mps_with_sbr = 1;
2448*15dc779aSAndroid Build Coastguard Worker           }
2449*15dc779aSAndroid Build Coastguard Worker           error_code =
2450*15dc779aSAndroid Build Coastguard Worker               ixheaacd_aac_mps_init(p_obj_exhaacplus_dec, mps_buffer,
2451*15dc779aSAndroid Build Coastguard Worker                                     p_state_enhaacplus_dec->ui_mps_out_bytes, sample_rate_1);
2452*15dc779aSAndroid Build Coastguard Worker           if (error_code) return error_code;
2453*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_n_channels =
2454*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->heaac_mps_handle.num_output_channels_at;
2455*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.mps_with_sbr == 1) {
2456*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 1;
2457*15dc779aSAndroid Build Coastguard Worker           }
2458*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.element_type[i + 1] >= 0 &&
2459*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.element_type[i + 1] <= 3) {
2460*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
2461*15dc779aSAndroid Build Coastguard Worker           }
2462*15dc779aSAndroid Build Coastguard Worker           break;
2463*15dc779aSAndroid Build Coastguard Worker         }
2464*15dc779aSAndroid Build Coastguard Worker         i++;
2465*15dc779aSAndroid Build Coastguard Worker       }
2466*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pers_mem_ptr =
2467*15dc779aSAndroid Build Coastguard Worker           (WORD8 *)p_state_enhaacplus_dec->aac_persistent_mem_v +
2468*15dc779aSAndroid Build Coastguard Worker           persistent_used_t;
2469*15dc779aSAndroid Build Coastguard Worker 
2470*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.i_channel_mask =
2471*15dc779aSAndroid Build Coastguard Worker           ixheaacd_get_channel_mask(p_obj_exhaacplus_dec);
2472*15dc779aSAndroid Build Coastguard Worker 
2473*15dc779aSAndroid Build Coastguard Worker       {
2474*15dc779aSAndroid Build Coastguard Worker         num_channels_1 = 0;
2475*15dc779aSAndroid Build Coastguard Worker         ch_idx = 0;
2476*15dc779aSAndroid Build Coastguard Worker         while (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] >= 0 &&
2477*15dc779aSAndroid Build Coastguard Worker                p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] <= 3) {
2478*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 0 ||
2479*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 3)
2480*15dc779aSAndroid Build Coastguard Worker             num_channels_1 += 1;
2481*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 1)
2482*15dc779aSAndroid Build Coastguard Worker             num_channels_1 += 2;
2483*15dc779aSAndroid Build Coastguard Worker           ch_idx++;
2484*15dc779aSAndroid Build Coastguard Worker         }
2485*15dc779aSAndroid Build Coastguard Worker 
2486*15dc779aSAndroid Build Coastguard Worker         if (ch_idx == 2 && num_channels_1 == 2) {
2487*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 2;
2488*15dc779aSAndroid Build Coastguard Worker         }
2489*15dc779aSAndroid Build Coastguard Worker         if (ch_idx == 1) {
2490*15dc779aSAndroid Build Coastguard Worker           if (num_channels_1 == 1)
2491*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 0;
2492*15dc779aSAndroid Build Coastguard Worker           if (num_channels_1 == 2)
2493*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 1;
2494*15dc779aSAndroid Build Coastguard Worker         }
2495*15dc779aSAndroid Build Coastguard Worker 
2496*15dc779aSAndroid Build Coastguard Worker         if (ps_detected == 1 && num_channels_1 == 1) num_channels_1 = 2;
2497*15dc779aSAndroid Build Coastguard Worker       }
2498*15dc779aSAndroid Build Coastguard Worker     }
2499*15dc779aSAndroid Build Coastguard Worker     if (1 == p_obj_exhaacplus_dec->aac_config.downmix) num_channels_1 = 2;
2500*15dc779aSAndroid Build Coastguard Worker 
2501*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.flag_downmix == 1) {
2502*15dc779aSAndroid Build Coastguard Worker       num_channels_1 = 1;
2503*15dc779aSAndroid Build Coastguard Worker     }
2504*15dc779aSAndroid Build Coastguard Worker 
2505*15dc779aSAndroid Build Coastguard Worker     if ((p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1) &&
2506*15dc779aSAndroid Build Coastguard Worker         (ch_idx == 1 || num_channels_1 <= 2)) {
2507*15dc779aSAndroid Build Coastguard Worker       num_channels_1 = 2;
2508*15dc779aSAndroid Build Coastguard Worker     }
2509*15dc779aSAndroid Build Coastguard Worker 
2510*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_n_channels = num_channels_1;
2511*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate;
2512*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->ui_init_done = 1;
2513*15dc779aSAndroid Build Coastguard Worker 
2514*15dc779aSAndroid Build Coastguard Worker     memcpy(it_bit_buff, &temp_bit_buff, sizeof(struct ia_bit_buf_struct));
2515*15dc779aSAndroid Build Coastguard Worker 
2516*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
2517*15dc779aSAndroid Build Coastguard Worker 
2518*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done == 1) {
2519*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->header_dec_done = 0;
2520*15dc779aSAndroid Build Coastguard Worker     }
2521*15dc779aSAndroid Build Coastguard Worker   }
2522*15dc779aSAndroid Build Coastguard Worker   return err_code;
2523*15dc779aSAndroid Build Coastguard Worker }
2524*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fill_slot_order(ia_aac_dec_state_struct * p_state_enhaacplus_dec,WORD32 ch,WORD8 * ptr_is_cpe,WORD8 * ptr_tag_select,WORD32 * ptr_idx_no)2525*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fill_slot_order(ia_aac_dec_state_struct *p_state_enhaacplus_dec,
2526*15dc779aSAndroid Build Coastguard Worker                               WORD32 ch, WORD8 *ptr_is_cpe,
2527*15dc779aSAndroid Build Coastguard Worker                               WORD8 *ptr_tag_select, WORD32 *ptr_idx_no) {
2528*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2529*15dc779aSAndroid Build Coastguard Worker   WORD32 idx_no = *ptr_idx_no;
2530*15dc779aSAndroid Build Coastguard Worker   WORD *p_slot_element = p_state_enhaacplus_dec->p_config->slot_element;
2531*15dc779aSAndroid Build Coastguard Worker   WORD *p_element_type = p_state_enhaacplus_dec->p_config->element_type;
2532*15dc779aSAndroid Build Coastguard Worker   WORD *p_element_instance_order =
2533*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->element_instance_order;
2534*15dc779aSAndroid Build Coastguard Worker 
2535*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ch; i++) {
2536*15dc779aSAndroid Build Coastguard Worker     if (ptr_is_cpe[i] == 0) {
2537*15dc779aSAndroid Build Coastguard Worker       *p_slot_element++ = idx_no++;
2538*15dc779aSAndroid Build Coastguard Worker       *p_element_type++ = 0;
2539*15dc779aSAndroid Build Coastguard Worker       *p_element_instance_order++ = ptr_tag_select[i];
2540*15dc779aSAndroid Build Coastguard Worker     }
2541*15dc779aSAndroid Build Coastguard Worker   }
2542*15dc779aSAndroid Build Coastguard Worker   *ptr_idx_no = idx_no;
2543*15dc779aSAndroid Build Coastguard Worker }
2544*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fill_prog_config_slots(ia_aac_dec_state_struct * p_state_enhaacplus_dec)2545*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fill_prog_config_slots(
2546*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_state_struct *p_state_enhaacplus_dec) {
2547*15dc779aSAndroid Build Coastguard Worker   WORD32 idx_no = 0;
2548*15dc779aSAndroid Build Coastguard Worker 
2549*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fill_slot_order(
2550*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec, p_state_enhaacplus_dec->p_config->str_prog_config
2551*15dc779aSAndroid Build Coastguard Worker                                   .num_front_channel_elements,
2552*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config.front_element_is_cpe,
2553*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config
2554*15dc779aSAndroid Build Coastguard Worker           .front_element_tag_select,
2555*15dc779aSAndroid Build Coastguard Worker       &idx_no);
2556*15dc779aSAndroid Build Coastguard Worker 
2557*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fill_slot_order(
2558*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec, p_state_enhaacplus_dec->p_config->str_prog_config
2559*15dc779aSAndroid Build Coastguard Worker                                   .num_side_channel_elements,
2560*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config.side_element_is_cpe,
2561*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config.side_element_tag_select,
2562*15dc779aSAndroid Build Coastguard Worker       &idx_no);
2563*15dc779aSAndroid Build Coastguard Worker 
2564*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fill_slot_order(
2565*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec, p_state_enhaacplus_dec->p_config->str_prog_config
2566*15dc779aSAndroid Build Coastguard Worker                                   .num_back_channel_elements,
2567*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config.back_element_is_cpe,
2568*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->p_config->str_prog_config.back_element_tag_select,
2569*15dc779aSAndroid Build Coastguard Worker       &idx_no);
2570*15dc779aSAndroid Build Coastguard Worker }
2571*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_execute(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec)2572*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_execute(
2573*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
2574*15dc779aSAndroid Build Coastguard Worker   ia_adts_header_struct adts = {0};
2575*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
2576*15dc779aSAndroid Build Coastguard Worker 
2577*15dc779aSAndroid Build Coastguard Worker   UWORD8 *in_buffer;
2578*15dc779aSAndroid Build Coastguard Worker   WORD16 *time_data;
2579*15dc779aSAndroid Build Coastguard Worker   WORD16 num_of_out_samples = 0;
2580*15dc779aSAndroid Build Coastguard Worker   WORD16 frame_size = 0;
2581*15dc779aSAndroid Build Coastguard Worker   WORD32 sample_rate_dec = 0;
2582*15dc779aSAndroid Build Coastguard Worker   WORD32 sample_rate = 0;
2583*15dc779aSAndroid Build Coastguard Worker   WORD16 num_ch = 0;
2584*15dc779aSAndroid Build Coastguard Worker   struct ia_bit_buf_struct *it_bit_buff;
2585*15dc779aSAndroid Build Coastguard Worker   UWORD8 *mps_buffer;
2586*15dc779aSAndroid Build Coastguard Worker   WORD32 error_code = IA_NO_ERROR;
2587*15dc779aSAndroid Build Coastguard Worker   WORD ch_idx1;
2588*15dc779aSAndroid Build Coastguard Worker   WORD type;
2589*15dc779aSAndroid Build Coastguard Worker   WORD total_channels = 0;
2590*15dc779aSAndroid Build Coastguard Worker   WORD total_elements = 0;
2591*15dc779aSAndroid Build Coastguard Worker   WORD16 *actual_out_buffer = NULL;
2592*15dc779aSAndroid Build Coastguard Worker   WORD ps_enable;
2593*15dc779aSAndroid Build Coastguard Worker   WORD esbr_mono_downmix = 0;
2594*15dc779aSAndroid Build Coastguard Worker   WORD8 element_used[MAX_BS_ELEMENT];
2595*15dc779aSAndroid Build Coastguard Worker   WORD32 channel_coupling_flag = 0;
2596*15dc779aSAndroid Build Coastguard Worker 
2597*15dc779aSAndroid Build Coastguard Worker   SIZE_T bytes_for_sync;
2598*15dc779aSAndroid Build Coastguard Worker   WORD32 audio_mux_length_bytes_last = 0;
2599*15dc779aSAndroid Build Coastguard Worker   WORD32 ret_val;
2600*15dc779aSAndroid Build Coastguard Worker   WORD32 mps_out_samples;
2601*15dc779aSAndroid Build Coastguard Worker 
2602*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
2603*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->aac_config.frame_status = 1;
2604*15dc779aSAndroid Build Coastguard Worker 
2605*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
2606*15dc779aSAndroid Build Coastguard Worker     ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf);
2607*15dc779aSAndroid Build Coastguard Worker     if (ret_val != 0) {
2608*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
2609*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
2610*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
2611*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2612*15dc779aSAndroid Build Coastguard Worker       return IA_NO_ERROR;
2613*15dc779aSAndroid Build Coastguard Worker     }
2614*15dc779aSAndroid Build Coastguard Worker   }
2615*15dc779aSAndroid Build Coastguard Worker 
2616*15dc779aSAndroid Build Coastguard Worker   time_data = (WORD16 *)(p_obj_exhaacplus_dec
2617*15dc779aSAndroid Build Coastguard Worker                              ->pp_mem_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX]);
2618*15dc779aSAndroid Build Coastguard Worker   in_buffer = p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_INPUT_IDX];
2619*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
2620*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->aac_scratch_mem_v =
2621*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_SCRATCH_IDX];
2622*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->mps_header = -1;
2623*15dc779aSAndroid Build Coastguard Worker   mps_buffer = p_state_enhaacplus_dec->mps_buffer;
2624*15dc779aSAndroid Build Coastguard Worker   it_bit_buff = p_state_enhaacplus_dec->pstr_bit_buf;
2625*15dc779aSAndroid Build Coastguard Worker 
2626*15dc779aSAndroid Build Coastguard Worker   ch_idx1 = 0;
2627*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->i_bytes_consumed = 0;
2628*15dc779aSAndroid Build Coastguard Worker 
2629*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->audio_object_type == AOT_USAC) {
2630*15dc779aSAndroid Build Coastguard Worker     WORD32 pcm_size = p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz;
2631*15dc779aSAndroid Build Coastguard Worker     WORD8 *inbuffer = (WORD8 *)(p_obj_exhaacplus_dec
2632*15dc779aSAndroid Build Coastguard Worker                                     ->pp_mem_aac[IA_ENHAACPLUS_DEC_INPUT_IDX]);
2633*15dc779aSAndroid Build Coastguard Worker     WORD8 *outbuffer =
2634*15dc779aSAndroid Build Coastguard Worker         (WORD8 *)(p_obj_exhaacplus_dec
2635*15dc779aSAndroid Build Coastguard Worker                       ->pp_mem_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX]);
2636*15dc779aSAndroid Build Coastguard Worker     WORD32 out_bytes = 0;
2637*15dc779aSAndroid Build Coastguard Worker 
2638*15dc779aSAndroid Build Coastguard Worker     WORD32 frames_done = p_obj_exhaacplus_dec->p_state_aac->frame_counter;
2639*15dc779aSAndroid Build Coastguard Worker 
2640*15dc779aSAndroid Build Coastguard Worker     ia_dec_data_struct *pstr_dec_data =
2641*15dc779aSAndroid Build Coastguard Worker         (ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac
2642*15dc779aSAndroid Build Coastguard Worker                                    ->pstr_dec_data);
2643*15dc779aSAndroid Build Coastguard Worker 
2644*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->str_usac_data.down_samp_sbr != 0) return IA_FATAL_ERROR;
2645*15dc779aSAndroid Build Coastguard Worker 
2646*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 0) {
2647*15dc779aSAndroid Build Coastguard Worker       ia_audio_specific_config_struct *ptr_audio_specific_config =
2648*15dc779aSAndroid Build Coastguard Worker           ((ia_audio_specific_config_struct *)
2649*15dc779aSAndroid Build Coastguard Worker                p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
2650*15dc779aSAndroid Build Coastguard Worker 
2651*15dc779aSAndroid Build Coastguard Worker       ptr_audio_specific_config->str_usac_config.str_usac_dec_config
2652*15dc779aSAndroid Build Coastguard Worker           .preroll_counter = 0;
2653*15dc779aSAndroid Build Coastguard Worker       {
2654*15dc779aSAndroid Build Coastguard Worker         WORD32 iii = 0;
2655*15dc779aSAndroid Build Coastguard Worker         for (iii = 0; iii < (MAX_AUDIO_PREROLLS + 1); iii++) {
2656*15dc779aSAndroid Build Coastguard Worker           ((ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac
2657*15dc779aSAndroid Build Coastguard Worker                                       ->pstr_dec_data))
2658*15dc779aSAndroid Build Coastguard Worker               ->str_frame_data.str_audio_specific_config.str_usac_config
2659*15dc779aSAndroid Build Coastguard Worker               .str_usac_dec_config.usac_ext_gain_payload_len[iii] = 0;
2660*15dc779aSAndroid Build Coastguard Worker           ptr_audio_specific_config->str_usac_config.str_usac_dec_config
2661*15dc779aSAndroid Build Coastguard Worker               .usac_ext_gain_payload_len[iii] =
2662*15dc779aSAndroid Build Coastguard Worker               0;  // reinitilize the payload len buff
2663*15dc779aSAndroid Build Coastguard Worker           ptr_audio_specific_config->str_usac_config.str_usac_dec_config
2664*15dc779aSAndroid Build Coastguard Worker               .preroll_bytes[iii] = 0;
2665*15dc779aSAndroid Build Coastguard Worker         }
2666*15dc779aSAndroid Build Coastguard Worker       }
2667*15dc779aSAndroid Build Coastguard Worker 
2668*15dc779aSAndroid Build Coastguard Worker       ((ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data))
2669*15dc779aSAndroid Build Coastguard Worker           ->str_frame_data.str_audio_specific_config.str_usac_config
2670*15dc779aSAndroid Build Coastguard Worker           .str_usac_dec_config.preroll_counter = 0;
2671*15dc779aSAndroid Build Coastguard Worker       error_code = ixheaacd_dec_main(
2672*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec, inbuffer, outbuffer, &out_bytes, frames_done,
2673*15dc779aSAndroid Build Coastguard Worker           pcm_size, &p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch);
2674*15dc779aSAndroid Build Coastguard Worker       if (error_code) {
2675*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2676*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2677*15dc779aSAndroid Build Coastguard Worker         } else {
2678*15dc779aSAndroid Build Coastguard Worker           return error_code;
2679*15dc779aSAndroid Build Coastguard Worker         }
2680*15dc779aSAndroid Build Coastguard Worker       }
2681*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->frame_counter++;
2682*15dc779aSAndroid Build Coastguard Worker     } else {
2683*15dc779aSAndroid Build Coastguard Worker       out_bytes = 0;
2684*15dc779aSAndroid Build Coastguard Worker     }
2685*15dc779aSAndroid Build Coastguard Worker 
2686*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->str_usac_data.ec_flag == 0) {
2687*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->bs_format != LOAS_BSFORMAT) {
2688*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
2689*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
2690*15dc779aSAndroid Build Coastguard Worker       }
2691*15dc779aSAndroid Build Coastguard Worker     } else {
2692*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->bs_format != LOAS_BSFORMAT) {
2693*15dc779aSAndroid Build Coastguard Worker         if (pstr_dec_data->str_usac_data.frame_ok == 0) {
2694*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
2695*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
2696*15dc779aSAndroid Build Coastguard Worker           pstr_dec_data->dec_bit_buf.cnt_bits = 0;
2697*15dc779aSAndroid Build Coastguard Worker         } else {
2698*15dc779aSAndroid Build Coastguard Worker           ia_dec_data_struct *pstr_dec_data =
2699*15dc779aSAndroid Build Coastguard Worker               (ia_dec_data_struct *)p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data;
2700*15dc779aSAndroid Build Coastguard Worker 
2701*15dc779aSAndroid Build Coastguard Worker           if (pstr_dec_data->dec_bit_buf.cnt_bits & 7) {
2702*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->dec_bit_buf.cnt_bits -= (pstr_dec_data->dec_bit_buf.cnt_bits & 7);
2703*15dc779aSAndroid Build Coastguard Worker           }
2704*15dc779aSAndroid Build Coastguard Worker           if (pstr_dec_data->dec_bit_buf.cnt_bits == 0) {
2705*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
2706*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
2707*15dc779aSAndroid Build Coastguard Worker           } else {
2708*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
2709*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes -
2710*15dc779aSAndroid Build Coastguard Worker                 (pstr_dec_data->dec_bit_buf.cnt_bits >> 3);
2711*15dc779aSAndroid Build Coastguard Worker           }
2712*15dc779aSAndroid Build Coastguard Worker         }
2713*15dc779aSAndroid Build Coastguard Worker       }
2714*15dc779aSAndroid Build Coastguard Worker     }
2715*15dc779aSAndroid Build Coastguard Worker 
2716*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = out_bytes;
2717*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_n_channels =
2718*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch;
2719*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.sbr_parse_err_flag = 0;
2720*15dc779aSAndroid Build Coastguard Worker 
2721*15dc779aSAndroid Build Coastguard Worker     return 0;
2722*15dc779aSAndroid Build Coastguard Worker   }
2723*15dc779aSAndroid Build Coastguard Worker 
2724*15dc779aSAndroid Build Coastguard Worker   while (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] <= 3 &&
2725*15dc779aSAndroid Build Coastguard Worker          p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] >= 0) {
2726*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 0 ||
2727*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 3) {
2728*15dc779aSAndroid Build Coastguard Worker       total_channels += 1;
2729*15dc779aSAndroid Build Coastguard Worker       total_elements += 1;
2730*15dc779aSAndroid Build Coastguard Worker     }
2731*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 1) {
2732*15dc779aSAndroid Build Coastguard Worker       total_elements += 1;
2733*15dc779aSAndroid Build Coastguard Worker       total_channels += 2;
2734*15dc779aSAndroid Build Coastguard Worker     }
2735*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 2) {
2736*15dc779aSAndroid Build Coastguard Worker       total_elements += 1;
2737*15dc779aSAndroid Build Coastguard Worker     }
2738*15dc779aSAndroid Build Coastguard Worker 
2739*15dc779aSAndroid Build Coastguard Worker     ch_idx1++;
2740*15dc779aSAndroid Build Coastguard Worker     if (ch_idx1 > MAX_BS_ELEMENT) {
2741*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal)
2742*15dc779aSAndroid Build Coastguard Worker         break;
2743*15dc779aSAndroid Build Coastguard Worker       else
2744*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
2745*15dc779aSAndroid Build Coastguard Worker     }
2746*15dc779aSAndroid Build Coastguard Worker   }
2747*15dc779aSAndroid Build Coastguard Worker 
2748*15dc779aSAndroid Build Coastguard Worker   if (ch_idx1 != 1) {
2749*15dc779aSAndroid Build Coastguard Worker     ps_enable = 0;
2750*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
2751*15dc779aSAndroid Build Coastguard Worker       WORD32 scratch_pointer;
2752*15dc779aSAndroid Build Coastguard Worker 
2753*15dc779aSAndroid Build Coastguard Worker       scratch_pointer = (MAX_SCR_SIZE - SCR_INTER_SCR_SIZE);
2754*15dc779aSAndroid Build Coastguard Worker 
2755*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->coup_ch_output =
2756*15dc779aSAndroid Build Coastguard Worker           (WORD32 *)((WORD8 *)
2757*15dc779aSAndroid Build Coastguard Worker                          p_obj_exhaacplus_dec->p_state_aac->aac_scratch_mem_v +
2758*15dc779aSAndroid Build Coastguard Worker                      scratch_pointer);
2759*15dc779aSAndroid Build Coastguard Worker     }
2760*15dc779aSAndroid Build Coastguard Worker 
2761*15dc779aSAndroid Build Coastguard Worker   }
2762*15dc779aSAndroid Build Coastguard Worker 
2763*15dc779aSAndroid Build Coastguard Worker   else {
2764*15dc779aSAndroid Build Coastguard Worker     if (total_channels < (WORD)p_obj_exhaacplus_dec->aac_config.ui_n_channels)
2765*15dc779aSAndroid Build Coastguard Worker       total_channels = p_obj_exhaacplus_dec->aac_config.ui_n_channels;
2766*15dc779aSAndroid Build Coastguard Worker     ps_enable = 1;
2767*15dc779aSAndroid Build Coastguard Worker   }
2768*15dc779aSAndroid Build Coastguard Worker 
2769*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
2770*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->p_state_aac->ui_mps_out_bytes = 0;
2771*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
2772*15dc779aSAndroid Build Coastguard Worker     UWORD32 i;
2773*15dc779aSAndroid Build Coastguard Worker     WORD32 j;
2774*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->peak_lim_init == 1) {
2775*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
2776*15dc779aSAndroid Build Coastguard Worker           (p_state_enhaacplus_dec->peak_limiter.attack_time_samples) *
2777*15dc779aSAndroid Build Coastguard Worker           total_channels * sizeof(WORD16);
2778*15dc779aSAndroid Build Coastguard Worker 
2779*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < total_channels; j++) {
2780*15dc779aSAndroid Build Coastguard Worker         for (i = 0;
2781*15dc779aSAndroid Build Coastguard Worker              i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
2782*15dc779aSAndroid Build Coastguard Worker                   p_state_enhaacplus_dec->peak_limiter.delayed_input_index);
2783*15dc779aSAndroid Build Coastguard Worker              i++) {
2784*15dc779aSAndroid Build Coastguard Worker           *(time_data + total_channels * i + j) = ixheaac_round16(
2785*15dc779aSAndroid Build Coastguard Worker               (WORD32)*(p_state_enhaacplus_dec->peak_limiter.delayed_input +
2786*15dc779aSAndroid Build Coastguard Worker                 (p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
2787*15dc779aSAndroid Build Coastguard Worker                     total_channels +
2788*15dc779aSAndroid Build Coastguard Worker                 total_channels * i + j));
2789*15dc779aSAndroid Build Coastguard Worker         }
2790*15dc779aSAndroid Build Coastguard Worker       }
2791*15dc779aSAndroid Build Coastguard Worker 
2792*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < total_channels; j++) {
2793*15dc779aSAndroid Build Coastguard Worker         for (i = 0;
2794*15dc779aSAndroid Build Coastguard Worker              i < p_state_enhaacplus_dec->peak_limiter.delayed_input_index;
2795*15dc779aSAndroid Build Coastguard Worker              i++) {
2796*15dc779aSAndroid Build Coastguard Worker           *(time_data +
2797*15dc779aSAndroid Build Coastguard Worker             (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
2798*15dc779aSAndroid Build Coastguard Worker              p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
2799*15dc779aSAndroid Build Coastguard Worker                 total_channels +
2800*15dc779aSAndroid Build Coastguard Worker             total_channels * i + j) =
2801*15dc779aSAndroid Build Coastguard Worker               ixheaac_round16(
2802*15dc779aSAndroid Build Coastguard Worker                   (WORD32)*(p_state_enhaacplus_dec->peak_limiter.delayed_input +
2803*15dc779aSAndroid Build Coastguard Worker                    total_channels * i + j));
2804*15dc779aSAndroid Build Coastguard Worker         }
2805*15dc779aSAndroid Build Coastguard Worker       }
2806*15dc779aSAndroid Build Coastguard Worker 
2807*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.dup_stereo_flag) {
2808*15dc779aSAndroid Build Coastguard Worker         for (i = 0;
2809*15dc779aSAndroid Build Coastguard Worker              i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples);
2810*15dc779aSAndroid Build Coastguard Worker              i++) {
2811*15dc779aSAndroid Build Coastguard Worker           time_data[2 * i + 1] = time_data[2 * i + 0];
2812*15dc779aSAndroid Build Coastguard Worker         }
2813*15dc779aSAndroid Build Coastguard Worker       }
2814*15dc779aSAndroid Build Coastguard Worker     } else {
2815*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
2816*15dc779aSAndroid Build Coastguard Worker     }
2817*15dc779aSAndroid Build Coastguard Worker 
2818*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed = 0;
2819*15dc779aSAndroid Build Coastguard Worker     return IA_NO_ERROR;
2820*15dc779aSAndroid Build Coastguard Worker   }
2821*15dc779aSAndroid Build Coastguard Worker 
2822*15dc779aSAndroid Build Coastguard Worker   if (ch_idx1 == 0) {
2823*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed = 1;
2824*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2825*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2826*15dc779aSAndroid Build Coastguard Worker     } else {
2827*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
2828*15dc779aSAndroid Build Coastguard Worker     }
2829*15dc779aSAndroid Build Coastguard Worker   }
2830*15dc779aSAndroid Build Coastguard Worker   if (total_channels > (WORD)p_obj_exhaacplus_dec->aac_config.ui_max_channels) {
2831*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed = 1;
2832*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2833*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2834*15dc779aSAndroid Build Coastguard Worker     } else {
2835*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL;
2836*15dc779aSAndroid Build Coastguard Worker     }
2837*15dc779aSAndroid Build Coastguard Worker   }
2838*15dc779aSAndroid Build Coastguard Worker 
2839*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
2840*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) {
2841*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag)
2842*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_size = p_state_enhaacplus_dec->ui_in_bytes;
2843*15dc779aSAndroid Build Coastguard Worker   }
2844*15dc779aSAndroid Build Coastguard Worker 
2845*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
2846*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag)
2847*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_size = 1024;
2848*15dc779aSAndroid Build Coastguard Worker   }
2849*15dc779aSAndroid Build Coastguard Worker 
2850*15dc779aSAndroid Build Coastguard Worker   {
2851*15dc779aSAndroid Build Coastguard Worker     ixheaacd_create_init_bit_buf(it_bit_buff, in_buffer,
2852*15dc779aSAndroid Build Coastguard Worker                                  p_state_enhaacplus_dec->ui_in_bytes);
2853*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->xaac_jmp_buf = &(p_state_enhaacplus_dec->xaac_jmp_buf);
2854*15dc779aSAndroid Build Coastguard Worker 
2855*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->adts_header_present =
2856*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->s_adts_hdr_present;
2857*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->no_raw_data_blocks =
2858*15dc779aSAndroid Build Coastguard Worker         (WORD8)p_state_enhaacplus_dec->b_n_raw_data_blk;
2859*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->protection_absent = p_state_enhaacplus_dec->protection_absent;
2860*15dc779aSAndroid Build Coastguard Worker 
2861*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->s_adts_hdr_present) {
2862*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->b_n_raw_data_blk == 0) {
2863*15dc779aSAndroid Build Coastguard Worker         WORD32 error;
2864*15dc779aSAndroid Build Coastguard Worker 
2865*15dc779aSAndroid Build Coastguard Worker         error = ixheaacd_readifadts(p_state_enhaacplus_dec, it_bit_buff, &adts);
2866*15dc779aSAndroid Build Coastguard Worker         if (error) {
2867*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2868*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2869*15dc779aSAndroid Build Coastguard Worker             if (adts.samp_freq_index > 11) {
2870*15dc779aSAndroid Build Coastguard Worker               adts.samp_freq_index = 11;
2871*15dc779aSAndroid Build Coastguard Worker             }
2872*15dc779aSAndroid Build Coastguard Worker           } else {
2873*15dc779aSAndroid Build Coastguard Worker             return error;
2874*15dc779aSAndroid Build Coastguard Worker           }
2875*15dc779aSAndroid Build Coastguard Worker         }
2876*15dc779aSAndroid Build Coastguard Worker 
2877*15dc779aSAndroid Build Coastguard Worker         if ((WORD32)p_state_enhaacplus_dec->sampling_rate !=
2878*15dc779aSAndroid Build Coastguard Worker             (WORD32)((p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
2879*15dc779aSAndroid Build Coastguard Worker                           ->str_sample_rate_info[adts.samp_freq_index]
2880*15dc779aSAndroid Build Coastguard Worker                           .sampling_frequency))) {
2881*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 0;
2882*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2883*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2884*15dc779aSAndroid Build Coastguard Worker           } else {
2885*15dc779aSAndroid Build Coastguard Worker             return IA_XHEAAC_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
2886*15dc779aSAndroid Build Coastguard Worker           }
2887*15dc779aSAndroid Build Coastguard Worker         }
2888*15dc779aSAndroid Build Coastguard Worker       }
2889*15dc779aSAndroid Build Coastguard Worker     }
2890*15dc779aSAndroid Build Coastguard Worker 
2891*15dc779aSAndroid Build Coastguard Worker     bytes_for_sync = (SIZE_T)it_bit_buff->ptr_read_next;
2892*15dc779aSAndroid Build Coastguard Worker 
2893*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
2894*15dc779aSAndroid Build Coastguard Worker       WORD32 result, audio_mux_len_bytes_last;
2895*15dc779aSAndroid Build Coastguard Worker       WORD32 cnt_bits = it_bit_buff->cnt_bits;
2896*15dc779aSAndroid Build Coastguard Worker       WORD32 sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
2897*15dc779aSAndroid Build Coastguard Worker       UWORD32 curr_samp_rate = 0;
2898*15dc779aSAndroid Build Coastguard Worker 
2899*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->latm_initialized)
2900*15dc779aSAndroid Build Coastguard Worker         curr_samp_rate =
2901*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->latm_struct_element.layer_info[0][0]
2902*15dc779aSAndroid Build Coastguard Worker                 .asc.sampling_freq;
2903*15dc779aSAndroid Build Coastguard Worker 
2904*15dc779aSAndroid Build Coastguard Worker       while (sync != 0x2b7) {
2905*15dc779aSAndroid Build Coastguard Worker         sync = ((sync & 0x3ff) << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1);
2906*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 13) {
2907*15dc779aSAndroid Build Coastguard Worker           ixheaacd_read_bidirection(it_bit_buff, -11);
2908*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed =
2909*15dc779aSAndroid Build Coastguard Worker               (cnt_bits - it_bit_buff->cnt_bits) / 8;
2910*15dc779aSAndroid Build Coastguard Worker 
2911*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->i_bytes_consumed == 0)
2912*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->i_bytes_consumed = 1;
2913*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2914*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2915*15dc779aSAndroid Build Coastguard Worker           } else {
2916*15dc779aSAndroid Build Coastguard Worker             return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
2917*15dc779aSAndroid Build Coastguard Worker           }
2918*15dc779aSAndroid Build Coastguard Worker         }
2919*15dc779aSAndroid Build Coastguard Worker       }
2920*15dc779aSAndroid Build Coastguard Worker 
2921*15dc779aSAndroid Build Coastguard Worker       it_bit_buff->audio_mux_align = it_bit_buff->cnt_bits - 13;
2922*15dc779aSAndroid Build Coastguard Worker 
2923*15dc779aSAndroid Build Coastguard Worker       audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
2924*15dc779aSAndroid Build Coastguard Worker 
2925*15dc779aSAndroid Build Coastguard Worker       audio_mux_length_bytes_last = audio_mux_len_bytes_last;
2926*15dc779aSAndroid Build Coastguard Worker 
2927*15dc779aSAndroid Build Coastguard Worker       bytes_for_sync = (SIZE_T)it_bit_buff->ptr_read_next - bytes_for_sync;
2928*15dc779aSAndroid Build Coastguard Worker 
2929*15dc779aSAndroid Build Coastguard Worker       if (it_bit_buff->cnt_bits < (audio_mux_len_bytes_last << 3)) {
2930*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
2931*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
2932*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2933*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2934*15dc779aSAndroid Build Coastguard Worker         } else {
2935*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
2936*15dc779aSAndroid Build Coastguard Worker         }
2937*15dc779aSAndroid Build Coastguard Worker       } else {
2938*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bidirection(it_bit_buff, -(13));
2939*15dc779aSAndroid Build Coastguard Worker       }
2940*15dc779aSAndroid Build Coastguard Worker 
2941*15dc779aSAndroid Build Coastguard Worker       if (sync == 0x2b7) {
2942*15dc779aSAndroid Build Coastguard Worker         result = ixheaacd_latm_audio_mux_element(
2943*15dc779aSAndroid Build Coastguard Worker             it_bit_buff, &p_state_enhaacplus_dec->latm_struct_element,
2944*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec,
2945*15dc779aSAndroid Build Coastguard Worker             (ia_sampling_rate_info_struct *)&p_obj_exhaacplus_dec->aac_tables
2946*15dc779aSAndroid Build Coastguard Worker                 .pstr_huffmann_tables->str_sample_rate_info[0]);
2947*15dc779aSAndroid Build Coastguard Worker         if (result < 0) {
2948*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2949*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2950*15dc779aSAndroid Build Coastguard Worker           } else {
2951*15dc779aSAndroid Build Coastguard Worker             return result;
2952*15dc779aSAndroid Build Coastguard Worker           }
2953*15dc779aSAndroid Build Coastguard Worker         }
2954*15dc779aSAndroid Build Coastguard Worker         if (!p_state_enhaacplus_dec->latm_initialized) {
2955*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->sampling_rate =
2956*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->latm_struct_element.layer_info[0][0].asc.sampling_freq;
2957*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->latm_initialized = 1;
2958*15dc779aSAndroid Build Coastguard Worker         } else {
2959*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->sampling_rate != curr_samp_rate) {
2960*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->i_bytes_consumed = 0;
2961*15dc779aSAndroid Build Coastguard Worker             if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2962*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2963*15dc779aSAndroid Build Coastguard Worker             } else {
2964*15dc779aSAndroid Build Coastguard Worker               return IA_XHEAAC_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
2965*15dc779aSAndroid Build Coastguard Worker             }
2966*15dc779aSAndroid Build Coastguard Worker           }
2967*15dc779aSAndroid Build Coastguard Worker         }
2968*15dc779aSAndroid Build Coastguard Worker       }
2969*15dc779aSAndroid Build Coastguard Worker     }
2970*15dc779aSAndroid Build Coastguard Worker   }
2971*15dc779aSAndroid Build Coastguard Worker 
2972*15dc779aSAndroid Build Coastguard Worker   if (total_elements == 2 && total_channels == 2 &&
2973*15dc779aSAndroid Build Coastguard Worker       (p_state_enhaacplus_dec->p_config->ui_pce_found_in_hdr == 1 ||
2974*15dc779aSAndroid Build Coastguard Worker        p_state_enhaacplus_dec->p_config->ui_pce_found_in_hdr == 3)) {
2975*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fill_prog_config_slots(p_state_enhaacplus_dec);
2976*15dc779aSAndroid Build Coastguard Worker   }
2977*15dc779aSAndroid Build Coastguard Worker 
2978*15dc779aSAndroid Build Coastguard Worker   memset(element_used, 0, sizeof(WORD8) * MAX_BS_ELEMENT);
2979*15dc779aSAndroid Build Coastguard Worker 
2980*15dc779aSAndroid Build Coastguard Worker   if (it_bit_buff->cnt_bits <= 0) {
2981*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->cnt_bits = -1;
2982*15dc779aSAndroid Build Coastguard Worker     ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
2983*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
2984*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.frame_status = 0;
2985*15dc779aSAndroid Build Coastguard Worker     } else {
2986*15dc779aSAndroid Build Coastguard Worker       return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
2987*15dc779aSAndroid Build Coastguard Worker     }
2988*15dc779aSAndroid Build Coastguard Worker   }
2989*15dc779aSAndroid Build Coastguard Worker 
2990*15dc779aSAndroid Build Coastguard Worker   { it_bit_buff->initial_cnt_bits = it_bit_buff->cnt_bits; }
2991*15dc779aSAndroid Build Coastguard Worker 
2992*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD) {
2993*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->s_adts_hdr_present)
2994*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_size = adts.aac_frame_length;
2995*15dc779aSAndroid Build Coastguard Worker   }
2996*15dc779aSAndroid Build Coastguard Worker 
2997*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
2998*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->s_adts_hdr_present)
2999*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->frame_size = 1024;
3000*15dc779aSAndroid Build Coastguard Worker   }
3001*15dc779aSAndroid Build Coastguard Worker 
3002*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->pstr_drc_dec) {
3003*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_drc_dec->num_drc_elements = 0;
3004*15dc779aSAndroid Build Coastguard Worker 
3005*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_drc_dec->state = 1;
3006*15dc779aSAndroid Build Coastguard Worker   }
3007*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3008*15dc779aSAndroid Build Coastguard Worker     if (total_elements > MAX_BS_ELEMENT) {
3009*15dc779aSAndroid Build Coastguard Worker       total_elements = MAX_BS_ELEMENT;
3010*15dc779aSAndroid Build Coastguard Worker     }
3011*15dc779aSAndroid Build Coastguard Worker   }
3012*15dc779aSAndroid Build Coastguard Worker 
3013*15dc779aSAndroid Build Coastguard Worker   WORD16 *intermediate_scr = (WORD16 *)(WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v +
3014*15dc779aSAndroid Build Coastguard Worker                              (MAX_SCR_SIZE - SCR_INTER_SCR_SIZE - SCR_COUP_CH_OUT_SIZE);
3015*15dc779aSAndroid Build Coastguard Worker 
3016*15dc779aSAndroid Build Coastguard Worker   for (ch_idx1 = 0; ch_idx1 < total_elements; ch_idx1++) {
3017*15dc779aSAndroid Build Coastguard Worker     WORD32 skip_full_decode = 0;
3018*15dc779aSAndroid Build Coastguard Worker     WORD32 ch_idx = ch_idx1;
3019*15dc779aSAndroid Build Coastguard Worker     WORD32 channel = 0;
3020*15dc779aSAndroid Build Coastguard Worker     WORD ch_fac, slot_ele;
3021*15dc779aSAndroid Build Coastguard Worker 
3022*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START ||
3023*15dc779aSAndroid Build Coastguard Worker         (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD &&
3024*15dc779aSAndroid Build Coastguard Worker          p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD &&
3025*15dc779aSAndroid Build Coastguard Worker          p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LC)) {
3026*15dc779aSAndroid Build Coastguard Worker       jmp_buf local;
3027*15dc779aSAndroid Build Coastguard Worker 
3028*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal == 1) {
3029*15dc779aSAndroid Build Coastguard Worker         ret_val = setjmp(local);
3030*15dc779aSAndroid Build Coastguard Worker       }
3031*15dc779aSAndroid Build Coastguard Worker       if (ret_val == 0) {
3032*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal == 1) {
3033*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->ptr_bit_stream->xaac_jmp_buf = &local;
3034*15dc779aSAndroid Build Coastguard Worker         }
3035*15dc779aSAndroid Build Coastguard Worker         error_code = ixheaacd_get_element_index_tag(
3036*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec, ch_idx1, &ch_idx, &channel,
3037*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.element_instance_order, total_elements, element_used,
3038*15dc779aSAndroid Build Coastguard Worker             total_channels, p_state_enhaacplus_dec->pstr_drc_dec,
3039*15dc779aSAndroid Build Coastguard Worker             &p_state_enhaacplus_dec->drc_dummy, mps_buffer, &p_state_enhaacplus_dec->mps_header,
3040*15dc779aSAndroid Build Coastguard Worker             &p_state_enhaacplus_dec->ui_mps_out_bytes);
3041*15dc779aSAndroid Build Coastguard Worker       }
3042*15dc779aSAndroid Build Coastguard Worker 
3043*15dc779aSAndroid Build Coastguard Worker       if (error_code || ret_val) {
3044*15dc779aSAndroid Build Coastguard Worker         ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
3045*15dc779aSAndroid Build Coastguard Worker         if (it_bit_buff->cnt_bits < 0) {
3046*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->ui_out_bytes = 0;
3047*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
3048*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
3049*15dc779aSAndroid Build Coastguard Worker         }
3050*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->i_bytes_consumed = 1;
3051*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
3052*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3053*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3054*15dc779aSAndroid Build Coastguard Worker         } else {
3055*15dc779aSAndroid Build Coastguard Worker           return error_code;
3056*15dc779aSAndroid Build Coastguard Worker         }
3057*15dc779aSAndroid Build Coastguard Worker       }
3058*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == ID_CPE)
3059*15dc779aSAndroid Build Coastguard Worker       {
3060*15dc779aSAndroid Build Coastguard Worker         if (channel != 2)
3061*15dc779aSAndroid Build Coastguard Worker         {
3062*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal)
3063*15dc779aSAndroid Build Coastguard Worker           {
3064*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3065*15dc779aSAndroid Build Coastguard Worker             channel = 2;
3066*15dc779aSAndroid Build Coastguard Worker           }
3067*15dc779aSAndroid Build Coastguard Worker           else
3068*15dc779aSAndroid Build Coastguard Worker           {
3069*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
3070*15dc779aSAndroid Build Coastguard Worker           }
3071*15dc779aSAndroid Build Coastguard Worker         }
3072*15dc779aSAndroid Build Coastguard Worker       }
3073*15dc779aSAndroid Build Coastguard Worker       else
3074*15dc779aSAndroid Build Coastguard Worker       {
3075*15dc779aSAndroid Build Coastguard Worker         if (channel != 1)
3076*15dc779aSAndroid Build Coastguard Worker         {
3077*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal)
3078*15dc779aSAndroid Build Coastguard Worker           {
3079*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3080*15dc779aSAndroid Build Coastguard Worker             channel = 1;
3081*15dc779aSAndroid Build Coastguard Worker           }
3082*15dc779aSAndroid Build Coastguard Worker           else
3083*15dc779aSAndroid Build Coastguard Worker           {
3084*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
3085*15dc779aSAndroid Build Coastguard Worker           }
3086*15dc779aSAndroid Build Coastguard Worker         }
3087*15dc779aSAndroid Build Coastguard Worker       }
3088*15dc779aSAndroid Build Coastguard Worker     } else {
3089*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == ID_SCE)
3090*15dc779aSAndroid Build Coastguard Worker         channel = 1;
3091*15dc779aSAndroid Build Coastguard Worker       else
3092*15dc779aSAndroid Build Coastguard Worker         channel = 2;
3093*15dc779aSAndroid Build Coastguard Worker     }
3094*15dc779aSAndroid Build Coastguard Worker 
3095*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && (error_code || ret_val)) {
3096*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 0 ||
3097*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 3) {
3098*15dc779aSAndroid Build Coastguard Worker         if (channel > 1) {
3099*15dc779aSAndroid Build Coastguard Worker           channel = 1;
3100*15dc779aSAndroid Build Coastguard Worker         }
3101*15dc779aSAndroid Build Coastguard Worker       }
3102*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 1) {
3103*15dc779aSAndroid Build Coastguard Worker         if (channel > 2) {
3104*15dc779aSAndroid Build Coastguard Worker           channel = 2;
3105*15dc779aSAndroid Build Coastguard Worker         }
3106*15dc779aSAndroid Build Coastguard Worker       }
3107*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 2) {
3108*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
3109*15dc779aSAndroid Build Coastguard Worker           if (!(p_obj_exhaacplus_dec->aac_config.element_instance_order[ch_idx] !=
3110*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->aac_config.ui_coupling_channel)) {
3111*15dc779aSAndroid Build Coastguard Worker             if (channel > 1) {
3112*15dc779aSAndroid Build Coastguard Worker               channel = 1;
3113*15dc779aSAndroid Build Coastguard Worker             }
3114*15dc779aSAndroid Build Coastguard Worker           }
3115*15dc779aSAndroid Build Coastguard Worker         }
3116*15dc779aSAndroid Build Coastguard Worker       }
3117*15dc779aSAndroid Build Coastguard Worker       if (ps_enable == 1) {
3118*15dc779aSAndroid Build Coastguard Worker         if (channel > 2) {
3119*15dc779aSAndroid Build Coastguard Worker           channel = 2;
3120*15dc779aSAndroid Build Coastguard Worker         }
3121*15dc779aSAndroid Build Coastguard Worker       }
3122*15dc779aSAndroid Build Coastguard Worker     }
3123*15dc779aSAndroid Build Coastguard Worker 
3124*15dc779aSAndroid Build Coastguard Worker     ch_fac = total_channels;
3125*15dc779aSAndroid Build Coastguard Worker     slot_ele = p_obj_exhaacplus_dec->aac_config.slot_element[ch_idx];
3126*15dc779aSAndroid Build Coastguard Worker     actual_out_buffer = time_data;
3127*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 2) {
3128*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->p_ind_channel_info =
3129*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->ind_cc_info;
3130*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_instance_order[ch_idx] !=
3131*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_coupling_channel) {
3132*15dc779aSAndroid Build Coastguard Worker         skip_full_decode = 1;
3133*15dc779aSAndroid Build Coastguard Worker         ixheaacd_set_aac_persistent_buffers(
3134*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pers_mem_ptr, channel);
3135*15dc779aSAndroid Build Coastguard Worker 
3136*15dc779aSAndroid Build Coastguard Worker         {
3137*15dc779aSAndroid Build Coastguard Worker           struct ia_aac_persistent_struct *aac_persistent_mem =
3138*15dc779aSAndroid Build Coastguard Worker               (struct ia_aac_persistent_struct *)
3139*15dc779aSAndroid Build Coastguard Worker                   p_state_enhaacplus_dec->pers_mem_ptr;
3140*15dc779aSAndroid Build Coastguard Worker           aac_persistent_mem->str_aac_decoder.pstr_aac_tables =
3141*15dc779aSAndroid Build Coastguard Worker               &p_obj_exhaacplus_dec->aac_tables;
3142*15dc779aSAndroid Build Coastguard Worker           aac_persistent_mem->str_aac_decoder.pstr_common_tables =
3143*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->common_tables;
3144*15dc779aSAndroid Build Coastguard Worker         }
3145*15dc779aSAndroid Build Coastguard Worker 
3146*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx] = 0;
3147*15dc779aSAndroid Build Coastguard Worker 
3148*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
3149*15dc779aSAndroid Build Coastguard Worker 
3150*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx] =
3151*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_decoder_init(
3152*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec,
3153*15dc779aSAndroid Build Coastguard Worker 
3154*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx],
3155*15dc779aSAndroid Build Coastguard Worker 
3156*15dc779aSAndroid Build Coastguard Worker                 channel, p_state_enhaacplus_dec->pers_mem_ptr,
3157*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->frame_length
3158*15dc779aSAndroid Build Coastguard Worker 
3159*15dc779aSAndroid Build Coastguard Worker                 );
3160*15dc779aSAndroid Build Coastguard Worker         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
3161*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->i_bytes_consumed = 1;
3162*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3163*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3164*15dc779aSAndroid Build Coastguard Worker           } else {
3165*15dc779aSAndroid Build Coastguard Worker             return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
3166*15dc779aSAndroid Build Coastguard Worker           }
3167*15dc779aSAndroid Build Coastguard Worker         }
3168*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->p_ind_channel_info =
3169*15dc779aSAndroid Build Coastguard Worker             (WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + (P_IND_CH_INFO_OFFSET);
3170*15dc779aSAndroid Build Coastguard Worker       }
3171*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[1] < 3 &&
3172*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.element_type[1] > 0 &&
3173*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
3174*15dc779aSAndroid Build Coastguard Worker         actual_out_buffer =
3175*15dc779aSAndroid Build Coastguard Worker             (WORD16 *)(VOID *)p_state_enhaacplus_dec->coup_ch_output;
3176*15dc779aSAndroid Build Coastguard Worker       }
3177*15dc779aSAndroid Build Coastguard Worker       ch_fac = 1;
3178*15dc779aSAndroid Build Coastguard Worker       slot_ele = 0;
3179*15dc779aSAndroid Build Coastguard Worker     }
3180*15dc779aSAndroid Build Coastguard Worker 
3181*15dc779aSAndroid Build Coastguard Worker     type = -1;
3182*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements = 0;
3183*15dc779aSAndroid Build Coastguard Worker 
3184*15dc779aSAndroid Build Coastguard Worker     {
3185*15dc779aSAndroid Build Coastguard Worker       WORD element_index_order1[MAX_BS_ELEMENT];
3186*15dc779aSAndroid Build Coastguard Worker       ia_aac_dec_scratch_struct aac_scratch_struct;
3187*15dc779aSAndroid Build Coastguard Worker       memset(&aac_scratch_struct, 0, sizeof(aac_scratch_struct));
3188*15dc779aSAndroid Build Coastguard Worker 
3189*15dc779aSAndroid Build Coastguard Worker       ixheaacd_allocate_aac_scr(
3190*15dc779aSAndroid Build Coastguard Worker           &aac_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
3191*15dc779aSAndroid Build Coastguard Worker           time_data, channel, p_obj_exhaacplus_dec->aac_config.ui_max_channels,
3192*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type);
3193*15dc779aSAndroid Build Coastguard Worker 
3194*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->ch_config == 2 && channel == 1) {
3195*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3196*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3197*15dc779aSAndroid Build Coastguard Worker         } else {
3198*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
3199*15dc779aSAndroid Build Coastguard Worker         }
3200*15dc779aSAndroid Build Coastguard Worker       }
3201*15dc779aSAndroid Build Coastguard Worker 
3202*15dc779aSAndroid Build Coastguard Worker       error_code = ixheaacd_aacdec_decodeframe(
3203*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec, &aac_scratch_struct, actual_out_buffer,
3204*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status, &type, &ch_idx, 0, channel,
3205*15dc779aSAndroid Build Coastguard Worker           element_index_order1, skip_full_decode, ch_fac, slot_ele,
3206*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_max_channels, total_channels,
3207*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->frame_length,
3208*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->frame_size, p_state_enhaacplus_dec->pstr_drc_dec,
3209*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type, p_state_enhaacplus_dec->ch_config,
3210*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present,
3211*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->drc_dummy, p_state_enhaacplus_dec->ldmps_present,
3212*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->slot_pos, mps_buffer, &p_state_enhaacplus_dec->mps_header,
3213*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->ui_mps_out_bytes, 0,
3214*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.first_frame);
3215*15dc779aSAndroid Build Coastguard Worker 
3216*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->slot_pos -= (channel - 1);
3217*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->sbr_present = 0;
3218*15dc779aSAndroid Build Coastguard Worker 
3219*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ &&
3220*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->frame_counter == 0) {
3221*15dc779aSAndroid Build Coastguard Worker         ixheaacd_peak_limiter_init(
3222*15dc779aSAndroid Build Coastguard Worker             &p_state_enhaacplus_dec->peak_limiter, total_channels,
3223*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->p_state_aac->p_config->ui_samp_freq,
3224*15dc779aSAndroid Build Coastguard Worker             &p_state_enhaacplus_dec->peak_limiter.buffer[0],
3225*15dc779aSAndroid Build Coastguard Worker             &p_obj_exhaacplus_dec->p_state_aac->delay_in_samples);
3226*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 1;
3227*15dc779aSAndroid Build Coastguard Worker       }
3228*15dc779aSAndroid Build Coastguard Worker 
3229*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START ||
3230*15dc779aSAndroid Build Coastguard Worker           (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD &&
3231*15dc779aSAndroid Build Coastguard Worker            p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD &&
3232*15dc779aSAndroid Build Coastguard Worker            p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LC)) {
3233*15dc779aSAndroid Build Coastguard Worker         if ((error_code == 0) && ((ch_idx1 + 1) == total_elements) &&
3234*15dc779aSAndroid Build Coastguard Worker             (type != ID_END)) {
3235*15dc779aSAndroid Build Coastguard Worker           {
3236*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->i_bytes_consumed = (WORD32)(
3237*15dc779aSAndroid Build Coastguard Worker                 it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
3238*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
3239*15dc779aSAndroid Build Coastguard Worker             if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3240*15dc779aSAndroid Build Coastguard Worker               p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3241*15dc779aSAndroid Build Coastguard Worker             } else {
3242*15dc779aSAndroid Build Coastguard Worker             return IA_XHEAAC_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
3243*15dc779aSAndroid Build Coastguard Worker           }
3244*15dc779aSAndroid Build Coastguard Worker           }
3245*15dc779aSAndroid Build Coastguard Worker         }
3246*15dc779aSAndroid Build Coastguard Worker       }
3247*15dc779aSAndroid Build Coastguard Worker 
3248*15dc779aSAndroid Build Coastguard Worker       num_ch = p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->channels;
3249*15dc779aSAndroid Build Coastguard Worker       if (skip_full_decode == 0) {
3250*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
3251*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD)
3252*15dc779aSAndroid Build Coastguard Worker           frame_size = p_state_enhaacplus_dec->frame_length;
3253*15dc779aSAndroid Build Coastguard Worker         else {
3254*15dc779aSAndroid Build Coastguard Worker           frame_size = p_state_enhaacplus_dec->frame_length;
3255*15dc779aSAndroid Build Coastguard Worker         }
3256*15dc779aSAndroid Build Coastguard Worker 
3257*15dc779aSAndroid Build Coastguard Worker         sample_rate_dec =
3258*15dc779aSAndroid Build Coastguard Worker             p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->sampling_rate;
3259*15dc779aSAndroid Build Coastguard Worker       }
3260*15dc779aSAndroid Build Coastguard Worker     }
3261*15dc779aSAndroid Build Coastguard Worker 
3262*15dc779aSAndroid Build Coastguard Worker     if (skip_full_decode == 1) {
3263*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements = 0;
3264*15dc779aSAndroid Build Coastguard Worker     }
3265*15dc779aSAndroid Build Coastguard Worker 
3266*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements != 0) {
3267*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 1;
3268*15dc779aSAndroid Build Coastguard Worker     }
3269*15dc779aSAndroid Build Coastguard Worker 
3270*15dc779aSAndroid Build Coastguard Worker     if (error_code) {
3271*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->ui_input_over) {
3272*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3273*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3274*15dc779aSAndroid Build Coastguard Worker         } else {
3275*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
3276*15dc779aSAndroid Build Coastguard Worker         }
3277*15dc779aSAndroid Build Coastguard Worker       }
3278*15dc779aSAndroid Build Coastguard Worker       ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
3279*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes +=
3280*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
3281*15dc779aSAndroid Build Coastguard Worker       if (error_code) {
3282*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3283*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3284*15dc779aSAndroid Build Coastguard Worker         } else {
3285*15dc779aSAndroid Build Coastguard Worker           return error_code;
3286*15dc779aSAndroid Build Coastguard Worker         }
3287*15dc779aSAndroid Build Coastguard Worker       }
3288*15dc779aSAndroid Build Coastguard Worker     }
3289*15dc779aSAndroid Build Coastguard Worker 
3290*15dc779aSAndroid Build Coastguard Worker     error_code = IA_NO_ERROR;
3291*15dc779aSAndroid Build Coastguard Worker 
3292*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample == 0) {
3293*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements == 0 &&
3294*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
3295*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
3296*15dc779aSAndroid Build Coastguard Worker         error_code = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_OFF;
3297*15dc779aSAndroid Build Coastguard Worker       }
3298*15dc779aSAndroid Build Coastguard Worker     }
3299*15dc779aSAndroid Build Coastguard Worker     if ((!p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) &&
3300*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements) {
3301*15dc779aSAndroid Build Coastguard Worker       WORD32 harmonic_sbr_flag = 0;
3302*15dc779aSAndroid Build Coastguard Worker       error_code = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_ON;
3303*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = ixheaacd_init_sbr(
3304*15dc779aSAndroid Build Coastguard Worker           sample_rate_dec, frame_size,
3305*15dc779aSAndroid Build Coastguard Worker           (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
3306*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->sbr_persistent_mem_v,
3307*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->ptr_overlap_buf, ps_enable ? 2 : channel,
3308*15dc779aSAndroid Build Coastguard Worker           ps_enable, 1, frame_size * 2, &harmonic_sbr_flag, NULL,
3309*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_config,
3310*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->audio_object_type,
3311*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
3312*15dc779aSAndroid Build Coastguard Worker               .ldmps_present_flag,
3313*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present);
3314*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
3315*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
3316*15dc779aSAndroid Build Coastguard Worker             &(p_state_enhaacplus_dec->xaac_jmp_buf);
3317*15dc779aSAndroid Build Coastguard Worker       }
3318*15dc779aSAndroid Build Coastguard Worker     }
3319*15dc779aSAndroid Build Coastguard Worker 
3320*15dc779aSAndroid Build Coastguard Worker     {
3321*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
3322*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
3323*15dc779aSAndroid Build Coastguard Worker         ia_sbr_scr_struct sbr_scratch_struct;
3324*15dc779aSAndroid Build Coastguard Worker         ixheaacd_allocate_sbr_scr(&sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
3325*15dc779aSAndroid Build Coastguard Worker                                   time_data, total_channels,
3326*15dc779aSAndroid Build Coastguard Worker                                   p_obj_exhaacplus_dec->p_state_aac->qshift_adj,
3327*15dc779aSAndroid Build Coastguard Worker                                   p_state_enhaacplus_dec->slot_pos, channel);
3328*15dc779aSAndroid Build Coastguard Worker 
3329*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->sbr_present = 1;
3330*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->peak_lim_init = 0;
3331*15dc779aSAndroid Build Coastguard Worker 
3332*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_enh_sbr)
3333*15dc779aSAndroid Build Coastguard Worker         {
3334*15dc779aSAndroid Build Coastguard Worker           WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
3335*15dc779aSAndroid Build Coastguard Worker 
3336*15dc779aSAndroid Build Coastguard Worker           if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
3337*15dc779aSAndroid Build Coastguard Worker             WORD32 i = 0;
3338*15dc779aSAndroid Build Coastguard Worker             ia_dec_data_struct* pstr_dec_data =
3339*15dc779aSAndroid Build Coastguard Worker                 (ia_dec_data_struct*)p_state_enhaacplus_dec->pstr_dec_data;
3340*15dc779aSAndroid Build Coastguard Worker             if (ch_fac == 1) {
3341*15dc779aSAndroid Build Coastguard Worker               for (; i < 1024; i++) {
3342*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
3343*15dc779aSAndroid Build Coastguard Worker                     (FLOAT32)time_data[i];
3344*15dc779aSAndroid Build Coastguard Worker               }
3345*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
3346*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
3347*15dc779aSAndroid Build Coastguard Worker 
3348*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
3349*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
3350*15dc779aSAndroid Build Coastguard Worker             } else if (ch_fac == 2) {
3351*15dc779aSAndroid Build Coastguard Worker               for (; i < 1024; i++) {
3352*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
3353*15dc779aSAndroid Build Coastguard Worker                     (FLOAT32)time_data[2 * i + 0];
3354*15dc779aSAndroid Build Coastguard Worker                 pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
3355*15dc779aSAndroid Build Coastguard Worker                     (FLOAT32)time_data[2 * i + 1];
3356*15dc779aSAndroid Build Coastguard Worker               }
3357*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
3358*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
3359*15dc779aSAndroid Build Coastguard Worker 
3360*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
3361*15dc779aSAndroid Build Coastguard Worker                   &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
3362*15dc779aSAndroid Build Coastguard Worker             } else if (ch_fac > 2) {
3363*15dc779aSAndroid Build Coastguard Worker               if (channel == 1) {
3364*15dc779aSAndroid Build Coastguard Worker                 for (; i < 1024; i++) {
3365*15dc779aSAndroid Build Coastguard Worker                   pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
3366*15dc779aSAndroid Build Coastguard Worker                       (FLOAT32)(time_data + slot_ele)[i* ch_fac];
3367*15dc779aSAndroid Build Coastguard Worker                 }
3368*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
3369*15dc779aSAndroid Build Coastguard Worker                     &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
3370*15dc779aSAndroid Build Coastguard Worker               } else if (channel == 2) {
3371*15dc779aSAndroid Build Coastguard Worker                 for (; i < 1024; i++) {
3372*15dc779aSAndroid Build Coastguard Worker                   pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
3373*15dc779aSAndroid Build Coastguard Worker                       (FLOAT32)(time_data + slot_ele)[ch_fac * i + 0];
3374*15dc779aSAndroid Build Coastguard Worker                   pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
3375*15dc779aSAndroid Build Coastguard Worker                       (FLOAT32)(time_data + slot_ele)[ch_fac * i + 1];
3376*15dc779aSAndroid Build Coastguard Worker                 }
3377*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
3378*15dc779aSAndroid Build Coastguard Worker                     &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
3379*15dc779aSAndroid Build Coastguard Worker 
3380*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
3381*15dc779aSAndroid Build Coastguard Worker                     &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
3382*15dc779aSAndroid Build Coastguard Worker               }
3383*15dc779aSAndroid Build Coastguard Worker             }
3384*15dc779aSAndroid Build Coastguard Worker           }
3385*15dc779aSAndroid Build Coastguard Worker         }
3386*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->esbr_hq =
3387*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_hq_esbr;
3388*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr =
3389*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr;
3390*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr_ps =
3391*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps;
3392*15dc779aSAndroid Build Coastguard Worker 
3393*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
3394*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
3395*15dc779aSAndroid Build Coastguard Worker               &(p_state_enhaacplus_dec->xaac_jmp_buf);
3396*15dc779aSAndroid Build Coastguard Worker         }
3397*15dc779aSAndroid Build Coastguard Worker 
3398*15dc779aSAndroid Build Coastguard Worker         if (ixheaacd_applysbr(p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
3399*15dc779aSAndroid Build Coastguard Worker                               &p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0],
3400*15dc779aSAndroid Build Coastguard Worker                               actual_out_buffer, &num_ch,
3401*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.frame_status,
3402*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.down_sample_flag,
3403*15dc779aSAndroid Build Coastguard Worker                               esbr_mono_downmix, &sbr_scratch_struct, ps_enable, ch_fac, slot_ele,
3404*15dc779aSAndroid Build Coastguard Worker                               NULL, &p_state_enhaacplus_dec->str_drc_dec_info,
3405*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
3406*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->audio_object_type, 0,
3407*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->ldmps_present, frame_size,
3408*15dc779aSAndroid Build Coastguard Worker                               p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present,
3409*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.ui_err_conceal,
3410*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.first_frame) != SBRDEC_OK) {
3411*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
3412*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3413*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3414*15dc779aSAndroid Build Coastguard Worker           } else {
3415*15dc779aSAndroid Build Coastguard Worker             return -1;
3416*15dc779aSAndroid Build Coastguard Worker           }
3417*15dc779aSAndroid Build Coastguard Worker         } else {
3418*15dc779aSAndroid Build Coastguard Worker           if (!p_obj_exhaacplus_dec->aac_config.down_sample_flag) {
3419*15dc779aSAndroid Build Coastguard Worker             frame_size = (WORD16)(frame_size * 2);
3420*15dc779aSAndroid Build Coastguard Worker             sample_rate_dec *= 2;
3421*15dc779aSAndroid Build Coastguard Worker           }
3422*15dc779aSAndroid Build Coastguard Worker           if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
3423*15dc779aSAndroid Build Coastguard Worker                   .ldmps_present_flag == 1) {
3424*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mps_payload(
3425*15dc779aSAndroid Build Coastguard Worker                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
3426*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec);
3427*15dc779aSAndroid Build Coastguard Worker           }
3428*15dc779aSAndroid Build Coastguard Worker         }
3429*15dc779aSAndroid Build Coastguard Worker 
3430*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.ui_enh_sbr)
3431*15dc779aSAndroid Build Coastguard Worker         {
3432*15dc779aSAndroid Build Coastguard Worker           WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
3433*15dc779aSAndroid Build Coastguard Worker 
3434*15dc779aSAndroid Build Coastguard Worker           if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
3435*15dc779aSAndroid Build Coastguard Worker             WORD32 out_bytes = 0;
3436*15dc779aSAndroid Build Coastguard Worker             ia_dec_data_struct *pstr_dec_data =
3437*15dc779aSAndroid Build Coastguard Worker                 (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
3438*15dc779aSAndroid Build Coastguard Worker             if (ch_fac <= 2) {
3439*15dc779aSAndroid Build Coastguard Worker               ixheaacd_samples_sat((WORD8*)time_data, 2048, 16,
3440*15dc779aSAndroid Build Coastguard Worker                                    pstr_dec_data->str_usac_data.time_sample_vector,
3441*15dc779aSAndroid Build Coastguard Worker                                    &out_bytes, ch_fac);
3442*15dc779aSAndroid Build Coastguard Worker             } else {
3443*15dc779aSAndroid Build Coastguard Worker               ixheaacd_samples_sat_mc((WORD8*)(time_data + slot_ele), 2048,
3444*15dc779aSAndroid Build Coastguard Worker                                       pstr_dec_data->str_usac_data.time_sample_vector,
3445*15dc779aSAndroid Build Coastguard Worker                                       &out_bytes, channel, ch_fac);
3446*15dc779aSAndroid Build Coastguard Worker             }
3447*15dc779aSAndroid Build Coastguard Worker           }
3448*15dc779aSAndroid Build Coastguard Worker         }
3449*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present =
3450*15dc779aSAndroid Build Coastguard Worker             0;
3451*15dc779aSAndroid Build Coastguard Worker         if (p_state_enhaacplus_dec->ui_mps_out_bytes > 0) {
3452*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present = 1;
3453*15dc779aSAndroid Build Coastguard Worker         }
3454*15dc779aSAndroid Build Coastguard Worker       } else {
3455*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
3456*15dc779aSAndroid Build Coastguard Worker       }
3457*15dc779aSAndroid Build Coastguard Worker     }
3458*15dc779aSAndroid Build Coastguard Worker 
3459*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
3460*15dc779aSAndroid Build Coastguard Worker                 .ldmps_present_flag == 1 &&
3461*15dc779aSAndroid Build Coastguard Worker          p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
3462*15dc779aSAndroid Build Coastguard Worker          p_state_enhaacplus_dec->mps_dec_handle.mps_init_done == 1) {
3463*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->ec_enable) {
3464*15dc779aSAndroid Build Coastguard Worker         if (!p_obj_exhaacplus_dec->aac_config.first_frame) {
3465*15dc779aSAndroid Build Coastguard Worker           error_code = ixheaacd_ld_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer);
3466*15dc779aSAndroid Build Coastguard Worker           if (error_code) p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3467*15dc779aSAndroid Build Coastguard Worker         }
3468*15dc779aSAndroid Build Coastguard Worker       } else {
3469*15dc779aSAndroid Build Coastguard Worker         error_code = ixheaacd_ld_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer);
3470*15dc779aSAndroid Build Coastguard Worker 
3471*15dc779aSAndroid Build Coastguard Worker         if (error_code)
3472*15dc779aSAndroid Build Coastguard Worker           return error_code;
3473*15dc779aSAndroid Build Coastguard Worker       }
3474*15dc779aSAndroid Build Coastguard Worker     }
3475*15dc779aSAndroid Build Coastguard Worker     if (sample_rate < sample_rate_dec) {
3476*15dc779aSAndroid Build Coastguard Worker       sample_rate = sample_rate_dec;
3477*15dc779aSAndroid Build Coastguard Worker     }
3478*15dc779aSAndroid Build Coastguard Worker 
3479*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->sbr_present ||
3480*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] == LD_OBJ) {
3481*15dc779aSAndroid Build Coastguard Worker       num_of_out_samples = frame_size;
3482*15dc779aSAndroid Build Coastguard Worker 
3483*15dc779aSAndroid Build Coastguard Worker     } else {
3484*15dc779aSAndroid Build Coastguard Worker       num_of_out_samples =
3485*15dc779aSAndroid Build Coastguard Worker           frame_size -
3486*15dc779aSAndroid Build Coastguard Worker           MIN((WORD16)p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size);
3487*15dc779aSAndroid Build Coastguard Worker     }
3488*15dc779aSAndroid Build Coastguard Worker 
3489*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal &&
3490*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.first_frame &&
3491*15dc779aSAndroid Build Coastguard Worker         (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_ER_AAC_ELD ||
3492*15dc779aSAndroid Build Coastguard Worker          p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_ER_AAC_LD)) {
3493*15dc779aSAndroid Build Coastguard Worker       num_of_out_samples = frame_size;
3494*15dc779aSAndroid Build Coastguard Worker     }
3495*15dc779aSAndroid Build Coastguard Worker 
3496*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate;
3497*15dc779aSAndroid Build Coastguard Worker 
3498*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->num_channel_last = num_ch;
3499*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->num_of_out_samples = num_of_out_samples;
3500*15dc779aSAndroid Build Coastguard Worker 
3501*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
3502*15dc779aSAndroid Build Coastguard Worker             .ldmps_present_flag == 1 &&
3503*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->mps_dec_handle.mps_init_done == 1 &&
3504*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
3505*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.output_buffer) {
3506*15dc779aSAndroid Build Coastguard Worker         ixheaacd_samples_sat((WORD8 *)actual_out_buffer, num_of_out_samples,
3507*15dc779aSAndroid Build Coastguard Worker                              p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz,
3508*15dc779aSAndroid Build Coastguard Worker                              p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.output_buffer,
3509*15dc779aSAndroid Build Coastguard Worker                              &mps_out_samples, 2);
3510*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = mps_out_samples;
3511*15dc779aSAndroid Build Coastguard Worker       }
3512*15dc779aSAndroid Build Coastguard Worker       num_ch = p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.out_ch_count;
3513*15dc779aSAndroid Build Coastguard Worker       if (p_state_enhaacplus_dec->ec_enable) {
3514*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.first_frame) {
3515*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
3516*15dc779aSAndroid Build Coastguard Worker               p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
3517*15dc779aSAndroid Build Coastguard Worker         }
3518*15dc779aSAndroid Build Coastguard Worker       }
3519*15dc779aSAndroid Build Coastguard Worker     } else {
3520*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] != 2) {
3521*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
3522*15dc779aSAndroid Build Coastguard Worker           channel == 1 && total_elements == 1 && num_ch == 1) {
3523*15dc779aSAndroid Build Coastguard Worker         num_ch = 2;
3524*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 1;
3525*15dc779aSAndroid Build Coastguard Worker 
3526*15dc779aSAndroid Build Coastguard Worker       } else {
3527*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 0;
3528*15dc779aSAndroid Build Coastguard Worker       }
3529*15dc779aSAndroid Build Coastguard Worker 
3530*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.ui_n_channels = 2;
3531*15dc779aSAndroid Build Coastguard Worker 
3532*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes +=
3533*15dc779aSAndroid Build Coastguard Worker           p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
3534*15dc779aSAndroid Build Coastguard Worker 
3535*15dc779aSAndroid Build Coastguard Worker     } else {
3536*15dc779aSAndroid Build Coastguard Worker       channel_coupling_flag = 1;
3537*15dc779aSAndroid Build Coastguard Worker     }
3538*15dc779aSAndroid Build Coastguard Worker   }
3539*15dc779aSAndroid Build Coastguard Worker 
3540*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
3541*15dc779aSAndroid Build Coastguard Worker       for (WORD32 j = 0; j < channel; j++) {
3542*15dc779aSAndroid Build Coastguard Worker         for (WORD32 i = 0; i < frame_size; i++) {
3543*15dc779aSAndroid Build Coastguard Worker           intermediate_scr[total_channels * i + j +
3544*15dc779aSAndroid Build Coastguard Worker                            p_state_enhaacplus_dec->slot_pos] =
3545*15dc779aSAndroid Build Coastguard Worker               actual_out_buffer[total_channels * i + j +
3546*15dc779aSAndroid Build Coastguard Worker                                 p_state_enhaacplus_dec->slot_pos];
3547*15dc779aSAndroid Build Coastguard Worker         }
3548*15dc779aSAndroid Build Coastguard Worker       }
3549*15dc779aSAndroid Build Coastguard Worker     }
3550*15dc779aSAndroid Build Coastguard Worker   }
3551*15dc779aSAndroid Build Coastguard Worker 
3552*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
3553*15dc779aSAndroid Build Coastguard Worker     memcpy(time_data, intermediate_scr,
3554*15dc779aSAndroid Build Coastguard Worker            sizeof(WORD16) * frame_size * total_channels);
3555*15dc779aSAndroid Build Coastguard Worker   }
3556*15dc779aSAndroid Build Coastguard Worker 
3557*15dc779aSAndroid Build Coastguard Worker   {
3558*15dc779aSAndroid Build Coastguard Worker     ia_adts_crc_info_struct *ptr_adts_crc_info =
3559*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->ptr_bit_stream->pstr_adts_crc_info;
3560*15dc779aSAndroid Build Coastguard Worker     if (ptr_adts_crc_info->crc_active == 1) {
3561*15dc779aSAndroid Build Coastguard Worker       if ((error_code = ixheaacd_adts_crc_check_crc(ptr_adts_crc_info))) {
3562*15dc779aSAndroid Build Coastguard Worker         if (error_code) {
3563*15dc779aSAndroid Build Coastguard Worker           if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3564*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.frame_status = 0;
3565*15dc779aSAndroid Build Coastguard Worker           } else {
3566*15dc779aSAndroid Build Coastguard Worker             return error_code;
3567*15dc779aSAndroid Build Coastguard Worker           }
3568*15dc779aSAndroid Build Coastguard Worker         }
3569*15dc779aSAndroid Build Coastguard Worker       }
3570*15dc779aSAndroid Build Coastguard Worker     }
3571*15dc779aSAndroid Build Coastguard Worker   }
3572*15dc779aSAndroid Build Coastguard Worker 
3573*15dc779aSAndroid Build Coastguard Worker   p_obj_exhaacplus_dec->aac_config.ui_n_channels = total_channels;
3574*15dc779aSAndroid Build Coastguard Worker 
3575*15dc779aSAndroid Build Coastguard Worker   p_state_enhaacplus_dec->frame_counter++;
3576*15dc779aSAndroid Build Coastguard Worker 
3577*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
3578*15dc779aSAndroid Build Coastguard Worker 
3579*15dc779aSAndroid Build Coastguard Worker   if (channel_coupling_flag) {
3580*15dc779aSAndroid Build Coastguard Worker     error_code = ixheaacd_dec_ind_coupling(p_obj_exhaacplus_dec,
3581*15dc779aSAndroid Build Coastguard Worker                                            p_state_enhaacplus_dec->coup_ch_output,
3582*15dc779aSAndroid Build Coastguard Worker                                            num_of_out_samples, total_channels, time_data);
3583*15dc779aSAndroid Build Coastguard Worker     if (error_code)
3584*15dc779aSAndroid Build Coastguard Worker       return error_code;
3585*15dc779aSAndroid Build Coastguard Worker   }
3586*15dc779aSAndroid Build Coastguard Worker 
3587*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < total_channels; i++) {
3588*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] == 0)
3589*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] =
3590*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0];
3591*15dc779aSAndroid Build Coastguard Worker   }
3592*15dc779aSAndroid Build Coastguard Worker 
3593*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
3594*15dc779aSAndroid Build Coastguard Worker       total_elements == 1 && num_ch == 2 &&
3595*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.dup_stereo_flag == 1) {
3596*15dc779aSAndroid Build Coastguard Worker     WORD i;
3597*15dc779aSAndroid Build Coastguard Worker 
3598*15dc779aSAndroid Build Coastguard Worker     if (!p_state_enhaacplus_dec->sbr_present &&
3599*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
3600*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_size; i++) {
3601*15dc779aSAndroid Build Coastguard Worker         *((WORD32 *)actual_out_buffer + 2 * i + 1) =
3602*15dc779aSAndroid Build Coastguard Worker             *((WORD32 *)actual_out_buffer + 2 * i);
3603*15dc779aSAndroid Build Coastguard Worker       }
3604*15dc779aSAndroid Build Coastguard Worker     } else {
3605*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_size; i++) {
3606*15dc779aSAndroid Build Coastguard Worker         *(actual_out_buffer + 2 * i + 1) = *(actual_out_buffer + 2 * i);
3607*15dc779aSAndroid Build Coastguard Worker       }
3608*15dc779aSAndroid Build Coastguard Worker     }
3609*15dc779aSAndroid Build Coastguard Worker   }
3610*15dc779aSAndroid Build Coastguard Worker 
3611*15dc779aSAndroid Build Coastguard Worker   if (!p_state_enhaacplus_dec->sbr_present &&
3612*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->peak_lim_init == 1 &&
3613*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
3614*15dc779aSAndroid Build Coastguard Worker     if (!p_obj_exhaacplus_dec->aac_config.peak_limiter_off) {
3615*15dc779aSAndroid Build Coastguard Worker       ixheaacd_peak_limiter_process(
3616*15dc779aSAndroid Build Coastguard Worker           &p_state_enhaacplus_dec->peak_limiter, time_data, frame_size,
3617*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->p_state_aac->qshift_adj);
3618*15dc779aSAndroid Build Coastguard Worker     } else {
3619*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_adjust(time_data, frame_size,
3620*15dc779aSAndroid Build Coastguard Worker                             p_obj_exhaacplus_dec->p_state_aac->qshift_adj,
3621*15dc779aSAndroid Build Coastguard Worker                             total_channels);
3622*15dc779aSAndroid Build Coastguard Worker     }
3623*15dc779aSAndroid Build Coastguard Worker 
3624*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < frame_size * 2; i++) {
3625*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < total_channels; j++) {
3626*15dc779aSAndroid Build Coastguard Worker         *((WORD16 *)time_data + total_channels * i + j) =
3627*15dc779aSAndroid Build Coastguard Worker             ixheaac_round16(*((WORD32 *)time_data + total_channels * i + j));
3628*15dc779aSAndroid Build Coastguard Worker       }
3629*15dc779aSAndroid Build Coastguard Worker     }
3630*15dc779aSAndroid Build Coastguard Worker 
3631*15dc779aSAndroid Build Coastguard Worker     memmove(
3632*15dc779aSAndroid Build Coastguard Worker         time_data,
3633*15dc779aSAndroid Build Coastguard Worker         (time_data +
3634*15dc779aSAndroid Build Coastguard Worker          total_channels * p_obj_exhaacplus_dec->p_state_aac->delay_in_samples),
3635*15dc779aSAndroid Build Coastguard Worker         sizeof(WORD16) * num_of_out_samples * total_channels);
3636*15dc779aSAndroid Build Coastguard Worker 
3637*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->delay_in_samples =
3638*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->p_state_aac->delay_in_samples -
3639*15dc779aSAndroid Build Coastguard Worker         MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, (UWORD16)frame_size);
3640*15dc779aSAndroid Build Coastguard Worker   }
3641*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present == 1) {
3642*15dc779aSAndroid Build Coastguard Worker     ia_heaac_mps_state_struct *pstr_mps_state =
3643*15dc779aSAndroid Build Coastguard Worker         &p_state_enhaacplus_dec->heaac_mps_handle;
3644*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->sbr_present == 0) {
3645*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1;
3646*15dc779aSAndroid Build Coastguard Worker     } else {
3647*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->heaac_mps_handle.mps_with_sbr = 1;
3648*15dc779aSAndroid Build Coastguard Worker     }
3649*15dc779aSAndroid Build Coastguard Worker     if (!p_obj_exhaacplus_dec->aac_config.ui_enh_sbr)
3650*15dc779aSAndroid Build Coastguard Worker     {
3651*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1;
3652*15dc779aSAndroid Build Coastguard Worker     }
3653*15dc779aSAndroid Build Coastguard Worker     if (p_state_enhaacplus_dec->heaac_mps_handle.mps_init_done == 1) {
3654*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.frame_ok =
3655*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.frame_status;
3656*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.ec_flag =
3657*15dc779aSAndroid Build Coastguard Worker           p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
3658*15dc779aSAndroid Build Coastguard Worker 
3659*15dc779aSAndroid Build Coastguard Worker       ixheaacd_heaac_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer,
3660*15dc779aSAndroid Build Coastguard Worker                                mps_buffer,
3661*15dc779aSAndroid Build Coastguard Worker                                p_state_enhaacplus_dec->ui_mps_out_bytes);
3662*15dc779aSAndroid Build Coastguard Worker 
3663*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1;
3664*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
3665*15dc779aSAndroid Build Coastguard Worker           (pstr_mps_state->num_output_channels_at *
3666*15dc779aSAndroid Build Coastguard Worker            pstr_mps_state->frame_length *
3667*15dc779aSAndroid Build Coastguard Worker            (p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz >> 3));
3668*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.first_frame = 0;
3669*15dc779aSAndroid Build Coastguard Worker     }
3670*15dc779aSAndroid Build Coastguard Worker   }
3671*15dc779aSAndroid Build Coastguard Worker   if ((total_channels > 2) && (1 == p_obj_exhaacplus_dec->aac_config.downmix)) {
3672*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dec_downmix_to_stereo(p_obj_exhaacplus_dec, num_of_out_samples,
3673*15dc779aSAndroid Build Coastguard Worker                                    total_elements, time_data, total_channels);
3674*15dc779aSAndroid Build Coastguard Worker 
3675*15dc779aSAndroid Build Coastguard Worker     total_channels = 2;
3676*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
3677*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->num_of_out_samples * 2 * sizeof(WORD16);
3678*15dc779aSAndroid Build Coastguard Worker   }
3679*15dc779aSAndroid Build Coastguard Worker 
3680*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.flag_downmix && total_channels == 2) {
3681*15dc779aSAndroid Build Coastguard Worker     WORD32 out_ch = 1;
3682*15dc779aSAndroid Build Coastguard Worker     WORD i;
3683*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1) {
3684*15dc779aSAndroid Build Coastguard Worker       out_ch = 2;
3685*15dc779aSAndroid Build Coastguard Worker     }
3686*15dc779aSAndroid Build Coastguard Worker 
3687*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.ui_n_channels = out_ch;
3688*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
3689*15dc779aSAndroid Build Coastguard Worker         p_state_enhaacplus_dec->num_of_out_samples * out_ch * sizeof(WORD16);
3690*15dc779aSAndroid Build Coastguard Worker 
3691*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_of_out_samples; i++) {
3692*15dc779aSAndroid Build Coastguard Worker       WORD16 temp;
3693*15dc779aSAndroid Build Coastguard Worker 
3694*15dc779aSAndroid Build Coastguard Worker       temp = (time_data[2 * i + 0] >> 1) + (time_data[2 * i + 1] >> 1);
3695*15dc779aSAndroid Build Coastguard Worker 
3696*15dc779aSAndroid Build Coastguard Worker       if (out_ch == 2) {
3697*15dc779aSAndroid Build Coastguard Worker         time_data[2 * i + 0] = temp;
3698*15dc779aSAndroid Build Coastguard Worker         time_data[2 * i + 1] = time_data[2 * i + 0];
3699*15dc779aSAndroid Build Coastguard Worker       } else {
3700*15dc779aSAndroid Build Coastguard Worker         time_data[i] = temp;
3701*15dc779aSAndroid Build Coastguard Worker       }
3702*15dc779aSAndroid Build Coastguard Worker     }
3703*15dc779aSAndroid Build Coastguard Worker   }
3704*15dc779aSAndroid Build Coastguard Worker 
3705*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->s_adts_hdr_present) {
3706*15dc779aSAndroid Build Coastguard Worker     if (adts.no_raw_data_blocks != 0) {
3707*15dc779aSAndroid Build Coastguard Worker       if (adts.protection_absent == 0 && it_bit_buff->cnt_bits >= 16) {
3708*15dc779aSAndroid Build Coastguard Worker         adts.crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
3709*15dc779aSAndroid Build Coastguard Worker       }
3710*15dc779aSAndroid Build Coastguard Worker     }
3711*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->b_n_raw_data_blk--;
3712*15dc779aSAndroid Build Coastguard Worker   }
3713*15dc779aSAndroid Build Coastguard Worker 
3714*15dc779aSAndroid Build Coastguard Worker   ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
3715*15dc779aSAndroid Build Coastguard Worker 
3716*15dc779aSAndroid Build Coastguard Worker   if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT)
3717*15dc779aSAndroid Build Coastguard Worker     p_state_enhaacplus_dec->i_bytes_consumed =
3718*15dc779aSAndroid Build Coastguard Worker         (WORD32)(audio_mux_length_bytes_last + bytes_for_sync);
3719*15dc779aSAndroid Build Coastguard Worker 
3720*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal &&
3721*15dc779aSAndroid Build Coastguard Worker       p_obj_exhaacplus_dec->aac_config.first_frame) {
3722*15dc779aSAndroid Build Coastguard Worker     p_obj_exhaacplus_dec->aac_config.first_frame = 0;
3723*15dc779aSAndroid Build Coastguard Worker   }
3724*15dc779aSAndroid Build Coastguard Worker 
3725*15dc779aSAndroid Build Coastguard Worker   if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
3726*15dc779aSAndroid Build Coastguard Worker     if (p_obj_exhaacplus_dec->aac_config.frame_status != 1) {
3727*15dc779aSAndroid Build Coastguard Worker       p_state_enhaacplus_dec->i_bytes_consumed = p_state_enhaacplus_dec->ui_in_bytes;
3728*15dc779aSAndroid Build Coastguard Worker     }
3729*15dc779aSAndroid Build Coastguard Worker     return IA_NO_ERROR;
3730*15dc779aSAndroid Build Coastguard Worker   } else {
3731*15dc779aSAndroid Build Coastguard Worker     return error_code;
3732*15dc779aSAndroid Build Coastguard Worker   }
3733*15dc779aSAndroid Build Coastguard Worker }
3734