aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShashank Pathmudi <shashank.pathmudi@ittiam.com>2023-10-05 15:15:23 +0530
committersandeshvenkatesh <89826624+sandeshvenkatesh@users.noreply.github.com>2023-10-05 16:01:11 +0530
commit2d79f3ac5944f3924bd895c22cdcb993dac97a4d (patch)
treefd85d6bad7bdecffb38d80b5754b43180be386eb
parent0c86a5d8fabe7ab275ff56caed9e4293e627c525 (diff)
downloadlibxaac-2d79f3ac5944f3924bd895c22cdcb993dac97a4d.tar.gz
Fix for divide-by-zero in ixheaacd_sbr_env_calc
These changes handle the divide-by-zero runtime error reported while calculating energy gain. Bug: ossFuzz:62903 Test: poc in bug
-rw-r--r--decoder/ixheaacd_esbr_envcal.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c
index ebf4ae7..677c616 100644
--- a/decoder/ixheaacd_esbr_envcal.c
+++ b/decoder/ixheaacd_esbr_envcal.c
@@ -150,6 +150,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
WORD32 band_loop_end;
WORD32 rate = upsamp_4_flag ? 4 : 2;
+ FLOAT64 guard = 1e-17;
if (ldmps_present == 1) rate = 1;
@@ -349,7 +350,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
nrg_tone_pvc[c][t] = 0.0f;
tmp = frame_data->qmapped_pvc[c][t] /
- (1 + frame_data->qmapped_pvc[c][t]);
+ (1 + frame_data->qmapped_pvc[c][t] + guard);
if (flag) {
nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
@@ -359,7 +360,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
(harmonics[c] && (t >= frame_data->sine_position ||
(*harm_flag_prev)[c + sub_band_start]))
? sqrt(nrg_ref_pvc[c][t] * tmp /
- frame_data->qmapped_pvc[c][t])
+ (frame_data->qmapped_pvc[c][t] + guard))
: nrg_tone_pvc[c][t]);
nrg_tone_pvc[c][t] = (FLOAT32)(
@@ -376,7 +377,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
} else {
nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
nrg_ref_pvc[c][t] * tmp /
- ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t]));
+ ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
}
}
@@ -400,7 +401,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
k < (*lim_table)[limiter_band][c + 1]; k++) {
if (g_max <= nrg_gain_pvc[k][t]) {
noise_level_pvc[k][t] =
- noise_level_pvc[k][t] * (g_max / nrg_gain_pvc[k][t]);
+ (FLOAT32)(noise_level_pvc[k][t] * (g_max / (nrg_gain_pvc[k][t] + guard)));
nrg_gain_pvc[k][t] = g_max;
}
@@ -473,7 +474,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
nrg_tone_pvc[c][t] = 0.0f;
tmp = frame_data->qmapped_pvc[c][t] /
- (1 + frame_data->qmapped_pvc[c][t]);
+ (1 + frame_data->qmapped_pvc[c][t] + guard);
if (flag) {
nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
@@ -483,7 +484,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
(harmonics[c] && (t >= frame_data->sine_position ||
(*harm_flag_prev)[c + sub_band_start]))
? sqrt(nrg_ref_pvc[c][t] * tmp /
- frame_data->qmapped_pvc[c][t])
+ (frame_data->qmapped_pvc[c][t] + guard))
: nrg_tone_pvc[c][t]);
} else {
if (noise_absc_flag) {
@@ -492,7 +493,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
} else {
nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
nrg_ref_pvc[c][t] * tmp /
- ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t]));
+ ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
}
}
@@ -645,7 +646,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
->freq_band_tbl_noise[o + 1];
- if (p_frame_info->border_vec[i] == p_frame_info->border_vec[i + 1]) {
+ if (p_frame_info->border_vec[i] >= p_frame_info->border_vec[i + 1]) {
for (flag = 0, k = li; k < ui; k++) {
flag = (harmonics[c] &&
(i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
@@ -677,7 +678,6 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
c -= (ui - li);
for (k = 0; k < ui - li; k++) {
- FLOAT64 guard = 1e-17;
o = (k + li >= ui2) ? o + 1 : o;
if (o >= MAX_NOISE_COEFFS) {
if (ec_flag)
@@ -691,7 +691,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
nrg_est[c] = (!int_mode) ? nrg : nrg_est[c];
nrg_tone[c] = 0;
tmp = noise_floor[next * num_nf_bands + o] /
- (1 + noise_floor[next * num_nf_bands + o]);
+ (1 + noise_floor[next * num_nf_bands + o] + guard);
if (flag) {
nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1));
nrg_tone[c] = (FLOAT32)(
@@ -728,7 +728,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32
for (k = (*lim_table)[limiter_band][c];
k < (*lim_table)[limiter_band][c + 1]; k++) {
if (g_max <= nrg_gain[k]) {
- noise_level[k] = noise_level[k] * (g_max / nrg_gain[k]);
+ noise_level[k] = (FLOAT32)(noise_level[k] * (g_max / (nrg_gain[k] + guard)));
nrg_gain[k] = g_max;
}
}