summaryrefslogtreecommitdiff
path: root/libavfilter/avf_showwaves.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-07-17 14:25:13 +0200
committerPaul B Mahol <onemda@gmail.com>2020-07-17 14:26:48 +0200
commit3a37aa597fab22f321da94dccfa3ad61cc94f1f4 (patch)
tree83d33e603ad4a977b53815ee6643155e2e2362ae /libavfilter/avf_showwaves.c
parentd363afb30e9ccd4e9b7c139185ade9be65927d7b (diff)
avfilter/avf_showwavespic: add filter mode
Diffstat (limited to 'libavfilter/avf_showwaves.c')
-rw-r--r--libavfilter/avf_showwaves.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/libavfilter/avf_showwaves.c b/libavfilter/avf_showwaves.c
index afe05fb504..cf784604d9 100644
--- a/libavfilter/avf_showwaves.c
+++ b/libavfilter/avf_showwaves.c
@@ -57,6 +57,12 @@ enum ShowWavesDrawMode {
DRAW_NB,
};
+enum ShowWavesFilterMode {
+ FILTER_AVERAGE,
+ FILTER_PEAK,
+ FILTER_NB,
+};
+
struct frame_node {
AVFrame *frame;
struct frame_node *next;
@@ -77,6 +83,7 @@ typedef struct ShowWavesContext {
int scale; ///< ShowWavesScale
int draw_mode; ///< ShowWavesDrawMode
int split_channels;
+ int filter_mode;
uint8_t *fg;
int (*get_h)(int16_t sample, int height);
@@ -590,12 +597,21 @@ static int push_single_pic(AVFilterLink *outlink)
int64_t max_samples = col == outlink->w - 1 ? last_column_samples: column_max_samples;
int ch;
- for (ch = 0; ch < nb_channels; ch++)
- sum[ch] += abs(p[ch + i*nb_channels]) << 1;
+ switch (showwaves->filter_mode) {
+ case FILTER_AVERAGE:
+ for (ch = 0; ch < nb_channels; ch++)
+ sum[ch] += abs(p[ch + i*nb_channels]) << 1;
+ break;
+ case FILTER_PEAK:
+ for (ch = 0; ch < nb_channels; ch++)
+ sum[ch] = FFMAX(sum[ch], abs(p[ch + i*nb_channels]));
+ break;
+ }
+
n++;
if (n == max_samples) {
for (ch = 0; ch < nb_channels; ch++) {
- int16_t sample = sum[ch] / max_samples;
+ int16_t sample = sum[ch] / (showwaves->filter_mode == FILTER_AVERAGE ? max_samples : 1);
uint8_t *buf = out->data[0] + col * pixstep;
int h;
@@ -792,6 +808,9 @@ static const AVOption showwavespic_options[] = {
{ "draw", "set draw mode", OFFSET(draw_mode), AV_OPT_TYPE_INT, {.i64 = DRAW_SCALE}, 0, DRAW_NB-1, FLAGS, .unit="draw" },
{ "scale", "scale pixel values for each drawn sample", 0, AV_OPT_TYPE_CONST, {.i64=DRAW_SCALE}, .flags=FLAGS, .unit="draw"},
{ "full", "draw every pixel for sample directly", 0, AV_OPT_TYPE_CONST, {.i64=DRAW_FULL}, .flags=FLAGS, .unit="draw"},
+ { "filter", "set filter mode", OFFSET(filter_mode), AV_OPT_TYPE_INT, {.i64 = FILTER_AVERAGE}, 0, FILTER_NB-1, FLAGS, .unit="filter" },
+ { "average", "use average samples", 0, AV_OPT_TYPE_CONST, {.i64=FILTER_AVERAGE}, .flags=FLAGS, .unit="filter"},
+ { "peak", "use peak samples", 0, AV_OPT_TYPE_CONST, {.i64=FILTER_PEAK}, .flags=FLAGS, .unit="filter"},
{ NULL }
};