[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