diff options
author | Paul B Mahol <onemda@gmail.com> | 2015-08-04 14:41:35 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2015-08-19 16:15:13 +0000 |
commit | 2fa019958b4f8d1412f0e021c0c0aa0645ec6c7a (patch) | |
tree | f17f742e8043dfde6d6f39b066ac0bcac4e8920b /libavutil | |
parent | e6b8797b827ce3c5eb0608725db7e7e85d78864b (diff) |
avfilter: add showfreqs filter
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/audio_fifo.c | 19 | ||||
-rw-r--r-- | libavutil/audio_fifo.h | 16 | ||||
-rw-r--r-- | libavutil/fifo.c | 26 | ||||
-rw-r--r-- | libavutil/fifo.h | 10 |
4 files changed, 71 insertions, 0 deletions
diff --git a/libavutil/audio_fifo.c b/libavutil/audio_fifo.c index 574907aa32..d5298cce4d 100644 --- a/libavutil/audio_fifo.c +++ b/libavutil/audio_fifo.c @@ -136,6 +136,25 @@ int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples) return nb_samples; } +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples) +{ + int i, ret, size; + + if (nb_samples < 0) + return AVERROR(EINVAL); + nb_samples = FFMIN(nb_samples, af->nb_samples); + if (!nb_samples) + return 0; + + size = nb_samples * af->sample_size; + for (i = 0; i < af->nb_buffers; i++) { + if ((ret = av_fifo_generic_peek(af->buf[i], data[i], size, NULL)) < 0) + return AVERROR_BUG; + } + + return nb_samples; +} + int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples) { int i, ret, size; diff --git a/libavutil/audio_fifo.h b/libavutil/audio_fifo.h index d21e6a1318..d93be2aeb0 100644 --- a/libavutil/audio_fifo.h +++ b/libavutil/audio_fifo.h @@ -94,6 +94,22 @@ int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); /** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** * Read data from an AVAudioFifo. * * @see enum AVSampleFormat diff --git a/libavutil/fifo.c b/libavutil/fifo.c index f2fe93de75..07fb4ec811 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -148,6 +148,32 @@ int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, return total - size; } +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, + void (*func)(void *, void *, int)) +{ +// Read memory barrier needed for SMP here in theory + uint8_t *rptr = f->rptr; + uint32_t rndx = f->rndx; + + do { + int len = FFMIN(f->end - f->rptr, buf_size); + if (func) + func(dest, f->rptr, len); + else { + memcpy(dest, f->rptr, len); + dest = (uint8_t *)dest + len; + } +// memory barrier needed for SMP here in theory + av_fifo_drain(f, len); + buf_size -= len; + } while (buf_size > 0); + + f->rptr = rptr; + f->rndx = rndx; + + return 0; +} + int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void *, void *, int)) { diff --git a/libavutil/fifo.h b/libavutil/fifo.h index f3bdcbceb4..0e4070b99e 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -85,6 +85,16 @@ int av_fifo_space(const AVFifoBuffer *f); /** * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. * @param f AVFifoBuffer to read from * @param buf_size number of bytes to read * @param func generic read function |