mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-11 18:09:36 +00:00
aacsbr: Check for envelope scalefactors overflowing
This prevents various values from becoming stuck at NAN and output to become silent If someone knows a cleaner solution, thats welcome! Fixes Ticket2335 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
199db97fbd
commit
8978c743fb
@ -1132,7 +1132,12 @@ static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
|
|||||||
for (k = 0; k < sbr->n[sbr->data[0].bs_freq_res[e]]; k++) {
|
for (k = 0; k < sbr->n[sbr->data[0].bs_freq_res[e]]; k++) {
|
||||||
float temp1 = exp2f(sbr->data[0].env_facs[e][k] * alpha + 7.0f);
|
float temp1 = exp2f(sbr->data[0].env_facs[e][k] * alpha + 7.0f);
|
||||||
float temp2 = exp2f((pan_offset - sbr->data[1].env_facs[e][k]) * alpha);
|
float temp2 = exp2f((pan_offset - sbr->data[1].env_facs[e][k]) * alpha);
|
||||||
float fac = temp1 / (1.0f + temp2);
|
float fac;
|
||||||
|
if (temp1 > 1E20) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n");
|
||||||
|
temp1 = 1;
|
||||||
|
}
|
||||||
|
fac = temp1 / (1.0f + temp2);
|
||||||
sbr->data[0].env_facs[e][k] = fac;
|
sbr->data[0].env_facs[e][k] = fac;
|
||||||
sbr->data[1].env_facs[e][k] = fac * temp2;
|
sbr->data[1].env_facs[e][k] = fac * temp2;
|
||||||
}
|
}
|
||||||
@ -1141,7 +1146,12 @@ static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
|
|||||||
for (k = 0; k < sbr->n_q; k++) {
|
for (k = 0; k < sbr->n_q; k++) {
|
||||||
float temp1 = exp2f(NOISE_FLOOR_OFFSET - sbr->data[0].noise_facs[e][k] + 1);
|
float temp1 = exp2f(NOISE_FLOOR_OFFSET - sbr->data[0].noise_facs[e][k] + 1);
|
||||||
float temp2 = exp2f(12 - sbr->data[1].noise_facs[e][k]);
|
float temp2 = exp2f(12 - sbr->data[1].noise_facs[e][k]);
|
||||||
float fac = temp1 / (1.0f + temp2);
|
float fac;
|
||||||
|
if (temp1 > 1E20) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n");
|
||||||
|
temp1 = 1;
|
||||||
|
}
|
||||||
|
fac = temp1 / (1.0f + temp2);
|
||||||
sbr->data[0].noise_facs[e][k] = fac;
|
sbr->data[0].noise_facs[e][k] = fac;
|
||||||
sbr->data[1].noise_facs[e][k] = fac * temp2;
|
sbr->data[1].noise_facs[e][k] = fac * temp2;
|
||||||
}
|
}
|
||||||
@ -1150,9 +1160,15 @@ static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
|
|||||||
for (ch = 0; ch < (id_aac == TYPE_CPE) + 1; ch++) {
|
for (ch = 0; ch < (id_aac == TYPE_CPE) + 1; ch++) {
|
||||||
float alpha = sbr->data[ch].bs_amp_res ? 1.0f : 0.5f;
|
float alpha = sbr->data[ch].bs_amp_res ? 1.0f : 0.5f;
|
||||||
for (e = 1; e <= sbr->data[ch].bs_num_env; e++)
|
for (e = 1; e <= sbr->data[ch].bs_num_env; e++)
|
||||||
for (k = 0; k < sbr->n[sbr->data[ch].bs_freq_res[e]]; k++)
|
for (k = 0; k < sbr->n[sbr->data[ch].bs_freq_res[e]]; k++){
|
||||||
sbr->data[ch].env_facs[e][k] =
|
sbr->data[ch].env_facs[e][k] =
|
||||||
exp2f(alpha * sbr->data[ch].env_facs[e][k] + 6.0f);
|
exp2f(alpha * sbr->data[ch].env_facs[e][k] + 6.0f);
|
||||||
|
if (sbr->data[ch].env_facs[e][k] > 1E20) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n");
|
||||||
|
sbr->data[ch].env_facs[e][k] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (e = 1; e <= sbr->data[ch].bs_num_noise; e++)
|
for (e = 1; e <= sbr->data[ch].bs_num_noise; e++)
|
||||||
for (k = 0; k < sbr->n_q; k++)
|
for (k = 0; k < sbr->n_q; k++)
|
||||||
sbr->data[ch].noise_facs[e][k] =
|
sbr->data[ch].noise_facs[e][k] =
|
||||||
|
Loading…
Reference in New Issue
Block a user