[FFmpeg-devel] [PATCH] drawbox: Respect thickness parameter

Jean Delvare khali at linux-fr.org
Wed Jun 12 10:48:57 CEST 2013


The drawbox video filter is drawing lines one pixel thinner than
requested. The default thickness is 4 pixel but in fact the lines
drawn by default are only 3 pixel wide.

Change the comparisons in the code to fix this off-by-one bug. Also
change the default thickness from 4 to 3 to minimize the unexpected
changes from the user's perspective.

As I was already touching these lines, I also removed the "maximum" in
the thickness parameter description, as I don't think it was adding
any value and I even found it confusing.
---
 doc/filters.texi         |    2 +-
 libavfilter/vf_drawbox.c |   12 ++++++------
 2 files changed, 7 insertions(+), 7 deletions(-)

--- ffmpeg.orig/libavfilter/vf_drawbox.c	2013-05-21 14:19:36.946980517 +0200
+++ ffmpeg/libavfilter/vf_drawbox.c	2013-06-12 10:13:21.341379961 +0200
@@ -114,15 +114,15 @@ static int filter_frame(AVFilterLink *in
 
         if (s->invert_color) {
             for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++)
-                if ((y - yb < s->thickness-1) || (yb + s->h - y < s->thickness) ||
-                    (x - xb < s->thickness-1) || (xb + s->w - x < s->thickness))
+                if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
+                    (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness))
                     row[0][x] = 0xff - row[0][x];
         } else {
             for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++) {
                 double alpha = (double)s->yuv_color[A] / 255;
 
-                if ((y - yb < s->thickness-1) || (yb + s->h - y < s->thickness) ||
-                    (x - xb < s->thickness-1) || (xb + s->w - x < s->thickness)) {
+                if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
+                    (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness)) {
                     row[0][x                 ] = (1 - alpha) * row[0][x                 ] + alpha * s->yuv_color[Y];
                     row[1][x >> s->hsub] = (1 - alpha) * row[1][x >> s->hsub] + alpha * s->yuv_color[U];
                     row[2][x >> s->hsub] = (1 - alpha) * row[2][x >> s->hsub] + alpha * s->yuv_color[V];
@@ -148,8 +148,8 @@ static const AVOption drawbox_options[]
     { "h",         "set height of the box",                        OFFSET(h_opt),     AV_OPT_TYPE_INT, { .i64 = 0 }, 0,       INT_MAX, FLAGS },
     { "color",     "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
     { "c",         "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "thickness", "set the box maximum thickness",                OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
-    { "t",         "set the box maximum thickness",                OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
+    { "thickness", "set the box thickness",                        OFFSET(thickness), AV_OPT_TYPE_INT, { .i64 = 3 }, 0,       INT_MAX, FLAGS },
+    { "t",         "set the box thickness",                        OFFSET(thickness), AV_OPT_TYPE_INT, { .i64 = 3 }, 0,       INT_MAX, FLAGS },
     { NULL }
 };
 
--- ffmpeg.orig/doc/filters.texi	2013-06-08 10:05:54.095116778 +0200
+++ ffmpeg/doc/filters.texi	2013-06-12 10:23:23.018143985 +0200
@@ -2900,7 +2900,7 @@ value @code{invert} is used, the box edg
 video with inverted luma.
 
 @item thickness, t
-Set the thickness of the box edge. Default value is @code{4}.
+Set the thickness of the box edge. Default value is @code{3}.
 @end table
 
 @subsection Examples


-- 
Jean Delvare


More information about the ffmpeg-devel mailing list