Browse Source

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>
tags/n3.4
Ricardo Constantino Rostislav Pehlivanov 8 years ago
parent
commit
57c3670896
2 changed files with 10 additions and 5 deletions
  1. +3
    -0
      doc/filters.texi
  2. +7
    -5
      libavfilter/vf_pad.c

+ 3
- 0
doc/filters.texi View File

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


+ 7
- 5
libavfilter/vf_pad.c View File

@@ -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 ||
s->w <= 0 || s->h <= 0 ||
(unsigned)s->x + (unsigned)inlink->w > s->w ||
(unsigned)s->y + (unsigned)inlink->h > s->h) {
if (s->w <= 0 || s->h <= 0) {
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