diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-04-22 15:18:58 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-04-22 22:15:01 +0200 |
commit | c6c94303d44798f968fa57f282627b1c5e60ce85 (patch) | |
tree | 229fb1a58e0a097485ffbad6d86397db6f41db0a /libavfilter/af_surround.c | |
parent | 6829c3cbe480501725250c62cd1b920a75a44ec7 (diff) | |
download | ffmpeg-c6c94303d44798f968fa57f282627b1c5e60ce85.tar.gz |
avfilter/af_surround: avoid divisions with very small numbers
Diffstat (limited to 'libavfilter/af_surround.c')
-rw-r--r-- | libavfilter/af_surround.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/libavfilter/af_surround.c b/libavfilter/af_surround.c index 117c2a2d4c..d7690cf12a 100644 --- a/libavfilter/af_surround.c +++ b/libavfilter/af_surround.c @@ -910,7 +910,8 @@ static void filter_stereo(AVFilterContext *ctx) float l_phase = atan2f(l_im, l_re); float r_phase = atan2f(r_im, r_re); float phase_dif = fabsf(l_phase - r_phase); - float mag_dif = (l_mag - r_mag) / (l_mag + r_mag); + float mag_sum = l_mag + r_mag; + float mag_dif = mag_sum < 0.000001 ? 0.f : (l_mag - r_mag) / mag_sum; float mag_total = hypotf(l_mag, r_mag); float x, y; @@ -944,7 +945,8 @@ static void filter_surround(AVFilterContext *ctx) float l_phase = atan2f(l_im, l_re); float r_phase = atan2f(r_im, r_re); float phase_dif = fabsf(l_phase - r_phase); - float mag_dif = (l_mag - r_mag) / (l_mag + r_mag); + float mag_sum = l_mag + r_mag; + float mag_dif = mag_sum < 0.000001 ? 0.f : (l_mag - r_mag) / mag_sum; float mag_total = hypotf(l_mag, r_mag); float x, y; @@ -977,7 +979,8 @@ static void filter_2_1(AVFilterContext *ctx) float l_phase = atan2f(l_im, l_re); float r_phase = atan2f(r_im, r_re); float phase_dif = fabsf(l_phase - r_phase); - float mag_dif = (l_mag - r_mag) / (l_mag + r_mag); + float mag_sum = l_mag + r_mag; + float mag_dif = mag_sum < 0.000001 ? 0.f : (l_mag - r_mag) / mag_sum; float mag_total = hypotf(l_mag, r_mag); float x, y; @@ -1018,8 +1021,10 @@ static void filter_5_0_side(AVFilterContext *ctx) float sr_phase = atan2f(sr_im, sr_re); float phase_difl = fabsf(fl_phase - sl_phase); float phase_difr = fabsf(fr_phase - sr_phase); - float mag_difl = (fl_mag - sl_mag) / (fl_mag + sl_mag); - float mag_difr = (fr_mag - sr_mag) / (fr_mag + sr_mag); + float magl_sum = fl_mag + sl_mag; + float magr_sum = fr_mag + sr_mag; + float mag_difl = magl_sum < 0.000001 ? 0.f : (fl_mag - sl_mag) / magl_sum; + float mag_difr = magr_sum < 0.000001 ? 0.f : (fr_mag - sr_mag) / magr_sum; float mag_totall = hypotf(fl_mag, sl_mag); float mag_totalr = hypotf(fr_mag, sr_mag); float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re); @@ -1075,8 +1080,10 @@ static void filter_5_1_side(AVFilterContext *ctx) float sr_phase = atan2f(sr_im, sr_re); float phase_difl = fabsf(fl_phase - sl_phase); float phase_difr = fabsf(fr_phase - sr_phase); - float mag_difl = (fl_mag - sl_mag) / (fl_mag + sl_mag); - float mag_difr = (fr_mag - sr_mag) / (fr_mag + sr_mag); + float magl_sum = fl_mag + sl_mag; + float magr_sum = fr_mag + sr_mag; + float mag_difl = magl_sum < 0.000001 ? 0.f : (fl_mag - sl_mag) / magl_sum; + float mag_difr = magr_sum < 0.000001 ? 0.f : (fr_mag - sr_mag) / magr_sum; float mag_totall = hypotf(fl_mag, sl_mag); float mag_totalr = hypotf(fr_mag, sr_mag); float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re); @@ -1132,8 +1139,10 @@ static void filter_5_1_back(AVFilterContext *ctx) float br_phase = atan2f(br_im, br_re); float phase_difl = fabsf(fl_phase - bl_phase); float phase_difr = fabsf(fr_phase - br_phase); - float mag_difl = (fl_mag - bl_mag) / (fl_mag + bl_mag); - float mag_difr = (fr_mag - br_mag) / (fr_mag + br_mag); + float magl_sum = fl_mag + bl_mag; + float magr_sum = fr_mag + br_mag; + float mag_difl = magl_sum < 0.000001 ? 0.f : (fl_mag - bl_mag) / magl_sum; + float mag_difr = magr_sum < 0.000001 ? 0.f : (fr_mag - br_mag) / magr_sum; float mag_totall = hypotf(fl_mag, bl_mag); float mag_totalr = hypotf(fr_mag, br_mag); float sl_phase = atan2f(fl_im + bl_im, fl_re + bl_re); |