summaryrefslogtreecommitdiff
path: root/libavcodec/sbrdsp_fixed.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/sbrdsp_fixed.c')
-rw-r--r--libavcodec/sbrdsp_fixed.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/sbrdsp_fixed.c b/libavcodec/sbrdsp_fixed.c
index 748772102e..218bb1acd8 100644
--- a/libavcodec/sbrdsp_fixed.c
+++ b/libavcodec/sbrdsp_fixed.c
@@ -253,7 +253,7 @@ static void sbr_hf_g_filt_c(int (*Y)[2], const int (*X_high)[40][2],
}
}
-static av_always_inline void sbr_hf_apply_noise(int (*Y)[2],
+static av_always_inline int sbr_hf_apply_noise(int (*Y)[2],
const SoftFloat *s_m,
const SoftFloat *q_filt,
int noise,
@@ -271,7 +271,10 @@ static av_always_inline void sbr_hf_apply_noise(int (*Y)[2],
int shift, round;
shift = 22 - s_m[m].exp;
- if (shift < 30) {
+ if (shift < 1) {
+ av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_apply_noise, shift=%d\n", shift);
+ return AVERROR(ERANGE);
+ } else if (shift < 30) {
round = 1 << (shift-1);
y0 += (s_m[m].mant * phi_sign0 + round) >> shift;
y1 += (s_m[m].mant * phi_sign1 + round) >> shift;
@@ -281,7 +284,10 @@ static av_always_inline void sbr_hf_apply_noise(int (*Y)[2],
int64_t accu;
shift = 22 - q_filt[m].exp;
- if (shift < 30) {
+ if (shift < 1) {
+ av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_apply_noise, shift=%d\n", shift);
+ return AVERROR(ERANGE);
+ } else if (shift < 30) {
round = 1 << (shift-1);
accu = (int64_t)q_filt[m].mant * ff_sbr_noise_table_fixed[noise][0];
@@ -297,6 +303,7 @@ static av_always_inline void sbr_hf_apply_noise(int (*Y)[2],
Y[m][1] = y1;
phi_sign1 = -phi_sign1;
}
+ return 0;
}
#include "sbrdsp_template.c"