diff --git a/doc/filters.texi b/doc/filters.texi index 862290550debbc5981b827ad1d65844da3e56cf4..9ca24b3c8e255797625a8025e2755ee353f20749 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -17044,7 +17044,8 @@ Specify the red, green, blue and alpha fade. Default values are @code{15}, Allowed range is @code{[0, 255]}. @item zoom -Set the zoom factor. Default value is @code{1}. Allowed range is @code{[1, 10]}. +Set the zoom factor. Default value is @code{1}. Allowed range is @code{[0, 10]}. +Values lower than @var{1} will auto adjust zoom factor to maximal possible value. @item draw Set the vectorscope drawing mode. diff --git a/libavfilter/avf_avectorscope.c b/libavfilter/avf_avectorscope.c index 7cb5efb402ad8ac70e6811d91c65ef53aca9b6ab..b24011bd66c58366a3708974086ebbe5dfda3850 100644 --- a/libavfilter/avf_avectorscope.c +++ b/libavfilter/avf_avectorscope.c @@ -90,7 +90,7 @@ static const AVOption avectorscope_options[] = { { "gf", "set green fade", OFFSET(fade[1]), AV_OPT_TYPE_INT, {.i64=10}, 0, 255, FLAGS }, { "bf", "set blue fade", OFFSET(fade[2]), AV_OPT_TYPE_INT, {.i64=5}, 0, 255, FLAGS }, { "af", "set alpha fade", OFFSET(fade[3]), AV_OPT_TYPE_INT, {.i64=5}, 0, 255, FLAGS }, - { "zoom", "set zoom factor", OFFSET(zoom), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 1, 10, FLAGS }, + { "zoom", "set zoom factor", OFFSET(zoom), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 10, FLAGS }, { "draw", "set draw mode", OFFSET(draw), AV_OPT_TYPE_INT, {.i64=DOT}, 0, DRAW_NB-1, FLAGS, "draw" }, { "dot", "", 0, AV_OPT_TYPE_CONST, {.i64=DOT} , 0, 0, FLAGS, "draw" }, { "line", "", 0, AV_OPT_TYPE_CONST, {.i64=LINE}, 0, 0, FLAGS, "draw" }, @@ -234,7 +234,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) const int hh = s->hh; unsigned x, y; unsigned prev_x = s->prev_x, prev_y = s->prev_y; - const double zoom = s->zoom; + double zoom = s->zoom; int i; if (!s->outpicref || s->outpicref->width != outlink->w || @@ -254,6 +254,35 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) fade(s); + if (zoom < 1) { + float max = 0; + + switch (insamples->format) { + case AV_SAMPLE_FMT_S16: { + int16_t *samples = (int16_t *)insamples->data[0]; + + for (i = 0; i < insamples->nb_samples * 2; i++) { + float sample = samples[i] / (float)INT16_MAX; + max = FFMAX(FFABS(sample), max); + } + + } + break; + case AV_SAMPLE_FMT_FLT: { + float *samples = (float *)insamples->data[0] + i * 2; + + for (i = 0; i < insamples->nb_samples; i++) { + max = FFMAX(FFABS(samples[i]), max); + } + } + break; + default: + av_assert2(0); + } + + zoom = 1. / max; + } + for (i = 0; i < insamples->nb_samples; i++) { int16_t *samples = (int16_t *)insamples->data[0] + i * 2; float *samplesf = (float *)insamples->data[0] + i * 2;