The pad filter is currently broken for cases where all of the following hold:

(1) chroma subsampling exists (very common),

(2) an input dimension is odd (uncommon), and

(3) the corresponding output dimension is either the same as the input,
or an expression like "ow-iw" or "oh-ih" is used to place the image at
the right/bottom edge and the extra padding is even in size.

The cause of the breakage is essentially that the output width and
height are being rounded downward, causing the image to exceed the
padded area slightly.

It seems best to me to simply round the output width/height up instead 
of down, so I've attached a patch to do that. This fixes bugs #1618 and
#8475.

Commands to reproduce the bug:

# create 15x15 test jpeg with 4:2:0 subsampling
ffmpeg -f lavfi -i color=red:15x15,format=rgb24 -vframes 1 -vf format=yuvj420p 
red.jpg

# output size = input size. fails
ffmpeg -i red.jpg -vf pad=iw:ih:0:0 pad1.png

# input at bottom right of output. fails
ffmpeg -i red.jpg -vf pad=iw+16:ih+16:ow-iw:oh-ih pad2.png

Ivan
From 52030219e09b5f9611ca6232b1f24197363fc23b Mon Sep 17 00:00:00 2001
From: Ivan Middleton <ivan.middle...@gmail.com>
Date: Sun, 26 Jan 2020 20:25:59 -0700
Subject: [PATCH] avfilter/pad: round output width/height up instead of down.
 Fixes bugs #1618 and #8475.

---
 libavfilter/vf_pad.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c
index e86292e..493e342 100644
--- a/libavfilter/vf_pad.c
+++ b/libavfilter/vf_pad.c
@@ -178,8 +178,8 @@ static int config_input(AVFilterLink *inlink)
     if (s->y < 0 || s->y + inlink->h > s->h)
         s->y = var_values[VAR_Y] = (s->h - inlink->h) / 2;
 
-    s->w    = ff_draw_round_to_sub(&s->draw, 0, -1, s->w);
-    s->h    = ff_draw_round_to_sub(&s->draw, 1, -1, s->h);
+    s->w    = ff_draw_round_to_sub(&s->draw, 0, +1, s->w);
+    s->h    = ff_draw_round_to_sub(&s->draw, 1, +1, s->h);
     /* sanity check params */
     if (s->w < inlink->w || s->h < inlink->h) {
         av_log(ctx, AV_LOG_ERROR, "Padded dimensions cannot be smaller than input dimensions.\n");
-- 
2.20.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to