avfilter/avf_avectorscope: add swap and mirror options
authorPaul B Mahol <onemda@gmail.com>
Tue, 21 Nov 2017 11:07:13 +0000 (12:07 +0100)
committerPaul B Mahol <onemda@gmail.com>
Tue, 21 Nov 2017 11:27:03 +0000 (12:27 +0100)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
doc/filters.texi
libavfilter/avf_avectorscope.c

index 63ce899..62f633c 100644 (file)
@@ -17232,6 +17232,26 @@ Cubic root.
 Logarithmic.
 @end table
 
+@item swap
+Swap left channel axis with right channel axis.
+
+@item mirror
+Mirror axis.
+
+@table @samp
+@item none
+No mirror.
+
+@item x
+Mirror only x axis.
+
+@item y
+Mirror only y axis.
+
+@item xy
+Mirror both axis.
+@end table
+
 @end table
 
 @subsection Examples
index c8ff069..725ac8b 100644 (file)
@@ -65,6 +65,8 @@ typedef struct AudioVectorScopeContext {
     int contrast[4];
     int fade[4];
     double zoom;
+    int swap;
+    int mirror;
     unsigned prev_x, prev_y;
     AVRational frame_rate;
 } AudioVectorScopeContext;
@@ -99,6 +101,12 @@ static const AVOption avectorscope_options[] = {
     { "sqrt",  "square root", 0, AV_OPT_TYPE_CONST, {.i64=SQRT}, 0, 0, FLAGS, "scale" },
     { "cbrt",  "cube root",   0, AV_OPT_TYPE_CONST, {.i64=CBRT}, 0, 0, FLAGS, "scale" },
     { "log",   "logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=LOG},  0, 0, FLAGS, "scale" },
+    { "swap", "swap x axis with y axis", OFFSET(swap), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
+    { "mirror", "mirror axis", OFFSET(mirror), AV_OPT_TYPE_INT, {.i64=2}, 0, 3, FLAGS, "mirror" },
+    { "none",  "no mirror", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "mirror" },
+    { "x",  "mirror x",     0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "mirror" },
+    { "y",  "mirror y",     0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "mirror" },
+    { "xy", "mirror both",  0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "mirror" },
     { NULL }
 };
 
@@ -316,6 +324,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
             break;
         }
 
+        if (s->mirror & 1)
+            src[0] = -src[0];
+
+        if (s->mirror & 2)
+            src[1] = -src[1];
+
+        if (s->swap)
+            FFSWAP(float, src[0], src[1]);;
+
         if (s->mode == LISSAJOUS) {
             x = ((src[1] - src[0]) * zoom / 2 + 1) * hw;
             y = (1.0 - (src[0] + src[1]) * zoom / 2) * hh;