diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2013-01-22 12:11:36 +0100 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2013-01-25 17:42:04 +0100 |
commit | b7d34b328b10f2aa4f9aea4606197e934cd09675 (patch) | |
tree | be63e81ec24803de048e1c664c19827c0e8cb182 | |
parent | 13aca070ab83afbd9026b298ead38f9ea88f6a92 (diff) | |
download | ffmpeg-b7d34b328b10f2aa4f9aea4606197e934cd09675.tar.gz |
lavfi/showwaves: add display mode option and mode=line
-rw-r--r-- | doc/filters.texi | 13 | ||||
-rw-r--r-- | libavfilter/avf_showwaves.c | 31 | ||||
-rw-r--r-- | libavfilter/version.h | 2 |
3 files changed, 42 insertions, 4 deletions
diff --git a/doc/filters.texi b/doc/filters.texi index ff0dedc18a..9edec47bf5 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -5716,6 +5716,19 @@ Convert input audio to a video output, representing the samples waves. The filter accepts the following named parameters: @table @option +@item mode +Set display mode. + +Available values are: +@table @samp +@item point +Draw a point for each sample. + +@item line +Draw a vertical line for each sample. +@end table + +Default value is @code{point}. @item n Set the number of samples which are printed on the same column. A diff --git a/libavfilter/avf_showwaves.c b/libavfilter/avf_showwaves.c index 20f127e63a..998b4cbbd4 100644 --- a/libavfilter/avf_showwaves.c +++ b/libavfilter/avf_showwaves.c @@ -32,6 +32,12 @@ #include "video.h" #include "internal.h" +enum ShowWavesMode { + MODE_POINT, + MODE_LINE, + MODE_NB, +}; + typedef struct { const AVClass *class; int w, h; @@ -42,6 +48,7 @@ typedef struct { int req_fullfilled; int n; int sample_count_mod; + enum ShowWavesMode mode; } ShowWavesContext; #define OFFSET(x) offsetof(ShowWavesContext, x) @@ -53,6 +60,10 @@ static const AVOption showwaves_options[] = { { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "600x240"}, 0, 0, FLAGS }, { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "600x240"}, 0, 0, FLAGS }, { "n", "set how many samples to show in the same point", OFFSET(n), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS }, + + {"mode", "select display mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_POINT}, 0, MODE_NB-1, FLAGS, "mode"}, + {"point", "draw a point for each sample", 0, AV_OPT_TYPE_CONST, {.i64=MODE_POINT}, .flags=FLAGS, .unit="mode"}, + {"line", "draw a line for each sample", 0, AV_OPT_TYPE_CONST, {.i64=MODE_LINE}, .flags=FLAGS, .unit="mode"}, { NULL }, }; @@ -187,7 +198,7 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *insamples) int linesize = outpicref ? outpicref->linesize[0] : 0; int16_t *p = (int16_t *)insamples->data[0]; int nb_channels = av_get_channel_layout_nb_channels(insamples->audio->channel_layout); - int i, j, h; + int i, j, k, h; const int n = showwaves->n; const int x = 255 / (nb_channels * n); /* multiplication factor, pre-computed to avoid in-loop divisions */ @@ -210,9 +221,23 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *insamples) } for (j = 0; j < nb_channels; j++) { h = showwaves->h/2 - av_rescale(*p++, showwaves->h/2, MAX_INT16); - if (h >= 0 && h < outlink->h) - *(outpicref->data[0] + showwaves->buf_idx + h * linesize) += x; + switch (showwaves->mode) { + case MODE_POINT: + if (h >= 0 && h < outlink->h) + *(outpicref->data[0] + showwaves->buf_idx + h * linesize) += x; + break; + + case MODE_LINE: + { + int start = showwaves->h/2, end = av_clip(h, 0, outlink->h-1); + if (start > end) FFSWAP(int16_t, start, end); + for (k = start; k < end; k++) + *(outpicref->data[0] + showwaves->buf_idx + k * linesize) += x; + break; + } + } } + showwaves->sample_count_mod++; if (showwaves->sample_count_mod == n) { showwaves->sample_count_mod = 0; diff --git a/libavfilter/version.h b/libavfilter/version.h index cd79709e63..9194249297 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 33 -#define LIBAVFILTER_VERSION_MICRO 100 +#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ |