[FFmpeg-devel] [PATCH] avfilter/pad: round output width/height up instead of down. Fixes bugs #1618 and #8475.
Ivan Middleton
ivan.middleton at gmail.com
Thu Feb 6 01:28:31 EET 2020
Hoping someone can review this and apply it if it looks good.
> 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
>
> ---
> 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
More information about the ffmpeg-devel
mailing list