[FFmpeg-cvslog] lavfi/gradfun: fix rounding in MMX code.

Clément Bœsch git at videolan.org
Thu Mar 28 13:11:17 CET 2013


ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Fri Dec  7 00:36:29 2012 +0100| [2d66fc543b01995d6146fc132a778d3e722ca665] | committer: Anton Khirnov

lavfi/gradfun: fix rounding in MMX code.

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 <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2d66fc543b01995d6146fc132a778d3e722ca665
---

 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"



More information about the ffmpeg-cvslog mailing list