[FFmpeg-devel] [PATCH] libavfilter/vf_scale: Ensure scaled video is divisible by n

Lars Kiesow lkiesow at uos.de
Mon Aug 5 14:30:55 EEST 2019


Hi everyone,
this is now open for nearly a month with no more comments or change
requests. Anything else I should do to get this merged?
Best regards,
Lars


On Mon,  8 Jul 2019 17:43:40 +0200
Lars Kiesow <lkiesow at uos.de> wrote:

> This patch adds a new option to the scale filter which ensures that
> the output resolution is divisible by the given integer when used
> together with `force_original_aspect_ratio`. This works similar to
> using `-n` in the `w` and `h` options.
> 
> This option respects the value set for `force_original_aspect_ratio`,
> increasing or decreasing the resolution accordingly.
> 
> The use case for this is to set a fixed target resolution using `w`
> and `h`, to use the `force_original_aspect_ratio` option to make sure
> that the video always fits in the defined bounding box regardless of
> aspect ratio, but to also make sure that the calculated output
> resolution is divisible by n so in can be encoded with certain
> encoders/options if that is required.
> 
> Signed-off-by: Lars Kiesow <lkiesow at uos.de>
> ---
>  doc/filters.texi       | 12 ++++++++++++
>  libavfilter/vf_scale.c | 13 ++++++++++++-
>  2 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index ee6a93ffbf..2de71d9820 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -15231,6 +15231,18 @@ Please note that this is a different thing
> than specifying -1 for @option{w} or @option{h}, you still need to
> specify the output resolution for this option to work.
>  
> + at item force_divisible_by Ensures that the output resolution is
> divisible by the +given integer when used together with
> @option{force_original_aspect_ratio}. This +works similar to using -n
> in the @option{w} and @option{h} options. +
> +This option respects the value set for
> @option{force_original_aspect_ratio}, +increasing or decreasing the
> resolution accordingly. This may slightly modify +the video's aspect
> ration. +
> +This can be handy, for example, if you want to have a video fit
> within a defined +resolution using the
> @option{force_original_aspect_ratio} option but have +encoder
> restrictions when it comes to width or height. +
>  @end table
>  
>  The values of the @option{w} and @option{h} options are expressions
> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
> index 7aebf56ad8..3ce6cdd1d5 100644
> --- a/libavfilter/vf_scale.c
> +++ b/libavfilter/vf_scale.c
> @@ -86,6 +86,7 @@ typedef struct ScaleContext {
>      int in_v_chr_pos;
>  
>      int force_original_aspect_ratio;
> +    int force_divisible_by;
>  
>      int nb_slices;
>  
> @@ -237,7 +238,8 @@ static int config_props(AVFilterLink *outlink)
>          goto fail;
>  
>      /* Note that force_original_aspect_ratio may overwrite the
> previous set
> -     * dimensions so that it is not divisible by the set factors
> anymore. */
> +     * dimensions so that it is not divisible by the set factors
> anymore
> +     * unless force_divisible_by is defined as well */
>      if (scale->force_original_aspect_ratio) {
>          int tmp_w = av_rescale(h, inlink->w, inlink->h);
>          int tmp_h = av_rescale(w, inlink->h, inlink->w);
> @@ -245,9 +247,17 @@ static int config_props(AVFilterLink *outlink)
>          if (scale->force_original_aspect_ratio == 1) {
>               w = FFMIN(tmp_w, w);
>               h = FFMIN(tmp_h, h);
> +             if (scale->force_divisible_by > 1) {
> +                 w = w / scale->force_divisible_by *
> scale->force_divisible_by;
> +                 h = h / scale->force_divisible_by *
> scale->force_divisible_by;
> +             }
>          } else {
>               w = FFMAX(tmp_w, w);
>               h = FFMAX(tmp_h, h);
> +             if (scale->force_divisible_by > 1) {
> +                 w = ceil(w / (float)scale->force_divisible_by) *
> scale->force_divisible_by;
> +                 h = ceil(h / (float)scale->force_divisible_by) *
> scale->force_divisible_by;
> +             }
>          }
>      }
>  
> @@ -600,6 +610,7 @@ static const AVOption scale_options[] = {
>      { "disable",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0,
> FLAGS, "force_oar" }, { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64
> = 1 }, 0, 0, FLAGS, "force_oar" }, { "increase", NULL, 0,
> AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" },
> +    { "force_divisible_by", "enforce that the output resolution is
> divisible by a defined integer when force_original_aspect_ratio is
> used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1,
> 256, FLAGS }, { "param0", "Scaler param 0",
> OFFSET(param[0]),  AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT  },
> INT_MIN, INT_MAX, FLAGS }, { "param1", "Scaler param 1",
> OFFSET(param[1]),  AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT  },
> INT_MIN, INT_MAX, FLAGS }, { "nb_slices", "set the number of slices
> (debug purpose only)", OFFSET(nb_slices), AV_OPT_TYPE_INT, { .i64 =
> 0 }, 0, INT_MAX, FLAGS },



More information about the ffmpeg-devel mailing list