[FFmpeg-devel] [PATCH] avutil/fifo: Use av_fifo_generic_peek_at() for av_fifo_generic_peek()

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Thu Jan 13 18:39:08 EET 2022


Avoids code duplication. It furthermore properly checks
for buf_size to be > 0 before doing anything.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
It also avoids having to update yet another function when
the FIFO implementation is updated.
I pondered changing av_fifo_generic_read() to

int ret = av_fifo_generic_peek();
if (ret < 0)
    return ret;
av_fifo_drain(f, buf_size);
return 0;

but decided against it because the current implementation already
drains the FIFO after each call to the read function, so that
the user may already see the FIFO internals updated on the second
call to the read function.
Of course, one could use a common backend for all three functions.

 libavutil/fifo.c | 21 +--------------------
 1 file changed, 1 insertion(+), 20 deletions(-)

diff --git a/libavutil/fifo.c b/libavutil/fifo.c
index d741bdd395..e1f2175530 100644
--- a/libavutil/fifo.c
+++ b/libavutil/fifo.c
@@ -194,26 +194,7 @@ int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_siz
 int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size,
                          void (*func)(void *, void *, int))
 {
-    uint8_t *rptr = f->rptr;
-
-    if (buf_size > av_fifo_size(f))
-        return AVERROR(EINVAL);
-
-    do {
-        int len = FFMIN(f->end - rptr, buf_size);
-        if (func)
-            func(dest, rptr, len);
-        else {
-            memcpy(dest, rptr, len);
-            dest = (uint8_t *)dest + len;
-        }
-        rptr += len;
-        if (rptr >= f->end)
-            rptr -= f->end - f->buffer;
-        buf_size -= len;
-    } while (buf_size > 0);
-
-    return 0;
+    return av_fifo_generic_peek_at(f, dest, 0, buf_size, func);
 }
 
 int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size,
-- 
2.32.0



More information about the ffmpeg-devel mailing list