xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_decode_main.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_arith_dec.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_create.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_dec_main.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_headerdecode.h"
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
ixheaacd_samples_sat(WORD8 * outbuffer,WORD32 num_samples_out,WORD32 pcmsize,FLOAT32 (* out_samples)[4096],WORD32 * out_bytes,WORD32 num_channel_out)82*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out,
83*15dc779aSAndroid Build Coastguard Worker                           WORD32 pcmsize, FLOAT32 (*out_samples)[4096],
84*15dc779aSAndroid Build Coastguard Worker                           WORD32 *out_bytes, WORD32 num_channel_out) {
85*15dc779aSAndroid Build Coastguard Worker   WORD32 num;
86*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
87*15dc779aSAndroid Build Coastguard Worker   WORD32 write_local;
88*15dc779aSAndroid Build Coastguard Worker   FLOAT32 write_local_float;
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker   WORD16 *out_buf = (WORD16 *)outbuffer;
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   num = num_channel_out * num_samples_out;
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker   if (pcmsize == 16) {
95*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num; i++) {
96*15dc779aSAndroid Build Coastguard Worker       write_local_float =
97*15dc779aSAndroid Build Coastguard Worker           (out_samples[i % num_channel_out][i / num_channel_out]);
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker       if (write_local_float > 32767.0f) {
100*15dc779aSAndroid Build Coastguard Worker         write_local_float = 32767.0f;
101*15dc779aSAndroid Build Coastguard Worker       } else if (write_local_float < -32768.0f) {
102*15dc779aSAndroid Build Coastguard Worker         write_local_float = -32768.0f;
103*15dc779aSAndroid Build Coastguard Worker       }
104*15dc779aSAndroid Build Coastguard Worker       out_buf[i] = (WORD16)write_local_float;
105*15dc779aSAndroid Build Coastguard Worker     }
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker     *out_bytes = num * sizeof(WORD16);
108*15dc779aSAndroid Build Coastguard Worker   } else {
109*15dc779aSAndroid Build Coastguard Worker     WORD8 *out_24bit = (WORD8 *)out_buf;
110*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num; i++) {
111*15dc779aSAndroid Build Coastguard Worker       write_local_float =
112*15dc779aSAndroid Build Coastguard Worker           (out_samples[i % num_channel_out][i / num_channel_out] * 256);
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker       if (write_local_float > 8388607.0f) {
115*15dc779aSAndroid Build Coastguard Worker         write_local_float = 8388607.0f;
116*15dc779aSAndroid Build Coastguard Worker       } else if (write_local_float < -8388608.0f) {
117*15dc779aSAndroid Build Coastguard Worker         write_local_float = -8388608.0f;
118*15dc779aSAndroid Build Coastguard Worker       }
119*15dc779aSAndroid Build Coastguard Worker       write_local = (WORD32)write_local_float;
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker       *out_24bit++ = (WORD32)write_local & 0xff;
122*15dc779aSAndroid Build Coastguard Worker       *out_24bit++ = ((WORD32)write_local >> 8) & 0xff;
123*15dc779aSAndroid Build Coastguard Worker       *out_24bit++ = ((WORD32)write_local >> 16) & 0xff;
124*15dc779aSAndroid Build Coastguard Worker     }
125*15dc779aSAndroid Build Coastguard Worker 
126*15dc779aSAndroid Build Coastguard Worker     *out_bytes = num * 3 * sizeof(WORD8);
127*15dc779aSAndroid Build Coastguard Worker   }
128*15dc779aSAndroid Build Coastguard Worker }
129*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_samples_sat_mc(WORD8 * outbuffer,WORD32 num_samples_out,FLOAT32 (* out_samples)[4096],WORD32 * out_bytes,WORD32 num_channel_out,WORD32 ch_fac)130*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_samples_sat_mc(WORD8* outbuffer, WORD32 num_samples_out,
131*15dc779aSAndroid Build Coastguard Worker     FLOAT32(*out_samples)[4096], WORD32* out_bytes,
132*15dc779aSAndroid Build Coastguard Worker     WORD32 num_channel_out, WORD32 ch_fac) {
133*15dc779aSAndroid Build Coastguard Worker   WORD32 num;
134*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
135*15dc779aSAndroid Build Coastguard Worker   FLOAT32 write_local_float;
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker   WORD16* out_buf = (WORD16*)outbuffer;
138*15dc779aSAndroid Build Coastguard Worker 
139*15dc779aSAndroid Build Coastguard Worker   num = num_channel_out * num_samples_out;
140*15dc779aSAndroid Build Coastguard Worker   if (num_channel_out == 1) {
141*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num; i++) {
142*15dc779aSAndroid Build Coastguard Worker       write_local_float =
143*15dc779aSAndroid Build Coastguard Worker           (out_samples[i % num_channel_out][i / num_channel_out]);
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker       if (write_local_float > 32767.0f) {
146*15dc779aSAndroid Build Coastguard Worker         write_local_float = 32767.0f;
147*15dc779aSAndroid Build Coastguard Worker       } else if (write_local_float < -32768.0f) {
148*15dc779aSAndroid Build Coastguard Worker         write_local_float = -32768.0f;
149*15dc779aSAndroid Build Coastguard Worker       }
150*15dc779aSAndroid Build Coastguard Worker       out_buf[i * ch_fac] = (WORD16)write_local_float;
151*15dc779aSAndroid Build Coastguard Worker     }
152*15dc779aSAndroid Build Coastguard Worker   } else if (num_channel_out == 2) {
153*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_samples_out; i++) {
154*15dc779aSAndroid Build Coastguard Worker       write_local_float =
155*15dc779aSAndroid Build Coastguard Worker           (out_samples[(2*i) % num_channel_out][(2 * i) / num_channel_out]);
156*15dc779aSAndroid Build Coastguard Worker 
157*15dc779aSAndroid Build Coastguard Worker       if (write_local_float > 32767.0f) {
158*15dc779aSAndroid Build Coastguard Worker           write_local_float = 32767.0f;
159*15dc779aSAndroid Build Coastguard Worker       } else if (write_local_float < -32768.0f) {
160*15dc779aSAndroid Build Coastguard Worker           write_local_float = -32768.0f;
161*15dc779aSAndroid Build Coastguard Worker       }
162*15dc779aSAndroid Build Coastguard Worker       out_buf[i * ch_fac] = (WORD16)write_local_float;
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker       write_local_float =
165*15dc779aSAndroid Build Coastguard Worker           (out_samples[((2 * i) + 1) % num_channel_out][((2 * i) + 1) / num_channel_out]);
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker       if (write_local_float > 32767.0f) {
168*15dc779aSAndroid Build Coastguard Worker           write_local_float = 32767.0f;
169*15dc779aSAndroid Build Coastguard Worker       } else if (write_local_float < -32768.0f) {
170*15dc779aSAndroid Build Coastguard Worker           write_local_float = -32768.0f;
171*15dc779aSAndroid Build Coastguard Worker       }
172*15dc779aSAndroid Build Coastguard Worker       out_buf[i * ch_fac + 1] = (WORD16)write_local_float;
173*15dc779aSAndroid Build Coastguard Worker     }
174*15dc779aSAndroid Build Coastguard Worker   }
175*15dc779aSAndroid Build Coastguard Worker   *out_bytes = num * sizeof(WORD16);
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker /* audio pre roll frame parsing*/
ixheaacd_audio_preroll_parsing(ia_dec_data_struct * pstr_dec_data,UWORD8 * conf_buf,WORD32 * preroll_units,WORD32 * preroll_frame_offset,ia_aac_dec_state_struct * aac_dec_handle,WORD32 * config_changed,WORD32 * apply_crossfade)179*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_audio_preroll_parsing(
180*15dc779aSAndroid Build Coastguard Worker     ia_dec_data_struct *pstr_dec_data, UWORD8 *conf_buf, WORD32 *preroll_units,
181*15dc779aSAndroid Build Coastguard Worker     WORD32 *preroll_frame_offset, ia_aac_dec_state_struct *aac_dec_handle,
182*15dc779aSAndroid Build Coastguard Worker     WORD32 *config_changed, WORD32 *apply_crossfade) {
183*15dc779aSAndroid Build Coastguard Worker   ia_bit_buf_struct *temp_buff =
184*15dc779aSAndroid Build Coastguard Worker       (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf);
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker   WORD32 ext_ele_present = 0;
187*15dc779aSAndroid Build Coastguard Worker   WORD32 ext_ele_use_dflt_len = 0;
188*15dc779aSAndroid Build Coastguard Worker   WORD32 ext_ele_payload_len = 0;
189*15dc779aSAndroid Build Coastguard Worker   WORD32 num_pre_roll_frames = 0;
190*15dc779aSAndroid Build Coastguard Worker 
191*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_idx = 0;
192*15dc779aSAndroid Build Coastguard Worker   WORD32 temp = 0;
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker   WORD32 config_len = 0;
195*15dc779aSAndroid Build Coastguard Worker   WORD32 loop;
196*15dc779aSAndroid Build Coastguard Worker 
197*15dc779aSAndroid Build Coastguard Worker   if (pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
198*15dc779aSAndroid Build Coastguard Worker           .str_usac_dec_config.usac_element_type[0] == ID_USAC_EXT) {
199*15dc779aSAndroid Build Coastguard Worker     temp = ixheaacd_show_bits_buf(temp_buff, 3);
200*15dc779aSAndroid Build Coastguard Worker     ext_ele_present = (temp >> 1) & 0x1;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker     if (ext_ele_present) {
203*15dc779aSAndroid Build Coastguard Worker       ext_ele_use_dflt_len = temp & 0x1;
204*15dc779aSAndroid Build Coastguard Worker       if (ext_ele_use_dflt_len != 0) return 0;
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(temp_buff, 3);
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker       ext_ele_payload_len = ixheaacd_read_bits_buf(temp_buff, 8);
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker       if (ext_ele_payload_len == 255) {
211*15dc779aSAndroid Build Coastguard Worker         WORD32 val_add = 0;
212*15dc779aSAndroid Build Coastguard Worker         val_add = ixheaacd_read_bits_buf(temp_buff, 16);
213*15dc779aSAndroid Build Coastguard Worker         ext_ele_payload_len =
214*15dc779aSAndroid Build Coastguard Worker             (UWORD32)((WORD32)ext_ele_payload_len + val_add - 2);
215*15dc779aSAndroid Build Coastguard Worker       }
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker       config_len = ixheaacd_read_bits_buf(temp_buff, 4);
218*15dc779aSAndroid Build Coastguard Worker       if (config_len == 15) {
219*15dc779aSAndroid Build Coastguard Worker         WORD32 val_add = 0;
220*15dc779aSAndroid Build Coastguard Worker         val_add = ixheaacd_read_bits_buf(temp_buff, 4);
221*15dc779aSAndroid Build Coastguard Worker         config_len += val_add;
222*15dc779aSAndroid Build Coastguard Worker         if (val_add == 15) {
223*15dc779aSAndroid Build Coastguard Worker           WORD32 val_add1 = 0;
224*15dc779aSAndroid Build Coastguard Worker           val_add1 = ixheaacd_read_bits_buf(temp_buff, 8);
225*15dc779aSAndroid Build Coastguard Worker           config_len += val_add1;
226*15dc779aSAndroid Build Coastguard Worker         }
227*15dc779aSAndroid Build Coastguard Worker       }
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker       for (loop = 0; loop < config_len; loop++)
230*15dc779aSAndroid Build Coastguard Worker         conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8);
231*15dc779aSAndroid Build Coastguard Worker 
232*15dc779aSAndroid Build Coastguard Worker       if (aac_dec_handle->preroll_config_present == 1) {
233*15dc779aSAndroid Build Coastguard Worker         if (!(memcmp(aac_dec_handle->preroll_config_prev, conf_buf,
234*15dc779aSAndroid Build Coastguard Worker                      sizeof(UWORD8) * config_len))) {
235*15dc779aSAndroid Build Coastguard Worker           config_len = 0;
236*15dc779aSAndroid Build Coastguard Worker         }
237*15dc779aSAndroid Build Coastguard Worker         if (memcmp(aac_dec_handle->preroll_config_prev, conf_buf,
238*15dc779aSAndroid Build Coastguard Worker                    sizeof(UWORD8) * config_len) != 0) {
239*15dc779aSAndroid Build Coastguard Worker           *config_changed = 1;
240*15dc779aSAndroid Build Coastguard Worker         } else {
241*15dc779aSAndroid Build Coastguard Worker           *config_changed = 0;
242*15dc779aSAndroid Build Coastguard Worker         }
243*15dc779aSAndroid Build Coastguard Worker       }
244*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->preroll_config_present = 1;
245*15dc779aSAndroid Build Coastguard Worker       memcpy(aac_dec_handle->preroll_config_prev, conf_buf,
246*15dc779aSAndroid Build Coastguard Worker              sizeof(UWORD8) * config_len);
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker       *apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1);
249*15dc779aSAndroid Build Coastguard Worker       ixheaacd_read_bits_buf(temp_buff, 1);
250*15dc779aSAndroid Build Coastguard Worker 
251*15dc779aSAndroid Build Coastguard Worker       num_pre_roll_frames = ixheaacd_read_bits_buf(temp_buff, 2);
252*15dc779aSAndroid Build Coastguard Worker       if (num_pre_roll_frames == 3) {
253*15dc779aSAndroid Build Coastguard Worker         WORD32 val_add = 0;
254*15dc779aSAndroid Build Coastguard Worker         val_add = ixheaacd_read_bits_buf(temp_buff, 4);
255*15dc779aSAndroid Build Coastguard Worker         num_pre_roll_frames += val_add;
256*15dc779aSAndroid Build Coastguard Worker       }
257*15dc779aSAndroid Build Coastguard Worker 
258*15dc779aSAndroid Build Coastguard Worker       if (num_pre_roll_frames > MAX_AUDIO_PREROLLS) {
259*15dc779aSAndroid Build Coastguard Worker         if (pstr_dec_data->str_usac_data.ec_flag) {
260*15dc779aSAndroid Build Coastguard Worker           num_pre_roll_frames = 0;
261*15dc779aSAndroid Build Coastguard Worker           longjmp(*(pstr_dec_data->xaac_jmp_buf),
262*15dc779aSAndroid Build Coastguard Worker                   IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
263*15dc779aSAndroid Build Coastguard Worker         } else {
264*15dc779aSAndroid Build Coastguard Worker           return IA_FATAL_ERROR;
265*15dc779aSAndroid Build Coastguard Worker         }
266*15dc779aSAndroid Build Coastguard Worker       }
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker       for (frame_idx = 0; frame_idx < num_pre_roll_frames; frame_idx++) {
269*15dc779aSAndroid Build Coastguard Worker         WORD32 au_len = 0;
270*15dc779aSAndroid Build Coastguard Worker         au_len = ixheaacd_read_bits_buf(temp_buff, 16);
271*15dc779aSAndroid Build Coastguard Worker         if (au_len == 65535) {
272*15dc779aSAndroid Build Coastguard Worker           WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16);
273*15dc779aSAndroid Build Coastguard Worker           au_len += val_add;
274*15dc779aSAndroid Build Coastguard Worker         }
275*15dc779aSAndroid Build Coastguard Worker         if (config_len != 0) {
276*15dc779aSAndroid Build Coastguard Worker           preroll_frame_offset[frame_idx] =
277*15dc779aSAndroid Build Coastguard Worker               temp_buff->size - temp_buff->cnt_bits;
278*15dc779aSAndroid Build Coastguard Worker         }
279*15dc779aSAndroid Build Coastguard Worker         temp_buff->ptr_read_next += au_len;
280*15dc779aSAndroid Build Coastguard Worker         temp_buff->cnt_bits -= au_len * 8;
281*15dc779aSAndroid Build Coastguard Worker         if (temp_buff->cnt_bits < 0) {
282*15dc779aSAndroid Build Coastguard Worker           if (pstr_dec_data->str_usac_data.ec_flag) {
283*15dc779aSAndroid Build Coastguard Worker             temp_buff->cnt_bits = 0;
284*15dc779aSAndroid Build Coastguard Worker             longjmp(*(pstr_dec_data->xaac_jmp_buf),
285*15dc779aSAndroid Build Coastguard Worker                     IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
286*15dc779aSAndroid Build Coastguard Worker           } else {
287*15dc779aSAndroid Build Coastguard Worker             return IA_FATAL_ERROR;
288*15dc779aSAndroid Build Coastguard Worker           }
289*15dc779aSAndroid Build Coastguard Worker         }
290*15dc779aSAndroid Build Coastguard Worker       }
291*15dc779aSAndroid Build Coastguard Worker     }
292*15dc779aSAndroid Build Coastguard Worker   }
293*15dc779aSAndroid Build Coastguard Worker   if (config_len == 0)
294*15dc779aSAndroid Build Coastguard Worker     *preroll_units = 0;
295*15dc779aSAndroid Build Coastguard Worker   else
296*15dc779aSAndroid Build Coastguard Worker     *preroll_units = num_pre_roll_frames;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker   return config_len;
299*15dc779aSAndroid Build Coastguard Worker }
300*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_main(VOID * temp_handle,WORD8 * inbuffer,WORD8 * outbuffer,WORD32 * out_bytes,WORD32 frames_done,WORD32 pcmsize,WORD32 * num_channel_out)301*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer,
302*15dc779aSAndroid Build Coastguard Worker                          WORD32 *out_bytes, WORD32 frames_done, WORD32 pcmsize,
303*15dc779aSAndroid Build Coastguard Worker                          WORD32 *num_channel_out) {
304*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
305*15dc779aSAndroid Build Coastguard Worker   ia_exhaacplus_dec_api_struct *handle =
306*15dc779aSAndroid Build Coastguard Worker       (ia_exhaacplus_dec_api_struct *)temp_handle;
307*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *aac_dec_handle = handle->p_state_aac;
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker   WORD32 tmp;
310*15dc779aSAndroid Build Coastguard Worker   ia_audio_specific_config_struct *pstr_audio_specific_config =
311*15dc779aSAndroid Build Coastguard Worker       (ia_audio_specific_config_struct *)
312*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ia_audio_specific_config;
313*15dc779aSAndroid Build Coastguard Worker   WORD32 suitable_tracks = 1;
314*15dc779aSAndroid Build Coastguard Worker   WORD32 num_samples_out;
315*15dc779aSAndroid Build Coastguard Worker   ia_dec_data_struct *pstr_dec_data;
316*15dc779aSAndroid Build Coastguard Worker   UWORD8 config[MAX_PREROLL_SIZE];
317*15dc779aSAndroid Build Coastguard Worker   WORD32 config_len;
318*15dc779aSAndroid Build Coastguard Worker   WORD32 delay;
319*15dc779aSAndroid Build Coastguard Worker   WORD preroll_frame_offset[MAX_PREROLL_FRAME_OFFSET] = {0};
320*15dc779aSAndroid Build Coastguard Worker   WORD preroll_units = -1;
321*15dc779aSAndroid Build Coastguard Worker   WORD32 access_units = 0;
322*15dc779aSAndroid Build Coastguard Worker   WORD32 bits_consumed = 0;
323*15dc779aSAndroid Build Coastguard Worker 
324*15dc779aSAndroid Build Coastguard Worker   if (frames_done == 0) {
325*15dc779aSAndroid Build Coastguard Worker     if ((pstr_audio_specific_config->channel_configuration > 2) ||
326*15dc779aSAndroid Build Coastguard Worker         (pstr_audio_specific_config->channel_configuration == 0)) {
327*15dc779aSAndroid Build Coastguard Worker       return -1;
328*15dc779aSAndroid Build Coastguard Worker     }
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data = (ia_dec_data_struct *)aac_dec_handle->pstr_dec_data;
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker     tmp = pstr_audio_specific_config->channel_configuration;
333*15dc779aSAndroid Build Coastguard Worker 
334*15dc779aSAndroid Build Coastguard Worker     suitable_tracks =
335*15dc779aSAndroid Build Coastguard Worker         ixheaacd_frm_data_init(pstr_audio_specific_config, pstr_dec_data);
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker     pstr_audio_specific_config->channel_configuration = tmp;
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker     if (suitable_tracks <= 0) {
340*15dc779aSAndroid Build Coastguard Worker       return -1;
341*15dc779aSAndroid Build Coastguard Worker     }
342*15dc779aSAndroid Build Coastguard Worker   }
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker   {
345*15dc779aSAndroid Build Coastguard Worker     WORD32 tot_out_bytes = 0;
346*15dc779aSAndroid Build Coastguard Worker     jmp_buf local;
347*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data = (ia_dec_data_struct *)aac_dec_handle->pstr_dec_data;
348*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.frame_ok = 1;
349*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.ec_flag = aac_dec_handle->p_config->ui_err_conceal;
350*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->str_usac_data.ec_flag) {
351*15dc779aSAndroid Build Coastguard Worker       err = setjmp(local);
352*15dc779aSAndroid Build Coastguard Worker     }
353*15dc779aSAndroid Build Coastguard Worker 
354*15dc779aSAndroid Build Coastguard Worker     if (aac_dec_handle->p_config->ui_err_conceal) {
355*15dc779aSAndroid Build Coastguard Worker       if (err == 0) {
356*15dc779aSAndroid Build Coastguard Worker         if (pstr_dec_data->dec_bit_buf.cnt_bits) {
357*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->ui_in_bytes += (pstr_dec_data->dec_bit_buf.cnt_bits >> 3);
358*15dc779aSAndroid Build Coastguard Worker           if (aac_dec_handle->ui_in_bytes > IA_MAX_INP_BUFFER_SIZE) {
359*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->ui_in_bytes = 0;
360*15dc779aSAndroid Build Coastguard Worker           }
361*15dc779aSAndroid Build Coastguard Worker         }
362*15dc779aSAndroid Build Coastguard Worker       } else {
363*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.frame_ok = 0;
364*15dc779aSAndroid Build Coastguard Worker       }
365*15dc779aSAndroid Build Coastguard Worker     }
366*15dc779aSAndroid Build Coastguard Worker 
367*15dc779aSAndroid Build Coastguard Worker     if (frames_done == 0) {
368*15dc779aSAndroid Build Coastguard Worker       WORD32 delay;
369*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->str_usac_data.first_frame = 1;
370*15dc779aSAndroid Build Coastguard Worker       if (aac_dec_handle->decode_create_done == 0) {
371*15dc779aSAndroid Build Coastguard Worker         delay = ixheaacd_decode_create(
372*15dc779aSAndroid Build Coastguard Worker             handle, pstr_dec_data,
373*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_frame_data.scal_out_select + 1);
374*15dc779aSAndroid Build Coastguard Worker         if (delay == -1) return -1;
375*15dc779aSAndroid Build Coastguard Worker       }
376*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.max_size =
377*15dc779aSAndroid Build Coastguard Worker           handle->p_mem_info_aac[IA_MEMTYPE_INPUT].ui_size;
378*15dc779aSAndroid Build Coastguard Worker       *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels;
379*15dc779aSAndroid Build Coastguard Worker       return 0;
380*15dc779aSAndroid Build Coastguard Worker     }
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer;
383*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3;
384*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_bit_buf_end =
385*15dc779aSAndroid Build Coastguard Worker         (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1;
386*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer;
387*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.bit_pos = 7;
388*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size;
389*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
390*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->str_usac_data.ec_flag) {
391*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->xaac_jmp_buf = &local;
392*15dc779aSAndroid Build Coastguard Worker     }
393*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag;
394*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.esbr_hq = handle->aac_config.ui_hq_esbr;
395*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.enh_sbr = 1;
396*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.enh_sbr_ps = handle->aac_config.ui_enh_sbr_ps;
397*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->dec_bit_buf.size > pstr_dec_data->dec_bit_buf.max_size)
398*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.max_size = pstr_dec_data->dec_bit_buf.size;
399*15dc779aSAndroid Build Coastguard Worker     /* audio pre roll frame parsing*/
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker     if (aac_dec_handle->bs_format == LOAS_BSFORMAT && pstr_dec_data->str_usac_data.frame_ok) {
402*15dc779aSAndroid Build Coastguard Worker       WORD32 sync = ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 11);
403*15dc779aSAndroid Build Coastguard Worker       if (sync == 0x2b7) {
404*15dc779aSAndroid Build Coastguard Worker         WORD32 result = ixheaacd_latm_audio_mux_element(
405*15dc779aSAndroid Build Coastguard Worker           &pstr_dec_data->dec_bit_buf, &aac_dec_handle->latm_struct_element,
406*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle,
407*15dc779aSAndroid Build Coastguard Worker           (ia_sampling_rate_info_struct *)&handle->aac_tables
408*15dc779aSAndroid Build Coastguard Worker           .pstr_huffmann_tables->str_sample_rate_info[0]);
409*15dc779aSAndroid Build Coastguard Worker         if (result < 0) {
410*15dc779aSAndroid Build Coastguard Worker           if (aac_dec_handle->p_config->ui_err_conceal)
411*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.frame_ok = 0;
412*15dc779aSAndroid Build Coastguard Worker           else
413*15dc779aSAndroid Build Coastguard Worker             return result;
414*15dc779aSAndroid Build Coastguard Worker         }
415*15dc779aSAndroid Build Coastguard Worker       }
416*15dc779aSAndroid Build Coastguard Worker       bits_consumed = pstr_dec_data->dec_bit_buf.size - pstr_dec_data->dec_bit_buf.cnt_bits;
417*15dc779aSAndroid Build Coastguard Worker     }
418*15dc779aSAndroid Build Coastguard Worker 
419*15dc779aSAndroid Build Coastguard Worker     do {
420*15dc779aSAndroid Build Coastguard Worker       config_len = 0;
421*15dc779aSAndroid Build Coastguard Worker       if (err == 0 || aac_dec_handle->p_config->ui_err_conceal == 0) {
422*15dc779aSAndroid Build Coastguard Worker         if (access_units == 0 &&
423*15dc779aSAndroid Build Coastguard Worker             pstr_audio_specific_config->str_usac_config.str_usac_dec_config.preroll_flag) {
424*15dc779aSAndroid Build Coastguard Worker           config_len = ixheaacd_audio_preroll_parsing(
425*15dc779aSAndroid Build Coastguard Worker               pstr_dec_data, &config[0], &preroll_units, &preroll_frame_offset[0], aac_dec_handle,
426*15dc779aSAndroid Build Coastguard Worker               &aac_dec_handle->drc_config_changed, &aac_dec_handle->apply_crossfade);
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker           if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR;
429*15dc779aSAndroid Build Coastguard Worker         }
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker         if (config_len != 0) {
432*15dc779aSAndroid Build Coastguard Worker           ia_bit_buf_struct config_bit_buf = {0};
433*15dc779aSAndroid Build Coastguard Worker 
434*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.ptr_bit_buf_base = config;
435*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.size = config_len << 3;
436*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.ptr_read_next = config_bit_buf.ptr_bit_buf_base;
437*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.ptr_bit_buf_end = (UWORD8 *)config + config_len;
438*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.bit_pos = 7;
439*15dc779aSAndroid Build Coastguard Worker           config_bit_buf.cnt_bits = config_bit_buf.size;
440*15dc779aSAndroid Build Coastguard Worker           if (pstr_dec_data->str_usac_data.ec_flag) {
441*15dc779aSAndroid Build Coastguard Worker             config_bit_buf.xaac_jmp_buf = &local;
442*15dc779aSAndroid Build Coastguard Worker           } else {
443*15dc779aSAndroid Build Coastguard Worker             config_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
444*15dc779aSAndroid Build Coastguard Worker           }
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker           suitable_tracks = ixheaacd_frm_data_init(pstr_audio_specific_config, pstr_dec_data);
447*15dc779aSAndroid Build Coastguard Worker 
448*15dc779aSAndroid Build Coastguard Worker           if (suitable_tracks <= 0) return -1;
449*15dc779aSAndroid Build Coastguard Worker 
450*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->decode_create_done = 0;
451*15dc779aSAndroid Build Coastguard Worker           if (aac_dec_handle->p_config->ui_err_conceal) {
452*15dc779aSAndroid Build Coastguard Worker             if (pstr_dec_data->str_usac_data.frame_ok == 1 && err == 0) {
453*15dc779aSAndroid Build Coastguard Worker               err = ixheaacd_config(
454*15dc779aSAndroid Build Coastguard Worker                   &config_bit_buf,
455*15dc779aSAndroid Build Coastguard Worker                   &(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config),
456*15dc779aSAndroid Build Coastguard Worker                   &(pstr_audio_specific_config->channel_configuration),
457*15dc779aSAndroid Build Coastguard Worker                   aac_dec_handle->p_config->ui_err_conceal);
458*15dc779aSAndroid Build Coastguard Worker               if (err != 0) {
459*15dc779aSAndroid Build Coastguard Worker                 if (frames_done == 0)
460*15dc779aSAndroid Build Coastguard Worker                   return -1;
461*15dc779aSAndroid Build Coastguard Worker                 else
462*15dc779aSAndroid Build Coastguard Worker                   pstr_dec_data->str_usac_data.frame_ok = 0;
463*15dc779aSAndroid Build Coastguard Worker               }
464*15dc779aSAndroid Build Coastguard Worker             }
465*15dc779aSAndroid Build Coastguard Worker           } else {
466*15dc779aSAndroid Build Coastguard Worker             err = ixheaacd_config(
467*15dc779aSAndroid Build Coastguard Worker                 &config_bit_buf,
468*15dc779aSAndroid Build Coastguard Worker                 &(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config),
469*15dc779aSAndroid Build Coastguard Worker                 &(pstr_audio_specific_config->channel_configuration),
470*15dc779aSAndroid Build Coastguard Worker                 aac_dec_handle->p_config->ui_err_conceal);
471*15dc779aSAndroid Build Coastguard Worker             if (err != 0) {
472*15dc779aSAndroid Build Coastguard Worker               return err;
473*15dc779aSAndroid Build Coastguard Worker             }
474*15dc779aSAndroid Build Coastguard Worker           }
475*15dc779aSAndroid Build Coastguard Worker 
476*15dc779aSAndroid Build Coastguard Worker           pstr_dec_data->str_frame_data.str_audio_specific_config.sampling_frequency =
477*15dc779aSAndroid Build Coastguard Worker               pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
478*15dc779aSAndroid Build Coastguard Worker                   .usac_sampling_frequency;
479*15dc779aSAndroid Build Coastguard Worker           delay = ixheaacd_decode_create(handle, pstr_dec_data,
480*15dc779aSAndroid Build Coastguard Worker                                          pstr_dec_data->str_frame_data.scal_out_select + 1);
481*15dc779aSAndroid Build Coastguard Worker           if (delay == -1) return -1;
482*15dc779aSAndroid Build Coastguard Worker           *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels;
483*15dc779aSAndroid Build Coastguard Worker         }
484*15dc779aSAndroid Build Coastguard Worker       } else {
485*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.frame_ok = 0;
486*15dc779aSAndroid Build Coastguard Worker       }
487*15dc779aSAndroid Build Coastguard Worker 
488*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer;
489*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3;
490*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.ptr_bit_buf_end =
491*15dc779aSAndroid Build Coastguard Worker           (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1;
492*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer;
493*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.bit_pos = 7;
494*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size;
495*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
496*15dc779aSAndroid Build Coastguard Worker 
497*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag;
498*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->str_usac_data.esbr_hq = handle->aac_config.ui_hq_esbr;
499*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->str_usac_data.enh_sbr = 1;
500*15dc779aSAndroid Build Coastguard Worker       pstr_dec_data->str_usac_data.enh_sbr_ps = handle->aac_config.ui_enh_sbr_ps;
501*15dc779aSAndroid Build Coastguard Worker 
502*15dc779aSAndroid Build Coastguard Worker       if (preroll_frame_offset[access_units] &&
503*15dc779aSAndroid Build Coastguard Worker           ((pstr_dec_data->str_usac_data.ec_flag && pstr_dec_data->str_usac_data.frame_ok == 1) ||
504*15dc779aSAndroid Build Coastguard Worker            pstr_dec_data->str_usac_data.ec_flag == 0)) {
505*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.cnt_bits =
506*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->dec_bit_buf.size -
507*15dc779aSAndroid Build Coastguard Worker             preroll_frame_offset[access_units];
508*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.bit_pos =
509*15dc779aSAndroid Build Coastguard Worker             7 - preroll_frame_offset[access_units] % 8;
510*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.ptr_read_next =
511*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->dec_bit_buf.ptr_read_next +
512*15dc779aSAndroid Build Coastguard Worker             (preroll_frame_offset[access_units] / 8);
513*15dc779aSAndroid Build Coastguard Worker       } else {
514*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.cnt_bits =
515*15dc779aSAndroid Build Coastguard Worker           pstr_dec_data->dec_bit_buf.size -
516*15dc779aSAndroid Build Coastguard Worker           (bits_consumed);
517*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.bit_pos =
518*15dc779aSAndroid Build Coastguard Worker           7 - (bits_consumed) % 8;
519*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->dec_bit_buf.ptr_read_next =
520*15dc779aSAndroid Build Coastguard Worker           pstr_dec_data->dec_bit_buf.ptr_read_next +
521*15dc779aSAndroid Build Coastguard Worker           (bits_consumed / 8);
522*15dc779aSAndroid Build Coastguard Worker       }
523*15dc779aSAndroid Build Coastguard Worker 
524*15dc779aSAndroid Build Coastguard Worker       if (pstr_dec_data->str_usac_data.ec_flag) {
525*15dc779aSAndroid Build Coastguard Worker         if (!aac_dec_handle->decode_create_done && pstr_dec_data->str_usac_data.frame_ok == 1 &&
526*15dc779aSAndroid Build Coastguard Worker             config_len != 0)
527*15dc779aSAndroid Build Coastguard Worker           return IA_FATAL_ERROR;
528*15dc779aSAndroid Build Coastguard Worker       } else {
529*15dc779aSAndroid Build Coastguard Worker         if (!aac_dec_handle->decode_create_done) return IA_FATAL_ERROR;
530*15dc779aSAndroid Build Coastguard Worker       }
531*15dc779aSAndroid Build Coastguard Worker 
532*15dc779aSAndroid Build Coastguard Worker       err =
533*15dc779aSAndroid Build Coastguard Worker           ixheaacd_usac_process(pstr_dec_data, num_channel_out, aac_dec_handle);
534*15dc779aSAndroid Build Coastguard Worker 
535*15dc779aSAndroid Build Coastguard Worker       switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) {
536*15dc779aSAndroid Build Coastguard Worker         case 0:
537*15dc779aSAndroid Build Coastguard Worker           handle->aac_config.ui_sbr_mode = 0;
538*15dc779aSAndroid Build Coastguard Worker           break;
539*15dc779aSAndroid Build Coastguard Worker         case 1:
540*15dc779aSAndroid Build Coastguard Worker           handle->aac_config.ui_sbr_mode = 1;
541*15dc779aSAndroid Build Coastguard Worker           break;
542*15dc779aSAndroid Build Coastguard Worker         case 2:
543*15dc779aSAndroid Build Coastguard Worker           handle->aac_config.ui_sbr_mode = 1;
544*15dc779aSAndroid Build Coastguard Worker           break;
545*15dc779aSAndroid Build Coastguard Worker         case 3:
546*15dc779aSAndroid Build Coastguard Worker           handle->aac_config.ui_sbr_mode = 3;
547*15dc779aSAndroid Build Coastguard Worker           break;
548*15dc779aSAndroid Build Coastguard Worker 
549*15dc779aSAndroid Build Coastguard Worker         default:
550*15dc779aSAndroid Build Coastguard Worker           handle->aac_config.ui_sbr_mode = 0;
551*15dc779aSAndroid Build Coastguard Worker       }
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker       if (err == -1) return err;
554*15dc779aSAndroid Build Coastguard Worker 
555*15dc779aSAndroid Build Coastguard Worker       num_samples_out = pstr_dec_data->str_usac_data.output_samples;
556*15dc779aSAndroid Build Coastguard Worker       if (!handle->aac_config.peak_limiter_off && pstr_dec_data->str_usac_data.ec_flag) {
557*15dc779aSAndroid Build Coastguard Worker         aac_dec_handle->peak_limiter.num_channels = *num_channel_out;
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker         ixheaacd_peak_limiter_process_float(&aac_dec_handle->peak_limiter,
560*15dc779aSAndroid Build Coastguard Worker                                             pstr_dec_data->str_usac_data.time_sample_vector,
561*15dc779aSAndroid Build Coastguard Worker                                             num_samples_out);
562*15dc779aSAndroid Build Coastguard Worker       }
563*15dc779aSAndroid Build Coastguard Worker 
564*15dc779aSAndroid Build Coastguard Worker       ixheaacd_samples_sat((WORD8 *)outbuffer + tot_out_bytes, num_samples_out,
565*15dc779aSAndroid Build Coastguard Worker                            pcmsize,
566*15dc779aSAndroid Build Coastguard Worker                            pstr_dec_data->str_usac_data.time_sample_vector,
567*15dc779aSAndroid Build Coastguard Worker                            out_bytes, *num_channel_out);
568*15dc779aSAndroid Build Coastguard Worker       {
569*15dc779aSAndroid Build Coastguard Worker         WORD32 preroll_counter =
570*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_frame_data.str_audio_specific_config
571*15dc779aSAndroid Build Coastguard Worker                 .str_usac_config.str_usac_dec_config.preroll_counter;
572*15dc779aSAndroid Build Coastguard Worker 
573*15dc779aSAndroid Build Coastguard Worker         UWORD8 i;  // for looping index used for payload calculation
574*15dc779aSAndroid Build Coastguard Worker         WORD32 payload_buffer_offset = 0;
575*15dc779aSAndroid Build Coastguard Worker         WORD32 copy_bytes =
576*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_frame_data.str_audio_specific_config
577*15dc779aSAndroid Build Coastguard Worker                 .str_usac_config.str_usac_dec_config
578*15dc779aSAndroid Build Coastguard Worker                 .usac_ext_gain_payload_len[preroll_counter] *
579*15dc779aSAndroid Build Coastguard Worker             sizeof(WORD8);
580*15dc779aSAndroid Build Coastguard Worker 
581*15dc779aSAndroid Build Coastguard Worker         pstr_audio_specific_config->str_usac_config.str_usac_dec_config
582*15dc779aSAndroid Build Coastguard Worker             .usac_ext_gain_payload_len[preroll_counter] =
583*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_frame_data.str_audio_specific_config
584*15dc779aSAndroid Build Coastguard Worker                 .str_usac_config.str_usac_dec_config
585*15dc779aSAndroid Build Coastguard Worker                 .usac_ext_gain_payload_len[preroll_counter];
586*15dc779aSAndroid Build Coastguard Worker 
587*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < preroll_counter; i++)
588*15dc779aSAndroid Build Coastguard Worker           payload_buffer_offset +=
589*15dc779aSAndroid Build Coastguard Worker               pstr_dec_data->str_frame_data.str_audio_specific_config
590*15dc779aSAndroid Build Coastguard Worker                   .str_usac_config.str_usac_dec_config
591*15dc779aSAndroid Build Coastguard Worker                   .usac_ext_gain_payload_len[i] *
592*15dc779aSAndroid Build Coastguard Worker               sizeof(WORD8);
593*15dc779aSAndroid Build Coastguard Worker 
594*15dc779aSAndroid Build Coastguard Worker         memcpy(pstr_audio_specific_config->str_usac_config.str_usac_dec_config
595*15dc779aSAndroid Build Coastguard Worker                        .usac_ext_gain_payload_buf +
596*15dc779aSAndroid Build Coastguard Worker                    payload_buffer_offset,
597*15dc779aSAndroid Build Coastguard Worker                pstr_dec_data->str_frame_data.str_audio_specific_config
598*15dc779aSAndroid Build Coastguard Worker                        .str_usac_config.str_usac_dec_config
599*15dc779aSAndroid Build Coastguard Worker                        .usac_ext_gain_payload_buf +
600*15dc779aSAndroid Build Coastguard Worker                    payload_buffer_offset,
601*15dc779aSAndroid Build Coastguard Worker                copy_bytes);
602*15dc779aSAndroid Build Coastguard Worker 
603*15dc779aSAndroid Build Coastguard Worker         pstr_audio_specific_config->str_usac_config.str_usac_dec_config
604*15dc779aSAndroid Build Coastguard Worker             .preroll_bytes[preroll_counter] = *out_bytes;
605*15dc779aSAndroid Build Coastguard Worker 
606*15dc779aSAndroid Build Coastguard Worker         preroll_counter++;
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker         if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) return IA_FATAL_ERROR;
609*15dc779aSAndroid Build Coastguard Worker 
610*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
611*15dc779aSAndroid Build Coastguard Worker             .str_usac_dec_config.preroll_counter = preroll_counter;
612*15dc779aSAndroid Build Coastguard Worker 
613*15dc779aSAndroid Build Coastguard Worker         ia_usac_decoder_config_struct *pstr_usac_dec_config_state =
614*15dc779aSAndroid Build Coastguard Worker             &pstr_audio_specific_config->str_usac_config.str_usac_dec_config;
615*15dc779aSAndroid Build Coastguard Worker         ia_usac_decoder_config_struct *pstr_usac_dec_config_dec_data =
616*15dc779aSAndroid Build Coastguard Worker             &pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
617*15dc779aSAndroid Build Coastguard Worker             .str_usac_dec_config;
618*15dc779aSAndroid Build Coastguard Worker         pstr_usac_dec_config_state->num_config_extensions =
619*15dc779aSAndroid Build Coastguard Worker             pstr_usac_dec_config_dec_data->num_config_extensions;
620*15dc779aSAndroid Build Coastguard Worker         pstr_usac_dec_config_state->num_elements =
621*15dc779aSAndroid Build Coastguard Worker             pstr_usac_dec_config_dec_data->num_elements;
622*15dc779aSAndroid Build Coastguard Worker         memcpy(pstr_usac_dec_config_state->usac_cfg_ext_info_buf,
623*15dc779aSAndroid Build Coastguard Worker             pstr_usac_dec_config_dec_data->usac_cfg_ext_info_buf,
624*15dc779aSAndroid Build Coastguard Worker             sizeof(pstr_usac_dec_config_state->usac_cfg_ext_info_buf));
625*15dc779aSAndroid Build Coastguard Worker         memcpy(pstr_usac_dec_config_state->usac_ext_ele_payload_present,
626*15dc779aSAndroid Build Coastguard Worker             pstr_usac_dec_config_dec_data->usac_ext_ele_payload_present,
627*15dc779aSAndroid Build Coastguard Worker             sizeof(pstr_usac_dec_config_dec_data->usac_ext_ele_payload_present));
628*15dc779aSAndroid Build Coastguard Worker         memcpy(pstr_usac_dec_config_state->usac_ext_ele_payload_buf,
629*15dc779aSAndroid Build Coastguard Worker             pstr_usac_dec_config_dec_data->usac_ext_ele_payload_buf,
630*15dc779aSAndroid Build Coastguard Worker             sizeof(pstr_usac_dec_config_state->usac_ext_ele_payload_buf));
631*15dc779aSAndroid Build Coastguard Worker       }
632*15dc779aSAndroid Build Coastguard Worker 
633*15dc779aSAndroid Build Coastguard Worker       access_units++;
634*15dc779aSAndroid Build Coastguard Worker       preroll_units--;
635*15dc779aSAndroid Build Coastguard Worker       tot_out_bytes += (*out_bytes);
636*15dc779aSAndroid Build Coastguard Worker     } while (preroll_units >= 0);
637*15dc779aSAndroid Build Coastguard Worker     *out_bytes = tot_out_bytes;
638*15dc779aSAndroid Build Coastguard Worker   }
639*15dc779aSAndroid Build Coastguard Worker 
640*15dc779aSAndroid Build Coastguard Worker   if (aac_dec_handle->bs_format == LOAS_BSFORMAT) {
641*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer;
642*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3;
643*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_bit_buf_end =
644*15dc779aSAndroid Build Coastguard Worker       (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1;
645*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer;
646*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.bit_pos = 7;
647*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size;
648*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
649*15dc779aSAndroid Build Coastguard Worker 
650*15dc779aSAndroid Build Coastguard Worker     ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 11);
651*15dc779aSAndroid Build Coastguard Worker     aac_dec_handle->i_bytes_consumed =
652*15dc779aSAndroid Build Coastguard Worker         ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 13) + 3;
653*15dc779aSAndroid Build Coastguard Worker   }
654*15dc779aSAndroid Build Coastguard Worker 
655*15dc779aSAndroid Build Coastguard Worker   return err;
656*15dc779aSAndroid Build Coastguard Worker }
657