Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-11-27 01:26:04 +0300
committerPaul B Mahol <onemda@gmail.com>2020-11-27 14:52:21 +0300
commit3864896017f042ec70f7e8908af4f8ce11f21acb (patch)
tree1fa15e11d76bc92d7eede79197fd1877e17f5f00 /libavfilter/avf_showfreqs.c
parent659e6e9c88530c8319be51db93c6cb9e3dc70e75 (diff)
avfilter/avf_showfreqs: implement phase display
Diffstat (limited to 'libavfilter/avf_showfreqs.c')
-rw-r--r--libavfilter/avf_showfreqs.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/libavfilter/avf_showfreqs.c b/libavfilter/avf_showfreqs.c
index 5cc1f0b013..2ab9d4479f 100644
--- a/libavfilter/avf_showfreqs.c
+++ b/libavfilter/avf_showfreqs.c
@@ -36,6 +36,7 @@
#include "internal.h"
#include "window_func.h"
+enum DataMode { MAGNITUDE, PHASE, NB_DATA };
enum DisplayMode { LINE, BAR, DOT, NB_MODES };
enum ChannelMode { COMBINED, SEPARATE, NB_CMODES };
enum FrequencyScale { FS_LINEAR, FS_LOG, FS_RLOG, NB_FSCALES };
@@ -45,6 +46,7 @@ typedef struct ShowFreqsContext {
const AVClass *class;
int w, h;
int mode;
+ int data_mode;
int cmode;
int fft_size;
int fft_bits;
@@ -115,6 +117,9 @@ static const AVOption showfreqs_options[] = {
{ "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" },
{ "minamp", "set minimum amplitude", OFFSET(minamp), AV_OPT_TYPE_FLOAT, {.dbl=1e-6}, FLT_MIN, 1e-6, FLAGS },
+ { "data", "set data mode", OFFSET(data_mode), AV_OPT_TYPE_INT, {.i64=MAGNITUDE}, 0, NB_DATA-1, FLAGS, "data" },
+ { "magnitude", "show magnitude", 0, AV_OPT_TYPE_CONST, {.i64=MAGNITUDE}, 0, 0, FLAGS, "data" },
+ { "phase", "show phase", 0, AV_OPT_TYPE_CONST, {.i64=PHASE}, 0, 0, FLAGS, "data" },
{ NULL }
};
@@ -397,6 +402,7 @@ static int plot_freqs(AVFilterLink *inlink, AVFrame *in)
#define RE(x, ch) s->fft_data[ch][x].re
#define IM(x, ch) s->fft_data[ch][x].im
#define M(a, b) (sqrt((a) * (a) + (b) * (b)))
+#define P(a, b) (atan2((b), (a)))
colors = av_strdup(s->colors);
if (!colors) {
@@ -413,13 +419,27 @@ static int plot_freqs(AVFilterLink *inlink, AVFrame *in)
if (color)
av_parse_color(fg, color, -1, ctx);
- a = av_clipd(M(RE(0, ch), 0) / s->scale, 0, 1);
- plot_freq(s, ch, a, 0, fg, &prev_y, out, outlink);
+ switch (s->data_mode) {
+ case MAGNITUDE:
+ a = av_clipd(M(RE(0, ch), 0) / s->scale, 0, 1);
+ plot_freq(s, ch, a, 0, fg, &prev_y, out, outlink);
- for (f = 1; f < s->nb_freq; f++) {
- a = av_clipd(M(RE(f, ch), IM(f, ch)) / s->scale, 0, 1);
+ for (f = 1; f < s->nb_freq; f++) {
+ a = av_clipd(M(RE(f, ch), IM(f, ch)) / s->scale, 0, 1);
- plot_freq(s, ch, a, f, fg, &prev_y, out, outlink);
+ plot_freq(s, ch, a, f, fg, &prev_y, out, outlink);
+ }
+ break;
+ case PHASE:
+ a = av_clipd((M_PI + P(RE(0, ch), 0)) / (2. * M_PI), 0, 1);
+ plot_freq(s, ch, a, 0, fg, &prev_y, out, outlink);
+
+ for (f = 1; f < s->nb_freq; f++) {
+ a = av_clipd((M_PI + P(RE(f, ch), IM(f, ch))) / (2. * M_PI), 0, 1);
+
+ plot_freq(s, ch, a, f, fg, &prev_y, out, outlink);
+ }
+ break;
}
}