diff mbox

[FFmpeg-devel] vf_pad: center image on padded area if negative x/y

Message ID 20170403183409.10892-1-wiiaboo@gmail.com
State Accepted
Commit 57c3670896c69714ca1514728edf5ee48b2abcc9
Headers show

Commit Message

Ricardo Constantino April 3, 2017, 6:34 p.m. UTC
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.
---
 doc/filters.texi     |  3 +++
 libavfilter/vf_pad.c | 12 +++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

Comments

Rostislav Pehlivanov April 7, 2017, 8:36 p.m. UTC | #1
On 3 April 2017 at 19:34, Ricardo Constantino <wiiaboo@gmail.com> wrote:

> 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.
> ---
>  doc/filters.texi     |  3 +++
>  libavfilter/vf_pad.c | 12 +++++++-----
>  2 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index bc37e667e0..32720dba41 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -10430,6 +10430,9 @@ expression, and vice versa.
>
>  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
>  Specify the color of the padded area. For the syntax of this option,
>  check the "Color" section in the ffmpeg-utils manual.
> diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c
> index 5b81379691..757170e742 100644
> --- a/libavfilter/vf_pad.c
> +++ b/libavfilter/vf_pad.c
> @@ -173,8 +173,13 @@ static int config_input(AVFilterLink *inlink)
>          goto eval_fail;
>      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 */
> -    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");
>          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,
>             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,
>                 "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);
> --
> 2.12.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


Thanks, pushed.
diff mbox

Patch

diff --git a/doc/filters.texi b/doc/filters.texi
index bc37e667e0..32720dba41 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -10430,6 +10430,9 @@  expression, and vice versa.
 
 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
 Specify the color of the padded area. For the syntax of this option,
 check the "Color" section in the ffmpeg-utils manual.
diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c
index 5b81379691..757170e742 100644
--- a/libavfilter/vf_pad.c
+++ b/libavfilter/vf_pad.c
@@ -173,8 +173,13 @@  static int config_input(AVFilterLink *inlink)
         goto eval_fail;
     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 */
-    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");
         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,
            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,
                "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);