[FFmpeg-devel] [PATCH] lavfi/aspect: ripristinate ratio parsing

Clément Bœsch ubitux at gmail.com
Tue Apr 16 23:11:36 CEST 2013


On Tue, Apr 16, 2013 at 10:39:19PM +0200, Stefano Sabatini wrote:
> Allow to set a ratio as "a:b" (with proper escaping), and correctly
> honour the max parameter.
> ---
>  libavfilter/vf_aspect.c |   29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c
> index 2b9ba15..e1f616b 100644
> --- a/libavfilter/vf_aspect.c
> +++ b/libavfilter/vf_aspect.c
> @@ -42,22 +42,31 @@ typedef struct {
>  #if FF_API_OLD_FILTER_OPTS
>      float aspect_num, aspect_den;
>  #endif
> +    char *ratio_str;
>  } AspectContext;
>  
> -#if FF_API_OLD_FILTER_OPTS
>  static av_cold int init(AVFilterContext *ctx)
>  {
>      AspectContext *s = ctx->priv;
> +    int ret;
>  
> +#if FF_API_OLD_FILTER_OPTS

If you do that, you need to remove it around the .init in avfilter_vf_*,
otherwise you'll get a surprise at next bump.

>      if (s->aspect_num > 0 && s->aspect_den > 0) {
>          av_log(ctx, AV_LOG_WARNING,
>                 "num:den syntax is deprecated, please use num/den or named options instead\n");
>          s->aspect = av_d2q(s->aspect_num / s->aspect_den, s->max);
>      }
> -
> +#endif
> +    if (s->ratio_str) {
> +        ret = av_parse_ratio(&s->aspect, s->ratio_str, s->max, 0, ctx);
> +        if (ret < 0 || s->aspect.num < 0 || s->aspect.den <= 0) {
> +            av_log(ctx, AV_LOG_ERROR,
> +                   "Invalid string '%s' for aspect ratio\n", s->ratio_str);
> +            return AVERROR(EINVAL);
> +        }
> +    }
>      return 0;
>  }
> -#endif
>  
>  static int filter_frame(AVFilterLink *link, AVFrame *frame)
>  {
> @@ -80,7 +89,7 @@ static int setdar_config_props(AVFilterLink *inlink)
>      if (aspect->aspect.num && aspect->aspect.den) {
>          av_reduce(&aspect->aspect.num, &aspect->aspect.den,
>                     aspect->aspect.num * inlink->h,

> -                   aspect->aspect.den * inlink->w, 100);
> +                   aspect->aspect.den * inlink->w, aspect->max);

This sounds like a bug I introduced and partially fixed in 7bd014ea. If
you could commit this separately it would be nice.

>          inlink->sample_aspect_ratio = aspect->aspect;
>      } else {
>          inlink->sample_aspect_ratio = (AVRational){ 1, 1 };
> @@ -99,9 +108,9 @@ static const AVOption setdar_options[] = {
>      { "dar_num", NULL, OFFSET(aspect_num), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS },
>      { "dar_den", NULL, OFFSET(aspect_den), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS },
>  #endif
> -    { "dar",   "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> -    { "ratio", "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> -    { "r",     "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> +    { "dar",   "set display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
> +    { "ratio", "set display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
> +    { "r",     "set display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
>      { "max",   "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS },
>      { NULL }
>  };
> @@ -162,9 +171,9 @@ static const AVOption setsar_options[] = {
>      { "sar_num", NULL, OFFSET(aspect_num), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS },
>      { "sar_den", NULL, OFFSET(aspect_den), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS },
>  #endif
> -    { "sar",   "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> -    { "ratio", "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> -    { "r",     "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS },
> +    { "sar",   "set sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
> +    { "ratio", "set sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
> +    { "r",     "set sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, .flags=FLAGS },
>      { "max",   "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS },
>      { NULL }
>  };

Could you make one of the FATE test use the ':' form?

Rest LGTM, thanks.

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130416/5ec5f563/attachment.asc>


More information about the ffmpeg-devel mailing list