Coverage Report

Created: 2026-02-26 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_headerdecode.c
Line
Count
Source
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 <stdlib.h>
21
#include "ixheaac_type_def.h"
22
#include "ixheaac_error_standards.h"
23
#include "ixheaac_constants.h"
24
#include "ixheaac_basic_ops32.h"
25
#include "ixheaac_basic_ops16.h"
26
#include "ixheaac_basic_ops40.h"
27
#include "ixheaacd_sbr_common.h"
28
29
#include "ixheaacd_bitbuffer.h"
30
#include "ixheaacd_defines.h"
31
#include "ixheaacd_aac_rom.h"
32
33
#include "ixheaacd_sbrdecsettings.h"
34
#include "ixheaacd_sbr_scale.h"
35
#include "ixheaacd_env_extr_part.h"
36
#include "ixheaacd_sbr_rom.h"
37
38
#include "ixheaacd_lpp_tran.h"
39
#include "ixheaacd_hybrid.h"
40
#include "ixheaacd_ps_dec.h"
41
42
#include "ixheaacd_env_extr.h"
43
#include "ixheaacd_common_rom.h"
44
45
#include "ixheaacd_pulsedata.h"
46
47
#include "ixheaacd_pns.h"
48
#include "ixheaacd_drc_data_struct.h"
49
50
#include "ixheaacd_lt_predict.h"
51
52
#include "ixheaacd_cnst.h"
53
#include "ixheaacd_ec_defines.h"
54
#include "ixheaacd_ec_struct_def.h"
55
#include "ixheaacd_channelinfo.h"
56
#include "ixheaacd_drc_dec.h"
57
#include "ixheaacd_sbrdecoder.h"
58
#include "ixheaacd_block.h"
59
#include "ixheaacd_channel.h"
60
61
#include "ixheaacd_adts.h"
62
#include "ixheaacd_audioobjtypes.h"
63
#include "ixheaacd_sbrdecoder.h"
64
#include "ixheaacd_memory_standards.h"
65
66
#include "ixheaacd_latmdemux.h"
67
68
#include "ixheaacd_aacdec.h"
69
#include "ixheaacd_mps_polyphase.h"
70
#include "ixheaacd_config.h"
71
#include "ixheaacd_qmf_dec.h"
72
#include "ixheaacd_mps_macro_def.h"
73
#include "ixheaacd_mps_struct_def.h"
74
#include "ixheaacd_mps_res_rom.h"
75
#include "ixheaacd_mps_aac_struct.h"
76
#include "ixheaacd_mps_dec.h"
77
#include "ixheaacd_struct_def.h"
78
#include "ixheaacd_error_codes.h"
79
#include "ixheaacd_definitions.h"
80
#include "ixheaacd_adts_crc_check.h"
81
82
#include "ixheaacd_headerdecode.h"
83
84
#include "ixheaacd_interface.h"
85
#include "ixheaacd_info.h"
86
#include "ixheaacd_mps_interface.h"
87
#include "ixheaacd_config.h"
88
89
#include "ixheaacd_struct.h"
90
#include "ixheaacd_function_selector.h"
91
#include "ixheaacd_ld_mps_dec.h"
92
93
#include "ixheaac_error_standards.h"
94
95
528
#define ELDEXT_SAOC 1
96
18.5k
#define ELDEXT_TERM 0
97
975
#define ELDEXT_LDSAC 2
98
99
extern const WORD32 ixheaacd_sampl_freq_idx_table[17];
100
101
117k
#define AAC_LC_PROFILE (2)
102
103
11.0k
#define ADTS_HEADER_LENGTH 7
104
105
static PLATFORM_INLINE VOID
106
40.5k
ixheaacd_aac_bytealign(struct ia_bit_buf_struct *it_bit_buff) {
107
40.5k
  WORD16 num_bit;
108
40.5k
  num_bit = (it_bit_buff->bit_pos + 1);
109
40.5k
  if (num_bit != 8) {
110
0
    it_bit_buff->bit_pos = 7;
111
0
    it_bit_buff->cnt_bits -= num_bit;
112
0
    it_bit_buff->ptr_read_next += 1;
113
0
  }
114
40.5k
}
115
116
WORD32 ixheaacd_read_pce_channel_info(WORD32 ch, WORD8 *ptr_is_cpe,
117
                                      WORD8 *ptr_tag_select,
118
4.48k
                                      struct ia_bit_buf_struct *it_bit_buff) {
119
4.48k
  WORD32 num_ch = 0, i, tmp;
120
12.4k
  for (i = 0; i < ch; i++) {
121
7.92k
    tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
122
7.92k
    ptr_is_cpe[i] = (tmp & 0x10) >> 4;
123
124
7.92k
    if (ptr_is_cpe[i]) {
125
1.48k
      num_ch += 2;
126
6.43k
    } else {
127
6.43k
      num_ch++;
128
6.43k
    }
129
130
7.92k
    ptr_tag_select[i] = (tmp & 0xF);
131
7.92k
  }
132
4.48k
  return num_ch;
133
4.48k
}
134
135
VOID ixheaacd_read_pce_mixdown_data(struct ia_bit_buf_struct *it_bit_buff,
136
                                    WORD32 mix_down_present,
137
4.50k
                                    WORD32 mix_down_element_no) {
138
4.50k
  WORD32 mix_down_flag = ixheaacd_read_bits_buf(it_bit_buff, mix_down_present);
139
4.50k
  if (mix_down_flag == 1) {
140
2.03k
    ixheaacd_read_bits_buf(it_bit_buff, mix_down_element_no);
141
2.03k
  }
142
4.50k
}
143
144
VOID ixheaacd_skip_bits(struct ia_bit_buf_struct *it_bit_buff, WORD32 bits,
145
5.39k
                        WORD32 num_element) {
146
5.39k
  WORD32 i;
147
63.2k
  for (i = 0; i < num_element; i++) {
148
57.8k
    ixheaacd_read_bits_buf(it_bit_buff, bits);
149
57.8k
  }
150
5.39k
}
151
152
WORD32 ixheaacd_read_prog_config_element(
153
    ia_program_config_struct *ptr_config_element,
154
10.0k
    struct ia_bit_buf_struct *it_bit_buff) {
155
10.0k
  WORD32 i, tmp;
156
10.0k
  WORD count = 0, num_ch = 0;
157
158
10.0k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
159
160
10.0k
  ptr_config_element->element_instance_tag = (tmp >> 2);
161
10.0k
  ptr_config_element->object_type = tmp & 0x3;
162
163
10.0k
  if ((ptr_config_element->object_type + 1) != 2
164
165
2.44k
      && (ptr_config_element->object_type + 1) != 4
166
167
10.0k
      ) {
168
956
    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
169
956
  }
170
171
9.05k
  ptr_config_element->samp_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
172
9.05k
  if (ptr_config_element->samp_freq_index > 11) {
173
7.07k
    return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
174
7.07k
  }
175
176
1.98k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
177
178
1.98k
  count += ptr_config_element->num_front_channel_elements = (tmp >> 17);
179
1.98k
  count += ptr_config_element->num_side_channel_elements =
180
1.98k
      (tmp & 0x1E000) >> 13;
181
1.98k
  count += ptr_config_element->num_back_channel_elements = (tmp & 0x1E00) >> 9;
182
1.98k
  count += ptr_config_element->num_lfe_channel_elements = (tmp & 0x180) >> 7;
183
1.98k
  ptr_config_element->num_assoc_data_elements = (tmp & 0x70) >> 4;
184
1.98k
  count += ptr_config_element->num_valid_cc_elements = tmp & 0xF;
185
186
1.98k
  if (count > MAX_BS_ELEMENT) {
187
469
    return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
188
469
  }
189
190
1.51k
  ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
191
1.51k
  ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
192
1.51k
  ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 3);
193
194
1.51k
  num_ch += ixheaacd_read_pce_channel_info(
195
1.51k
      ptr_config_element->num_front_channel_elements,
196
1.51k
      ptr_config_element->front_element_is_cpe,
197
1.51k
      ptr_config_element->front_element_tag_select, it_bit_buff);
198
199
1.51k
  num_ch += ixheaacd_read_pce_channel_info(
200
1.51k
      ptr_config_element->num_side_channel_elements,
201
1.51k
      ptr_config_element->side_element_is_cpe,
202
1.51k
      ptr_config_element->side_element_tag_select, it_bit_buff);
203
204
1.51k
  num_ch += ixheaacd_read_pce_channel_info(
205
1.51k
      ptr_config_element->num_back_channel_elements,
206
1.51k
      ptr_config_element->back_element_is_cpe,
207
1.51k
      ptr_config_element->back_element_tag_select, it_bit_buff);
208
209
1.51k
  num_ch += ptr_config_element->num_lfe_channel_elements;
210
211
2.58k
  for (i = 0; i < (ptr_config_element->num_lfe_channel_elements); i++) {
212
1.06k
    ptr_config_element->lfe_element_tag_select[i] =
213
1.06k
        ixheaacd_read_bits_buf(it_bit_buff, 4);
214
1.06k
  }
215
216
1.51k
  ptr_config_element->channels = num_ch;
217
218
4.61k
  for (i = 0; i < (ptr_config_element->num_assoc_data_elements); i++) {
219
3.10k
    ixheaacd_read_bits_buf(it_bit_buff, 4);
220
3.10k
  }
221
222
1.51k
  ixheaacd_skip_bits(it_bit_buff, 5, ptr_config_element->num_valid_cc_elements);
223
224
1.51k
  {
225
1.51k
    WORD32 bits_to_read = ptr_config_element->alignment_bits;
226
1.51k
    if (bits_to_read <= it_bit_buff->bit_pos) {
227
70
      bits_to_read = it_bit_buff->bit_pos - bits_to_read;
228
1.44k
    } else {
229
1.44k
      bits_to_read = 8 - (bits_to_read) + it_bit_buff->bit_pos;
230
1.44k
    }
231
1.51k
    tmp = ixheaacd_read_bits_buf(it_bit_buff, bits_to_read);
232
1.51k
  }
233
1.51k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 8);
234
235
1.51k
  ixheaacd_skip_bits(it_bit_buff, 8, tmp);
236
237
1.51k
  return 0;
238
1.98k
}
239
240
WORD ixheaacd_decode_pce(struct ia_bit_buf_struct *it_bit_buff,
241
                         UWORD32 *ui_pce_found_in_hdr,
242
335
                         ia_program_config_struct *ptr_prog_config) {
243
335
  WORD32 error_code = 0;
244
245
335
  if (*ui_pce_found_in_hdr == 1 || *ui_pce_found_in_hdr == 3) {
246
92
    ia_program_config_struct ptr_config_element = {0};
247
92
    ptr_config_element.alignment_bits = ptr_prog_config->alignment_bits;
248
92
    error_code =
249
92
        ixheaacd_read_prog_config_element(&ptr_config_element, it_bit_buff);
250
92
    *ui_pce_found_in_hdr = 3;
251
243
  } else {
252
243
    error_code =
253
243
        ixheaacd_read_prog_config_element(ptr_prog_config, it_bit_buff);
254
243
    *ui_pce_found_in_hdr = 2;
255
243
  }
256
335
  return error_code;
257
335
}
258
259
static PLATFORM_INLINE WORD32 ixheaacd_get_adif_header(
260
1.71k
    ia_adif_header_struct *adif, struct ia_bit_buf_struct *it_bit_buff) {
261
1.71k
  WORD32 i;
262
1.71k
  WORD32 ret_val = 0, tmp;
263
264
1.71k
  ixheaacd_read_bits_buf(it_bit_buff, 16);
265
1.71k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 17);
266
267
1.71k
  if (tmp & 0x1) {
268
554
    ixheaacd_skip_bits(it_bit_buff, 8, 9);
269
554
  }
270
271
1.71k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 3);
272
273
1.71k
  adif->bit_stream_type = (tmp & 0x1);
274
275
1.71k
  ixheaacd_read_bits_buf(it_bit_buff, 23);
276
277
1.71k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 4);
278
279
2.80k
  for (i = 0; i <= tmp; i++) {
280
2.79k
    if (adif->bit_stream_type == 0) {
281
2.49k
      ixheaacd_read_bits_buf(it_bit_buff, 20);
282
2.49k
    }
283
284
2.79k
    adif->prog_config_present = 1;
285
2.79k
    adif->str_prog_config.alignment_bits = 7;
286
2.79k
    ret_val =
287
2.79k
        ixheaacd_read_prog_config_element(&adif->str_prog_config, it_bit_buff);
288
2.79k
    if (ret_val) {
289
1.70k
      return ret_val;
290
1.70k
    }
291
2.79k
  }
292
293
10
  return 0;
294
1.71k
}
295
296
WORD32 ixheaacd_find_syncword(ia_adts_header_struct *adts,
297
106k
                              struct ia_bit_buf_struct *it_bit_buff) {
298
106k
  adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
299
106k
  if (adts->sync_word == 0xFFF) {
300
106k
    return 0;
301
106k
  }
302
303
324k
  while (1) {
304
324k
    ixheaacd_read_bidirection(it_bit_buff, -4);
305
324k
    if (it_bit_buff->cnt_bits < 12) {
306
235
      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
307
235
    }
308
324k
    adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
309
324k
    if (adts->sync_word == 0xFFF) {
310
312
      ixheaacd_read_bidirection(it_bit_buff, -12);
311
312
      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
312
312
    }
313
324k
  }
314
651
}
315
316
WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts,
317
80.2k
                          struct ia_bit_buf_struct *it_bit_buff) {
318
80.2k
  WORD32 tmp;
319
80.2k
  IA_ERRORCODE err = IA_NO_ERROR;
320
80.2k
  WORD32 crc_reg;
321
80.2k
  ia_adts_crc_info_struct *ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info;
322
80.2k
  ptr_adts_crc_info->crc_active = 1;
323
80.2k
  ptr_adts_crc_info->no_reg = 0;
324
80.2k
  ixheaacd_read_bidirection(it_bit_buff, -12);
325
80.2k
  crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
326
80.2k
                                        CRC_ADTS_HEADER_LEN);
327
80.2k
  err = ixheaacd_find_syncword(adts, it_bit_buff);
328
80.2k
  if (err) return err;
329
330
80.2k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 10);
331
332
80.2k
  adts->id = (tmp & 0x200) >> 9;
333
80.2k
  adts->layer = (tmp & 0x180) >> 7;
334
80.2k
  adts->protection_absent = (tmp & 0x40) >> 6;
335
80.2k
  adts->profile = (tmp & 0x30) >> 4;
336
80.2k
  { adts->profile++; }
337
80.2k
  adts->samp_freq_index = (tmp & 0xF);
338
339
80.2k
  if (((adts->profile != AAC_LC_PROFILE)) || (adts->samp_freq_index > 11))
340
341
39.6k
  {
342
39.6k
    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
343
39.6k
  }
344
345
40.6k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
346
347
40.6k
  adts->channel_configuration = (WORD32)(tmp & 0xE0000) >> 17;
348
349
40.6k
  adts->aac_frame_length = (tmp & 0x1FFF);
350
351
40.6k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 13);
352
353
40.6k
  adts->no_raw_data_blocks = (tmp & 0x3);
354
355
40.6k
  ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
356
357
40.6k
  if (adts->protection_absent == 0) {
358
1.88k
    ixheaacd_skip_bits(it_bit_buff, 16, adts->no_raw_data_blocks);
359
1.88k
    adts->crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
360
361
1.88k
    ptr_adts_crc_info->crc_active = 1;
362
1.88k
    ptr_adts_crc_info->file_value = adts->crc_check;
363
1.88k
  } else
364
38.7k
    ptr_adts_crc_info->crc_active = 0;
365
366
40.6k
  ixheaacd_aac_bytealign(it_bit_buff);
367
40.6k
  return 0;
368
80.2k
}
369
370
WORD32 ixheaacd_get_samp_rate(
371
    struct ia_bit_buf_struct *it_bit_buff,
372
    ia_sampling_rate_info_struct *pstr_samp_rate_info,
373
100k
    ia_audio_specific_config_struct *pstr_audio_specific_config) {
374
100k
  WORD32 index;
375
100k
  WORD32 sampling_rate;
376
100k
  index = ixheaacd_read_bits_buf(it_bit_buff, 4);
377
100k
  pstr_audio_specific_config->samp_frequency_index = index;
378
379
100k
  if (index == 0x0F) {
380
460
    sampling_rate = ixheaacd_read_bits_buf(it_bit_buff, 24);
381
382
460
    if (pstr_audio_specific_config->audio_object_type != AOT_USAC) {
383
310
      if (sampling_rate < 9391)
384
8
        sampling_rate = 8000;
385
302
      else if ((sampling_rate >= 9391) && (sampling_rate < 11502))
386
9
        sampling_rate = 11025;
387
293
      else if ((sampling_rate >= 11502) && (sampling_rate < 13856))
388
11
        sampling_rate = 12000;
389
282
      else if ((sampling_rate >= 13856) && (sampling_rate < 18783))
390
5
        sampling_rate = 16000;
391
277
      else if ((sampling_rate >= 18783) && (sampling_rate < 23004))
392
10
        sampling_rate = 22050;
393
267
      else if ((sampling_rate >= 23004) && (sampling_rate < 27713))
394
9
        sampling_rate = 24000;
395
258
      else if ((sampling_rate >= 27713) && (sampling_rate < 37566))
396
12
        sampling_rate = 32000;
397
246
      else if ((sampling_rate >= 37566) && (sampling_rate < 46009))
398
9
        sampling_rate = 44100;
399
237
      else if ((sampling_rate >= 46009) && (sampling_rate < 55426))
400
14
        sampling_rate = 48000;
401
223
      else if ((sampling_rate >= 55426) && (sampling_rate < 75132))
402
8
        sampling_rate = 64000;
403
215
      else if ((sampling_rate >= 75132) && (sampling_rate < 92017))
404
12
        sampling_rate = 88200;
405
203
      else if (sampling_rate >= 92017)
406
203
        sampling_rate = 96000;
407
310
    }
408
460
    return sampling_rate;
409
100k
  } else if ((index > 12) && (index < 15)) {
410
5
    return -1;
411
100k
  } else {
412
100k
    return ((pstr_samp_rate_info[index].sampling_frequency));
413
100k
  }
414
100k
}
415
static int ixheaacd_get_ld_sbr_header(
416
    ia_bit_buf_struct *it_bit_buff,
417
16.6k
    ia_sbr_header_data_struct *sbr_header_data) {
418
16.6k
  WORD32 header_extra_1, header_extra_2;
419
16.6k
  UWORD32 tmp, bit_cnt = 0;
420
421
16.6k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 16);
422
16.6k
  bit_cnt += 16;
423
424
16.6k
  sbr_header_data->amp_res = (tmp & 0x8000) >> 15;
425
16.6k
  sbr_header_data->start_freq = (tmp & 0x7800) >> 11;
426
16.6k
  sbr_header_data->stop_freq = (tmp & 0x780) >> 7;
427
16.6k
  sbr_header_data->xover_band = (tmp & 0x70) >> 4;
428
16.6k
  header_extra_1 = (tmp & 0x0002) >> 1;
429
16.6k
  header_extra_2 = (tmp & 0x0001);
430
431
16.6k
  if (header_extra_1) {
432
2.62k
    sbr_header_data->freq_scale = ixheaacd_read_bits_buf(it_bit_buff, 2);
433
2.62k
    sbr_header_data->alter_scale = ixheaacd_read_bits_buf(it_bit_buff, 1);
434
2.62k
    sbr_header_data->noise_bands = ixheaacd_read_bits_buf(it_bit_buff, 2);
435
13.9k
  } else {
436
13.9k
    sbr_header_data->freq_scale = 2;
437
13.9k
    sbr_header_data->alter_scale = 1;
438
13.9k
    sbr_header_data->noise_bands = 2;
439
13.9k
  }
440
441
16.6k
  if (header_extra_2) {
442
1.35k
    sbr_header_data->limiter_bands = ixheaacd_read_bits_buf(it_bit_buff, 2);
443
1.35k
    sbr_header_data->limiter_gains = ixheaacd_read_bits_buf(it_bit_buff, 2);
444
1.35k
    sbr_header_data->interpol_freq = ixheaacd_read_bits_buf(it_bit_buff, 1);
445
1.35k
    sbr_header_data->smoothing_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
446
15.2k
  } else {
447
15.2k
    sbr_header_data->limiter_bands = 2;
448
15.2k
    sbr_header_data->limiter_gains = 2;
449
15.2k
    sbr_header_data->interpol_freq = 1;
450
15.2k
    sbr_header_data->smoothing_mode = 1;
451
15.2k
  }
452
453
16.6k
  return (bit_cnt);
454
16.6k
}
455
456
WORD32 ixheaacd_eld_sbr_header(ia_bit_buf_struct *it_bit_buff, WORD32 channels,
457
11.2k
                               ia_sbr_header_data_struct *pstr_sbr_config) {
458
11.2k
  int num_sbr_header, el, bit_cnt = 0;
459
11.2k
  switch (channels) {
460
569
    default:
461
569
      num_sbr_header = 0;
462
569
      break;
463
141
    case 1:
464
5.64k
    case 2:
465
5.64k
      num_sbr_header = 1;
466
5.64k
      break;
467
4.60k
    case 3:
468
4.60k
      num_sbr_header = 2;
469
4.60k
      break;
470
6
    case 4:
471
6
    case 5:
472
12
    case 6:
473
12
      num_sbr_header = 3;
474
12
      break;
475
433
    case 7:
476
433
      num_sbr_header = 4;
477
433
      break;
478
11.2k
  }
479
27.8k
  for (el = 0; el < num_sbr_header; el++) {
480
16.6k
    bit_cnt = ixheaacd_get_ld_sbr_header(it_bit_buff, pstr_sbr_config);
481
16.6k
  }
482
11.2k
  return (bit_cnt);
483
11.2k
}
484
485
WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
486
                           WORD32 header_len, WORD32 *bytes_consumed,
487
                           ia_sampling_rate_info_struct *pstr_samp_rate_info,
488
100k
                           struct ia_bit_buf_struct *it_bit_buff) {
489
100k
  WORD32 tmp;
490
100k
  WORD32 cnt_bits = it_bit_buff->cnt_bits;
491
100k
  UWORD32 aot_init;
492
100k
  UWORD32 tmp_aot;
493
494
100k
  ia_audio_specific_config_struct *pstr_audio_specific_config;
495
496
100k
  memset(aac_state_struct->ia_audio_specific_config, 0,
497
100k
         sizeof(ia_audio_specific_config_struct));
498
499
100k
  memset(&(aac_state_struct->eld_specific_config), 0,
500
100k
         sizeof(ia_eld_specific_config_struct));
501
502
100k
  pstr_audio_specific_config = aac_state_struct->ia_audio_specific_config;
503
504
100k
  aac_state_struct->p_config->str_prog_config.alignment_bits =
505
100k
      it_bit_buff->bit_pos;
506
507
100k
  aot_init = aac_state_struct->audio_object_type;
508
100k
  aac_state_struct->frame_length = FRAME_SIZE;
509
510
100k
  tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5);
511
512
100k
  if (tmp_aot == 31) {
513
31.9k
    tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
514
31.9k
    tmp_aot = 32 + tmp;
515
31.9k
  }
516
517
100k
  if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
518
92.3k
    if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS)
519
81
      return IA_FATAL_ERROR;
520
92.3k
  }
521
522
100k
  pstr_audio_specific_config->audio_object_type =
523
100k
      aac_state_struct->audio_object_type = tmp_aot;
524
525
100k
  tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
526
100k
                               pstr_audio_specific_config);
527
100k
  pstr_audio_specific_config->sampling_frequency = tmp;
528
529
100k
  if (tmp == -1) {
530
4
    *bytes_consumed = 1;
531
4
    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
532
4
  } else
533
100k
    aac_state_struct->sampling_rate = tmp;
534
100k
  aac_state_struct->p_config->ui_samp_freq = tmp;
535
536
100k
  aac_state_struct->ch_config = ixheaacd_read_bits_buf(it_bit_buff, 4);
537
538
100k
  if (aac_state_struct->audio_object_type == AOT_USAC &&
539
19.6k
      ((aac_state_struct->ch_config >= 3) && (aac_state_struct->ch_config != 8))) {
540
2
    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
541
2
  }
542
543
100k
  pstr_audio_specific_config->channel_configuration =
544
100k
      aac_state_struct->ch_config;
545
546
100k
  if (aac_state_struct->audio_object_type == AOT_SBR ||
547
100k
      aac_state_struct->audio_object_type == AOT_PS) {
548
114
    tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
549
114
                                 pstr_audio_specific_config);
550
114
    aac_state_struct->sbr_present_flag = 1;
551
114
    if (tmp == -1) {
552
0
      *bytes_consumed = 1;
553
0
      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
554
0
    } else
555
114
      aac_state_struct->extension_samp_rate = tmp;
556
557
114
    aac_state_struct->audio_object_type =
558
114
        ixheaacd_read_bits_buf(it_bit_buff, 5);
559
114
  }
560
561
100k
  if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
562
92.3k
    if (aac_state_struct->audio_object_type != aot_init) return IA_FATAL_ERROR;
563
92.3k
  }
564
565
100k
  if (((aac_state_struct->audio_object_type >= AOT_AAC_MAIN &&
566
100k
        aac_state_struct->audio_object_type <= AOT_AAC_LTP) ||
567
92.8k
       aac_state_struct->audio_object_type == AOT_AAC_SCAL ||
568
92.7k
       aac_state_struct->audio_object_type == AOT_TWIN_VQ ||
569
92.6k
       aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
570
53.8k
       aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
571
41.5k
       aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL ||
572
41.5k
       aac_state_struct->audio_object_type == AOT_ER_AAC_LC) &&
573
80.7k
      aac_state_struct->audio_object_type != AOT_USAC)
574
575
80.7k
  {
576
80.7k
    aac_state_struct->usac_flag = 0;
577
578
80.7k
    aac_state_struct->frame_len_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
579
80.7k
    if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD) {
580
68.5k
      aac_state_struct->depends_on_core_coder =
581
68.5k
          ixheaacd_read_bits_buf(it_bit_buff, 1);
582
68.5k
      aac_state_struct->extension_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
583
584
68.5k
      if (aac_state_struct->ch_config == 0) {
585
6.88k
        WORD32 error_code;
586
6.88k
        error_code = ixheaacd_read_prog_config_element(
587
6.88k
            &aac_state_struct->p_config->str_prog_config, it_bit_buff);
588
6.88k
        if (error_code != 0) {
589
6.64k
          *bytes_consumed = 1;
590
6.64k
          return error_code;
591
6.64k
        }
592
247
        aac_state_struct->p_config->ui_pce_found_in_hdr = 1;
593
247
      }
594
68.5k
    }
595
74.1k
    if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
596
61.8k
        aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
597
29.3k
        aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
598
66.4k
        aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
599
66.4k
      aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 0;
600
66.4k
      aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 0;
601
66.4k
      aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 0;
602
66.4k
      aac_state_struct->eld_specific_config.ep_config = 0;
603
66.4k
      if ((aac_state_struct->extension_flag == 1) ||
604
64.7k
          aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
605
64.7k
        if (aac_state_struct->audio_object_type >= ER_OBJECT_START) {
606
64.7k
          aac_state_struct->eld_specific_config.aac_sect_data_resil_flag =
607
64.7k
              ixheaacd_read_bits_buf(it_bit_buff, 1);
608
64.7k
          aac_state_struct->eld_specific_config.aac_sf_data_resil_flag =
609
64.7k
              ixheaacd_read_bits_buf(it_bit_buff, 1);
610
64.7k
          aac_state_struct->eld_specific_config.aac_spect_data_resil_flag =
611
64.7k
              ixheaacd_read_bits_buf(it_bit_buff, 1);
612
64.7k
          if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
613
32.3k
            aac_state_struct->eld_specific_config.ep_config =
614
32.3k
                ixheaacd_read_bits_buf(it_bit_buff, 2);
615
64.7k
          if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD)
616
12.2k
            aac_state_struct->eld_specific_config.ld_sbr_flag_present =
617
12.2k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
618
64.7k
        }
619
64.7k
      }
620
66.4k
    }
621
74.1k
  }
622
93.9k
  if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
623
19.6k
    {
624
19.6k
      pstr_audio_specific_config->sbr_present_flag = 0;
625
19.6k
      pstr_audio_specific_config->ext_audio_object_type = 0;
626
19.6k
    }
627
628
19.6k
    {
629
19.6k
      {
630
19.6k
        SIZE_T tmp = 0xf;
631
19.6k
        UWORD32 i;
632
19.6k
        WORD32 err = 0;
633
634
19.6k
        aac_state_struct->usac_flag = 1;
635
636
19.6k
        ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
637
19.6k
        err = ixheaacd_config(it_bit_buff, &(pstr_audio_specific_config->str_usac_config),
638
19.6k
                              &(pstr_audio_specific_config->channel_configuration),
639
19.6k
                              aac_state_struct->ec_enable);
640
19.6k
        if (err != 0) return err;
641
642
19.5k
        pstr_audio_specific_config->sampling_frequency =
643
19.5k
            pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
644
645
19.5k
        if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
646
19.4k
          pstr_audio_specific_config->sbr_present_flag = 1;
647
19.4k
          pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
648
19.4k
          pstr_audio_specific_config->ext_sampling_frequency =
649
19.4k
              pstr_audio_specific_config->sampling_frequency;
650
19.4k
          pstr_audio_specific_config->ext_samp_frequency_index =
651
19.4k
              pstr_audio_specific_config->samp_frequency_index;
652
653
224k
          for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
654
224k
                              sizeof(ixheaacd_sampl_freq_idx_table[0]);
655
222k
               i++) {
656
222k
            if (ixheaacd_sampl_freq_idx_table[i] ==
657
222k
                (int)(pstr_audio_specific_config->sampling_frequency)) {
658
17.6k
              tmp = i;
659
17.6k
              break;
660
17.6k
            }
661
222k
          }
662
19.4k
          pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
663
19.4k
        } else {
664
98
          pstr_audio_specific_config->sbr_present_flag = 0;
665
98
        }
666
19.5k
      }
667
19.5k
    }
668
669
19.5k
    if (aac_state_struct->bs_format != LOAS_BSFORMAT) {
670
974
      ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
671
672
974
      if ((SIZE_T)it_bit_buff->ptr_read_next ==
673
974
          (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
674
0
        *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
675
974
      } else {
676
974
        *bytes_consumed = (WORD32)((((((SIZE_T)it_bit_buff->ptr_read_next -
677
974
                              (SIZE_T)it_bit_buff->ptr_bit_buf_base))
678
974
                            << 3) +
679
974
                            7 - it_bit_buff->bit_pos + 7) >>
680
974
                            3);
681
974
      }
682
974
    }
683
19.5k
    return 0;
684
19.6k
  }
685
686
74.3k
  aac_state_struct->frame_length = FRAME_SIZE;
687
74.3k
  if (aac_state_struct->frame_len_flag)
688
35.6k
    aac_state_struct->frame_length = FRAME_SIZE_SMALL;
689
690
74.3k
  if (aac_state_struct->extension_flag)
691
52.7k
    aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
692
693
74.3k
  if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
694
32.4k
    aac_state_struct->frame_length >>= 1;
695
696
74.3k
  if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
697
12.2k
    aac_state_struct->frame_length >>= 1;
698
12.2k
    if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
699
11.2k
      aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
700
11.2k
          ixheaacd_read_bits_buf(it_bit_buff, 1);
701
11.2k
      aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
702
11.2k
          ixheaacd_read_bits_buf(it_bit_buff, 1);
703
704
11.2k
      ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
705
11.2k
                              &aac_state_struct->str_sbr_config);
706
707
11.2k
      aac_state_struct->dwnsmp_signal =
708
11.2k
          !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
709
11.2k
    }
710
711
12.2k
    {
712
12.2k
      UWORD16 len, eld_ext_type;
713
12.2k
      WORD32 err;
714
12.2k
      UWORD16 cnt;
715
716
12.2k
      if (ixheaacd_show_bits_buf(it_bit_buff, 4) != ELDEXT_TERM) {
717
6.31k
        while ((eld_ext_type = ixheaacd_read_bits_buf(it_bit_buff, 4)) !=
718
6.31k
               ELDEXT_TERM) {
719
6.31k
          len = ixheaacd_read_bits_buf(it_bit_buff, 4);
720
6.31k
          if (len == 15) {
721
37
            len += ixheaacd_read_bits_buf(it_bit_buff, 8);
722
37
          }
723
6.31k
          if (len == 15 + 255) {
724
13
            len += ixheaacd_read_bits_buf(it_bit_buff, 16);
725
13
          }
726
727
6.31k
          switch (eld_ext_type) {
728
528
            case ELDEXT_SAOC:
729
528
              break;
730
975
            case ELDEXT_LDSAC:
731
975
              aac_state_struct->ldmps_present = 1;
732
975
              aac_state_struct->mps_dec_handle.ldmps_config.ldmps_present_flag =
733
975
                  1;
734
975
              aac_state_struct->mps_dec_handle.object_type =
735
975
                  aac_state_struct->audio_object_type;
736
975
              aac_state_struct->mps_dec_handle.ec_flag = aac_state_struct->ec_enable;
737
975
              err = ixheaacd_ld_spatial_specific_config(
738
975
                  &(aac_state_struct->mps_dec_handle.ldmps_config), it_bit_buff);
739
975
              if (err) return err;
740
741
956
              if (ixheaacd_mps_create(
742
956
                      &aac_state_struct->mps_dec_handle,
743
956
                      aac_state_struct->mps_dec_handle.ldmps_config
744
956
                          .bs_frame_length,
745
956
                      0, &(aac_state_struct->mps_dec_handle.ldmps_config))) {
746
14
                return -1;
747
14
              }
748
942
              break;
749
4.80k
            default:
750
7.95k
              for (cnt = 0; cnt < len; cnt++) {
751
3.14k
                ixheaacd_read_bits_buf(it_bit_buff, 8);
752
3.14k
              }
753
754
4.80k
              break;
755
6.31k
          }
756
6.10k
          break;
757
6.31k
        }
758
6.31k
      }
759
12.2k
    }
760
12.0k
    if (!((aac_state_struct->ldmps_present == 1) &&
761
3.81k
          !(it_bit_buff->cnt_bits >= 1)))
762
12.0k
    ixheaacd_read_bits_buf(it_bit_buff, 1);
763
12.0k
  }
764
74.1k
  if (!((aac_state_struct->ldmps_present == 1) && !(it_bit_buff->cnt_bits > 0))) {
765
73.9k
    if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
766
61.9k
        aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
767
40.2k
        aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
768
33.7k
      WORD32 ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
769
33.7k
      if (ep_config == 2 || ep_config == 3) {
770
187
      }
771
33.7k
      if (ep_config == 3) {
772
141
        WORD32 direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
773
141
        if (!direct_map) {
774
3
        }
775
141
      }
776
33.7k
    }
777
778
73.9k
    tmp = (header_len * 8) - it_bit_buff->cnt_bits;
779
780
73.9k
    if (aac_state_struct->audio_object_type != AOT_SBR &&
781
73.9k
        (it_bit_buff->cnt_bits >= 16)) {
782
73.8k
      tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
783
784
73.8k
      if (tmp == 0x2b7) {
785
56
        tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
786
787
56
        if (tmp == AOT_SBR) {
788
48
          WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
789
48
          if (sbr_present_flag) {
790
42
            tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
791
42
                                         pstr_audio_specific_config);
792
42
            if (tmp == -1) {
793
1
              *bytes_consumed = 1;
794
1
              return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
795
1
            } else
796
41
              aac_state_struct->extension_samp_rate = tmp;
797
798
41
            if (it_bit_buff->cnt_bits >= 12) {
799
15
              tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
800
15
              if (tmp == 0x548) {
801
0
                tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
802
0
              }
803
15
            }
804
41
          }
805
48
        }
806
73.7k
      } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
807
73.7k
        ixheaacd_read_bidirection(it_bit_buff, -11);
808
73.7k
      }
809
73.8k
    }
810
73.9k
  }
811
812
74.1k
  if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
813
73.9k
      aac_state_struct->audio_object_type != AOT_SBR &&
814
73.9k
      aac_state_struct->audio_object_type != AOT_PS &&
815
73.9k
      aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
816
52.1k
      aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
817
19.7k
      aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
818
7.72k
      aac_state_struct->audio_object_type != AOT_AAC_LTP) {
819
138
    *bytes_consumed = 1;
820
138
    return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
821
73.9k
  } else {
822
73.9k
    if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
823
73.7k
      *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
824
73.7k
      if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
825
826
73.7k
    } else
827
267
      *bytes_consumed = header_len;
828
829
73.9k
    return 0;
830
73.9k
  }
831
74.1k
}
832
833
WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts,
834
                              struct ia_bit_buf_struct *it_bit_buff,
835
80.2k
                              WORD32 usr_max_ch) {
836
80.2k
  WORD32 max_frm_len_per_ch, result = 0;
837
838
80.2k
  result = ixheaacd_adtsframe(adts, it_bit_buff);
839
840
80.2k
  max_frm_len_per_ch = ixheaac_mult32(768, (adts->no_raw_data_blocks + 1));
841
842
80.2k
  if (adts->channel_configuration != 0)
843
55.3k
    max_frm_len_per_ch =
844
55.3k
        ixheaac_mult32(max_frm_len_per_ch, adts->channel_configuration);
845
24.9k
  else
846
24.9k
    max_frm_len_per_ch = max_frm_len_per_ch * usr_max_ch;
847
848
80.2k
  return ((result != 0) || (adts->aac_frame_length < 8) || (adts->layer != 0) ||
849
36.9k
          (adts->profile != AAC_LC_PROFILE));
850
80.2k
}
851
852
IA_ERRORCODE ixheaacd_latm_header_decode(
853
    ia_aac_dec_state_struct *aac_state_struct,
854
    struct ia_bit_buf_struct *it_bit_buff, WORD32 *bytes_consumed,
855
6.41k
    ia_sampling_rate_info_struct *pstr_samp_rate_info) {
856
6.41k
  WORD32 sync;
857
6.41k
  IA_ERRORCODE result;
858
6.41k
  WORD32 next_sync, audio_mux_len_bytes_last;
859
6.41k
  WORD32 audio_mux_len_bits_last;
860
6.41k
  WORD32 sync_status = aac_state_struct->sync_status;
861
6.41k
  WORD32 bit_count = aac_state_struct->bit_count;
862
6.41k
  WORD32 cnt_bits = it_bit_buff->cnt_bits;
863
864
6.41k
  *bytes_consumed = 0;
865
866
6.41k
  aac_state_struct->bs_format = LOAS_BSFORMAT;
867
868
6.41k
  if (sync_status == 0) {
869
18.6k
    do {
870
18.6k
      sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
871
18.6k
      bit_count += 11;
872
7.31M
      while (sync != 0x2B7) {
873
7.29M
        sync = ((sync & 0x3ff) << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1);
874
7.29M
        bit_count += 1;
875
7.29M
        if (it_bit_buff->cnt_bits < 13) {
876
9
          ixheaacd_read_bidirection(it_bit_buff, -11);
877
9
          *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
878
9
          return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
879
9
        }
880
7.29M
      }
881
882
18.6k
      audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
883
18.6k
      bit_count += 13;
884
18.6k
      audio_mux_len_bits_last = audio_mux_len_bytes_last << 3;
885
18.6k
      if (it_bit_buff->cnt_bits >= (audio_mux_len_bits_last + 11)) {
886
18.5k
        ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bits_last);
887
18.5k
        bit_count += audio_mux_len_bits_last;
888
889
18.5k
        next_sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
890
18.5k
        bit_count += 11;
891
892
18.5k
        if (next_sync == 0x2B7) {
893
6.32k
          ixheaacd_read_bidirection(it_bit_buff,
894
6.32k
                                    -(11 + audio_mux_len_bits_last + 13 + 11));
895
6.32k
          bit_count -= 11 + audio_mux_len_bits_last + 13 + 11;
896
6.32k
          break;
897
12.2k
        } else {
898
12.2k
          ixheaacd_read_bidirection(it_bit_buff,
899
12.2k
                                    -(audio_mux_len_bits_last + 24 + 11 - 1));
900
12.2k
          bit_count -= audio_mux_len_bits_last + 24 + 11 - 1;
901
12.2k
        }
902
903
18.5k
      } else {
904
89
        if (it_bit_buff->cnt_bits != audio_mux_len_bits_last) {
905
15
          ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
906
15
          bit_count -= (13 + 11);
907
15
          *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
908
15
          return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
909
74
        } else {
910
74
          ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
911
74
          bit_count -= (13 + 11);
912
74
          break;
913
74
        }
914
89
      }
915
18.6k
    } while (1);
916
917
6.39k
    do {
918
6.39k
      WORD32 audio_mux_len_bytes_last;
919
6.39k
      WORD32 use_same_stream_mux;
920
921
6.39k
      sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
922
6.39k
      bit_count += 11;
923
924
6.39k
      if (sync != 0x2b7) {
925
0
        ixheaacd_read_bidirection(it_bit_buff, -25);
926
0
        bit_count -= 11;
927
0
        *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
928
0
        return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
929
0
      }
930
931
6.39k
      audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
932
6.39k
      bit_count += 13;
933
934
6.39k
      use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1);
935
6.39k
      bit_count += 1;
936
937
6.39k
      if (!use_same_stream_mux) {
938
6.39k
        ixheaacd_read_bidirection(it_bit_buff, -25);
939
6.39k
        bit_count -= 25;
940
6.39k
        sync_status = 1;
941
6.39k
        aac_state_struct->sync_status = sync_status;
942
6.39k
        break;
943
6.39k
      } else {
944
3
        ixheaacd_read_bidirection(it_bit_buff, -25);
945
3
        bit_count -= 25;
946
3
        aac_state_struct->bit_count = bit_count;
947
3
        *bytes_consumed = 1;
948
3
        return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
949
3
      }
950
951
952
0
      ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bytes_last * 8 - 1);
953
0
      bit_count += audio_mux_len_bytes_last * 8 - 1;
954
955
0
    } while (sync_status == 0);
956
957
6.39k
    *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
958
6.39k
    {
959
6.39k
      ixheaacd_latm_struct latm_struct_element;
960
6.39k
      WORD32 sync;
961
6.39k
      memset(&latm_struct_element, 0, sizeof(ixheaacd_latm_struct));
962
963
6.39k
      sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
964
6.39k
      if (sync == 0x2b7) {
965
6.39k
        result = ixheaacd_latm_audio_mux_element(
966
6.39k
            it_bit_buff, &latm_struct_element, aac_state_struct,
967
6.39k
            pstr_samp_rate_info);
968
6.39k
        if (result != 0) {
969
258
          sync_status = 0;
970
258
          aac_state_struct->sync_status = sync_status;
971
972
258
          *bytes_consumed += 1;
973
258
          return result;
974
258
        }
975
6.39k
      }
976
6.39k
    }
977
6.39k
  }
978
6.13k
  return IA_NO_ERROR;
979
6.41k
}
980
981
WORD32 ixheaacd_aac_headerdecode(
982
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, UWORD8 *buffer,
983
    WORD32 *bytes_consumed,
984
12.4k
    const ia_aac_dec_huffman_tables_struct *pstr_huffmann_tables) {
985
12.4k
  struct ia_bit_buf_struct it_bit_buff = {0}, *handle_bit_buff;
986
12.4k
  ia_adif_header_struct adif = {0};
987
12.4k
  ia_adts_header_struct adts = {0};
988
12.4k
  WORD32 result;
989
12.4k
  WORD32 header_len;
990
12.4k
  WORD32 sync = 0;
991
992
12.4k
  WORD32 disable_sync = p_obj_exhaacplus_dec->aac_config.ui_disable_sync;
993
12.4k
  WORD32 is_ga_header = p_obj_exhaacplus_dec->aac_config.ui_mp4_flag;
994
995
12.4k
  WORD32 loas_present = p_obj_exhaacplus_dec->aac_config.loas_present;
996
997
12.4k
  ia_aac_dec_state_struct *aac_state_struct =
998
12.4k
      p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
999
12.4k
  WORD32 usr_max_ch = aac_state_struct->p_config->ui_max_channels;
1000
1001
12.4k
  ia_sampling_rate_info_struct *pstr_samp_rate_info =
1002
12.4k
      (ia_sampling_rate_info_struct *)&pstr_huffmann_tables
1003
12.4k
          ->str_sample_rate_info[0];
1004
1005
12.4k
  if (buffer == 0) {
1006
0
    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
1007
0
  }
1008
1009
12.4k
  header_len = aac_state_struct->ui_in_bytes;
1010
1011
12.4k
  handle_bit_buff = ixheaacd_create_bit_buf(&it_bit_buff, (UWORD8 *)buffer,
1012
12.4k
                                            (WORD16)header_len);
1013
12.4k
  handle_bit_buff->cnt_bits += (header_len << 3);
1014
12.4k
  handle_bit_buff->xaac_jmp_buf = &aac_state_struct->xaac_jmp_buf;
1015
1016
12.4k
  if (is_ga_header == 1) {
1017
1.68k
    return ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed,
1018
1.68k
                               pstr_samp_rate_info, handle_bit_buff);
1019
10.7k
  } else if (loas_present) {
1020
0
    return ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff,
1021
0
                                       bytes_consumed, pstr_samp_rate_info);
1022
0
  }
1023
1024
10.7k
  else {
1025
10.7k
    WORD32 header_found = 0;
1026
10.7k
    WORD32 bytes_taken = -1;
1027
10.7k
    WORD32 prev_offset = 0;
1028
10.7k
    WORD32 run_once = 1;
1029
10.7k
    if (disable_sync == 0) run_once = 0;
1030
1031
382k
    do {
1032
382k
      bytes_taken++;
1033
382k
      buffer += (bytes_taken - prev_offset);
1034
1035
382k
      prev_offset = bytes_taken;
1036
1037
382k
      handle_bit_buff = ixheaacd_create_bit_buf(
1038
382k
          &it_bit_buff, (UWORD8 *)buffer, (WORD16)(header_len - bytes_taken));
1039
382k
      handle_bit_buff->cnt_bits += (8 * (header_len - bytes_taken));
1040
1041
382k
      handle_bit_buff->pstr_adts_crc_info = &handle_bit_buff->str_adts_crc_info;
1042
382k
      ixheaacd_adts_crc_open(handle_bit_buff->pstr_adts_crc_info);
1043
1044
382k
      aac_state_struct->ldmps_present = 0;
1045
382k
      aac_state_struct->latm_initialized = 0;
1046
382k
      memset(&aac_state_struct->mps_dec_handle, 0,
1047
382k
             sizeof(aac_state_struct->mps_dec_handle));
1048
382k
      memset(&aac_state_struct->eld_specific_config, 0,
1049
382k
             sizeof(aac_state_struct->eld_specific_config));
1050
1051
382k
      if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') &&
1052
2.47k
          (buffer[3] == 'F')) {
1053
1.71k
        adif.prog_config_present = 0;
1054
1.71k
        result = ixheaacd_get_adif_header(&adif, handle_bit_buff);
1055
1.71k
        if (result == 0) {
1056
3
          if (adif.prog_config_present == 1) {
1057
3
            aac_state_struct->p_config->ui_pce_found_in_hdr = 1;
1058
3
            aac_state_struct->p_config->str_prog_config = adif.str_prog_config;
1059
3
          }
1060
3
          aac_state_struct->s_adif_hdr_present = 1;
1061
3
          aac_state_struct->audio_object_type =
1062
3
              adif.str_prog_config.object_type;
1063
3
          aac_state_struct->sampling_rate =
1064
3
              pstr_samp_rate_info[adif.str_prog_config.samp_freq_index]
1065
3
                  .sampling_frequency;
1066
3
          aac_state_struct->ch_config = adif.str_prog_config.channels;
1067
3
          bytes_taken +=
1068
3
              ((handle_bit_buff->size - handle_bit_buff->cnt_bits) >> 3);
1069
1070
3
          header_found = 1;
1071
3
          aac_state_struct->frame_length = FRAME_SIZE;
1072
3
          if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
1073
0
            aac_state_struct->frame_length >>= 1;
1074
3
        }
1075
1.71k
      }
1076
1077
380k
      else if ((sync = ixheaacd_read_bits_buf(&it_bit_buff, 12)) == 0xfff) {
1078
53.4k
        result = ixheaacd_check_if_adts(&adts, handle_bit_buff, usr_max_ch);
1079
53.4k
        if (result != 0) {
1080
42.4k
          continue;
1081
42.4k
        }
1082
1083
11.0k
        if ((adts.aac_frame_length + ADTS_HEADER_LENGTH) <
1084
11.0k
            (header_len - bytes_taken)) {
1085
6.55k
          ia_adts_header_struct adts_loc = {0};
1086
1087
6.55k
          ixheaacd_create_init_bit_buf(
1088
6.55k
              &it_bit_buff, (UWORD8 *)(buffer + adts.aac_frame_length),
1089
6.55k
              (WORD16)(header_len - bytes_taken - adts.aac_frame_length));
1090
1091
6.55k
          handle_bit_buff = &it_bit_buff;
1092
1093
6.55k
          adts_loc.sync_word =
1094
6.55k
              (WORD16)ixheaacd_read_bits_buf(handle_bit_buff, 12);
1095
1096
6.55k
          if (adts_loc.sync_word != 0xFFF) {
1097
5.50k
            continue;
1098
5.50k
          }
1099
1100
1.04k
          result =
1101
1.04k
              ixheaacd_check_if_adts(&adts_loc, handle_bit_buff, usr_max_ch);
1102
1.04k
          if ((result != 0) ||
1103
280
              (adts.samp_freq_index != adts_loc.samp_freq_index) ||
1104
1.04k
              (adts.channel_configuration != adts_loc.channel_configuration)) {
1105
1.04k
            continue;
1106
1.04k
          }
1107
1.04k
        }
1108
1109
4.50k
        {
1110
4.50k
          WORD32 obj_type;
1111
4.50k
          obj_type = adts.profile;
1112
1113
4.50k
          aac_state_struct->audio_object_type = obj_type;
1114
4.50k
          aac_state_struct->sampling_rate =
1115
4.50k
              ((pstr_samp_rate_info[adts.samp_freq_index].sampling_frequency));
1116
4.50k
          aac_state_struct->ch_config = adts.channel_configuration;
1117
4.50k
          aac_state_struct->s_adts_hdr_present = 1;
1118
4.50k
          header_found = 1;
1119
4.50k
          aac_state_struct->bs_format = ADTS_BSFORMAT;
1120
4.50k
          aac_state_struct->frame_length = FRAME_SIZE;
1121
4.50k
          if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
1122
0
            aac_state_struct->frame_length >>= 1;
1123
4.50k
        }
1124
326k
      } else if (0x2b7 == (sync >> 1)) {
1125
6.41k
        ixheaacd_read_bidirection(&it_bit_buff, -12);
1126
6.41k
        result =
1127
6.41k
            ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff,
1128
6.41k
                                        bytes_consumed, pstr_samp_rate_info);
1129
6.41k
        if (result != 0) {
1130
285
          if ((result == (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
1131
267
              (result < 0)) {
1132
40
            bytes_taken += *bytes_consumed;
1133
40
            *bytes_consumed = bytes_taken;
1134
40
            return result;
1135
40
          } else
1136
245
            bytes_taken += *bytes_consumed - 1;
1137
245
          continue;
1138
285
        }
1139
6.13k
        header_found = 1;
1140
6.13k
        aac_state_struct->bs_format = LOAS_BSFORMAT;
1141
6.13k
        bytes_taken += *bytes_consumed;
1142
6.13k
      }
1143
1144
382k
    } while ((header_found == 0 && ((bytes_taken + 1) < (header_len - 68))) &&
1145
371k
             run_once != 1);
1146
1147
10.7k
    if (header_found == 0 && disable_sync == 1) {
1148
0
      WORD32 err_code;
1149
0
      ixheaacd_read_bidirection(&it_bit_buff, -12);
1150
0
      err_code =
1151
0
          ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed,
1152
0
                              pstr_samp_rate_info, handle_bit_buff);
1153
1154
0
      if (err_code == 0) p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 1;
1155
0
      return err_code;
1156
0
    }
1157
1158
10.7k
    switch (aac_state_struct->audio_object_type) {
1159
2
        case AOT_AAC_MAIN:
1160
4.51k
        case AOT_AAC_LC:
1161
4.51k
        case AOT_AAC_SSR:
1162
4.70k
        case AOT_AAC_LTP:
1163
4.71k
        case AOT_AAC_SCAL:
1164
4.71k
        case AOT_TWIN_VQ:
1165
5.41k
        case AOT_ER_AAC_LD:
1166
6.85k
        case AOT_ER_AAC_ELD:
1167
7.40k
        case AOT_ER_AAC_LC:
1168
10.6k
        case AOT_USAC:
1169
10.6k
          break;
1170
68
        default:
1171
68
          return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
1172
10.7k
      }
1173
1174
10.6k
    if (aac_state_struct->audio_object_type != AOT_USAC)
1175
7.40k
      aac_state_struct->usac_flag = 0;
1176
10.6k
    *bytes_consumed = bytes_taken;
1177
1178
10.6k
    if ((handle_bit_buff->cnt_bits < 0) &&
1179
0
        (handle_bit_buff->size <
1180
0
         (usr_max_ch * (IA_ENHAACPLUS_DEC_INP_BUF_SIZE << 3)))) {
1181
0
      return (WORD16)(
1182
0
          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
1183
0
    }
1184
1185
10.6k
    if (header_found == 0) {
1186
8
      *bytes_consumed = bytes_taken + 1;
1187
8
      return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
1188
10.6k
    } else {
1189
10.6k
      return 0;
1190
10.6k
    }
1191
10.6k
  }
1192
12.4k
}