[FFmpeg-cvslog] vf_aspect: switch to an AVOptions-based system.

Anton Khirnov git at videolan.org
Wed Apr 10 15:42:38 CEST 2013


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Feb 25 21:21:29 2013 +0100| [2831b307e65f89639ab61848d5c5d39001b22702] | committer: Anton Khirnov

vf_aspect: switch to an AVOptions-based system.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2831b307e65f89639ab61848d5c5d39001b22702
---

 doc/filters.texi        |   34 +++++++++-------
 libavfilter/vf_aspect.c |   99 ++++++++++++++++++++++++++++++++---------------
 2 files changed, 87 insertions(+), 46 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 1d3457c..022c984 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1834,18 +1834,20 @@ the video frame. Also the display aspect ratio set by this filter may
 be changed by later filters in the filterchain, e.g. in case of
 scaling or if another "setdar" or a "setsar" filter is applied.
 
-The filter accepts a parameter string which represents the wanted
-display aspect ratio.
-The parameter can be a floating point number string, or an expression
-of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
-numerator and denominator of the aspect ratio.
-If the parameter is not specified, it is assumed the value "0:1".
+This filter accepts the following options:
+
+ at table @option
+
+ at item dar
+Output display aspect ratio, as a rational or a decimal number.
+
+ at end table
 
 For example to change the display aspect ratio to 16:9, specify:
 @example
-setdar=16:9
+setdar=dar=16/9
 # the above is equivalent to
-setdar=1.77777
+setdar=dar=1.77777
 @end example
 
 See also the @ref{setsar} filter documentation.
@@ -1929,16 +1931,18 @@ Keep in mind that the sample aspect ratio set by this filter may be
 changed by later filters in the filterchain, e.g. if another "setsar"
 or a "setdar" filter is applied.
 
-The filter accepts a parameter string which represents the wanted
-sample aspect ratio.
-The parameter can be a floating point number string, or an expression
-of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
-numerator and denominator of the aspect ratio.
-If the parameter is not specified, it is assumed the value "0:1".
+This filter accepts the following options:
+
+ at table @option
+
+ at item sar
+Output sample aspect ratio, as a rational or decimal number.
+
+ at end table
 
 For example to change the sample aspect ratio to 10:11, specify:
 @example
-setsar=10:11
+setsar=sar=10/11
 @end example
 
 @section settb
diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c
index 71fb4c0..3fe3714 100644
--- a/libavfilter/vf_aspect.c
+++ b/libavfilter/vf_aspect.c
@@ -23,47 +23,38 @@
  * aspect ratio modification video filters
  */
 
+#include <float.h>
+
 #include "libavutil/common.h"
 #include "libavutil/mathematics.h"
+#include "libavutil/opt.h"
+
 #include "avfilter.h"
 #include "internal.h"
 #include "video.h"
 
 typedef struct {
+    const AVClass *class;
     AVRational aspect;
+#if FF_API_OLD_FILTER_OPTS
+    float aspect_num, aspect_den;
+#endif
 } AspectContext;
 
+#if FF_API_OLD_FILTER_OPTS
 static av_cold int init(AVFilterContext *ctx, const char *args)
 {
-    AspectContext *aspect = ctx->priv;
-    double  ratio;
-    int64_t gcd;
-    char c = 0;
-
-    if (args) {
-        if (sscanf(args, "%d:%d%c", &aspect->aspect.num, &aspect->aspect.den, &c) != 2)
-            if (sscanf(args, "%lf%c", &ratio, &c) == 1)
-                aspect->aspect = av_d2q(ratio, 100);
-
-        if (c || aspect->aspect.num <= 0 || aspect->aspect.den <= 0) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Invalid string '%s' for aspect ratio.\n", args);
-            return AVERROR(EINVAL);
-        }
-
-        gcd = av_gcd(FFABS(aspect->aspect.num), FFABS(aspect->aspect.den));
-        if (gcd) {
-            aspect->aspect.num /= gcd;
-            aspect->aspect.den /= gcd;
-        }
-    }
+    AspectContext *s = ctx->priv;
 
-    if (aspect->aspect.den == 0)
-        aspect->aspect = (AVRational) {0, 1};
+    if (s->aspect_num > 0 && s->aspect_den > 0) {
+        av_log(ctx, AV_LOG_WARNING, "This syntax is deprecated, use "
+               "dar=<number> or dar=num/den.\n");
+        s->aspect = av_d2q(s->aspect_num / s->aspect_den, INT_MAX);
+    }
 
-    av_log(ctx, AV_LOG_VERBOSE, "a:%d/%d\n", aspect->aspect.num, aspect->aspect.den);
     return 0;
 }
+#endif
 
 static int filter_frame(AVFilterLink *link, AVFrame *frame)
 {
@@ -73,6 +64,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
     return ff_filter_frame(link->dst->outputs[0], frame);
 }
 
+#define OFFSET(x) offsetof(AspectContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
+
 #if CONFIG_SETDAR_FILTER
 /* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */
 static int setdar_config_props(AVFilterLink *inlink)
@@ -80,18 +74,39 @@ static int setdar_config_props(AVFilterLink *inlink)
     AspectContext *aspect = inlink->dst->priv;
     AVRational dar = aspect->aspect;
 
-    av_reduce(&aspect->aspect.num, &aspect->aspect.den,
-               aspect->aspect.num * inlink->h,
-               aspect->aspect.den * inlink->w, 100);
+    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);
+        inlink->sample_aspect_ratio = aspect->aspect;
+    } else {
+        inlink->sample_aspect_ratio = (AVRational){ 1, 1 };
+        dar = (AVRational){ inlink->w, inlink->h };
+    }
 
     av_log(inlink->dst, AV_LOG_VERBOSE, "w:%d h:%d -> dar:%d/%d sar:%d/%d\n",
-           inlink->w, inlink->h, dar.num, dar.den, aspect->aspect.num, aspect->aspect.den);
-
-    inlink->sample_aspect_ratio = aspect->aspect;
+           inlink->w, inlink->h, dar.num, dar.den,
+           inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den);
 
     return 0;
 }
 
+static const AVOption setdar_options[] = {
+#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", "display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, FLAGS },
+    { NULL },
+};
+
+static const AVClass setdar_class = {
+    .class_name = "setdar",
+    .item_name  = av_default_item_name,
+    .option     = setdar_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 static const AVFilterPad avfilter_vf_setdar_inputs[] = {
     {
         .name             = "default",
@@ -115,9 +130,12 @@ AVFilter avfilter_vf_setdar = {
     .name      = "setdar",
     .description = NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."),
 
+#if FF_API_OLD_FILTER_OPTS
     .init      = init,
+#endif
 
     .priv_size = sizeof(AspectContext),
+    .priv_class = &setdar_class,
 
     .inputs    = avfilter_vf_setdar_inputs,
 
@@ -136,6 +154,22 @@ static int setsar_config_props(AVFilterLink *inlink)
     return 0;
 }
 
+static const AVOption setsar_options[] = {
+#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", "sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 1 }, 0, INT_MAX, FLAGS },
+    { NULL },
+};
+
+static const AVClass setsar_class = {
+    .class_name = "setsar",
+    .item_name  = av_default_item_name,
+    .option     = setsar_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 static const AVFilterPad avfilter_vf_setsar_inputs[] = {
     {
         .name             = "default",
@@ -159,9 +193,12 @@ AVFilter avfilter_vf_setsar = {
     .name      = "setsar",
     .description = NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."),
 
+#if FF_API_OLD_FILTER_OPTS
     .init      = init,
+#endif
 
     .priv_size = sizeof(AspectContext),
+    .priv_class = &setsar_class,
 
     .inputs    = avfilter_vf_setsar_inputs,
 



More information about the ffmpeg-cvslog mailing list