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

Stefano Sabatini stefasab at gmail.com
Wed Apr 17 23:11:37 CEST 2013


On date Tuesday 2013-04-16 23:11:36 +0200, Clément Bœsch encoded:
> 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.

Hunk dropped since it doesn't look correct.

> >          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.

Pushed.
-- 
FFmpeg = Fostering Fierce Meaningful Ponderous Exxagerate Genius


More information about the ffmpeg-devel mailing list