avfilter/avf_showfreqs: make it possible to split channels

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol 2015-12-20 19:52:51 +01:00
parent 367ffa0c15
commit 9e569abe99
2 changed files with 28 additions and 2 deletions

View File

@ -14438,6 +14438,17 @@ Default is @code{1}, which means time averaging is disabled.
Specify list of colors separated by space or by '|' which will be used to Specify list of colors separated by space or by '|' which will be used to
draw channel frequencies. Unrecognized or missing colors will be replaced draw channel frequencies. Unrecognized or missing colors will be replaced
by white color. by white color.
@item cmode
Set channel display mode.
It accepts the following values:
@table @samp
@item combined
@item separate
@end table
Default is @code{combined}.
@end table @end table
@section showspectrum @section showspectrum

View File

@ -34,6 +34,7 @@
#include "internal.h" #include "internal.h"
enum DisplayMode { LINE, BAR, DOT, NB_MODES }; enum DisplayMode { LINE, BAR, DOT, NB_MODES };
enum ChannelMode { COMBINED, SEPARATE, NB_CMODES };
enum FrequencyScale { FS_LINEAR, FS_LOG, FS_RLOG, NB_FSCALES }; enum FrequencyScale { FS_LINEAR, FS_LOG, FS_RLOG, NB_FSCALES };
enum AmplitudeScale { AS_LINEAR, AS_SQRT, AS_CBRT, AS_LOG, NB_ASCALES }; enum AmplitudeScale { AS_LINEAR, AS_SQRT, AS_CBRT, AS_LOG, NB_ASCALES };
enum WindowFunc { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN, enum WindowFunc { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
@ -45,6 +46,7 @@ typedef struct ShowFreqsContext {
const AVClass *class; const AVClass *class;
int w, h; int w, h;
int mode; int mode;
int cmode;
int fft_bits; int fft_bits;
int ascale, fscale; int ascale, fscale;
int avg; int avg;
@ -115,6 +117,9 @@ static const AVOption showfreqs_options[] = {
{ "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=1.}, 0., 1., FLAGS }, { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=1.}, 0., 1., FLAGS },
{ "averaging", "set time averaging", OFFSET(avg), AV_OPT_TYPE_INT, {.i64=1}, 0, INT32_MAX, FLAGS }, { "averaging", "set time averaging", OFFSET(avg), AV_OPT_TYPE_INT, {.i64=1}, 0, INT32_MAX, FLAGS },
{ "colors", "set channels colors", OFFSET(colors), AV_OPT_TYPE_STRING, {.str = "red|green|blue|yellow|orange|lime|pink|magenta|brown" }, 0, 0, FLAGS }, { "colors", "set channels colors", OFFSET(colors), AV_OPT_TYPE_STRING, {.str = "red|green|blue|yellow|orange|lime|pink|magenta|brown" }, 0, 0, FLAGS },
{ "cmode", "set channel mode", OFFSET(cmode), AV_OPT_TYPE_INT, {.i64=COMBINED}, 0, NB_CMODES-1, FLAGS, "cmode" },
{ "combined", "show all channels in same window", 0, AV_OPT_TYPE_CONST, {.i64=COMBINED}, 0, 0, FLAGS, "cmode" },
{ "separate", "show each channel in own window", 0, AV_OPT_TYPE_CONST, {.i64=SEPARATE}, 0, 0, FLAGS, "cmode" },
{ NULL } { NULL }
}; };
@ -358,6 +363,7 @@ static inline void plot_freq(ShowFreqsContext *s, int ch,
const float avg = s->avg_data[ch][f]; const float avg = s->avg_data[ch][f];
const float bsize = get_bsize(s, f); const float bsize = get_bsize(s, f);
const int sx = get_sx(s, f); const int sx = get_sx(s, f);
int end = outlink->h;
int x, y, i; int x, y, i;
switch(s->ascale) { switch(s->ascale) {
@ -374,7 +380,16 @@ static inline void plot_freq(ShowFreqsContext *s, int ch,
a = 1.0 - a; a = 1.0 - a;
break; break;
} }
y = a * outlink->h - 1;
switch (s->cmode) {
case COMBINED:
y = a * outlink->h - 1;
break;
case SEPARATE:
end = (outlink->h / s->nb_channels) * (ch + 1);
y = (outlink->h / s->nb_channels) * ch + a * (outlink->h / s->nb_channels) - 1;
break;
}
if (y < 0) if (y < 0)
return; return;
@ -410,7 +425,7 @@ static inline void plot_freq(ShowFreqsContext *s, int ch,
break; break;
case BAR: case BAR:
for (x = sx; x < sx + bsize && x < w; x++) for (x = sx; x < sx + bsize && x < w; x++)
for (i = y; i < outlink->h; i++) for (i = y; i < end; i++)
draw_dot(out, x, i, fg); draw_dot(out, x, i, fg);
break; break;
case DOT: case DOT: