From 93399e9381e62f37f46031f9bb35dec596967b3a Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Tue, 30 Oct 2012 20:40:19 +0100 Subject: [PATCH] lavfi/drawbox: add thickness option --- doc/filters.texi | 11 ++++++++++- libavfilter/version.h | 2 +- libavfilter/vf_drawbox.c | 14 ++++++++------ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index edbe4092c1..8bb7a9e80c 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1744,12 +1744,15 @@ Specify the color of the box to write, it can be the name of a color (case insensitive match) or a 0xRRGGBB[AA] sequence. If the special value @code{invert} is used, the box edge color is the same as the video with inverted luma. + +@item thickness, t +Set the thickness of the box edge. Default value is @code{4}. @end table If the key of the first options is omitted, the arguments are interpreted according to the following syntax: @example -drawbox=@var{x}:@var{y}:@var{width}:@var{height}:@var{color} +drawbox=@var{x}:@var{y}:@var{width}:@var{height}:@var{color}:@var{thickness} @end example Some examples follow: @@ -1770,6 +1773,12 @@ The previous example can be specified as: @example drawbox=x=10:y=20:w=200:h=60:color=red@@0.5 @end example + +@item +Fill the box with pink color: +@example +drawbox=x=10:y=10:w=100:h=100:color=pink@@0.5:t=max +@end example @end itemize @section drawtext diff --git a/libavfilter/version.h b/libavfilter/version.h index cb7b2a424e..d14097c35c 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 21 -#define LIBAVFILTER_VERSION_MICRO 102 +#define LIBAVFILTER_VERSION_MICRO 103 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_drawbox.c b/libavfilter/vf_drawbox.c index a1ae19b4a9..b37a35c6d6 100644 --- a/libavfilter/vf_drawbox.c +++ b/libavfilter/vf_drawbox.c @@ -38,7 +38,7 @@ enum { Y, U, V, A }; typedef struct { const AVClass *class; - int x, y, w, h; + int x, y, w, h, thickness; char *color_str; unsigned char yuv_color[4]; int invert_color; ///< invert luma color @@ -55,6 +55,8 @@ static const AVOption drawbox_options[] = { { "h", "set the box heigth", OFFSET(h), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, { "color", "set the box edge color", OFFSET(color_str), AV_OPT_TYPE_STRING, {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS }, { "c", "set the box edge color", 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 }, {NULL}, }; @@ -64,7 +66,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) { DrawBoxContext *drawbox = ctx->priv; uint8_t rgba_color[4]; - static const char *shorthand[] = { "x", "y", "w", "h", "color", NULL }; + static const char *shorthand[] = { "x", "y", "w", "h", "color", "thickness", NULL }; int ret; drawbox->class = &drawbox_class; @@ -140,15 +142,15 @@ static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir) if (drawbox->invert_color) { for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++) - if ((y - yb < 3) || (yb + drawbox->h - y < 4) || - (x - xb < 3) || (xb + drawbox->w - x < 4)) + if ((y - yb < drawbox->thickness-1) || (yb + drawbox->h - y < drawbox->thickness) || + (x - xb < drawbox->thickness-1) || (xb + drawbox->w - x < drawbox->thickness)) row[0][x] = 0xff - row[0][x]; } else { for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++) { double alpha = (double)drawbox->yuv_color[A] / 255; - if ((y - yb < 3) || (yb + drawbox->h - y < 4) || - (x - xb < 3) || (xb + drawbox->w - x < 4)) { + if ((y - yb < drawbox->thickness-1) || (yb + drawbox->h - y < drawbox->thickness) || + (x - xb < drawbox->thickness-1) || (xb + drawbox->w - x < drawbox->thickness)) { row[0][x ] = (1 - alpha) * row[0][x ] + alpha * drawbox->yuv_color[Y]; row[1][x >> drawbox->hsub] = (1 - alpha) * row[1][x >> drawbox->hsub] + alpha * drawbox->yuv_color[U]; row[2][x >> drawbox->hsub] = (1 - alpha) * row[2][x >> drawbox->hsub] + alpha * drawbox->yuv_color[V];