summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2015-08-04 14:41:35 +0200
committerPaul B Mahol <onemda@gmail.com>2015-08-19 16:15:13 +0000
commit2fa019958b4f8d1412f0e021c0c0aa0645ec6c7a (patch)
treef17f742e8043dfde6d6f39b066ac0bcac4e8920b /libavutil
parente6b8797b827ce3c5eb0608725db7e7e85d78864b (diff)
avfilter: add showfreqs filter
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/audio_fifo.c19
-rw-r--r--libavutil/audio_fifo.h16
-rw-r--r--libavutil/fifo.c26
-rw-r--r--libavutil/fifo.h10
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