aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_mps_bitdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ixheaacd_mps_bitdec.c')
-rw-r--r--decoder/ixheaacd_mps_bitdec.c321
1 files changed, 256 insertions, 65 deletions
diff --git a/decoder/ixheaacd_mps_bitdec.c b/decoder/ixheaacd_mps_bitdec.c
index ffc43f6..d8a10e4 100644
--- a/decoder/ixheaacd_mps_bitdec.c
+++ b/decoder/ixheaacd_mps_bitdec.c
@@ -47,12 +47,32 @@
#include "ixheaacd_mps_mdct_2_qmf.h"
#include "ixheaac_sbr_const.h"
-static WORD32 ixheaacd_mps_bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
+static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
+
+static WORD32 ixheaacd_bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
var = min(var, upper_bound);
var = max(var, lower_bound);
return var;
}
+static VOID ixheaacd_mps_check_index_bounds(
+ WORD32 output_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
+ WORD32 num_parameter_sets, WORD32 start_band, WORD32 stop_band,
+ WORD32 param_type, WORD32 xtt_idx) {
+ WORD32 i, band;
+ for (i = 0; i < num_parameter_sets; i++) {
+ for (band = start_band; band < stop_band; band++) {
+ if (param_type == CLD) {
+ output_idx_data[xtt_idx][i][band] =
+ ixheaacd_bound_check(output_idx_data[xtt_idx][i][band], -15, 15);
+ } else if (param_type == ICC) {
+ output_idx_data[xtt_idx][i][band] =
+ ixheaacd_bound_check(output_idx_data[xtt_idx][i][band], 0, 7);
+ }
+ }
+ }
+}
+
static IA_ERRORCODE ixheaacd_parse_extension_config(
ia_mps_spatial_bs_config_struct *config, WORD32 num_ott_boxes, WORD32 num_ttt_boxes,
WORD32 num_out_chan, WORD32 bits_available, ia_bit_buf_struct *it_bit_buff,
@@ -84,12 +104,19 @@ static IA_ERRORCODE ixheaacd_parse_extension_config(
config->bs_residual_coding = 1;
temp = ixheaacd_read_bits_buf(it_bit_buff, 6);
config->bs_residual_sampling_freq_index = (temp >> 2) & FOUR_BIT_MASK;
+ if (config->bs_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
+ return IA_FATAL_ERROR;
+ }
config->bs_residual_frames_per_spatial_frame = temp & TWO_BIT_MASK;
for (i = 0; i < num_ott_boxes + num_ttt_boxes; i++) {
config->bs_residual_present[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
if (config->bs_residual_present[i]) {
config->bs_residual_bands[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+ if (config->bs_residual_bands[i] > MAX_PARAMETER_BANDS)
+ {
+ return IA_FATAL_ERROR;
+ }
}
}
break;
@@ -99,9 +126,16 @@ static IA_ERRORCODE ixheaacd_parse_extension_config(
temp = ixheaacd_read_bits_buf(it_bit_buff, 11);
config->bs_arbitrary_downmix_residual_sampling_freq_index = (temp >> 7) & FOUR_BIT_MASK;
+ if (config->bs_arbitrary_downmix_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
+ return IA_FATAL_ERROR;
+ }
config->bs_arbitrary_downmix_residual_frames_per_spatial_frame =
(temp >> 5) & TWO_BIT_MASK;
config->bs_arbitrary_downmix_residual_bands = temp & FIVE_BIT_MASK;
+ if (config->bs_arbitrary_downmix_residual_bands >=
+ ixheaacd_freq_res_table[config->bs_freq_res]) {
+ return IA_FATAL_ERROR;
+ }
break;
@@ -524,7 +558,7 @@ static WORD32 ixheaacd_decode_icc_diff_code(ia_bit_buf_struct *it_bit_buff) {
return value;
}
-static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_state) {
+static IA_ERRORCODE ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_state) {
WORD32 ich, ch;
WORD32 rfpsf;
WORD32 ps;
@@ -547,6 +581,7 @@ static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_sta
WORD32 *p_res_mdct = pstr_mps_state->array_struct->res_mdct;
ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+ WORD16 error_code = IA_NO_ERROR;
for (ich = 0; ich < loop_counter; ich++) {
ch = ich;
@@ -567,8 +602,15 @@ static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_sta
}
p_mdct_res = p_res_mdct;
for (rfpsf = 0; rfpsf < residual_frames_per_spatial_frame; rfpsf++) {
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
- aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code =
+ ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+ aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
pstr_mps_state->p_aac_decoder_channel_info[0],
@@ -584,8 +626,15 @@ static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_sta
if ((pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence ==
EIGHT_SHORT_SEQUENCE) &&
((upd_qmf == UPD_QMF_18) || (upd_qmf == UPD_QMF_24) || (upd_qmf == UPD_QMF_30))) {
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
- aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code =
+ ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+ aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
pstr_mps_state->p_aac_decoder_channel_info[0],
@@ -601,6 +650,7 @@ static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_sta
p_res_mdct += RFX2XMDCTCOEF;
}
+ return IA_NO_ERROR;
}
static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
@@ -694,7 +744,13 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
switch (sac_ext_type) {
case EXT_TYPE_0:
- ixheaacd_parse_residual_data(pstr_mps_state);
+ error_code = ixheaacd_parse_residual_data(pstr_mps_state);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
break;
case EXT_TYPE_1:
@@ -728,8 +784,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
if (channel_grouping[gr] == 1) {
for (fr = 0; fr < arbdmx_frames_per_spatial_frame; fr++) {
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
- aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code =
+ ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+ 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
pstr_mps_state->p_aac_decoder_channel_info[0],
@@ -747,8 +810,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
EIGHT_SHORT_SEQUENCE) &&
((arbdmx_upd_qmf == UPD_QMF_18) || (arbdmx_upd_qmf == UPD_QMF_24) ||
(arbdmx_upd_qmf == UPD_QMF_30))) {
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
- 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code = ixheaacd_res_read_ics(
+ mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
+ pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 ==
pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
@@ -778,8 +848,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
}
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
- aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code =
+ ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+ 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
@@ -795,8 +872,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
(pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
}
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
- aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code =
+ ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+ 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
ixheaacd_res_ctns_apply(
@@ -821,8 +905,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
}
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
- 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code = ixheaacd_res_read_ics(
+ mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
+ pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 ==
pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
@@ -837,8 +928,15 @@ static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *ps
->p_spectral_coefficient[i]);
}
- ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
- 1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+ error_code = ixheaacd_res_read_ics(
+ mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
+ pstr_mps_state->tot_sf_bands_ls);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ } else
+ return error_code;
+ }
if (1 ==
pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
@@ -1126,7 +1224,14 @@ IA_ERRORCODE ixheaacd_parse_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
}
ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
- ixheaacd_parse_extension_frame(pstr_mps_state);
+ error_code = ixheaacd_parse_extension_frame(pstr_mps_state);
+ if (error_code) {
+ if (pstr_mps_state->ec_flag) {
+ pstr_mps_state->frame_ok = 0;
+ }
+ else
+ return error_code;
+ }
for (i = 0; i < num_ott_boxes; i++) {
for (ps = 0; ps < num_parameter_sets; ps++) {
@@ -1495,18 +1600,9 @@ static IA_ERRORCODE ixheaacd_map_index_data(
}
}
- for (ps = 0; ps < num_parameter_sets; ps++) {
- for (band = start_band; band < stop_band; band++) {
- if (param_type == CLD) {
- output_idx_data[xtt_idx][ps][band] =
- ixheaacd_mps_bound_check(output_idx_data[xtt_idx][ps][band], -15, 15);
- } else if (param_type == ICC)
- {
- output_idx_data[xtt_idx][ps][band] =
- ixheaacd_mps_bound_check(output_idx_data[xtt_idx][ps][band], 0, 7);
- }
- }
- }
+ ixheaacd_mps_check_index_bounds(output_idx_data, num_parameter_sets, start_band,
+ stop_band, param_type, xtt_idx);
+
if (extend_frame) {
for (band = start_band; band < stop_band; band++) {
output_data[xtt_idx][num_parameter_sets][band] =
@@ -1585,8 +1681,10 @@ static VOID ixheaacd_map_data_to_28_bands(
return;
}
-static VOID ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mps_state) {
- ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+static IA_ERRORCODE ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mps_state)
+{
+ IA_ERRORCODE error_code = IA_NO_ERROR;
+ ia_mps_dec_spatial_bs_frame_struct *p_cur_bs;
ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
ia_mps_dec_bitdec_tables_struct *bitdec_table =
@@ -1638,87 +1736,100 @@ static VOID ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mp
switch (curr_state->tree_config) {
case TREE_5151:
i = 0;
-
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, tot_db, ott_vs_tot_db_fc, ott_vs_tot_db_s, bitdec_table, free_scratch);
+ if (error_code) return error_code;
i = 1;
-
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_fc, ott_vs_tot_db_f, ott_vs_tot_db_c,
bitdec_table, free_scratch);
+ if (error_code) return error_code;
i = 2;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_s, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
i = 3;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_f, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
i = 4;
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
break;
case TREE_5152:
i = 0;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, tot_db, ott_vs_tot_db_lr, ott_vs_tot_db_c, bitdec_table, free_scratch);
+ if (error_code) return error_code;
+
i = 1;
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_lr, ott_vs_tot_db_l, ott_vs_tot_db_r,
bitdec_table, free_scratch);
+ if (error_code) return error_code;
+
i = 2;
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
+
i = 3;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_l, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
+
i = 4;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
quant_mode, ott_vs_tot_db_r, tmp1, tmp2, bitdec_table, free_scratch);
+ if (error_code) return error_code;
break;
default:
for (i = 0; i < num_ott_boxes; i++) {
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
ott_cld_default[i], parameter_sets, param_slot, extend_frame,
(curr_state->tree_config == TREE_525) ? 0 : quant_mode, NULL,
NULL, NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
}
break;
}
@@ -1742,23 +1853,25 @@ static VOID ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mp
for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
if (curr_state->ott_mode_lfe[ott_idx] == 0) {
- ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
0, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
}
}
} else {
for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
if (curr_state->ott_mode_lfe[ott_idx] == 0) {
- ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
ott_idx, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
}
}
}
@@ -1779,11 +1892,13 @@ static VOID ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mp
}
}
}
- return;
+ return error_code;
}
-static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mps_state) {
- ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+static IA_ERRORCODE ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mps_state)
+{
+ IA_ERRORCODE error_code = IA_NO_ERROR;
+ ia_mps_dec_spatial_bs_frame_struct *p_cur_bs;
ia_mps_dec_bitdec_tables_struct *bitdec_table =
pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
@@ -1807,33 +1922,36 @@ static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mp
p_aux_struct->ttt_config[j][i].start_band < p_aux_struct->ttt_config[j][i].stop_band;
j++) {
if (p_aux_struct->ttt_config[j][i].mode < 2) {
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_1, p_cur_bs->ttt_cpc_1_idx,
p_cur_bs->cmp_ttt_cpc_1_idx, NULL, i, p_cur_bs->ttt_cpc_1_idx_prev,
offset + 4 * i + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_2, p_cur_bs->ttt_cpc_2_idx,
p_cur_bs->cmp_ttt_cpc_2_idx, NULL, i, p_cur_bs->ttt_cpc_2_idx_prev,
offset + 4 * i + 1 + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->icc_lossless_data, p_aux_struct->ttt_icc, p_cur_bs->ttt_icc_idx,
p_cur_bs->cmp_ttt_icc_idx, NULL, i, p_cur_bs->ttt_icc_idx_prev,
offset + 4 * i + 2 * j, ICC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->icc_default,
pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+ if (error_code) return error_code;
}
else {
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_1, p_cur_bs->ttt_cld_1_idx,
p_cur_bs->cmp_ttt_cld_1_idx, NULL, i, p_cur_bs->ttt_cld_1_idx_prev,
offset + 4 * i + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
@@ -1841,8 +1959,9 @@ static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mp
pstr_mps_state->ttt_cld_1_default[i], pstr_mps_state->num_parameter_sets, param_slot,
pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
bitdec_table, free_scratch);
+ if (error_code) return error_code;
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_2, p_cur_bs->ttt_cld_2_idx,
p_cur_bs->cmp_ttt_cld_2_idx, NULL, i, p_cur_bs->ttt_cld_2_idx_prev,
offset + 4 * i + 1 + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
@@ -1850,6 +1969,7 @@ static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mp
pstr_mps_state->ttt_cld_2_default[i], pstr_mps_state->num_parameter_sets, param_slot,
pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
bitdec_table, free_scratch);
+ if (error_code) return error_code;
}
if (pstr_mps_state->up_mix_type == 2) {
@@ -1870,6 +1990,7 @@ static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mp
}
}
}
+ return error_code;
}
static VOID ixheaacd_decode_and_map_frame_smg(ia_heaac_mps_state_struct *pstr_mps_state) {
@@ -1976,7 +2097,9 @@ static VOID ixheaacd_decode_and_map_frame_smg(ia_heaac_mps_state_struct *pstr_mp
return;
}
-static VOID ixheaacd_decode_and_map_frame_arbdmx(ia_heaac_mps_state_struct *pstr_mps_state) {
+static IA_ERRORCODE ixheaacd_decode_and_map_frame_arbdmx(
+ ia_heaac_mps_state_struct *pstr_mps_state) {
+ IA_ERRORCODE error_code = IA_NO_ERROR;
ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
ia_mps_dec_bitdec_tables_struct *bitdec_table =
pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
@@ -1988,12 +2111,13 @@ static VOID ixheaacd_decode_and_map_frame_arbdmx(ia_heaac_mps_state_struct *pstr
VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
for (ch = 0; ch < pstr_mps_state->num_input_channels; ch++) {
- ixheaacd_map_index_data(
+ error_code = ixheaacd_map_index_data(
&frame->cld_lossless_data, p_aux_struct->arbdmx_gain, frame->arbdmx_gain_idx,
frame->cmp_arbdmx_gain_idx, NULL, ch, frame->arbdmx_gain_idx_prev, offset + ch, CLD, 0,
pstr_mps_state->bitstream_parameter_bands, pstr_mps_state->arbdmx_gain_default,
pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame, 0, NULL,
NULL, NULL, bitdec_table, scratch);
+ if (error_code) return error_code;
p_aux_struct->arbdmx_residual_abs[ch] = frame->bs_arbitrary_downmix_residual_abs[ch];
p_aux_struct->arbdmx_alpha_upd_set[ch] =
@@ -2013,9 +2137,12 @@ static VOID ixheaacd_decode_and_map_frame_arbdmx(ia_heaac_mps_state_struct *pstr
}
}
}
+ return error_code;
}
-static VOID ixheaacd_decode_and_map_frame_arb_tree(ia_heaac_mps_state_struct *pstr_mps_state) {
+static IA_ERRORCODE ixheaacd_decode_and_map_frame_arb_tree(
+ ia_heaac_mps_state_struct *pstr_mps_state) {
+ IA_ERRORCODE error_code = IA_NO_ERROR;
ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
ia_mps_spatial_bs_config_struct *p_config = &(pstr_mps_state->bs_config);
ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
@@ -2027,17 +2154,20 @@ static VOID ixheaacd_decode_and_map_frame_arb_tree(ia_heaac_mps_state_struct *ps
WORD32 i;
for (i = 0; i < p_config->num_ott_boxes_at; i++) {
- ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+ error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, offset + i,
p_cur_bs->ott_cld_idx_prev, offset + i, CLD, 0,
p_config->bs_ott_bands_at[i], p_config->bs_ott_default_cld_at[i],
pstr_mps_state->num_parameter_sets, param_slot,
pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL,
NULL, pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr, scratch);
+ if (error_code) return error_code;
}
+ return error_code;
}
IA_ERRORCODE ixheaacd_decode_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
+ IA_ERRORCODE error_code = IA_NO_ERROR;
ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
@@ -2055,16 +2185,77 @@ IA_ERRORCODE ixheaacd_decode_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
}
}
- ixheaacd_decode_and_map_frame_ott(pstr_mps_state);
- ixheaacd_decode_and_map_frame_ttt(pstr_mps_state);
+ error_code = ixheaacd_decode_and_map_frame_ott(pstr_mps_state);
+ if (error_code)
+ {
+ if (pstr_mps_state->ec_flag)
+ {
+ pstr_mps_state->frame_ok = 0;
+ for (WORD32 idx = 0; idx < MAX_NUM_OTT; idx++)
+ {
+ ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_cld_idx,
+ pstr_mps_state->num_parameter_sets, 0, pstr_mps_state->bitstream_ott_bands[idx],
+ CLD, idx);
+ ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_icc_idx,
+ pstr_mps_state->num_parameter_sets, 0, pstr_mps_state->bitstream_ott_bands[idx],
+ ICC, idx);
+ }
+ }
+ else
+ return error_code;
+ }
+
+ error_code = ixheaacd_decode_and_map_frame_ttt(pstr_mps_state);
+ if (error_code)
+ {
+ if (pstr_mps_state->ec_flag)
+ {
+ pstr_mps_state->frame_ok = 0;
+ ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ttt_icc_idx,
+ pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
+ ICC, 0);
+ }
+ else
+ return error_code;
+ }
ixheaacd_decode_and_map_frame_smg(pstr_mps_state);
if (p_bs_config->arbitrary_tree != 0) {
- ixheaacd_decode_and_map_frame_arb_tree(pstr_mps_state);
+ error_code = ixheaacd_decode_and_map_frame_arb_tree(pstr_mps_state);
+ if (error_code)
+ {
+ if (pstr_mps_state->ec_flag)
+ {
+ pstr_mps_state->frame_ok = 0;
+ for (WORD32 idx = 0; idx < MAX_NUM_OTT; idx++)
+ {
+ ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_cld_idx,
+ pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
+ CLD, idx);
+ }
+ }
+ else
+ return error_code;
+ }
}
if (pstr_mps_state->arbitrary_downmix != 0) {
- ixheaacd_decode_and_map_frame_arbdmx(pstr_mps_state);
+ error_code = ixheaacd_decode_and_map_frame_arbdmx(pstr_mps_state);
+ if (error_code)
+ {
+ if (pstr_mps_state->ec_flag)
+ {
+ pstr_mps_state->frame_ok = 0;
+ for (WORD32 idx = 0; idx < MAX_INPUT_CHANNELS_MPS; idx++)
+ {
+ ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->arbdmx_gain_idx,
+ pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
+ CLD, idx);
+ }
+ }
+ else
+ return error_code;
+ }
}
if (pstr_mps_state->extend_frame) {