From 71ef1ec7b482d7222717faae0a51f2fd4ef3bdf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Thu, 11 Apr 2013 21:59:53 +0200 Subject: [PATCH] lavfi/aspect: switch to an AVOptions-based system. This is heavily based on 2831b307 by Anton Khirnov --- doc/filters.texi | 40 ++++++++++++++++---------------- libavfilter/avfilter.c | 2 -- libavfilter/vf_aspect.c | 48 ++++++++++++++++----------------------- tests/lavfi-regression.sh | 4 ++-- 4 files changed, 42 insertions(+), 52 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index c6cf678c73..f812d8329d 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -5030,18 +5030,10 @@ Keep in mind that the sample aspect ratio set by the @code{setsar} filter may be changed by later filters in the filterchain, e.g. if another "setsar" or a "setdar" filter is applied. -The @code{setdar} and @code{setsar} filters accept a string in the -form @var{num}:@var{den} expressing an aspect ratio, or the following -named options, expressed as a sequence of @var{key}=@var{value} pairs, -separated by ":". +The filters accept the following options: @table @option -@item max -Set the maximum integer value to use for expressing numerator and -denominator when reducing the expressed aspect ratio to a rational. -Default value is @code{100}. - -@item r, ratio, dar, sar: +@item r, ratio, dar (@code{setdar} only), sar (@code{setsar} only) Set the aspect ratio used by the filter. The parameter can be a floating point number string, an expression, or @@ -5050,33 +5042,41 @@ a string of the form @var{num}:@var{den}, where @var{num} and the parameter is not specified, it is assumed the value "0". In case the form "@var{num}:@var{den}" the @code{:} character should be escaped. + +@item max +Set the maximum integer value to use for expressing numerator and +denominator when reducing the expressed aspect ratio to a rational. +Default value is @code{100}. + @end table -If the keys are omitted in the named options list, the specifed values -are assumed to be @var{ratio} and @var{max} in that order. +@subsection Examples -For example to change the display aspect ratio to 16:9, specify: +@itemize + +@item +To change the display aspect ratio to 16:9, specify one of the following: @example -setdar='16:9' -# the above is equivalent to -setdar=1.77777 +setdar=dar=1.77777 setdar=dar=16/9 setdar=dar=1.77777 @end example +@item To change the sample aspect ratio to 10:11, specify: @example -setsar='10:11' -# the above is equivalent to -setsar='sar=10/11' +setsar=sar=10/11 @end example +@item To set a display aspect ratio of 16:9, and specify a maximum integer value of 1000 in the aspect ratio reduction, use the command: @example -setdar=ratio='16:9':max=1000 +setdar=ratio=16/9:max=1000 @end example +@end itemize + @anchor{setfield} @section setfield diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index c088f41c6a..ff309f436c 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -681,8 +681,6 @@ static const char *const filters_left_to_update[] = { "mp", "pan", "scale", - "setdar", - "setsar", }; static int filter_use_deprecated_init(const char *name) diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c index ab41becf68..4e7db56e9e 100644 --- a/libavfilter/vf_aspect.c +++ b/libavfilter/vf_aspect.c @@ -38,7 +38,6 @@ typedef struct { const AVClass *class; AVRational aspect; - char *ratio_str; int max; #if FF_API_OLD_FILTER_OPTS float aspect_num, aspect_den; @@ -49,26 +48,11 @@ typedef struct { static av_cold int init(AVFilterContext *ctx, const char *args) { AspectContext *s = ctx->priv; - static const char *shorthand[] = { "ratio", "max", NULL }; - char c; - int ret; - AVRational q; - if (args && sscanf(args, "%d:%d%c", &q.num, &q.den, &c) == 2) { - s->ratio_str = av_strdup(args); + 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"); - } else if ((ret = av_opt_set_from_string(s, args, shorthand, "=", ":")) < 0) { - return ret; - } - - 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", args); - return AVERROR(EINVAL); - } + s->aspect = av_d2q(s->aspect_num / s->aspect_den, INT_MAX); } return 0; @@ -111,11 +95,15 @@ static int setdar_config_props(AVFilterLink *inlink) } static const AVOption setdar_options[] = { - {"max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, - {"ratio", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {"r", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {"dar", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {NULL} +#if FF_API_OLD_FILTER_OPTS + { "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 }, + { "max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, + { NULL } }; AVFILTER_DEFINE_CLASS(setdar); @@ -170,11 +158,15 @@ static int setsar_config_props(AVFilterLink *inlink) } static const AVOption setsar_options[] = { - {"max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, - {"ratio", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {"r", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {"sar", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, - {NULL} +#if FF_API_OLD_FILTER_OPTS + { "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 }, + { "max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, + { NULL } }; AVFILTER_DEFINE_CLASS(setsar); diff --git a/tests/lavfi-regression.sh b/tests/lavfi-regression.sh index 9076e4fbda..d3e95d7754 100755 --- a/tests/lavfi-regression.sh +++ b/tests/lavfi-regression.sh @@ -60,8 +60,8 @@ do_lavfi "pp6" "pp=be/fd" do_lavfi "scale200" "scale=200:200" do_lavfi "scale500" "scale=500:500" do_lavfi "select" "select=not(eq(mod(n\,2)\,0)+eq(mod(n\,3)\,0))" -do_lavfi "setdar" "setdar=16/9" -do_lavfi "setsar" "setsar=16/11" +do_lavfi "setdar" "setdar=dar=16/9" +do_lavfi "setsar" "setsar=sar=16/11" do_lavfi "thumbnail" "thumbnail=10" do_lavfi "tile" "tile=3x3:nb_frames=5:padding=7:margin=2" do_lavfi "transpose" "transpose"