From: Clément Bœsch <[email protected]>

Current code divides before increasing precision.

Also reduce upper bound for strength from 255 to 64.  This will prevent
an overflow in the SSSE3 and MMX filter_line code: delta is expressed as
an u16 being shifted by 2 to the left. If it overflows, having a
strength not above 64 will make sure that m is set to 0 (making the
m*m*delta >> 14 expression void).

A value above 64 should not make any sense unless gradfun is used as
a blur filter.

Signed-off-by: Anton Khirnov <[email protected]>
---
 doc/filters.texi             |    2 +-
 libavfilter/vf_gradfun.c     |    2 +-
 libavfilter/x86/vf_gradfun.c |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 9b39ea5..88888c6 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1142,7 +1142,7 @@ The filter takes two optional parameters, separated by 
':':
 
 @var{strength} is the maximum amount by which the filter will change
 any one pixel. Also the threshold for detecting nearly flat
-regions. Acceptable values range from .51 to 255, default value is
+regions. Acceptable values range from .51 to 64, default value is
 1.2, out-of-range values will be clipped to the valid range.
 
 @var{radius} is the neighborhood to fit the gradient to. A larger
diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c
index 80b7e41..900ef60 100644
--- a/libavfilter/vf_gradfun.c
+++ b/libavfilter/vf_gradfun.c
@@ -128,7 +128,7 @@ static av_cold int init(AVFilterContext *ctx, const char 
*args)
     if (args)
         sscanf(args, "%f:%d", &thresh, &radius);
 
-    thresh = av_clipf(thresh, 0.51, 255);
+    thresh = av_clipf(thresh, 0.51, 64);
     gf->thresh = (1 << 15) / thresh;
     gf->radius = av_clip((radius + 1) & ~1, 4, 32);
 
diff --git a/libavfilter/x86/vf_gradfun.c b/libavfilter/x86/vf_gradfun.c
index b4ca86c..75c117a 100644
--- a/libavfilter/x86/vf_gradfun.c
+++ b/libavfilter/x86/vf_gradfun.c
@@ -62,8 +62,8 @@ static void gradfun_filter_line_mmxext(uint8_t *dst, uint8_t 
*src, uint16_t *dc,
         "pminsw     %%mm7, %%mm2 \n" // m = -max(0, 127-m)
         "pmullw     %%mm2, %%mm2 \n"
         "paddw      %%mm4, %%mm0 \n" // pix += dither
-        "pmulhw     %%mm2, %%mm1 \n"
         "psllw         $2, %%mm1 \n" // m = m*m*delta >> 14
+        "pmulhw     %%mm2, %%mm1 \n"
         "paddw      %%mm1, %%mm0 \n" // pix += m
         "psraw         $7, %%mm0 \n"
         "packuswb   %%mm0, %%mm0 \n"
-- 
1.7.10.4

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to