[FFmpeg-devel] [PATCH 1/3] avfilter/showwaves: add "center" mode.
Stefano Sabatini
stefasab at gmail.com
Wed Aug 20 13:02:21 CEST 2014
On date Tuesday 2014-08-19 14:47:02 +0200, Clément Bœsch encoded:
> From: Clément Bœsch <clement at stupeflix.com>
>
> ---
> doc/filters.texi | 3 +++
> libavfilter/avf_showwaves.c | 24 +++++++++++++++++++-----
> 2 files changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 0ca1d6f..828f2b4 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -10813,6 +10813,9 @@ Draw a vertical line for each sample.
>
> @item p2p
> Draw a point for each sample and a line between them.
> +
> + at item center
> +Draw a centered vertical line for each sample.
> @end table
>
> Default value is @code{point}.
> diff --git a/libavfilter/avf_showwaves.c b/libavfilter/avf_showwaves.c
> index e025663..e4911cc 100644
> --- a/libavfilter/avf_showwaves.c
> +++ b/libavfilter/avf_showwaves.c
> @@ -36,6 +36,7 @@ enum ShowWavesMode {
> MODE_POINT,
> MODE_LINE,
> MODE_P2P,
> + MODE_CENTER,
Nit: what about CENTERED_LINE, then you can use cl or cline as abbreviation.
> MODE_NB,
> };
>
> @@ -62,6 +63,7 @@ static const AVOption showwaves_options[] = {
> { "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"},
> { "p2p", "draw a line between samples", 0, AV_OPT_TYPE_CONST, {.i64=MODE_P2P}, .flags=FLAGS, .unit="mode"},
> + { "center","draw a centered line for each sample", 0, AV_OPT_TYPE_CONST, {.i64=MODE_CENTER}, .flags=FLAGS, .unit="mode"},
> { "n", "set how many samples to show in the same point", OFFSET(n), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
> { "rate", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
> { "r", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
> @@ -206,26 +208,30 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
> memset(outpicref->data[0] + j * linesize, 0, outlink->w);
> }
> for (j = 0; j < nb_channels; j++) {
> - h = showwaves->h/2 - av_rescale(*p++, showwaves->h/2, MAX_INT16);
> + int start, end;
> switch (showwaves->mode) {
> case MODE_POINT:
> + 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;
> break;
>
> case MODE_LINE:
> - {
> - int start = showwaves->h/2, end = av_clip(h, 0, outlink->h-1);
> + h = showwaves->h/2 - av_rescale(*p++, showwaves->h/2, MAX_INT16);
> + 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;
> - }
> +
> case MODE_P2P:
> + 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;
> if (showwaves->buf_idy[j] && h != showwaves->buf_idy[j]) {
> - int start = showwaves->buf_idy[j], end = av_clip(h, 0, outlink->h-1);
> + start = showwaves->buf_idy[j];
> + end = av_clip(h, 0, outlink->h-1);
> if (start > end)
> FFSWAP(int16_t, start, end);
> for (k = start + 1; k < end; k++)
> @@ -233,6 +239,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
> }
> }
> break;
> +
> + case MODE_CENTER:
> + h = av_rescale(abs(*p++), showwaves->h, UINT16_MAX);
> + start = (showwaves->h - h) / 2;
> + end = start + h;
> + for (k = start; k < end; k++)
> + *(outpicref->data[0] + showwaves->buf_idx + k * linesize) += x;
> + break;
> }
> /* store current y coordinate for this channel */
> showwaves->buf_idy[j] = h;
LGTM otherwise, thanks.
--
FFmpeg = Friendly Fierce Moronic Peaceless Extroverse Gigant
More information about the ffmpeg-devel
mailing list