From 1897109c00a04373248e401d192ed26b1b74dd03 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Sat, 2 Feb 2013 00:51:14 +0100 Subject: [PATCH] lavfi/pad: add support to named options --- doc/filters.texi | 82 ++++++++++++++++++++++++------------------- libavfilter/version.h | 2 +- libavfilter/vf_pad.c | 52 +++++++++++++++++++-------- 3 files changed, 84 insertions(+), 52 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 5718d100b7..442fe35466 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -3725,14 +3725,50 @@ testsrc=s=100x100, split=4 [in0][in1][in2][in3]; @section pad -Add paddings to the input image, and places the original input at the +Add paddings to the input image, and place the original input at the given coordinates @var{x}, @var{y}. -It accepts the following parameters: +The filter accepts parameters as a list of @var{key}=@var{value} pairs, +separated by ":". + +If the key of the first options is omitted, the arguments are +interpreted according to the syntax @var{width}:@var{height}:@var{x}:@var{y}:@var{color}. -The parameters @var{width}, @var{height}, @var{x}, and @var{y} are -expressions containing the following constants: +A description of the accepted options follows. + +@table @option +@item width, w +@item height, h +Specify an expression for the size of the output image with the +paddings added. If the value for @var{width} or @var{height} is 0, the +corresponding input size is used for the output. + +The @var{width} expression can reference the value set by the +@var{height} expression, and vice versa. + +The default value of @var{width} and @var{height} is 0. + +@item x +@item y +Specify an expression for the offsets where to place the input image +in the padded area with respect to the top/left border of the output +image. + +The @var{x} expression can reference the value set by the @var{y} +expression, and vice versa. + +The default value of @var{x} and @var{y} is 0. + +@item color +Specify the color of the padded area, it can be the name of a color +(case insensitive match) or a 0xRRGGBB[AA] sequence. + +The default value of @var{color} is "black". +@end table + +The value for the @var{width}, @var{height}, @var{x}, and @var{y} +options are expressions containing the following constants: @table @option @item in_w, in_h @@ -3766,39 +3802,6 @@ horizontal and vertical chroma subsample values. For example for the pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. @end table -Follows the description of the accepted parameters. - -@table @option -@item width, height - -Specify the size of the output image with the paddings added. If the -value for @var{width} or @var{height} is 0, the corresponding input size -is used for the output. - -The @var{width} expression can reference the value set by the -@var{height} expression, and vice versa. - -The default value of @var{width} and @var{height} is 0. - -@item x, y - -Specify the offsets where to place the input image in the padded area -with respect to the top/left border of the output image. - -The @var{x} expression can reference the value set by the @var{y} -expression, and vice versa. - -The default value of @var{x} and @var{y} is 0. - -@item color - -Specify the color of the padded area, it can be the name of a color -(case insensitive match) or a 0xRRGGBB[AA] sequence. - -The default value of @var{color} is "black". - -@end table - @subsection Examples @itemize @@ -3810,6 +3813,11 @@ column 0, row 40: pad=640:480:0:40:violet @end example +The example above is equivalent to the following command: +@example +pad=width=640:height=480:x=0:y=40:color=violet +@end example + @item Pad the input to get an output with dimensions increased by 3/2, and put the input video at the center of the padded area: diff --git a/libavfilter/version.h b/libavfilter/version.h index b6f7992e11..f90d3f2018 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 35 -#define LIBAVFILTER_VERSION_MICRO 100 +#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index bbd37b160c..5c146f208f 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -35,6 +35,7 @@ #include "libavutil/colorspace.h" #include "libavutil/avassert.h" #include "libavutil/imgutils.h" +#include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/mathematics.h" #include "drawutils.h" @@ -76,40 +77,61 @@ static int query_formats(AVFilterContext *ctx) } typedef struct { + const AVClass *class; int w, h; ///< output dimensions, a value of 0 will result in the input size int x, y; ///< offsets of the input area with respect to the padded area int in_w, in_h; ///< width and height for the padded input video, which has to be aligned to the chroma values in order to avoid chroma issues - char w_expr[256]; ///< width expression string - char h_expr[256]; ///< height expression string - char x_expr[256]; ///< width expression string - char y_expr[256]; ///< height expression string - + char *w_expr; ///< width expression string + char *h_expr; ///< height expression string + char *x_expr; ///< width expression string + char *y_expr; ///< height expression string + char *color_str; uint8_t rgba_color[4]; ///< color for the padding area FFDrawContext draw; FFDrawColor color; } PadContext; +#define OFFSET(x) offsetof(PadContext, x) +#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM + +static const AVOption pad_options[] = { + { "width", "set the pad area width expression", OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "w", "set the pad area width expression", OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "height", "set the pad area height expression", OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "h", "set the pad area height expression", OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "x", "set the x offset expression for the input image position", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "y", "set the y offset expression for the input image position", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS }, + { "color", "set the color of the padded area border", OFFSET(color_str), AV_OPT_TYPE_STRING, {.str = "black"}, .flags = FLAGS }, + {NULL} +}; + +AVFILTER_DEFINE_CLASS(pad); + static av_cold int init(AVFilterContext *ctx, const char *args) { PadContext *pad = ctx->priv; - char color_string[128] = "black"; + static const char *shorthand[] = { "width", "height", "x", "y", "color", NULL }; + int ret; - av_strlcpy(pad->w_expr, "iw", sizeof(pad->w_expr)); - av_strlcpy(pad->h_expr, "ih", sizeof(pad->h_expr)); - av_strlcpy(pad->x_expr, "0" , sizeof(pad->w_expr)); - av_strlcpy(pad->y_expr, "0" , sizeof(pad->h_expr)); + pad->class = &pad_class; + av_opt_set_defaults(pad); - if (args) - sscanf(args, "%255[^:]:%255[^:]:%255[^:]:%255[^:]:%127s", - pad->w_expr, pad->h_expr, pad->x_expr, pad->y_expr, color_string); + if ((ret = av_opt_set_from_string(pad, args, shorthand, "=", ":")) < 0) + return ret; - if (av_parse_color(pad->rgba_color, color_string, -1, ctx) < 0) + if (av_parse_color(pad->rgba_color, pad->color_str, -1, ctx) < 0) return AVERROR(EINVAL); return 0; } +static av_cold void uninit(AVFilterContext *ctx) +{ + PadContext *pad = ctx->priv; + av_opt_free(pad); +} + static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; @@ -368,9 +390,11 @@ AVFilter avfilter_vf_pad = { .priv_size = sizeof(PadContext), .init = init, + .uninit = uninit, .query_formats = query_formats, .inputs = avfilter_vf_pad_inputs, .outputs = avfilter_vf_pad_outputs, + .priv_class = &pad_class, };