diff --git a/decoder/ixheaacd_arith_dec.c b/decoder/ixheaacd_arith_dec.c index af9f4c0..77b516d 100644 --- a/decoder/ixheaacd_arith_dec.c +++ b/decoder/ixheaacd_arith_dec.c @@ -599,7 +599,7 @@ const WORD64 ixheaacd_table_exp[32] = { static const WORD32 ixheaacd_pow_14_3[8] = {0, 3251, 4096, 5161, 6502, 8192, 10321, 13004}; -const WORD32 ixheaacd_pow_table_Q13[1024] = {0, +const WORD32 ixheaacd_pow_table_Q13[1025] = {0, 131072 >> 4, 330281 >> 4, 567116 >> 4, @@ -1622,7 +1622,8 @@ const WORD32 ixheaacd_pow_table_Q13[1024] = {0, 84111783, 84221751, 84331755, - 84441795}; + 84441795, + 84551870}; static WORD32 ixheaacd_esc_nb_offset[8] = {0, 131072, 262144, 393216, 524288, 655360, 786432, 917504}; @@ -1943,15 +1944,15 @@ static VOID ixheaacd_esc_iquant(WORD32 *q, WORD32 *coef, WORD32 noise_level, } } - if (q[i] >= 8192) { - q[i] = 8191; - } - if (q[i] < 0) { flag = -1; q[i] = -q[i]; } + if (q[i] >= 8192) { + q[i] = 8191; + } + if (q[i] < 1024) { coef[i] = flag * ixheaacd_pow_table_Q13[q[i]]; } else { diff --git a/decoder/ixheaacd_avq_dec.c b/decoder/ixheaacd_avq_dec.c index fae899d..478edd8 100644 --- a/decoder/ixheaacd_avq_dec.c +++ b/decoder/ixheaacd_avq_dec.c @@ -97,7 +97,8 @@ static VOID ixheaacd_nearest_neighbor_2d(WORD32 x[], WORD32 y[], WORD32 count, VOID ixheaacd_voronoi_search(WORD32 x[], WORD32 y[], WORD32 count, WORD32 *rem1, WORD32 *rem2) { WORD32 i, y0[8], y1[8]; - WORD32 e0, e1, x1[8], tmp; + WORD32 x1[8], tmp; + WORD64 e0, e1; ixheaacd_nearest_neighbor_2d(x, y0, count, rem1); for (i = 0; i < 8; i++) { @@ -122,9 +123,9 @@ VOID ixheaacd_voronoi_search(WORD32 x[], WORD32 y[], WORD32 count, WORD32 *rem1, e0 = e1 = 0; for (i = 0; i < 8; i++) { tmp = rem1[i]; - e0 += tmp * tmp; + e0 += (WORD64)tmp * tmp; tmp = rem2[i]; - e1 += tmp * tmp; + e1 += (WORD64)tmp * tmp; } if (e0 < e1) { diff --git a/decoder/ixheaacd_create.c b/decoder/ixheaacd_create.c index 9091a95..9f72de1 100644 --- a/decoder/ixheaacd_create.c +++ b/decoder/ixheaacd_create.c @@ -324,8 +324,11 @@ WORD32 ixheaacd_decode_init( .str_usac_element_config[ele_id] .str_usac_mps212_config); - ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle, bs_frame_length, - bs_residual_coding, ptr_usac_mps212_config); + if (ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle, + bs_frame_length, bs_residual_coding, + ptr_usac_mps212_config)) { + return -1; + } } break; } @@ -425,7 +428,7 @@ WORD32 ixheaacd_dec_data_init(VOID *handle, err_code = ixheaacd_decode_init(handle, pstr_frame_data->str_layer.sample_rate_layer, usac_data, pstr_stream_config); - if (err_code == -1) return -1; + if (err_code != 0) return err_code; for (i_ch = 0; i_ch < MAX_NUM_CHANNELS; i_ch++) { if (usac_data->tw_mdct[0] == 1) { @@ -556,7 +559,7 @@ WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle, handle->aac_config.ui_sbr_mode = 0; } - if (err == -1) return -1; + if (err != 0) return err; break; diff --git a/decoder/ixheaacd_ext_ch_ele.c b/decoder/ixheaacd_ext_ch_ele.c index 5f09ba8..8bc17e7 100644 --- a/decoder/ixheaacd_ext_ch_ele.c +++ b/decoder/ixheaacd_ext_ch_ele.c @@ -364,18 +364,20 @@ static VOID ixheaacd_filter_and_add(const WORD32 *in, const WORD32 length, sum = ixheaacd_mult32x32in64(in[0], filter[0]); sum = ixheaacd_mac32x32in64_n(sum, &in[0], &filter[1], 6); - *out += (WORD32)((sum * factor_even) >> 15); + + *out = ixheaacd_add32_sat(*out, (WORD32)((sum * factor_even) >> 15)); + out++; for (i = 3; i < length - 4; i += 2) { sum = 0; sum = ixheaacd_mac32x32in64_7(sum, &in[i - 3], filter); - *out += (WORD32)((sum * factor_odd) >> 15); + *out = ixheaacd_add32_sat(*out, (WORD32)((sum * factor_odd) >> 15)); out++; sum = 0; sum = ixheaacd_mac32x32in64_7(sum, &in[i - 2], filter); - *out += (WORD32)((sum * factor_even) >> 15); + *out = ixheaacd_add32_sat(*out, (WORD32)((sum * factor_even) >> 15)); out++; } i = length - 3; @@ -525,7 +527,7 @@ static WORD32 ixheaacd_cplx_pred_upmixing( (WORD32)((WORD64)ixheaacd_mult32x32in64( alpha_q_im_temp, dmx_im[i]) >> 24); - r_spec[i] = (factor) * (l_spec[i] - mid_side); + r_spec[i] = (factor)*ixheaacd_sub32_sat(l_spec[i], mid_side); l_spec[i] = l_spec[i] + mid_side; } diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c index 3075c1b..851f942 100644 --- a/decoder/ixheaacd_mps_dec.c +++ b/decoder/ixheaacd_mps_dec.c @@ -79,9 +79,9 @@ extern ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes; extern ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes; extern ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes; -VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, - WORD32 residual_coding, - ia_usac_dec_mps_config_struct* mps212_config) { +WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, + WORD32 residual_coding, + ia_usac_dec_mps_config_struct* mps212_config) { WORD32 num_ch; WORD32 err_code = 0; @@ -109,6 +109,8 @@ VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, err_code = ixheaacd_mps_header_decode(self); + if (err_code != 0) return err_code; + if ((self->residual_coding) && (self->res_bands > 0)) self->res_ch_count++; ixheaacd_mps_env_init(self); @@ -147,7 +149,7 @@ VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, memset(self->opd_smooth.smooth_r_phase, 0, MAX_PARAMETER_BANDS * sizeof(WORD32)); - return; + return 0; } static FLOAT32 ixheaacd_tsd_mul_re[] = { @@ -1424,6 +1426,8 @@ WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff, } } + if (data_bands <= 0) return -1; + if (!ixheaacd_huff_decode(it_bit_buff, data_array[0], data_array[1], data_type, diff_type[0], diff_type[1], pilot_coding_flag, pilot_data, data_bands, diff --git a/decoder/ixheaacd_mps_interface.h b/decoder/ixheaacd_mps_interface.h index 7587773..a488aef 100644 --- a/decoder/ixheaacd_mps_interface.h +++ b/decoder/ixheaacd_mps_interface.h @@ -20,9 +20,9 @@ #ifndef IXHEAACD_MPS_INTERFACE_H #define IXHEAACD_MPS_INTERFACE_H -VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, - WORD32 residual_coding, - ia_usac_dec_mps_config_struct* usac_mps_config); +WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, + WORD32 residual_coding, + ia_usac_dec_mps_config_struct* usac_mps_config); VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct* self, WORD32 independency_flag, diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c index 9326edf..e5ba760 100644 --- a/decoder/ixheaacd_mps_parse.c +++ b/decoder/ixheaacd_mps_parse.c @@ -110,6 +110,12 @@ static int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; static int ixheaacd_inverse_smoothing_time_table_q30[] = {16777216, 8388608, 4194304, 2097152}; +static WORD32 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_longmult1(unsigned short a[], unsigned short b, unsigned short d[], int len) { int k; @@ -803,9 +809,16 @@ static VOID ixheaacd_mps_mapindexdata( } for (ps = 0; ps < num_parameter_sets; ps++) { - for (band = band_start; band < band_stop; band++) + for (band = band_start; band < band_stop; band++) { + if (param_type == CLD) { + out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15); + } else if (param_type == ICC) // param_type is ICC + { + out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7); + } out_data[ps][band] = ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type); + } } if (ext_frame_flag) {