lavfi/astreamsync: switch to an AVOptions-based system.
authorClément Bœsch <ubitux@gmail.com>
Thu, 11 Apr 2013 12:58:29 +0000 (14:58 +0200)
committerClément Bœsch <ubitux@gmail.com>
Thu, 11 Apr 2013 13:09:25 +0000 (15:09 +0200)
doc/filters.texi
libavfilter/af_astreamsync.c
libavfilter/avfilter.c

index 75dd2de..55f2062 100644 (file)
@@ -999,7 +999,11 @@ will create 5 copies of the input audio.
 
 Forward two audio streams and control the order the buffers are forwarded.
 
-The argument to the filter is an expression deciding which stream should be
+The filter accepts the following options:
+
+@table @option
+@item expr, e
+Set the expression deciding which stream should be
 forwarded next: if the result is negative, the first stream is forwarded; if
 the result is positive or zero, the second stream is forwarded. It can use
 the following variables:
@@ -1015,8 +1019,11 @@ current timestamp of each stream
 
 The default value is @code{t1-t2}, which means to always forward the stream
 that has a smaller timestamp.
+@end table
+
+@subsection Examples
 
-Example: stress-test @code{amerge} by randomly sending buffers on the wrong
+Stress-test @code{amerge} by randomly sending buffers on the wrong
 input, while avoiding too much of a desynchronization:
 @example
 amovie=file.ogg [a] ; amovie=file.mp3 [b] ;
index 76a152c..47e66bc 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include "libavutil/eval.h"
+#include "libavutil/opt.h"
 #include "avfilter.h"
 #include "audio.h"
 #include "internal.h"
@@ -45,7 +46,9 @@ enum var_name {
 };
 
 typedef struct {
+    const AVClass *class;
     AVExpr *expr;
+    char *expr_str;
     double var_values[VAR_NB];
     struct buf_queue {
         AVFrame *buf[QUEUE_SIZE];
@@ -58,18 +61,25 @@ typedef struct {
     int eof; /* bitmask, one bit for each stream */
 } AStreamSyncContext;
 
-static const char *default_expr = "t1-t2";
+#define OFFSET(x) offsetof(AStreamSyncContext, x)
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+static const AVOption astreamsync_options[] = {
+    { "expr", "set stream selection expression", OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "t1-t2" }, .flags = FLAGS },
+    { "e",    "set stream selection expression", OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "t1-t2" }, .flags = FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(astreamsync);
 
 static av_cold int init(AVFilterContext *ctx, const char *args0)
 {
     AStreamSyncContext *as = ctx->priv;
-    const char *expr = args0 ? args0 : default_expr;
     int r, i;
 
-    r = av_expr_parse(&as->expr, expr, var_names,
+    r = av_expr_parse(&as->expr, as->expr_str, var_names,
                       NULL, NULL, NULL, NULL, 0, ctx);
     if (r < 0) {
-        av_log(ctx, AV_LOG_ERROR, "Error in expression \"%s\"\n", expr);
+        av_log(ctx, AV_LOG_ERROR, "Error in expression \"%s\"\n", as->expr_str);
         return r;
     }
     for (i = 0; i < 42; i++)
@@ -226,4 +236,5 @@ AVFilter avfilter_af_astreamsync = {
     .query_formats = query_formats,
     .inputs        = astreamsync_inputs,
     .outputs       = astreamsync_outputs,
+    .priv_class    = &astreamsync_class,
 };
index 3c37dee..04cd9a7 100644 (file)
@@ -679,7 +679,6 @@ static const char *const filters_left_to_update[] = {
     "anullsrc",
     "aresample",
     "asetnsamples",
-    "astreamsync",
     "atempo",
     "bbox",
     "buffer",