summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2017-09-05 11:43:49 +0200
committerPaul B Mahol <onemda@gmail.com>2017-09-05 11:43:49 +0200
commit2c10f054c2bcd4500ef7f2c88257c5df8933ef3c (patch)
tree5a01bffaeb5b312becebd3d251521f1d722c958b /libavfilter
parent6faa1275a2e163471e0cd16526713955d3500aa2 (diff)
avfilter/avf_avectorscope: add possibility to auto zoom
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/avf_avectorscope.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/libavfilter/avf_avectorscope.c b/libavfilter/avf_avectorscope.c
index 7cb5efb402..b24011bd66 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;