diff --git a/doc/filters.texi b/doc/filters.texi index 63ce899784..62f633c6f8 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -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 diff --git a/libavfilter/avf_avectorscope.c b/libavfilter/avf_avectorscope.c index c8ff0698e3..725ac8bbda 100644 --- a/libavfilter/avf_avectorscope.c +++ b/libavfilter/avf_avectorscope.c @@ -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;