avfilter/avf_showspectrum: add option to set gain for calculating color intensity
authorPaul B Mahol <onemda@gmail.com>
Mon, 4 Jan 2016 11:50:36 +0000 (12:50 +0100)
committerPaul B Mahol <onemda@gmail.com>
Mon, 4 Jan 2016 13:06:51 +0000 (14:06 +0100)
Inspired by Sonic Visualizer.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
doc/filters.texi
libavfilter/avf_showspectrum.c

index 35a0e71..cff6db7 100644 (file)
@@ -14688,6 +14688,10 @@ Set orientation of time vs frequency axis. Can be @code{vertical} or
 Set ratio of overlap window. Default value is @code{0}.
 When value is @code{1} overlap is set to recommended size for specific
 window function currently used.
+
+@item gain
+Set scale gain for calculating intensity color values.
+Default value is @code{1}.
 @end table
 
 The usage is very similar to the showwaves filter; see the examples in that
@@ -14809,6 +14813,10 @@ Default value is @code{hann}.
 @item orientation
 Set orientation of time vs frequency axis. Can be @code{vertical} or
 @code{horizontal}. Default is @code{vertical}.
+
+@item gain
+Set scale gain for calculating intensity color values.
+Default value is @code{1}.
 @end table
 
 @subsection Examples
index 48d811e..accd8c7 100644 (file)
@@ -68,6 +68,7 @@ typedef struct {
     int win_size;
     double win_scale;
     float overlap;
+    float gain;
     int skip_samples;
     float *combine_buffer;      ///< color combining buffer (3 * h items)
     AVAudioFifo *fifo;
@@ -125,6 +126,7 @@ static const AVOption showspectrum_options[] = {
         { "vertical",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=VERTICAL},   0, 0, FLAGS, "orientation" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, {.i64=HORIZONTAL}, 0, 0, FLAGS, "orientation" },
     { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl = 0}, 0, 1, FLAGS },
+    { "gain", "set scale gain", OFFSET(gain), AV_OPT_TYPE_FLOAT, {.dbl = 1}, 0, 128, FLAGS },
     { NULL }
 };
 
@@ -497,6 +499,7 @@ static int plot_spectrum_column(AVFilterLink *inlink, AVFrame *insamples)
     ShowSpectrumContext *s = ctx->priv;
     AVFrame *outpicref = s->outpicref;
     const double w = s->win_scale;
+    const float g = s->gain;
     int h = s->orientation == VERTICAL ? s->channel_height : s->channel_width;
 
     int ch, plane, x, y;
@@ -562,7 +565,7 @@ static int plot_spectrum_column(AVFilterLink *inlink, AVFrame *insamples)
             float *out = &s->combine_buffer[3 * row];
 
             /* get magnitude */
-            float a = w * magnitudes[y];
+            float a = g * w * magnitudes[y];
 
             /* apply scale */
             switch (s->scale) {
@@ -814,6 +817,7 @@ static const AVOption showspectrumpic_options[] = {
     { "orientation", "set orientation", OFFSET(orientation), AV_OPT_TYPE_INT, {.i64=VERTICAL}, 0, NB_ORIENTATIONS-1, FLAGS, "orientation" },
         { "vertical",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=VERTICAL},   0, 0, FLAGS, "orientation" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, {.i64=HORIZONTAL}, 0, 0, FLAGS, "orientation" },
+    { "gain", "set scale gain", OFFSET(gain), AV_OPT_TYPE_FLOAT, {.dbl = 1}, 0, 128, FLAGS },
     { NULL }
 };