vf_pad: center image on padded area if negative x/y

or if x/y go beyond padded area.

This is mostly useful when paired with the aspect option.
Defaults aren't changed.

Idea for this was taken from mpv's soon-to-be-removed expand vf.

Reviewed-by: Paul B Mahol <onemda@gmail.com>
pull/139/merge
Ricardo Constantino 8 years ago committed by Rostislav Pehlivanov
parent 3f8d7342c3
commit 57c3670896
  1. 3
      doc/filters.texi
  2. 12
      libavfilter/vf_pad.c

@ -10430,6 +10430,9 @@ expression, and vice versa.
The default value of @var{x} and @var{y} is 0. The default value of @var{x} and @var{y} is 0.
If @var{x} or @var{y} evaluate to a negative number, they'll be changed
so the input image is centered on the padded area.
@item color @item color
Specify the color of the padded area. For the syntax of this option, Specify the color of the padded area. For the syntax of this option,
check the "Color" section in the ffmpeg-utils manual. check the "Color" section in the ffmpeg-utils manual.

@ -173,8 +173,13 @@ static int config_input(AVFilterLink *inlink)
goto eval_fail; goto eval_fail;
s->x = var_values[VAR_X] = res; s->x = var_values[VAR_X] = res;
if (s->x < 0 || s->x + inlink->w > s->w)
s->x = var_values[VAR_X] = (s->w - inlink->w) / 2;
if (s->y < 0 || s->y + inlink->h > s->h)
s->y = var_values[VAR_Y] = (s->h - inlink->h) / 2;
/* sanity check params */ /* sanity check params */
if (s->w < 0 || s->h < 0 || s->x < 0 || s->y < 0) { if (s->w < 0 || s->h < 0) {
av_log(ctx, AV_LOG_ERROR, "Negative values are not acceptable.\n"); av_log(ctx, AV_LOG_ERROR, "Negative values are not acceptable.\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
@ -192,10 +197,7 @@ static int config_input(AVFilterLink *inlink)
inlink->w, inlink->h, s->w, s->h, s->x, s->y, inlink->w, inlink->h, s->w, s->h, s->x, s->y,
s->rgba_color[0], s->rgba_color[1], s->rgba_color[2], s->rgba_color[3]); s->rgba_color[0], s->rgba_color[1], s->rgba_color[2], s->rgba_color[3]);
if (s->x < 0 || s->y < 0 || if (s->w <= 0 || s->h <= 0) {
s->w <= 0 || s->h <= 0 ||
(unsigned)s->x + (unsigned)inlink->w > s->w ||
(unsigned)s->y + (unsigned)inlink->h > s->h) {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
"Input area %d:%d:%d:%d not within the padded area 0:0:%d:%d or zero-sized\n", "Input area %d:%d:%d:%d not within the padded area 0:0:%d:%d or zero-sized\n",
s->x, s->y, s->x + inlink->w, s->y + inlink->h, s->w, s->h); s->x, s->y, s->x + inlink->w, s->y + inlink->h, s->w, s->h);

Loading…
Cancel
Save