From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 651F240E0A for ; Tue, 8 Feb 2022 18:26:36 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6C93F68B149; Tue, 8 Feb 2022 20:26:26 +0200 (EET) Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E713E68B056 for ; Tue, 8 Feb 2022 20:26:18 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 8018D240175 for ; Tue, 8 Feb 2022 19:26:18 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id z6nmDRyAMM3p for ; Tue, 8 Feb 2022 19:26:17 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id E7E8B240179 for ; Tue, 8 Feb 2022 19:26:17 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id DE5213A017B; Tue, 8 Feb 2022 19:26:16 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Feb 2022 19:26:14 +0100 Message-Id: <20220208182614.25504-2-anton@khirnov.net> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220208182614.25504-1-anton@khirnov.net> References: <20220208182614.25504-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] lavu/fifo: add a test for _cb functions X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Makes an auto-growing FIFO and performs a sequence of randomly-sized writes/peeks/reads. --- libavutil/tests/fifo.c | 101 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/libavutil/tests/fifo.c b/libavutil/tests/fifo.c index 579602ccf3..bfcdfeebfb 100644 --- a/libavutil/tests/fifo.c +++ b/libavutil/tests/fifo.c @@ -18,7 +18,53 @@ #include #include +#include "libavutil/common.h" #include "libavutil/fifo.h" +#include "libavutil/lfg.h" +#include "libavutil/random_seed.h" + +typedef struct CBState { + unsigned int read_idx; + unsigned int write_idx; + unsigned int to_process; + unsigned int offset; +} CBState; + +static int read_cb(void *opaque, void *buf, size_t *nb_elems) +{ + CBState *s = opaque; + unsigned *b = buf; + + *nb_elems = FFMIN(*nb_elems, s->to_process); + + for (unsigned i = 0; i < *nb_elems; i++) + if (b[i] != s->read_idx + s->offset + i) { + printf("Mismatch at idx %u offset %u i %u\n", + s->read_idx, s->offset, i); + return AVERROR_BUG; + } + + s->offset += *nb_elems; + s->to_process -= *nb_elems; + + return 0; +} + +static int write_cb(void *opaque, void *buf, size_t *nb_elems) +{ + CBState *s = opaque; + unsigned *b = buf; + + *nb_elems = FFMIN(*nb_elems, s->to_process); + + for (unsigned i = 0; i < *nb_elems; i++) + b[i] = s->write_idx + i; + + s->write_idx += *nb_elems; + s->to_process -= *nb_elems; + + return 0; +} int main(void) { @@ -89,6 +135,61 @@ int main(void) printf("%d: %d\n", i, j); } + av_fifo_freep2(&fifo); + + /* test randomly-sized write/read/peek with a callback */ + { + CBState s = { 0 }; + uint32_t seed = av_get_random_seed(); + + AVLFG lfg; + int ret; + + av_lfg_init(&lfg, seed); + + fifo = av_fifo_alloc2(1, sizeof(unsigned), AV_FIFO_FLAG_AUTO_GROW); + + for (i = 0; i < 32; i++) { + size_t nb_elems = 16; + unsigned to_process = av_lfg_get(&lfg) % nb_elems; + + s.to_process = to_process; + + ret = av_fifo_write_from_cb(fifo, write_cb, &s, &nb_elems); + if (ret < 0 || s.to_process || nb_elems != to_process) { + printf("FIFO write fail; seed %"PRIu32"\n", seed); + return 1; + } + + nb_elems = av_fifo_can_read(fifo); + if (nb_elems > 1) { + s.offset = av_lfg_get(&lfg) % (nb_elems - 1); + nb_elems -= s.offset; + + s.to_process = av_lfg_get(&lfg) % nb_elems; + to_process = s.to_process; + + ret = av_fifo_peek_to_cb(fifo, read_cb, &s, &nb_elems, s.offset); + if (ret < 0 || s.to_process || nb_elems != to_process) { + printf("FIFO peek fail; seed %"PRIu32"\n", seed); + return 1; + } + } + + nb_elems = av_fifo_can_read(fifo); + to_process = nb_elems ? av_lfg_get(&lfg) % nb_elems : 0; + s.to_process = to_process; + s.offset = 0; + + ret = av_fifo_read_to_cb(fifo, read_cb, &s, &nb_elems); + if (ret < 0 || s.to_process || to_process != nb_elems) { + printf("FIFO peek fail; seed %"PRIu32"\n", seed); + return 1; + } + s.read_idx += s.offset; + } + } + av_fifo_freep2(&fifo); free(p); -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".