diff options
Diffstat (limited to 'libavfilter/avf_showspectrum.c')
-rw-r--r-- | libavfilter/avf_showspectrum.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c index 641c27f9bf..1600265415 100644 --- a/libavfilter/avf_showspectrum.c +++ b/libavfilter/avf_showspectrum.c @@ -37,6 +37,7 @@ typedef struct { int w, h; AVFilterBufferRef *outpicref; int req_fullfilled; + int sliding; ///< 1 if sliding mode, 0 otherwise int xpos; ///< x position (current column) RDFTContext *rdft; ///< Real Discrete Fourier Transform context int rdft_bits; ///< number of bits (RDFT window size = 1<<rdft_bits) @@ -52,6 +53,7 @@ typedef struct { static const AVOption showspectrum_options[] = { { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "640x480"}, 0, 0, FLAGS }, { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "640x480"}, 0, 0, FLAGS }, + { "slide", "set sliding mode", OFFSET(sliding), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, FLAGS }, { NULL }, }; @@ -247,16 +249,23 @@ static int plot_spectrum_column(AVFilterLink *inlink, AVFilterBufferRef *insampl for (y = 0; y < outlink->h; y++) { // FIXME: bin[0] contains first and last bins - const int pos = showspectrum->xpos * 3 + (outlink->h - y - 1) * outpicref->linesize[0]; + uint8_t *p = outpicref->data[0] + (outlink->h - y - 1) * outpicref->linesize[0]; const double w = 1. / sqrt(nb_freq); int a = sqrt(w * MAGNITUDE(RE(0), IM(0))); int b = nb_display_channels > 1 ? sqrt(w * MAGNITUDE(RE(1), IM(1))) : a; + if (showspectrum->sliding) { + memmove(p, p + 3, (outlink->w - 1) * 3); + p += (outlink->w - 1) * 3; + } else { + p += showspectrum->xpos * 3; + } + a = FFMIN(a, 255); b = FFMIN(b, 255); - outpicref->data[0][pos] = a; - outpicref->data[0][pos+1] = b; - outpicref->data[0][pos+2] = (a + b) / 2; + p[0] = a; + p[1] = b; + p[2] = (a + b) / 2; } outpicref->pts = insamples->pts + av_rescale_q(showspectrum->consumed, |