Commit 93399e93 authored by Stefano Sabatini's avatar Stefano Sabatini

lavfi/drawbox: add thickness option

parent 84833b02
...@@ -1744,12 +1744,15 @@ Specify the color of the box to write, it can be the name of a color ...@@ -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 (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 value @code{invert} is used, the box edge color is the same as the
video with inverted luma. video with inverted luma.
@item thickness, t
Set the thickness of the box edge. Default value is @code{4}.
@end table @end table
If the key of the first options is omitted, the arguments are If the key of the first options is omitted, the arguments are
interpreted according to the following syntax: interpreted according to the following syntax:
@example @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 @end example
Some examples follow: Some examples follow:
...@@ -1770,6 +1773,12 @@ The previous example can be specified as: ...@@ -1770,6 +1773,12 @@ The previous example can be specified as:
@example @example
drawbox=x=10:y=20:w=200:h=60:color=red@@0.5 drawbox=x=10:y=20:w=200:h=60:color=red@@0.5
@end example @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 @end itemize
@section drawtext @section drawtext
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 21 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \
......
...@@ -38,7 +38,7 @@ enum { Y, U, V, A }; ...@@ -38,7 +38,7 @@ enum { Y, U, V, A };
typedef struct { typedef struct {
const AVClass *class; const AVClass *class;
int x, y, w, h; int x, y, w, h, thickness;
char *color_str; char *color_str;
unsigned char yuv_color[4]; unsigned char yuv_color[4];
int invert_color; ///< invert luma color int invert_color; ///< invert luma color
...@@ -55,6 +55,8 @@ static const AVOption drawbox_options[] = { ...@@ -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 }, { "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 }, { "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 }, { "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}, {NULL},
}; };
...@@ -64,7 +66,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) ...@@ -64,7 +66,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
{ {
DrawBoxContext *drawbox = ctx->priv; DrawBoxContext *drawbox = ctx->priv;
uint8_t rgba_color[4]; 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; int ret;
drawbox->class = &drawbox_class; drawbox->class = &drawbox_class;
...@@ -140,15 +142,15 @@ static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir) ...@@ -140,15 +142,15 @@ static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
if (drawbox->invert_color) { if (drawbox->invert_color) {
for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++) for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++)
if ((y - yb < 3) || (yb + drawbox->h - y < 4) || if ((y - yb < drawbox->thickness-1) || (yb + drawbox->h - y < drawbox->thickness) ||
(x - xb < 3) || (xb + drawbox->w - x < 4)) (x - xb < drawbox->thickness-1) || (xb + drawbox->w - x < drawbox->thickness))
row[0][x] = 0xff - row[0][x]; row[0][x] = 0xff - row[0][x];
} else { } else {
for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++) { for (x = FFMAX(xb, 0); x < xb + drawbox->w && x < picref->video->w; x++) {
double alpha = (double)drawbox->yuv_color[A] / 255; double alpha = (double)drawbox->yuv_color[A] / 255;
if ((y - yb < 3) || (yb + drawbox->h - y < 4) || if ((y - yb < drawbox->thickness-1) || (yb + drawbox->h - y < drawbox->thickness) ||
(x - xb < 3) || (xb + drawbox->w - x < 4)) { (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[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[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]; row[2][x >> drawbox->hsub] = (1 - alpha) * row[2][x >> drawbox->hsub] + alpha * drawbox->yuv_color[V];
......
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