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