Commit 04a8bbca authored by Paul B Mahol's avatar Paul B Mahol

avfilter/avf_showspectrum: add color rotation feature

Mostly useful with channel color scheme.
parent 6803a298
...@@ -16500,6 +16500,10 @@ Default value is @code{1}. ...@@ -16500,6 +16500,10 @@ Default value is @code{1}.
@item data @item data
Set which data to display. Can be @code{magnitude}, default or @code{phase}. Set which data to display. Can be @code{magnitude}, default or @code{phase}.
@item rotation
Set color rotation, must be in [-1.0, 1.0] range.
Default value is @code{0}.
@end table @end table
The usage is very similar to the showwaves filter; see the examples in that The usage is very similar to the showwaves filter; see the examples in that
...@@ -16633,6 +16637,10 @@ Default value is @code{1}. ...@@ -16633,6 +16637,10 @@ Default value is @code{1}.
@item legend @item legend
Draw time and frequency axes and legends. Default is enabled. Draw time and frequency axes and legends. Default is enabled.
@item rotation
Set color rotation, must be in [-1.0, 1.0] range.
Default value is @code{0}.
@end table @end table
@subsection Examples @subsection Examples
......
...@@ -61,6 +61,7 @@ typedef struct { ...@@ -61,6 +61,7 @@ typedef struct {
int color_mode; ///< display color scheme int color_mode; ///< display color scheme
int scale; int scale;
float saturation; ///< color saturation multiplier float saturation; ///< color saturation multiplier
float rotation; ///< color rotation
int data; int data;
int xpos; ///< x position (current column) int xpos; ///< x position (current column)
FFTContext *fft; ///< Fast Fourier Transform context FFTContext *fft; ///< Fast Fourier Transform context
...@@ -140,6 +141,7 @@ static const AVOption showspectrum_options[] = { ...@@ -140,6 +141,7 @@ static const AVOption showspectrum_options[] = {
{ "data", "set data mode", OFFSET(data), AV_OPT_TYPE_INT, {.i64 = 0}, 0, NB_DMODES-1, FLAGS, "data" }, { "data", "set data mode", OFFSET(data), AV_OPT_TYPE_INT, {.i64 = 0}, 0, NB_DMODES-1, FLAGS, "data" },
{ "magnitude", NULL, 0, AV_OPT_TYPE_CONST, {.i64=D_MAGNITUDE}, 0, 0, FLAGS, "data" }, { "magnitude", NULL, 0, AV_OPT_TYPE_CONST, {.i64=D_MAGNITUDE}, 0, 0, FLAGS, "data" },
{ "phase", NULL, 0, AV_OPT_TYPE_CONST, {.i64=D_PHASE}, 0, 0, FLAGS, "data" }, { "phase", NULL, 0, AV_OPT_TYPE_CONST, {.i64=D_PHASE}, 0, 0, FLAGS, "data" },
{ "rotation", "color rotation", OFFSET(rotation), AV_OPT_TYPE_FLOAT, {.dbl = 0}, -1, 1, FLAGS },
{ NULL } { NULL }
}; };
...@@ -542,13 +544,17 @@ static void color_range(ShowSpectrumContext *s, int ch, ...@@ -542,13 +544,17 @@ static void color_range(ShowSpectrumContext *s, int ch,
if (s->color_mode == CHANNEL) { if (s->color_mode == CHANNEL) {
if (s->nb_display_channels > 1) { if (s->nb_display_channels > 1) {
*uf *= 0.5 * sin((2 * M_PI * ch) / s->nb_display_channels); *uf *= 0.5 * sin((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
*vf *= 0.5 * cos((2 * M_PI * ch) / s->nb_display_channels); *vf *= 0.5 * cos((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
} else { } else {
*uf = 0.0f; *uf *= 0.5 * sin(M_PI * s->rotation);
*vf = 0.0f; *vf *= 0.5 * cos(M_PI * s->rotation + M_PI_2);
} }
} else {
*uf += *uf * sin(M_PI * s->rotation);
*vf += *vf * cos(M_PI * s->rotation + M_PI_2);
} }
*uf *= s->saturation; *uf *= s->saturation;
*vf *= s->saturation; *vf *= s->saturation;
} }
...@@ -913,6 +919,7 @@ static const AVOption showspectrumpic_options[] = { ...@@ -913,6 +919,7 @@ static const AVOption showspectrumpic_options[] = {
{ "horizontal", NULL, 0, AV_OPT_TYPE_CONST, {.i64=HORIZONTAL}, 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 }, { "gain", "set scale gain", OFFSET(gain), AV_OPT_TYPE_FLOAT, {.dbl = 1}, 0, 128, FLAGS },
{ "legend", "draw legend", OFFSET(legend), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS }, { "legend", "draw legend", OFFSET(legend), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
{ "rotation", "color rotation", OFFSET(rotation), AV_OPT_TYPE_FLOAT, {.dbl = 0}, -1, 1, FLAGS },
{ NULL } { NULL }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment