diff options
Diffstat (limited to 'decoder/ixheaacd_mps_bitdec.c')
-rw-r--r-- | decoder/ixheaacd_mps_bitdec.c | 321 |
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) { |