Commit 2d66fc54 authored by Clément Bœsch's avatar Clément Bœsch Committed by 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: 's avatarAnton Khirnov <anton@khirnov.net>
parent 8b9a153e
...@@ -1142,7 +1142,7 @@ The filter takes two optional parameters, separated by ':': ...@@ -1142,7 +1142,7 @@ The filter takes two optional parameters, separated by ':':
@var{strength} is the maximum amount by which the filter will change @var{strength} is the maximum amount by which the filter will change
any one pixel. Also the threshold for detecting nearly flat 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. 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 @var{radius} is the neighborhood to fit the gradient to. A larger
......
...@@ -128,7 +128,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) ...@@ -128,7 +128,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
if (args) if (args)
sscanf(args, "%f:%d", &thresh, &radius); 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->thresh = (1 << 15) / thresh;
gf->radius = av_clip((radius + 1) & ~1, 4, 32); gf->radius = av_clip((radius + 1) & ~1, 4, 32);
......
...@@ -62,8 +62,8 @@ static void gradfun_filter_line_mmxext(uint8_t *dst, uint8_t *src, uint16_t *dc, ...@@ -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) "pminsw %%mm7, %%mm2 \n" // m = -max(0, 127-m)
"pmullw %%mm2, %%mm2 \n" "pmullw %%mm2, %%mm2 \n"
"paddw %%mm4, %%mm0 \n" // pix += dither "paddw %%mm4, %%mm0 \n" // pix += dither
"pmulhw %%mm2, %%mm1 \n"
"psllw $2, %%mm1 \n" // m = m*m*delta >> 14 "psllw $2, %%mm1 \n" // m = m*m*delta >> 14
"pmulhw %%mm2, %%mm1 \n"
"paddw %%mm1, %%mm0 \n" // pix += m "paddw %%mm1, %%mm0 \n" // pix += m
"psraw $7, %%mm0 \n" "psraw $7, %%mm0 \n"
"packuswb %%mm0, %%mm0 \n" "packuswb %%mm0, %%mm0 \n"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment