aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_esbr_envcal.c
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2022-12-02 07:47:30 -0800
committerHarish Mahendrakar <harish.mahendrakar@ittiam.com>2022-12-02 19:02:49 +0000
commit2ae5f6ff8a0a12ead1cb7bab53c110039d7c8884 (patch)
treeba49d720e42d9ee1fbb97899fd62d4df54c9d6a0 /decoder/ixheaacd_esbr_envcal.c
parentc13fd2dbf2455cee7682923f956bea85ad0931a6 (diff)
downloadlibxaac-2ae5f6ff8a0a12ead1cb7bab53c110039d7c8884.tar.gz
Update to v0.1.4 from upstream project
This CL is a squashed commit of the following CLs from upstream/main 9d57cec9725da0a4246f31779629e68630ac005c 9d57cec Merge pull request #15 from ittiam-systems/fuzzer_fix 679e3e5 Fix for signed integer overflow 944203c Merge pull request #14 from ittiam-systems/drm_960_er_support 3accfa6 Error robustness tool addition for xHEAAC decoder 42a0d6d Transform length 960 support for xHEAAC decoder 28c50d3 Merge pull request #13 from ittiam-systems/drc_config_updates c6a238f Fix for heap buffer overflow c2f16ab Fix for read access memory violation for extension element pointer b7f88cb DRC configuration updates for xHEAAC decoder 1a352d8 Merge pull request #12 from ittiam-systems/eldv2 0e0d013 Fix for read access memory violation in LD MPS process call e1bb9ba Fix for OOB issue in MPS process call c26a26d Fix for write access memory violation in USAC process call 270720d ELDv2 support for EXHEAAC decoder 397bdac Merge pull request #11 from ittiam-systems/drc_updates 1fb7d08 Fix for OOB issue 70a89a0 Fix for signed integer overflow daf6b8a DRC feature updates 8d342b2 Merge pull request #10 from ittiam-systems/cmake_win 8f3b3a4 Updates in CMakeLists for windows build 3ace28c Merge pull request #9 from ittiam-systems/fuzzer_fixes fd6d06f Fix for OOB issue 22071e3 Fix for OOB issue in DRC 089e13f Fix for heap buffer overflow 8e37a35 Fix for heap buffer overflow 49b1b8f Fix for write access memory violation in USAC process call dbedfaf Fix for write access memory violation in AAC init call 0ce17e2 Fix for OOB issue Also, updated METADATA to point to upstream repository Bug: 231644435 Bug: 233231045 Bug: 241854997 Bug: 244518544 Test: xaac_dec_fuzzer with testcases in the bugs Change-Id: I747cd8a395465107b375ed0e3994233b6f2a7779
Diffstat (limited to 'decoder/ixheaacd_esbr_envcal.c')
-rw-r--r--decoder/ixheaacd_esbr_envcal.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c
index 492287d..da6aa2f 100644
--- a/decoder/ixheaacd_esbr_envcal.c
+++ b/decoder/ixheaacd_esbr_envcal.c
@@ -73,7 +73,9 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
FLOAT32 input_real1[][64],
FLOAT32 input_imag1[][64],
WORD32 x_over_qmf[MAX_NUM_PATCHES],
- FLOAT32 *scratch_buff, FLOAT32 *env_out) {
+ FLOAT32 *scratch_buff, FLOAT32 *env_out,
+ WORD32 ldmps_present) {
+ WORD32 error_code = 0;
WORD8 harmonics[64];
FLOAT32(*env_tmp)[48];
FLOAT32(*noise_level_pvc)[48];
@@ -151,6 +153,8 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
WORD32 rate = upsamp_4_flag ? 4 : 2;
+ if (ldmps_present == 1) rate = 1;
+
env_tmp = frame_data->env_tmp;
noise_level_pvc = frame_data->noise_level_pvc;
nrg_est_pvc = frame_data->nrg_est_pvc;
@@ -163,10 +167,10 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
freq_band_table[1] =
frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1];
- if (reset) {
+ if (reset || (ldmps_present == 1)) {
esbr_start_up = 1;
esbr_start_up_pvc = 1;
- phase_index = 0;
+ if (reset) phase_index = 0;
if (ixheaacd_createlimiterbands(
(*lim_table), (*gate_mode),
frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo,
@@ -686,7 +690,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
}
}
- if (esbr_start_up) {
+ if (esbr_start_up && (ldmps_present != 1)) {
for (n = 0; n < 4; n++) {
memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32));
memcpy((*noise_buf)[n], noise_level,
@@ -701,6 +705,9 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
ptr_real_buf = *(input_real + l) + sub_band_start;
ptr_imag_buf = *(input_imag + l) + sub_band_start;
+ freq_inv = 1;
+ if ((ldmps_present == 1) && (sub_band_start & 1)) freq_inv = -1;
+
for (k = 0; k < num_subbands; k++) {
(*e_gain)[4][k] = nrg_gain[k];
(*noise_buf)[4][k] = noise_level[k];
@@ -713,14 +720,27 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
phase_index = (phase_index + 1) & 511;
sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise;
- *ptr_real_buf = *ptr_real_buf * sb_gain +
+ if (ldmps_present == 1) {
+ *ptr_real_buf = *ptr_real_buf * sb_gain +
+ sb_noise * ixheaacd_random_phase[phase_index][0] +
+ nrg_tone[k] * ixheaacd_hphase_tbl[0][harm_index];
+ *ptr_imag_buf =
+ *ptr_imag_buf * sb_gain +
+ sb_noise * ixheaacd_random_phase[phase_index][1] +
+ nrg_tone[k] * freq_inv * ixheaacd_hphase_tbl[1][harm_index];
+
+ freq_inv = -freq_inv;
+ } else {
+ *ptr_real_buf = *ptr_real_buf * sb_gain +
sb_noise * ixheaacd_random_phase[phase_index][0];
- *ptr_imag_buf = *ptr_imag_buf * sb_gain +
+ *ptr_imag_buf = *ptr_imag_buf * sb_gain +
sb_noise * ixheaacd_random_phase[phase_index][1];
+ }
ptr_real_buf++;
ptr_imag_buf++;
}
+ if (ldmps_present == 1) harm_index = (harm_index + 1) & 3;
memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
for (n = 0; n < 4; n++)
@@ -732,7 +752,8 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
}
- ixheaacd_apply_inter_tes(
+ if (ldmps_present != 1) {
+ error_code = ixheaacd_apply_inter_tes(
*(input_real1 + rate * p_frame_info->border_vec[i]),
*(input_imag1 + rate * p_frame_info->border_vec[i]),
*(input_real + rate * p_frame_info->border_vec[i]),
@@ -740,6 +761,10 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
rate * p_frame_info->border_vec[i + 1] -
rate * p_frame_info->border_vec[i],
sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
+ if (error_code != 0)
+ {
+ return error_code;
+ }
for (l = rate * p_frame_info->border_vec[i];
l < rate * p_frame_info->border_vec[i + 1]; l++) {
@@ -762,6 +787,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
}
}
}
+}
for (i = 0; i < 64; i++) {
(*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i];
@@ -777,6 +803,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
frame_data->env_short_flag_prev = -1;
}
+ if (ldmps_present != 1) {
memcpy((VOID *)&frame_data->str_frame_info_prev,
(VOID *)&frame_data->str_frame_info_details,
sizeof(ia_frame_info_struct));
@@ -798,6 +825,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
num_nf_bands +
i];
}
+}
frame_data->harm_index = harm_index;
frame_data->phase_index = phase_index;
@@ -911,10 +939,10 @@ IA_ERRORCODE ixheaacd_createlimiterbands(
return IA_NO_ERROR;
}
-VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
- FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
- WORD32 num_sample, WORD32 sub_band_start,
- WORD32 num_subband, WORD32 gamma_idx) {
+WORD32 ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
+ FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
+ WORD32 num_sample, WORD32 sub_band_start,
+ WORD32 num_subband, WORD32 gamma_idx) {
WORD32 sub_band_end = sub_band_start + num_subband;
FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE],
subsample_power_low[TIMESLOT_BUFFER_SIZE];
@@ -925,6 +953,10 @@ VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
FLOAT32 gamma = ixheaacd_q_gamma_table[gamma_idx];
WORD32 i, j;
+ if (num_sample > TIMESLOT_BUFFER_SIZE)
+ {
+ return IA_FATAL_ERROR;
+ }
if (gamma > 0) {
for (i = 0; i < num_sample; i++) {
memcpy(&qmf_real[64 * i], &qmf_real1[64 * i],
@@ -978,4 +1010,5 @@ VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
}
}
}
+ return 0;
}