lavfi/drawbox: add thickness option

This commit is contained in:
Stefano Sabatini 2012-10-30 20:40:19 +01:00
parent 84833b028b
commit 93399e9381
3 changed files with 19 additions and 8 deletions

View File

@ -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:
@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

View File

@ -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, \

View File

@ -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[] = {
{ "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)
{ {
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)
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];