aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_init_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ixheaacd_init_config.c')
-rw-r--r--decoder/ixheaacd_init_config.c178
1 files changed, 137 insertions, 41 deletions
diff --git a/decoder/ixheaacd_init_config.c b/decoder/ixheaacd_init_config.c
index 92ecee7..4285fab 100644
--- a/decoder/ixheaacd_init_config.c
+++ b/decoder/ixheaacd_init_config.c
@@ -23,7 +23,7 @@
#include <assert.h>
#include "ixheaacd_type_def.h"
-
+#include "ixheaacd_constants.h"
#include "ixheaacd_bitbuffer.h"
#include "ixheaacd_defines.h"
@@ -42,10 +42,11 @@
#include "ixheaacd_drc_dec.h"
#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_channel.h"
-#include "ixheaacd_channelinfo.h"
#include "ixheaacd_sbrdecoder.h"
#include "ixheaacd_audioobjtypes.h"
#include "ixheaacd_latmdemux.h"
@@ -55,17 +56,19 @@
#include "ixheaacd_hybrid.h"
#include "ixheaacd_ps_dec.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_polyphase.h"
#include "ixheaacd_config.h"
#include "ixheaacd_mps_dec.h"
-
#include "ixheaacd_struct_def.h"
#include "ixheaacd_config.h"
#include "ixheaacd_interface.h"
#include "ixheaacd_info.h"
#include "ixheaacd_struct.h"
-#include "ixheaacd_constants.h"
#include "ixheaacd_error_standards.h"
#include "ixheaacd_error_codes.h"
@@ -180,8 +183,9 @@ VOID ixheaacd_read_escape_value(ia_bit_buf_struct *it_bit_buff,
*ext_ele_value = value;
}
-static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
- UWORD32 ch_config_index) {
+static IA_ERRORCODE ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
+ UWORD32 ch_config_index, ia_bit_buf_struct *it_bit_buff, WORD32 ec_flag)
+{
switch (ch_config_index) {
case 1:
pstr_usac_config->num_out_channels = 1;
@@ -199,9 +203,14 @@ static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
break;
default:
- assert(0);
+ if (ec_flag)
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ else
+ return IA_FATAL_ERROR;
break;
}
+ return IA_NO_ERROR;
}
VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff,
@@ -334,7 +343,7 @@ IA_ERRORCODE ixheaacd_mps212_config(
pstr_usac_mps212_config->bs_residual_bands =
ixheaacd_read_bits_buf(it_bit_buff, 5);
- if (pstr_usac_mps212_config->bs_residual_bands > MAX_PARAMETER_BANDS_MPS)
+ if (pstr_usac_mps212_config->bs_residual_bands > MAX_PARAMETER_BANDS)
return IA_FATAL_ERROR;
pstr_usac_mps212_config->bs_ott_bands_phase =
@@ -381,9 +390,10 @@ IA_ERRORCODE ixheaacd_cpe_config(
WORD32 ixheaacd_decoder_config(
ia_bit_buf_struct *it_bit_buff,
ia_usac_decoder_config_struct *pstr_usac_decoder_config,
- WORD32 sbr_ratio_index, UINT32 *chan) {
+ WORD32 sbr_ratio_index, UINT32 *chan, WORD32 ec_flag) {
UWORD32 elem_idx = 0;
UWORD32 err = 0;
+ WORD32 num_channels = 0;
ixheaacd_read_escape_value(
it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16);
@@ -391,7 +401,12 @@ WORD32 ixheaacd_decoder_config(
pstr_usac_decoder_config->preroll_flag = 0;
if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) {
- return -1;
+ if (ec_flag) {
+ pstr_usac_decoder_config->num_elements = USAC_MAX_ELEMENTS;
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
}
for (elem_idx = 0; elem_idx < pstr_usac_decoder_config->num_elements;
@@ -404,7 +419,7 @@ WORD32 ixheaacd_decoder_config(
switch (pstr_usac_decoder_config->usac_element_type[elem_idx]) {
case ID_USAC_SCE:
-
+ num_channels++;
pstr_usac_element_config->tw_mdct =
ixheaacd_read_bits_buf(it_bit_buff, 1);
pstr_usac_element_config->noise_filling =
@@ -417,16 +432,28 @@ WORD32 ixheaacd_decoder_config(
break;
case ID_USAC_CPE:
- if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config,
- sbr_ratio_index) != IA_NO_ERROR)
- return IA_FATAL_ERROR;
- if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2)
- return -1;
-
+ num_channels += 2;
+ if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, sbr_ratio_index) !=
+ IA_NO_ERROR) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
+ if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
break;
case ID_USAC_LFE:
-
+ num_channels++;
pstr_usac_element_config->tw_mdct = 0;
pstr_usac_element_config->noise_filling = 0;
pstr_usac_element_config->stereo_config_index = 0;
@@ -444,19 +471,38 @@ WORD32 ixheaacd_decoder_config(
} else {
pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 0;
}
- if (err != 0) return -1;
+ if (err != 0) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
break;
default:
- return -1;
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
break;
}
+ if (num_channels > 2) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
}
return err;
}
-WORD32 ixheaacd_config_extension(
- ia_bit_buf_struct *it_bit_buff,
- ia_usac_decoder_config_struct *pstr_usac_decoder_config) {
+WORD32 ixheaacd_config_extension(ia_bit_buf_struct *it_bit_buff,
+ ia_usac_decoder_config_struct *pstr_usac_decoder_config, WORD32 ec_flag) {
UWORD32 i, j;
UWORD32 num_config_extensions;
UWORD32 usac_config_ext_type, usac_config_ext_len;
@@ -464,7 +510,11 @@ WORD32 ixheaacd_config_extension(
ixheaacd_read_escape_value(it_bit_buff, &(num_config_extensions), 2, 4, 8);
num_config_extensions += 1;
if (USAC_MAX_CONFIG_EXTENSIONS < num_config_extensions) {
- return -1;
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
}
pstr_usac_decoder_config->num_config_extensions = num_config_extensions;
@@ -479,18 +529,37 @@ WORD32 ixheaacd_config_extension(
ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16);
ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16);
- if (usac_config_ext_len > 768) return IA_FATAL_ERROR;
+ if (usac_config_ext_len > 768) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
switch (usac_config_ext_type) {
case ID_CONFIG_EXT_FILL:
for (i = 0; i < usac_config_ext_len; i++) {
fill_byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
- if (fill_byte_val != 0xa5) return -1;
+ if (fill_byte_val != 0xa5) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
}
break;
default:
if ((WORD32)usac_config_ext_len > (it_bit_buff->cnt_bits >> 3)) {
- return -1;
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
}
if (ID_CONFIG_EXT_LOUDNESS_INFO == usac_config_ext_type) {
for (i = 0; i < usac_config_ext_len; i++) {
@@ -511,8 +580,8 @@ WORD32 ixheaacd_config_extension(
return 0;
}
-WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
- ia_usac_config_struct *pstr_usac_conf, UINT32 *chan) {
+WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, ia_usac_config_struct *pstr_usac_conf,
+ UINT32 *chan, WORD32 ec_flag) {
WORD32 tmp, err;
err = 0;
@@ -524,7 +593,12 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
ixheaacd_read_bits_buf(it_bit_buff, 24);
if (pstr_usac_conf->usac_sampling_frequency > USAC_MAX_SAMPLE_RATE) {
- return IA_FATAL_ERROR;
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf),
+ IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
}
} else {
@@ -532,17 +606,34 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
sampling_rate_tbl[pstr_usac_conf->usac_sampling_frequency_index];
}
+ if (pstr_usac_conf->usac_sampling_frequency == 0) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
pstr_usac_conf->core_sbr_framelength_index =
ixheaacd_read_bits_buf(it_bit_buff, 3);
- if (pstr_usac_conf->core_sbr_framelength_index > MAX_CORE_SBR_FRAME_LEN_IDX)
- return -1;
+ if (pstr_usac_conf->core_sbr_framelength_index > MAX_CORE_SBR_FRAME_LEN_IDX) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
pstr_usac_conf->channel_configuration_index =
ixheaacd_read_bits_buf(it_bit_buff, 5);
if ((pstr_usac_conf->channel_configuration_index >= 3) &&
- (pstr_usac_conf->channel_configuration_index != 8))
- return -1;
+ (pstr_usac_conf->channel_configuration_index != 8)) {
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ } else {
+ return IA_FATAL_ERROR;
+ }
+ }
if (pstr_usac_conf->channel_configuration_index == 0) {
UWORD32 i;
@@ -551,27 +642,32 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
(UWORD32 *)(&(pstr_usac_conf->num_out_channels)),
5, 8, 16);
if (BS_MAX_NUM_OUT_CHANNELS < pstr_usac_conf->num_out_channels) {
- return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+ return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
}
for (i = 0; i < pstr_usac_conf->num_out_channels; i++)
pstr_usac_conf->output_channel_pos[i] =
ixheaacd_read_bits_buf(it_bit_buff, 5);
+ if (ec_flag) {
+ longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+ }
} else {
- ixheaacd_get_usac_chan_conf(pstr_usac_conf,
- pstr_usac_conf->channel_configuration_index);
+ err = ixheaacd_get_usac_chan_conf(pstr_usac_conf, pstr_usac_conf->channel_configuration_index,
+ it_bit_buff, ec_flag);
+ if (err != 0)
+ return err;
}
err = ixheaacd_decoder_config(
it_bit_buff, &(pstr_usac_conf->str_usac_dec_config),
- ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan);
- if (err != 0) return -1;
+ ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan, ec_flag);
+ if (err != 0) return err;
tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
if (tmp) {
err = ixheaacd_config_extension(it_bit_buff,
- &pstr_usac_conf->str_usac_dec_config);
+ &pstr_usac_conf->str_usac_dec_config, ec_flag);
if (err != 0) return -1;
}