aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_headerdecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ixheaacd_headerdecode.c')
-rw-r--r--decoder/ixheaacd_headerdecode.c433
1 files changed, 254 insertions, 179 deletions
diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c
index 356cf08..4e07b8d 100644
--- a/decoder/ixheaacd_headerdecode.c
+++ b/decoder/ixheaacd_headerdecode.c
@@ -49,6 +49,9 @@
#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
#include "ixheaacd_channelinfo.h"
#include "ixheaacd_drc_dec.h"
#include "ixheaacd_sbrdecoder.h"
@@ -65,8 +68,12 @@
#include "ixheaacd_aacdec.h"
#include "ixheaacd_mps_polyphase.h"
#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
#include "ixheaacd_mps_dec.h"
-
#include "ixheaacd_struct_def.h"
#include "ixheaacd_error_codes.h"
#include "ixheaacd_definitions.h"
@@ -76,21 +83,18 @@
#include "ixheaacd_interface.h"
#include "ixheaacd_info.h"
-
+#include "ixheaacd_mps_interface.h"
#include "ixheaacd_config.h"
#include "ixheaacd_struct.h"
#include "ixheaacd_function_selector.h"
+#include "ixheaacd_ld_mps_dec.h"
#include "ixheaacd_error_standards.h"
-#undef ALLOW_SMALL_FRAMELENGTH
-
-#define ALLOW_SMALL_FRAMELENGTH
-#ifdef ALLOW_SMALL_FRAMELENGTH
-#undef FRAME_SIZE_SMALL
-#define FRAME_SIZE_SMALL 960
-#endif
+#define ELDEXT_SAOC 1
+#define ELDEXT_TERM 0
+#define ELDEXT_LDSAC 2
extern const WORD32 ixheaacd_sampl_freq_idx_table[17];
@@ -98,10 +102,6 @@ extern const WORD32 ixheaacd_sampl_freq_idx_table[17];
#define ADTS_HEADER_LENGTH 7
-#undef ALLOW_SMALL_FRAMELENGTH
-
-#define ALLOW_SMALL_FRAMELENGTH
-
static PLATFORM_INLINE VOID
ixheaacd_aac_bytealign(struct ia_bit_buf_struct *it_bit_buff) {
WORD16 num_bit;
@@ -165,12 +165,12 @@ WORD32 ixheaacd_read_prog_config_element(
&& (ptr_config_element->object_type + 1) != 4
) {
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
}
ptr_config_element->samp_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
if (ptr_config_element->samp_freq_index > 11) {
- return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+ return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
}
tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
@@ -184,7 +184,7 @@ WORD32 ixheaacd_read_prog_config_element(
count += ptr_config_element->num_valid_cc_elements = tmp & 0xF;
if (count > MAX_BS_ELEMENT) {
- return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+ return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
}
ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
@@ -303,12 +303,12 @@ WORD32 ixheaacd_find_syncword(ia_adts_header_struct *adts,
while (1) {
ixheaacd_read_bidirection(it_bit_buff, -4);
if (it_bit_buff->cnt_bits < 12) {
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
}
adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
if (adts->sync_word == 0xFFF) {
ixheaacd_read_bidirection(it_bit_buff, -12);
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
}
}
}
@@ -339,7 +339,7 @@ WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts,
if (((adts->profile != AAC_LC_PROFILE)) || (adts->samp_freq_index > 11))
{
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
}
tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
@@ -488,8 +488,8 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
struct ia_bit_buf_struct *it_bit_buff) {
WORD32 tmp;
WORD32 cnt_bits = it_bit_buff->cnt_bits;
- WORD32 dummy = 0;
UWORD32 aot_init;
+ UWORD32 tmp_aot;
ia_audio_specific_config_struct *pstr_audio_specific_config;
@@ -505,15 +505,22 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
it_bit_buff->bit_pos;
aot_init = aac_state_struct->audio_object_type;
+ aac_state_struct->frame_length = FRAME_SIZE;
- aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5);
+ tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5);
- if (aac_state_struct->audio_object_type == 31) {
+ if (tmp_aot == 31) {
tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
- aac_state_struct->audio_object_type = 32 + tmp;
+ tmp_aot = 32 + tmp;
}
+
+ if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
+ if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS)
+ return IA_FATAL_ERROR;
+ }
+
pstr_audio_specific_config->audio_object_type =
- aac_state_struct->audio_object_type;
+ aac_state_struct->audio_object_type = tmp_aot;
tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
pstr_audio_specific_config);
@@ -521,7 +528,7 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
if (tmp == -1) {
*bytes_consumed = 1;
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
} else
aac_state_struct->sampling_rate = tmp;
aac_state_struct->p_config->ui_samp_freq = tmp;
@@ -538,7 +545,7 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
aac_state_struct->sbr_present_flag = 1;
if (tmp == -1) {
*bytes_consumed = 1;
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
} else
aac_state_struct->extension_samp_rate = tmp;
@@ -556,6 +563,7 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
aac_state_struct->audio_object_type == AOT_TWIN_VQ ||
aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
+ aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL ||
aac_state_struct->audio_object_type == AOT_ER_AAC_LC) &&
aac_state_struct->audio_object_type != AOT_USAC)
@@ -580,7 +588,9 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
}
}
if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
- aac_state_struct->audio_object_type == AOT_ER_AAC_LD) {
+ aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
+ aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
+ aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 0;
aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 0;
aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 0;
@@ -594,10 +604,10 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
ixheaacd_read_bits_buf(it_bit_buff, 1);
aac_state_struct->eld_specific_config.aac_spect_data_resil_flag =
ixheaacd_read_bits_buf(it_bit_buff, 1);
- if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD)
+ if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
aac_state_struct->eld_specific_config.ep_config =
ixheaacd_read_bits_buf(it_bit_buff, 2);
- else
+ if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD)
aac_state_struct->eld_specific_config.ld_sbr_flag_present =
ixheaacd_read_bits_buf(it_bit_buff, 1);
}
@@ -610,156 +620,209 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct,
pstr_audio_specific_config->ext_audio_object_type = 0;
}
- {{size_t tmp = 0xf;
- UWORD32 i;
- WORD32 err = 0;
-
- aac_state_struct->usac_flag = 1;
-
- ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
- err = ixheaacd_config(it_bit_buff,
- &(pstr_audio_specific_config->str_usac_config),
- &(pstr_audio_specific_config->channel_configuration));
- if (err != 0) return err;
-
- pstr_audio_specific_config->sampling_frequency =
- pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
-
- if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
- pstr_audio_specific_config->sbr_present_flag = 1;
- pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
- pstr_audio_specific_config->ext_sampling_frequency =
- pstr_audio_specific_config->sampling_frequency;
- pstr_audio_specific_config->ext_samp_frequency_index =
- pstr_audio_specific_config->samp_frequency_index;
-
- for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
- sizeof(ixheaacd_sampl_freq_idx_table[0]);
- i++) {
- if (ixheaacd_sampl_freq_idx_table[i] ==
- (int)(pstr_audio_specific_config->sampling_frequency)) {
- tmp = i;
- break;
+ {
+ {
+ SIZE_T tmp = 0xf;
+ UWORD32 i;
+ WORD32 err = 0;
+
+ aac_state_struct->usac_flag = 1;
+
+ ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
+ err = ixheaacd_config(it_bit_buff, &(pstr_audio_specific_config->str_usac_config),
+ &(pstr_audio_specific_config->channel_configuration),
+ aac_state_struct->ec_enable);
+ if (err != 0) return err;
+
+ pstr_audio_specific_config->sampling_frequency =
+ pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
+
+ if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
+ pstr_audio_specific_config->sbr_present_flag = 1;
+ pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
+ pstr_audio_specific_config->ext_sampling_frequency =
+ pstr_audio_specific_config->sampling_frequency;
+ pstr_audio_specific_config->ext_samp_frequency_index =
+ pstr_audio_specific_config->samp_frequency_index;
+
+ for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
+ sizeof(ixheaacd_sampl_freq_idx_table[0]);
+ i++) {
+ if (ixheaacd_sampl_freq_idx_table[i] ==
+ (int)(pstr_audio_specific_config->sampling_frequency)) {
+ tmp = i;
+ break;
+ }
+ }
+ pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
+ } else {
+ pstr_audio_specific_config->sbr_present_flag = 0;
}
}
- pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
- } else {
- pstr_audio_specific_config->sbr_present_flag = 0;
}
- }
-}
-{
- dummy = ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
+ if (aac_state_struct->bs_format != LOAS_BSFORMAT) {
+ ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
- if ((SIZE_T)it_bit_buff->ptr_read_next ==
- (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
- *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
- } else {
- *bytes_consumed = (((((SIZE_T)it_bit_buff->ptr_read_next -
- (SIZE_T)it_bit_buff->ptr_bit_buf_base))
- << 3) +
- 7 - it_bit_buff->bit_pos + 7) >>
- 3;
+ if ((SIZE_T)it_bit_buff->ptr_read_next ==
+ (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
+ *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
+ } else {
+ *bytes_consumed = (WORD32)((((((SIZE_T)it_bit_buff->ptr_read_next -
+ (SIZE_T)it_bit_buff->ptr_bit_buf_base))
+ << 3) +
+ 7 - it_bit_buff->bit_pos + 7) >>
+ 3);
+ }
+ }
+ return 0;
}
-}
-return 0;
-}
-aac_state_struct->frame_length = FRAME_SIZE;
-if (aac_state_struct->frame_len_flag)
-#ifdef ALLOW_SMALL_FRAMELENGTH
- aac_state_struct->frame_length = FRAME_SIZE_SMALL;
-#else
- return -1;
-#endif
-
-if (aac_state_struct->extension_flag)
- aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
- aac_state_struct->frame_length >>= 1;
-
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
- aac_state_struct->frame_length >>= 1;
- if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
- aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
- ixheaacd_read_bits_buf(it_bit_buff, 1);
- aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
- ixheaacd_read_bits_buf(it_bit_buff, 1);
-
- ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
- &aac_state_struct->str_sbr_config);
-
- aac_state_struct->dwnsmp_signal =
- !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
- }
+ aac_state_struct->frame_length = FRAME_SIZE;
+ if (aac_state_struct->frame_len_flag)
+ aac_state_struct->frame_length = FRAME_SIZE_SMALL;
- ixheaacd_read_bits_buf(it_bit_buff, 1);
-}
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
- int ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
- if (ep_config == 2 || ep_config == 3) {
- }
- if (ep_config == 3) {
- int direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
- if (!direct_map) {
- }
- }
-}
+ if (aac_state_struct->extension_flag)
+ aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
-tmp = (header_len * 8) - it_bit_buff->cnt_bits;
+ if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
+ aac_state_struct->frame_length >>= 1;
-if (aac_state_struct->audio_object_type != AOT_SBR &&
- (it_bit_buff->cnt_bits >= 16)) {
- tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+ if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
+ aac_state_struct->frame_length >>= 1;
+ if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
+ aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
+ ixheaacd_read_bits_buf(it_bit_buff, 1);
+ aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
+ ixheaacd_read_bits_buf(it_bit_buff, 1);
- if (tmp == 0x2b7) {
- tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
+ ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
+ &aac_state_struct->str_sbr_config);
- if (tmp == AOT_SBR) {
- WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
- if (sbr_present_flag) {
- tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
- pstr_audio_specific_config);
- if (tmp == -1) {
- *bytes_consumed = 1;
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
- } else
- aac_state_struct->extension_samp_rate = tmp;
-
- if (it_bit_buff->cnt_bits >= 12) {
- tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
- if (tmp == 0x548) {
- tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
+ aac_state_struct->dwnsmp_signal =
+ !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
+ }
+
+ {
+ UWORD16 len, eld_ext_type;
+ WORD32 err;
+ UWORD16 cnt;
+
+ if (ixheaacd_show_bits_buf(it_bit_buff, 4) != ELDEXT_TERM) {
+ while ((eld_ext_type = ixheaacd_read_bits_buf(it_bit_buff, 4)) !=
+ ELDEXT_TERM) {
+ len = ixheaacd_read_bits_buf(it_bit_buff, 4);
+ if (len == 15) {
+ len += ixheaacd_read_bits_buf(it_bit_buff, 8);
+ }
+ if (len == 15 + 255) {
+ len += ixheaacd_read_bits_buf(it_bit_buff, 16);
}
+
+ switch (eld_ext_type) {
+ case ELDEXT_SAOC:
+ break;
+ case ELDEXT_LDSAC:
+ aac_state_struct->ldmps_present = 1;
+ aac_state_struct->mps_dec_handle.ldmps_config.ldmps_present_flag =
+ 1;
+ aac_state_struct->mps_dec_handle.object_type =
+ aac_state_struct->audio_object_type;
+ aac_state_struct->mps_dec_handle.ec_flag = aac_state_struct->ec_enable;
+ err = ixheaacd_ld_spatial_specific_config(
+ &(aac_state_struct->mps_dec_handle.ldmps_config), it_bit_buff);
+ if (err) return err;
+
+ if (ixheaacd_mps_create(
+ &aac_state_struct->mps_dec_handle,
+ aac_state_struct->mps_dec_handle.ldmps_config
+ .bs_frame_length,
+ 0, &(aac_state_struct->mps_dec_handle.ldmps_config))) {
+ return -1;
+ }
+ break;
+ default:
+ for (cnt = 0; cnt < len; cnt++) {
+ ixheaacd_read_bits_buf(it_bit_buff, 8);
+ }
+
+ break;
+ }
+ break;
}
}
}
- } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
- ixheaacd_read_bidirection(it_bit_buff, -11);
+ if (!((aac_state_struct->ldmps_present == 1) &&
+ !(it_bit_buff->cnt_bits >= 1)))
+ ixheaacd_read_bits_buf(it_bit_buff, 1);
}
-}
+ if (!((aac_state_struct->ldmps_present == 1) && !(it_bit_buff->cnt_bits > 0))) {
+ if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
+ aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
+ aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
+ WORD32 ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
+ if (ep_config == 2 || ep_config == 3) {
+ }
+ if (ep_config == 3) {
+ WORD32 direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
+ if (!direct_map) {
+ }
+ }
+ }
-if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
- aac_state_struct->audio_object_type != AOT_SBR &&
- aac_state_struct->audio_object_type != AOT_PS &&
- aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
- aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
- aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
- aac_state_struct->audio_object_type != AOT_AAC_LTP) {
- *bytes_consumed = 1;
- return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
-} else {
- if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
- *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
- if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
+ tmp = (header_len * 8) - it_bit_buff->cnt_bits;
+
+ if (aac_state_struct->audio_object_type != AOT_SBR &&
+ (it_bit_buff->cnt_bits >= 16)) {
+ tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+
+ if (tmp == 0x2b7) {
+ tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
+
+ if (tmp == AOT_SBR) {
+ WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+ if (sbr_present_flag) {
+ tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
+ pstr_audio_specific_config);
+ if (tmp == -1) {
+ *bytes_consumed = 1;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ } else
+ aac_state_struct->extension_samp_rate = tmp;
+
+ if (it_bit_buff->cnt_bits >= 12) {
+ tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+ if (tmp == 0x548) {
+ tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
+ }
+ }
+ }
+ }
+ } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
+ ixheaacd_read_bidirection(it_bit_buff, -11);
+ }
+ }
+ }
- } else
- *bytes_consumed = header_len;
+ if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
+ aac_state_struct->audio_object_type != AOT_SBR &&
+ aac_state_struct->audio_object_type != AOT_PS &&
+ aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
+ aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
+ aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
+ aac_state_struct->audio_object_type != AOT_AAC_LTP) {
+ *bytes_consumed = 1;
+ return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
+ } else {
+ if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
+ *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
+ if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
- return 0;
-}
+ } else
+ *bytes_consumed = header_len;
+
+ return 0;
+ }
}
WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts,
@@ -807,7 +870,7 @@ IA_ERRORCODE ixheaacd_latm_header_decode(
if (it_bit_buff->cnt_bits < 13) {
ixheaacd_read_bidirection(it_bit_buff, -11);
*bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
- return (IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
+ return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
}
}
@@ -833,10 +896,16 @@ IA_ERRORCODE ixheaacd_latm_header_decode(
}
} else {
- ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
- bit_count -= (13 + 11);
- *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
- return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+ if (it_bit_buff->cnt_bits != audio_mux_len_bits_last) {
+ ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
+ bit_count -= (13 + 11);
+ *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
+ return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+ } else {
+ ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
+ bit_count -= (13 + 11);
+ break;
+ }
}
} while (1);
@@ -851,7 +920,7 @@ IA_ERRORCODE ixheaacd_latm_header_decode(
ixheaacd_read_bidirection(it_bit_buff, -25);
bit_count -= 11;
*bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
- return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
+ return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
}
audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
@@ -860,22 +929,21 @@ IA_ERRORCODE ixheaacd_latm_header_decode(
use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1);
bit_count += 1;
- if (it_bit_buff->cnt_bits - (audio_mux_len_bytes_last * 8 - 1 + 11) < 0) {
- ixheaacd_read_bidirection(it_bit_buff, -25);
- bit_count -= 25;
- aac_state_struct->bit_count = bit_count;
- *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
- return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
- }
-
if (!use_same_stream_mux) {
ixheaacd_read_bidirection(it_bit_buff, -25);
bit_count -= 25;
sync_status = 1;
aac_state_struct->sync_status = sync_status;
break;
+ } else {
+ ixheaacd_read_bidirection(it_bit_buff, -25);
+ bit_count -= 25;
+ aac_state_struct->bit_count = bit_count;
+ *bytes_consumed = 1;
+ return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
}
+
ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bytes_last * 8 - 1);
bit_count += audio_mux_len_bytes_last * 8 - 1;
@@ -930,7 +998,7 @@ WORD32 ixheaacd_aac_headerdecode(
->str_sample_rate_info[0];
if (buffer == 0) {
- return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+ return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
}
header_len = aac_state_struct->ui_in_bytes;
@@ -968,6 +1036,13 @@ WORD32 ixheaacd_aac_headerdecode(
handle_bit_buff->pstr_adts_crc_info = &handle_bit_buff->str_adts_crc_info;
ixheaacd_adts_crc_open(handle_bit_buff->pstr_adts_crc_info);
+ aac_state_struct->ldmps_present = 0;
+ aac_state_struct->latm_initialized = 0;
+ memset(&aac_state_struct->mps_dec_handle, 0,
+ sizeof(aac_state_struct->mps_dec_handle));
+ memset(&aac_state_struct->eld_specific_config, 0,
+ sizeof(aac_state_struct->eld_specific_config));
+
if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') &&
(buffer[3] == 'F')) {
adif.prog_config_present = 0;
@@ -1049,9 +1124,9 @@ WORD32 ixheaacd_aac_headerdecode(
if (result != 0) {
if ((result ==
(WORD32)
- IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
(result ==
- (WORD32)IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX)) {
+ (WORD32)IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX)) {
bytes_taken += *bytes_consumed;
*bytes_consumed = bytes_taken;
return result;
@@ -1095,7 +1170,7 @@ WORD32 ixheaacd_aac_headerdecode(
case AOT_USAC:
break;
default:
- return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
+ return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
}
if (aac_state_struct->audio_object_type != AOT_USAC)
@@ -1106,12 +1181,12 @@ WORD32 ixheaacd_aac_headerdecode(
(handle_bit_buff->size <
(usr_max_ch * (IA_ENHAACPLUS_DEC_INP_BUF_SIZE << 3)))) {
return (WORD16)(
- (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
}
if (header_found == 0) {
*bytes_consumed = bytes_taken + 1;
- return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
+ return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
} else {
return 0;
}