• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *                                                                            *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include <stdio.h>
21 #include <string.h>
22 #include "ixheaacd_sbr_common.h"
23 #include <ixheaacd_type_def.h>
24 
25 #include "ixheaacd_constants.h"
26 #include <ixheaacd_basic_ops32.h>
27 #include <ixheaacd_basic_ops16.h>
28 #include <ixheaacd_basic_ops40.h>
29 #include "ixheaacd_basic_ops.h"
30 #include "ixheaacd_bitbuffer.h"
31 
32 #include <ixheaacd_basic_op.h>
33 #include "ixheaacd_intrinsics.h"
34 
35 #include "ixheaacd_defines.h"
36 
37 #include <ixheaacd_aac_rom.h>
38 
39 #include "ixheaacd_definitions.h"
40 
41 #include "ixheaacd_error_codes.h"
42 
43 #include "ixheaacd_pulsedata.h"
44 
45 #include "ixheaacd_pns.h"
46 #include "ixheaacd_drc_data_struct.h"
47 
48 #include "ixheaacd_lt_predict.h"
49 
50 #include "ixheaacd_channelinfo.h"
51 #include "ixheaacd_cnst.h"
52 #include "ixheaacd_drc_dec.h"
53 #include "ixheaacd_sbrdecoder.h"
54 #include "ixheaacd_block.h"
55 #include "ixheaacd_channel.h"
56 
57 #include "ixheaacd_sbr_payload.h"
58 #include "ixheaacd_common_rom.h"
59 
60 #include <ixheaacd_type_def.h>
61 
62 #include "ixheaacd_sbrdecsettings.h"
63 #include "ixheaacd_sbr_scale.h"
64 #include "ixheaacd_env_extr_part.h"
65 #include <ixheaacd_sbr_rom.h>
66 #include "ixheaacd_stereo.h"
67 #include "ixheaacd_lpp_tran.h"
68 #include "ixheaacd_hybrid.h"
69 #include "ixheaacd_ps_dec.h"
70 #include "ixheaacd_env_extr.h"
71 #include "ixheaacd_adts.h"
72 #include "ixheaacd_audioobjtypes.h"
73 #include "ixheaacd_memory_standards.h"
74 #include "ixheaacd_latmdemux.h"
75 #include "ixheaacd_aacdec.h"
76 #include "ixheaacd_mps_polyphase.h"
77 #include "ixheaacd_config.h"
78 #include "ixheaacd_mps_dec.h"
79 #include "ixheaacd_struct_def.h"
80 #include "ixheaacd_headerdecode.h"
81 #include "ixheaacd_multichannel.h"
82 #include "ixheaacd_adts_crc_check.h"
83 
84 #include "ixheaacd_hcr.h"
85 
86 #define SIZEOF_INT(x) ((sizeof(x) + sizeof(WORD32) - 1) / sizeof(WORD32))
87 
88 #define EXT_FILL_DATA 1
89 #define EXT_FIL 0
90 
ixheaacd_aacdec_decodeframe(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,ia_aac_dec_scratch_struct * aac_scratch_ptrs,WORD16 * time_data,FLAG frame_status,WORD * type,WORD * ch_idx,WORD init_flag,WORD channel,WORD * element_index_order,WORD skip_full_decode,WORD ch_fac,WORD slot_element,WORD max_channels,WORD32 total_channels,WORD32 frame_length,WORD32 frame_size,ia_drc_dec_struct * pstr_drc_dec,WORD32 object_type,WORD32 ch_config,ia_eld_specific_config_struct eld_specific_config,WORD16 adtsheader,ia_drc_dec_struct * drc_dummy)91 WORD32 ixheaacd_aacdec_decodeframe(
92     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
93     ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
94     FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
95     WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
96     WORD slot_element, WORD max_channels, WORD32 total_channels,
97     WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
98     WORD32 object_type, WORD32 ch_config,
99     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
100     ia_drc_dec_struct *drc_dummy)
101 
102 {
103   WORD ch, ele_type;
104   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
105   ia_aac_decoder_struct *aac_dec_handle;
106   ia_bit_buf_struct *it_bit_buff;
107   ixheaacd_latm_struct *latm_element;
108 
109   WORD error_code = (WORD)frame_status;
110   WORD previous_element;
111   WORD prev_data_ele_present = 0;
112   WORD new_element;
113   WORD32 num_ch = 0;
114 
115   WORD32 crc_reg = 0;
116   ia_adts_crc_info_struct *ptr_adts_crc_info;
117 
118   WORD32 cnt_bits = 0;
119 
120   WORD32 eld_sbr_flag = eld_specific_config.ld_sbr_flag_present;
121   WORD32 ld_sbr_crc_flag = eld_specific_config.ld_sbr_crc_flag;
122   WORD32 aac_spect_data_resil_flag =
123       eld_specific_config.aac_spect_data_resil_flag;
124 
125   WORD32 ele_ch = 0;
126 
127   ia_aac_sfb_code_book_struct *ptr_aac_sfb_code_book_data[CHANNELS];
128   ia_pns_stereo_data_struct *ptr_pns_stereo_data;
129 
130   WORD32 *work_buffer_core = aac_scratch_ptrs->base_scr_8k;
131   WORD32 *work_buffer_1 = aac_scratch_ptrs->extra_scr_4k[0];
132   WORD32 *work_buffer_2 = aac_scratch_ptrs->extra_scr_4k[2];
133   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
134 
135   aac_dec_handle = p_state_enhaacplus_dec->pstr_aac_dec_info[*ch_idx];
136   it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream;
137 
138   ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info;
139 
140   latm_element = &p_state_enhaacplus_dec->latm_struct_element;
141 
142   ptr_pns_stereo_data =
143       (ia_pns_stereo_data_struct
144            *)&work_buffer_1[2 * SIZEOF_INT(ia_aac_dec_channel_info_struct) +
145                             2 * SIZEOF_INT(ia_aac_sfb_code_book_struct)];
146 
147   aac_dec_handle->frame_status = 1;
148 
149   for (ch = 0; ch < channel; ch++) {
150     const ia_aac_dec_imdct_tables_struct *pstr_imdct_tables;
151     aac_dec_handle->pstr_aac_dec_ch_info[ch] =
152         (ia_aac_dec_channel_info_struct
153              *)&work_buffer_1[ch * SIZEOF_INT(ia_aac_dec_channel_info_struct)];
154     ptr_aac_sfb_code_book_data[ch] =
155         (ia_aac_sfb_code_book_struct
156              *)&work_buffer_1[2 * SIZEOF_INT(ia_aac_dec_channel_info_struct) +
157                               (ch * SIZEOF_INT(ia_aac_sfb_code_book_struct))];
158 
159     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_scale_factor =
160         ptr_aac_sfb_code_book_data[ch]->scale_factor;
161     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_code_book =
162         ptr_aac_sfb_code_book_data[ch]->code_book;
163 
164     aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff =
165         &work_buffer_core[ch * MAX_BINS_LONG];
166 
167     if (object_type == AOT_ER_AAC_ELD) {
168       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff =
169           &work_buffer_core[2 * ch * MAX_BINS_LONG];
170     }
171 
172     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_stereo_info =
173         &ptr_pns_stereo_data->str_stereo_info;
174     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_pns_corr_info =
175         &ptr_pns_stereo_data->str_pns_corr_info;
176     aac_dec_handle->pstr_aac_dec_ch_info[ch]->pstr_pns_rand_vec_data =
177         aac_dec_handle->pstr_pns_rand_vec_data;
178 
179     pstr_imdct_tables = aac_dec_handle->pstr_aac_tables->pstr_imdct_tables;
180 
181     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
182         pstr_imdct_tables->only_long_window_sine;
183     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
184         pstr_imdct_tables->only_short_window_sine;
185     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
186         pstr_imdct_tables->only_long_window_kbd;
187     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
188         pstr_imdct_tables->only_short_window_kbd;
189 
190     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
191         pstr_imdct_tables->only_long_window_sine;
192     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
193         pstr_imdct_tables->only_short_window_sine;
194     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
195         pstr_imdct_tables->only_long_window_kbd;
196     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
197         pstr_imdct_tables->only_short_window_kbd;
198 
199     if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD ||
200         object_type == AOT_AAC_LTP) {
201       aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.frame_length =
202           frame_length;
203 
204       if (512 == aac_dec_handle->samples_per_frame) {
205         if (object_type != AOT_ER_AAC_ELD) {
206           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
207               (WORD16 *)pstr_imdct_tables->low_overlap_win;
208           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
209               (WORD16 *)pstr_imdct_tables->window_sine_512;
210 
211           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
212               ->ptr_long_window[1] =
213               (WORD16 *)pstr_imdct_tables->low_overlap_win;
214           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
215               ->ptr_long_window[0] =
216               (WORD16 *)pstr_imdct_tables->window_sine_512;
217         } else {
218           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
219               (WORD16 *)pstr_imdct_tables->window_sine_512_eld;
220           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
221               (WORD16 *)pstr_imdct_tables->window_sine_512_eld;
222         }
223       } else if (480 == aac_dec_handle->samples_per_frame) {
224         if (object_type != AOT_ER_AAC_ELD) {
225           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
226               (WORD16 *)pstr_imdct_tables->low_overlap_win_480;
227           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
228               (WORD16 *)pstr_imdct_tables->window_sine_480;
229 
230           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
231               ->ptr_long_window[1] =
232               (WORD16 *)pstr_imdct_tables->low_overlap_win_480;
233           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
234               ->ptr_long_window[0] =
235               (WORD16 *)pstr_imdct_tables->window_sine_480;
236 
237         } else {
238           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
239               (WORD16 *)pstr_imdct_tables->window_sine_480_eld;
240           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
241               (WORD16 *)pstr_imdct_tables->window_sine_480_eld;
242         }
243       }
244     }
245     if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
246       if (aac_dec_handle->samples_per_frame <= 512) {
247         aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.lag =
248             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag;
249       }
250       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ltp_buf =
251           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_buf;
252       aac_dec_handle->pstr_aac_dec_ch_info[ch]->ltp_lag =
253           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag;
254     }
255 
256     aac_dec_handle->pstr_aac_dec_ch_info[ch]->scratch_buf_ptr = work_buffer_2;
257     if (object_type == AOT_ER_AAC_ELD) {
258       aac_dec_handle->pstr_aac_dec_ch_info[ch]->pulse_scratch =
259           aac_scratch_ptrs->extra_scr_4k[3];
260     }
261   }
262 
263   if (channel == 2) {
264     if (aac_dec_handle->pstr_aac_dec_ch_info[1]->ptr_spec_coeff ==
265         aac_scratch_ptrs->extra_scr_4k[0]) {
266       aac_dec_handle->pstr_aac_dec_ch_info[1]->ptr_spec_coeff =
267           aac_dec_handle->pstr_aac_dec_ch_info[0]->ptr_spec_coeff;
268     }
269   }
270 
271   for (ch = 0; ch < channel; ch++) {
272     ia_pns_info_struct *ptr_pns_info =
273         &aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_pns_info;
274     memset(ptr_pns_info, 0, sizeof(ia_pns_info_struct));
275   }
276 
277   {
278     ia_pns_correlation_info_struct *ptr_corr_info =
279         aac_dec_handle->pstr_aac_dec_ch_info[0]->pstr_pns_corr_info;
280     memset(ptr_corr_info->correlated, 0, sizeof(UWORD8) * PNS_BAND_FLAGS_SIZE);
281   }
282 
283   for (ch = 0; ch < channel; ch++) {
284     memset(&aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_hcr_info, 0,
285            sizeof(ia_hcr_info_struct));
286     ixheaacd_huff_code_reorder_tbl_init(
287         &aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_hcr_info);
288   }
289 
290   for (ch = 0; ch < channel; ch++) {
291     aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.data_present = 0;
292     aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp2.data_present =
293         0;
294   }
295 
296   previous_element = ID_END;
297 
298   aac_dec_handle->pstr_sbr_bitstream->no_elements = 0;
299   new_element = 0;
300   ele_type = *type;
301 
302   cnt_bits = it_bit_buff->cnt_bits;
303 
304   if (((object_type != AOT_ER_AAC_ELD) && (object_type != AOT_ER_AAC_LD)) ||
305       (object_type < ER_OBJECT_START)) {
306     while (ele_type != ID_END && aac_dec_handle->frame_status) {
307       ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
308       ixheaacd_read_bidirection(it_bit_buff, -3);
309 
310       if (it_bit_buff->cnt_bits < 3) {
311         it_bit_buff->cnt_bits = -1;
312         error_code = (WORD16)(
313             (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
314         break;
315       }
316 
317       if ((ele_type == ID_FIL) || (ele_type == ID_DSE) || (new_element == 0)) {
318         ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
319         new_element = 1;
320       } else if ((ele_type != ID_END)) {
321         ele_type = -1;
322         break;
323       } else {
324         ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
325       }
326 
327       if (it_bit_buff->cnt_bits < 0) {
328         aac_dec_handle->frame_status = 0;
329       }
330 
331       switch (ele_type) {
332         case ID_SCE:
333         case ID_CPE:
334         case ID_LFE:
335 
336           if (aac_dec_handle->frame_status) {
337             ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
338                 aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
339             ia_ics_info_struct *ptr_ics_info =
340                 &pstr_aac_dec_ch_info->str_ics_info;
341             ele_ch = 1;
342             if (ele_type == ID_CPE) {
343               ele_ch = 2;
344             } else {
345               ele_ch = 1;
346             }
347 
348             prev_data_ele_present = 1;
349 
350             if (ptr_adts_crc_info->crc_active == 1 &&
351                 ptr_adts_crc_info->no_reg < 7) {
352               crc_reg = ixheaacd_adts_crc_start_reg(
353                   ptr_adts_crc_info, it_bit_buff, CRC_ADTS_RAW_DATA_BLK_LEN);
354             }
355 
356             pstr_aac_dec_ch_info->element_instance_tag =
357                 (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
358 
359             element_index_order[*ch_idx] =
360                 pstr_aac_dec_ch_info->element_instance_tag;
361             pstr_aac_dec_ch_info->common_window = 0;
362 
363             ptr_ics_info->num_swb_window = 0;
364             ptr_ics_info->sampling_rate_index =
365                 aac_dec_handle->sampling_rate_index;
366             if ((object_type == AOT_ER_AAC_LD) ||
367                 (object_type == AOT_AAC_LTP)) {
368               ptr_ics_info->ltp.data_present = 0;
369               ptr_ics_info->ltp2.data_present = 0;
370               ptr_ics_info->predictor_data_present = 0;
371             }
372 
373             if (ele_ch > 1) {
374               aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
375                   ->str_ics_info.num_swb_window = 0;
376               aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
377                   ->str_ics_info.sampling_rate_index =
378                   aac_dec_handle->sampling_rate_index;
379 
380               pstr_aac_dec_ch_info->common_window =
381                   (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
382 
383               if (pstr_aac_dec_ch_info->common_window) {
384                 error_code = ixheaacd_ics_read(
385                     it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window,
386                     object_type, pstr_aac_dec_ch_info->common_window,
387                     aac_dec_handle->samples_per_frame);
388                 if (error_code) {
389                   if (it_bit_buff->cnt_bits < 0) {
390                     error_code = (WORD16)(
391                         (WORD32)
392                             IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
393                   }
394 
395                   goto _ia_handle_error;
396                 }
397 
398                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
399                     pstr_aac_dec_ch_info->str_ics_info;
400 
401                 ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
402               }
403             }
404 
405             error_code = ixheaacd_individual_ch_stream(
406                 it_bit_buff, aac_dec_handle, ele_ch, frame_length,
407                 total_channels, object_type, eld_specific_config, ele_type);
408 
409             if (ptr_adts_crc_info->crc_active == 1) {
410               ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff,
411                                         crc_reg);
412             }
413 
414             if (it_bit_buff->cnt_bits < 0) {
415               error_code = (WORD16)(
416                   (WORD32)
417                       IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
418             }
419 
420             if (error_code) {
421               goto _ia_handle_error;
422             }
423 
424           _ia_handle_error:
425             if (error_code) {
426               aac_dec_handle->frame_status = 0;
427               if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE))
428                 num_ch = num_ch + ele_ch;
429               break;
430             } else {
431               ixheaacd_channel_pair_process(
432                   aac_dec_handle->pstr_aac_dec_ch_info, ele_ch,
433                   aac_dec_handle->pstr_aac_tables, total_channels, object_type,
434                   aac_spect_data_resil_flag,
435                   eld_specific_config.aac_sf_data_resil_flag,
436                   aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
437                   (void *)aac_dec_handle);
438               num_ch = num_ch + ele_ch;
439             }
440           }
441 
442           break;
443         case ID_CCE:
444           if (max_channels > 2) {
445             prev_data_ele_present = 1;
446             error_code = ixheaacd_dec_coupling_channel_element(
447                 it_bit_buff, aac_dec_handle,
448                 aac_dec_handle->sampling_rate_index,
449                 aac_dec_handle->pstr_aac_tables,
450                 aac_dec_handle->pstr_common_tables,
451                 &element_index_order[*ch_idx],
452                 (ia_enhaacplus_dec_ind_cc *)aac_dec_handle->p_ind_channel_info,
453                 total_channels, frame_length, object_type, eld_specific_config,
454                 ele_type);
455 
456             num_ch = num_ch + 1;
457 
458             if (error_code) {
459               aac_dec_handle->frame_status = 0;
460 
461               break;
462             } else {
463               ixheaacd_channel_pair_process(
464                   aac_dec_handle->pstr_aac_dec_ch_info, 1,
465                   aac_dec_handle->pstr_aac_tables, total_channels, object_type,
466                   aac_spect_data_resil_flag,
467                   eld_specific_config.aac_sf_data_resil_flag,
468                   aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
469                   (void *)aac_dec_handle);
470             }
471           } else {
472             error_code =
473                 (WORD32)((WORD32)IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE);
474           }
475           if (it_bit_buff->cnt_bits < 0) {
476             error_code = (WORD16)((
477                 WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
478             goto _ia_handle_error;
479           }
480           break;
481 
482         case ID_DSE:
483         case ID_PCE:
484         case ID_FIL:
485 
486         {
487           WORD32 flag = 1;
488 
489           if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1) &&
490               (ptr_adts_crc_info->no_reg < 7)) {
491             crc_reg =
492                 ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, 0);
493           }
494           if (ele_type == ID_DSE) {
495             ixheaacd_read_data_stream_element(
496                 it_bit_buff, &aac_dec_handle->byte_align_bits,
497                 p_obj_exhaacplus_dec->p_state_aac->pstr_drc_dec);
498           }
499 
500           else if (ele_type == ID_PCE) {
501             error_code = ixheaacd_decode_pce(
502                 it_bit_buff,
503                 &p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr,
504                 &p_obj_exhaacplus_dec->aac_config.str_prog_config);
505             if (error_code != 0) {
506               if (it_bit_buff->cnt_bits < 0) {
507                 error_code = (WORD16)(
508                     (WORD32)
509                         IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
510                 goto _ia_handle_error;
511               }
512               aac_dec_handle->frame_status = 0;
513               if (error_code > 0) {
514                 error_code = IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
515                 return error_code;
516               } else {
517                 return error_code;
518               }
519             }
520           }
521 
522           else if (ele_type == ID_FIL) {
523             WORD32 bits_decoded = 0;
524             if (object_type == AOT_ER_AAC_ELD) {
525               bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
526               cnt_bits = (frame_size * 8 - bits_decoded);
527               if (adtsheader == 1) {
528                 if (cnt_bits > it_bit_buff->cnt_bits)
529                   return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
530               }
531             }
532 
533             if (ixheaacd_check_for_sbr_payload(
534                     it_bit_buff, aac_dec_handle->pstr_sbr_bitstream,
535                     (WORD16)previous_element, pstr_drc_dec, object_type,
536                     adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy)) {
537               flag = 0;
538             }
539           }
540 
541           if (it_bit_buff->cnt_bits < 0) {
542             error_code = (WORD16)((
543                 WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
544             goto _ia_handle_error;
545           }
546 
547           if (flag) {
548             if (prev_data_ele_present == 0) {
549               new_element = 0;
550             }
551           }
552           if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1)) {
553             ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
554           }
555 
556           if (ele_type == ID_PCE) {
557             if (ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt) {
558               ptr_adts_crc_info->str_crc_reg_data[crc_reg].max_bits =
559                   ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt;
560             }
561           }
562         }
563 
564         break;
565 
566         case ID_END:
567           error_code = 0;
568           break;
569       }
570 
571       previous_element = ele_type;
572 
573       if (init_flag) {
574         if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) {
575           p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_type;
576         }
577       }
578     }
579   } else {
580     {
581       switch (ch_config) {
582         default:
583           if (aac_dec_handle->frame_status) {
584             ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
585                 aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
586             ia_ics_info_struct *ptr_ics_info =
587                 &pstr_aac_dec_ch_info->str_ics_info;
588 
589             if (ch_config == 2)
590               ele_ch = 2, ele_type = 1;
591             else
592               ele_ch = 1, ele_type = 0;
593 
594             prev_data_ele_present = 1;
595 
596             if ((ptr_adts_crc_info->crc_active == 1) &&
597                 (ptr_adts_crc_info->no_reg < 7)) {
598               crc_reg = ixheaacd_adts_crc_start_reg(
599                   ptr_adts_crc_info, it_bit_buff, CRC_ADTS_RAW_DATA_BLK_LEN);
600             }
601 
602             if (object_type != AOT_ER_AAC_ELD)
603               pstr_aac_dec_ch_info->element_instance_tag =
604                   (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
605 
606             element_index_order[*ch_idx] =
607                 pstr_aac_dec_ch_info->element_instance_tag;
608             pstr_aac_dec_ch_info->common_window = 0;
609 
610             ptr_ics_info->num_swb_window = 0;
611             ptr_ics_info->sampling_rate_index =
612                 aac_dec_handle->sampling_rate_index;
613 
614             if (object_type == AOT_ER_AAC_LD) {
615               ptr_ics_info->ltp.data_present = 0;
616               ptr_ics_info->ltp2.data_present = 0;
617               ptr_ics_info->predictor_data_present = 0;
618             }
619             if (ele_ch > 1) {
620               aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
621                   ->str_ics_info.num_swb_window = 0;
622               aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
623                   ->str_ics_info.sampling_rate_index =
624                   aac_dec_handle->sampling_rate_index;
625 
626               if (object_type != 39)
627                 pstr_aac_dec_ch_info->common_window =
628                     (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
629               else
630                 pstr_aac_dec_ch_info->common_window = 1;
631 
632               if (pstr_aac_dec_ch_info->common_window) {
633                 error_code = ixheaacd_ics_read(
634                     it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window,
635                     object_type, pstr_aac_dec_ch_info->common_window,
636                     aac_dec_handle->samples_per_frame);
637                 if (error_code) {
638                   if (it_bit_buff->cnt_bits < 0) {
639                     error_code = (WORD16)(
640                         (WORD32)
641                             IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
642                   }
643 
644                   goto _ia_handle_error1;
645                 }
646 
647                 aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
648                     pstr_aac_dec_ch_info->str_ics_info;
649 
650                 ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
651 
652                 {
653                   if (object_type == AOT_ER_AAC_LD) {
654                     WORD16 temp = ixheaacd_ltp_decode(
655                         it_bit_buff, ptr_ics_info, object_type,
656                         aac_dec_handle->samples_per_frame, LEFT);
657 
658                     if (temp != 0) {
659                       return temp;
660                     }
661                   }
662                 }
663               }
664             }
665 
666             error_code = ixheaacd_individual_ch_stream(
667                 it_bit_buff, aac_dec_handle, ele_ch, frame_length,
668                 total_channels, object_type, eld_specific_config, ele_type);
669 
670             if (ptr_adts_crc_info->crc_active == 1) {
671               ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff,
672                                         crc_reg);
673             }
674 
675             if (it_bit_buff->cnt_bits < 0) {
676               error_code = (WORD16)(
677                   (WORD32)
678                       IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
679             }
680 
681             if (error_code) {
682               goto _ia_handle_error1;
683             }
684 
685           _ia_handle_error1:
686             if (error_code) {
687               aac_dec_handle->frame_status = 0;
688               if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE))
689                 num_ch = num_ch + ele_ch;
690               break;
691             } else {
692               ixheaacd_channel_pair_process(
693                   aac_dec_handle->pstr_aac_dec_ch_info, ele_ch,
694                   aac_dec_handle->pstr_aac_tables, total_channels, object_type,
695                   aac_spect_data_resil_flag,
696                   eld_specific_config.aac_sf_data_resil_flag,
697                   aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
698                   (void *)aac_dec_handle);
699               num_ch = num_ch + ele_ch;
700             }
701           }
702 
703           p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_ch - 1;
704           break;
705       }
706 
707       if ((object_type != AOT_ER_AAC_ELD) || (!eld_sbr_flag)) {
708         WORD32 bits_decoded, cnt_bits;
709         bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
710 
711         cnt_bits = (frame_size * 8 - bits_decoded);
712         if (cnt_bits >= 8) {
713           ixheaacd_extension_payload(it_bit_buff, cnt_bits);
714         }
715 
716         if (((object_type == AOT_ER_AAC_ELD) ||
717              (object_type == AOT_ER_AAC_LD)) &&
718             (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) {
719           if (it_bit_buff->cnt_bits) {
720             WORD32 alignment = it_bit_buff->bit_pos & 0x07;
721             it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7;
722             it_bit_buff->bit_pos = 7;
723             it_bit_buff->ptr_read_next++;
724           }
725         } else {
726           if (it_bit_buff->bit_pos != 7) {
727             WORD32 alignment = it_bit_buff->bit_pos & 0x07;
728             it_bit_buff->cnt_bits -= alignment + 1;
729             it_bit_buff->bit_pos += 7 - alignment;
730             it_bit_buff->ptr_read_next++;
731           }
732         }
733       } else {
734         WORD32 bits_decoded, cnt_bits;
735         bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
736         cnt_bits = (frame_size * 8 - bits_decoded);
737         if (adtsheader == 1) {
738           if (cnt_bits > it_bit_buff->cnt_bits)
739             return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
740         }
741         ixheaacd_check_for_sbr_payload(
742             it_bit_buff, aac_dec_handle->pstr_sbr_bitstream,
743             (WORD16)(ch_config - 1), pstr_drc_dec, object_type, adtsheader,
744             cnt_bits, ld_sbr_crc_flag, drc_dummy);
745       }
746     }
747   }
748 
749   if (ele_type == ID_END &&
750       p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
751     WORD32 tmp;
752     tmp = ((WORD32)latm_element->layer_info[0][0].frame_len_bits) -
753           (it_bit_buff->initial_cnt_bits - it_bit_buff->cnt_bits);
754 
755     if (tmp > 0) ixheaacd_read_bidirection(it_bit_buff, tmp);
756 
757     if (latm_element->other_data_present) {
758       WORD32 count_bits = (WORD32)latm_element->other_data_length;
759       ixheaacd_read_bidirection(it_bit_buff, count_bits);
760     }
761   }
762 
763   if (object_type == AOT_ER_AAC_LD) {
764     for (ch = 0; ch < channel; ch++) {
765       aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ltp_lag =
766           aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.ltp.lag;
767     }
768   }
769   aac_dec_handle->frame_status = aac_dec_handle->frame_status && frame_status;
770 
771   aac_dec_handle->channels = num_ch;
772 
773   if (error_code == 0)
774     if ((skip_full_decode == 0) || ((skip_full_decode == 1) && error_code)) {
775       ia_ics_info_struct str_ics_info[2];
776       WORD32 *spec_coef[2];
777       WORD32 *scratch[2];
778 
779       for (ch = 0; ch < channel; ch++) {
780         str_ics_info[ch] =
781             aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info;
782         spec_coef[ch] =
783             aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff;
784       }
785 
786       scratch[0] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[2];
787       scratch[1] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[1];
788 
789       ixheaacd_drc_map_channels(
790           pstr_drc_dec, aac_dec_handle->channels,
791           aac_dec_handle->pstr_aac_dec_ch_info[0]->str_ics_info.frame_length);
792 
793       for (ch = 0; ch < aac_dec_handle->channels; ch++) {
794         WORD32 *overlap1 = aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
795                                ->overlap_add_data.ptr_overlap_buf;
796         const WORD16 *ptr_long_window_next =
797             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
798                 ->ptr_long_window[(int)str_ics_info[ch].window_shape];
799         const WORD16 *ptr_short_window_next =
800             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
801                 ->ptr_short_window[(int)str_ics_info[ch].window_shape];
802         if (pstr_drc_dec->drc_on) {
803           ixheaacd_drc_apply(pstr_drc_dec, spec_coef[ch],
804                              str_ics_info[ch].window_sequence, ch,
805                              str_ics_info[ch].frame_length);
806         }
807         if (skip_full_decode == 0) {
808           ixheaacd_imdct_process(
809               aac_dec_handle->pstr_aac_dec_overlap_info[ch], spec_coef[ch],
810               &str_ics_info[ch], time_data + slot_element, (WORD16)ch_fac,
811               scratch[ch], aac_dec_handle->pstr_aac_tables, object_type);
812 
813           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
814               ->overlap_add_data.win_shape = str_ics_info[ch].window_shape;
815           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
816               ->overlap_add_data.win_seq = str_ics_info[ch].window_sequence;
817           if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
818             {
819               if ((str_ics_info[ch].window_sequence == ONLY_LONG_SEQUENCE) ||
820                   (str_ics_info[ch].window_sequence == LONG_STOP_SEQUENCE)) {
821                 ixheaacd_lt_update_state(
822                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
823                         ->ltp_buf,
824                     time_data + slot_element, overlap1,
825                     aac_dec_handle->samples_per_frame, object_type,
826                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
827                     (WORD16 *)ptr_long_window_next);
828               } else {
829                 ixheaacd_lt_update_state(
830                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
831                         ->ltp_buf,
832                     time_data + slot_element, overlap1,
833                     aac_dec_handle->samples_per_frame, object_type,
834                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
835                     (WORD16 *)ptr_short_window_next);
836               }
837             }
838           }
839           slot_element++;
840         }
841       }
842     }
843 
844   if (ele_type == ID_END) {
845     ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
846     if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
847       ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
848     }
849   }
850   *type = ele_type;
851 
852   aac_dec_handle->block_number =
853       ixheaacd_add32(aac_dec_handle->block_number, 1);
854   return error_code;
855 }
856 
ixheaacd_extension_payload(ia_bit_buf_struct * it_bit_buff,WORD32 cnt)857 WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 cnt) {
858   WORD16 extension_type, discard;
859   WORD32 i;
860   WORD32 fill_nibble;
861 
862   WORD32 err = 0;
863   extension_type = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
864   switch (extension_type) {
865     case EXT_FILL_DATA:
866 
867       fill_nibble = ixheaacd_read_bits_buf(it_bit_buff, 4);
868 
869       if (fill_nibble == 0) {
870         for (i = 0; i < (cnt >> 3) - 1; i++) {
871           ixheaacd_read_bits_buf(it_bit_buff, 8);
872         }
873 
874       } else
875         err = -1;
876       break;
877     case EXT_FIL:
878     default:
879       for (i = 0; i < ((cnt)-8) + 4; i++) {
880         discard = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
881       }
882   }
883 
884   return err;
885 }
886