lavfi/aspect: switch to an AVOptions-based system.
authorClément Bœsch <ubitux@gmail.com>
Thu, 11 Apr 2013 19:59:53 +0000 (21:59 +0200)
committerClément Bœsch <ubitux@gmail.com>
Thu, 11 Apr 2013 20:05:03 +0000 (22:05 +0200)
This is heavily based on 2831b307 by Anton Khirnov <anton@khirnov.net>

doc/filters.texi
libavfilter/avfilter.c
libavfilter/vf_aspect.c
tests/lavfi-regression.sh

index c6cf678..f812d83 100644 (file)
@@ -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
 
index c088f41..ff309f4 100644 (file)
@@ -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)
index ab41bec..4e7db56 100644 (file)
@@ -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);
index 9076e4f..d3e95d7 100755 (executable)
@@ -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"