From patchwork Tue Jan 11 20:45:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33236 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4047728iog; Tue, 11 Jan 2022 12:47:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJwySZ0AFlNZqZho43avbeJZ7SdcpKAVerx2OqjI2QJiIS7sJfGrsecmJO/T9UMybPbDGy2T X-Received: by 2002:a17:906:a1d1:: with SMTP id bx17mr5082809ejb.602.1641934069417; Tue, 11 Jan 2022 12:47:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934069; cv=none; d=google.com; s=arc-20160816; b=Q754AnofnWjw7k02de2MLLpIyXWgBV3NbQdsi2KhmYnXmgTQEQbYXXwp6VvK07Gp5G yXvermbCEE9mSxQCJ2m6VJYWqdSqGVkeR/igNBkw4pP8G+4PdUBKMoqjaUebn7aqVPxf Tb2VcvS3KkeYIZnVBcd59CzqDKBc1b1Xd/f4T8ceelxHj3vxszorHam6p09aPWsjHBmt GhvwdPknGvtGNFODhge16Udk22OFdcTk6pitU9OxR604qy9Ht5zlY5hyzZwGIQwKZdRa kM9HSX+NJDKwsrVTyrEFPMdydPs1pxmmr114SinBt8NwWKhDDgi1dBTuhNzY9JBnuhXE P0FQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :delivered-to; bh=kzL7R9hjWq1zXNLLH7UIKSlH0YOm4qpo/XHsIFXcolY=; b=lol1RJxdpuSjJpJTlt1inCmMHtmLBCHVnVNOt8oJ71/BxlQNe4rZB4bp+kAfEN7Uhi lw6IXQW9I63zXOm7+SBffrvhCPr3bJ/g7dMxJusuAMhd+wxdB4B/QkPqGRHI/rv/+OF/ rogcOr/I1Oo9fkKxOJ8M1qBGwjhQO8Mt19X3S40V+lE8dM67Zxs+TqqBpZsrVYkQYrTP /wOdtrjWPNC8QIL1I3erlmA3QythB1uIGf7BaFcPX9oaX5zHARsPNycfdVluaQX2Es1U L7Db+N/cjdrqg2P8L8Qe0IcL4sSfbh0qZjd1w4Cw0kmkrNjIo4zZBUsB58P2qKoAtUCF YkEA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l10si5428589edc.327.2022.01.11.12.47.48; Tue, 11 Jan 2022 12:47:49 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3F83368AEB1; Tue, 11 Jan 2022 22:47:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (unknown [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BCA0268A6E0 for ; Tue, 11 Jan 2022 22:47:26 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9D5CA24056A for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 1SPfFdU9-pmD for ; Tue, 11 Jan 2022 21:47:25 +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 181EA240179 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id E15683A0631; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:36 +0100 Message-Id: <20220111204610.14262-1-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/35] lavu/fifo: disallow overly large fifo sizes 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EPN67fHlgi6F The API currently allows creating FIFOs up to - UINT_MAX: av_fifo_alloc(), av_fifo_realloc(), av_fifo_grow() - SIZE_MAX: av_fifo_alloc_array() However the usable limit is determined by - rndx/wndx being uint32_t - av_fifo_[size,space] returning int so no FIFO should be larger than the smallest of - INT_MAX - UINT32_MAX - SIZE_MAX (which should be INT_MAX an all commonly used platforms). Return an error on trying to allocate FIFOs larger than this limit. --- libavutil/fifo.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libavutil/fifo.c b/libavutil/fifo.c index d741bdd395..f2f046b1f3 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -20,14 +20,23 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "avassert.h" #include "common.h" #include "fifo.h" +#define FIFO_SIZE_MAX FFMIN3((uint64_t)INT_MAX, (uint64_t)UINT32_MAX, (uint64_t)SIZE_MAX) + AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) { AVFifoBuffer *f; - void *buffer = av_realloc_array(NULL, nmemb, size); + void *buffer; + + if (nmemb > FIFO_SIZE_MAX / size) + return NULL; + + buffer = av_realloc_array(NULL, nmemb, size); if (!buffer) return NULL; f = av_mallocz(sizeof(AVFifoBuffer)); @@ -82,6 +91,9 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { unsigned int old_size = f->end - f->buffer; + if (new_size > FIFO_SIZE_MAX) + return AVERROR(EINVAL); + if (old_size < new_size) { size_t offset_r = f->rptr - f->buffer; size_t offset_w = f->wptr - f->buffer; From patchwork Tue Jan 11 20:45:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33255 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049588iog; Tue, 11 Jan 2022 12:50:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJyfGTWxgh27InKJiOUPQYTyBzP+l5VLZNGflKNpdiEAIVmH+tq87JqHp+JTNzpm64lIvAu3 X-Received: by 2002:a17:907:961d:: with SMTP id gb29mr4926617ejc.123.1641934258303; Tue, 11 Jan 2022 12:50:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934258; cv=none; d=google.com; s=arc-20160816; b=SUOJ6bhkYUEhEwpliePm9+BpnYIAiUSRWt34XVyzHKmotNK0cScESQ5DEhFJ7DTUUo hQqIwnBvO0dzl2g6SEWIhDGaNrBYDSLDSzbXjS+CgPFhySrHCnzl22kxho4duhT5kKdM YbNyWCqX5zsA7mVkIgDKe79hzoedN9HS254VZfBr9bN6T1gQm5FK+k33d6aiP0RfZSWV X+4T/WL0RE2EaXTx0CQq4CKvae0DZlQ8wW35nxQgKxzzQ9l7I134u+ATF2Nb6vOQHerS 34LE8p+p1p2coSxHlaPcWCYlL8Qu4OGOs7CWEX0NVQXrrfCtM302+1agFeslOAMS4RR7 XI4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=FkCkV5Tr4wetqW/BRi4177Ql7OIJcLFMn8nST3v05cw=; b=qEBf0vXjeIu33fiV9NgReAa4hZuk19lHBNUqAUw/iQ1Cp8wqtyMa+A64Joded8t68B YmHZXfnsphO+84k93ZMiCr8hIk9/X+FEoJDevMlFf89pTwOvMsFK/xnwHVMX0QZ6qD5w jjk0ka4cX7C7Mp1ba4nVueVmjwdBknarlVjnGq4vpE6sLkHzXaJyLShHVHVRYPjf+DPq JBMbogZMVnKukL7M8llICRZ8ML0YaJ6sGI/M1yT6nFcST1gekxxyT/vdQ+nzwAi7VaH5 TRo27WeZQ+yUTicrdxRhwXEkI5QvcSSFgZGlOhgN9tzvXhe7/zZvFDwr25sxWS1V24T7 rd9w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ji2si2595711ejc.546.2022.01.11.12.50.58; Tue, 11 Jan 2022 12:50:58 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A05DA68AEDD; Tue, 11 Jan 2022 22:47:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 99D0968AE0F for ; Tue, 11 Jan 2022 22:47:37 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 261A724017C for ; Tue, 11 Jan 2022 21:47:37 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id z0furuBg5U2E for ; Tue, 11 Jan 2022 21:47:36 +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 4F9D524068F for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id E33853A00D9; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:37 +0100 Message-Id: <20220111204610.14262-2-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/35] lavu/fifo: make the contents of AVFifoBuffer private on next major bump 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A1jGhahPTEdH There should be no good reason for the callers to access any of its contents. Define a new type for the internal struct that currently matches AVFifoBuffer. This will allow adding new private fields without waiting for the major bump and will be useful in the following commits. Unfortunately AVFifoBuffer fields cannot be marked as deprecated because it would trigger a warning wherever fifo.h is #included, due to inlined av_fifo_peek2(). --- doc/APIchanges | 4 ++++ libavutil/fifo.c | 23 +++++++++++++++++++---- libavutil/fifo.h | 14 ++++++++++++-- libavutil/tests/fifo.c | 2 +- libavutil/version.h | 1 + 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 8df0364e4c..21fa02ae9d 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,10 @@ libavutil: 2021-04-27 API changes, most recent first: +2022-01-xx - xxxxxxxxxx - lavu fifo.h + Access to all AVFifoBuffer members is deprecated. The struct will + become an incomplete type in a future major libavutil version. + 2022-01-04 - 78dc21b123e - lavu 57.16.100 - frame.h Add AV_FRAME_DATA_DOVI_METADATA. diff --git a/libavutil/fifo.c b/libavutil/fifo.c index f2f046b1f3..aaade01333 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -28,9 +28,24 @@ #define FIFO_SIZE_MAX FFMIN3((uint64_t)INT_MAX, (uint64_t)UINT32_MAX, (uint64_t)SIZE_MAX) +#if FF_API_FIFO_PUBLIC +# define CTX_STRUCT_NAME FifoBuffer +#else +# define CTX_STRUCT_NAME AVFifoBuffer +#endif + +typedef struct CTX_STRUCT_NAME { + // These fields must match then contents of AVFifoBuffer in fifo.h + // until FF_API_FIFO_PUBLIC is removed + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; + ///////////////////////////////////////// +} FifoBuffer; + AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) { - AVFifoBuffer *f; + FifoBuffer *f; void *buffer; if (nmemb > FIFO_SIZE_MAX / size) @@ -39,15 +54,15 @@ AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) buffer = av_realloc_array(NULL, nmemb, size); if (!buffer) return NULL; - f = av_mallocz(sizeof(AVFifoBuffer)); + f = av_mallocz(sizeof(*f)); if (!f) { av_free(buffer); return NULL; } f->buffer = buffer; f->end = f->buffer + nmemb * size; - av_fifo_reset(f); - return f; + av_fifo_reset((AVFifoBuffer*)f); + return (AVFifoBuffer*)f; } AVFifoBuffer *av_fifo_alloc(unsigned int size) diff --git a/libavutil/fifo.h b/libavutil/fifo.h index f4fd291e59..ca4e7fe060 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -28,11 +28,21 @@ #include "avutil.h" #include "attributes.h" -typedef struct AVFifoBuffer { +#if FF_API_FIFO_PUBLIC +/** + * The contents of the struct are private and should not be accessed by the + * callers in any way. + */ +#endif +typedef struct AVFifoBuffer +#if FF_API_FIFO_PUBLIC +{ uint8_t *buffer; uint8_t *rptr, *wptr, *end; uint32_t rndx, wndx; -} AVFifoBuffer; +} +#endif +AVFifoBuffer; /** * Initialize an AVFifoBuffer. diff --git a/libavutil/tests/fifo.c b/libavutil/tests/fifo.c index a17d913233..e5aa88d252 100644 --- a/libavutil/tests/fifo.c +++ b/libavutil/tests/fifo.c @@ -18,7 +18,7 @@ #include #include -#include "libavutil/fifo.h" +#include "libavutil/fifo.c" int main(void) { diff --git a/libavutil/version.h b/libavutil/version.h index 953aac9d94..7c031f547e 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -110,6 +110,7 @@ #define FF_API_COLORSPACE_NAME (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58) +#define FF_API_FIFO_PUBLIC (LIBAVUTIL_VERSION_MAJOR < 58) /** * @} From patchwork Tue Jan 11 20:45:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33237 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4047795iog; Tue, 11 Jan 2022 12:48:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJzGmIBcfrB/y8T/0JvojlhKolxw+cKXz8TMVpOnU63BzG/8T0zZ1Oru8DbjoBelfoPk68EI X-Received: by 2002:a17:906:5d08:: with SMTP id g8mr4926402ejt.710.1641934080387; Tue, 11 Jan 2022 12:48:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934080; cv=none; d=google.com; s=arc-20160816; b=v0fDQ+oTAj0c/wHkqdpoGInrrcxtkzJzMweomBl8FcpJ/ZQICRNzhn4dOeTQ3OKAne m01m0y/LX+EIMeWG5VtjqhzhteL5rsxI9CmoyAEYfBPTR4QQFaHgsOg19bJe7fUQHMue 8Dsq0Jain1/9Vs+C7Xi7CNk1N32KWwuUKlja6uadthrCUDKV6bNYDUelzOg0005cbqG1 h71yPUe3Sl+rbQiwelTd/DMVmiXzbMXfS5WBzkyWdzhY5RQ2aNrC0/kK4+0XWG7EV7OH q4u0Ktn57Wi7Hvh562IB+/JAlUTgIPLyzgflYo5yO23kI7pbbi4SCtDn8G3geJoJ4tbK kNPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=BlWZtGbPe7zAyO0Lu45C/4rlZ8/UugBIhmJqDWxoW00=; b=c3LnGsrIw0c0VJescL897CVSKPw+Fp+i8Q4Q2eUXHa9NlOyWqiKZjJLZ+oYTo1vqgO 6c0UjmCiVjHkAwwT+0CNmGW6uAGSTF/k57vZQ3arvMYeVP2WHTvKhqCdeCr0ebHUGhda 5AcFZUtSqKneYi2OQZ3wLRMr25t/Yn/RlwArFg8aOG1x2vmadER1be/294ZusHDGOL2O fM1zSYCCq9xiZSfiekf+n06DYI0fEIUrk4KWMoobLJVGSMHIYkk6XwoLRGTgYIwWqFij QAaK+RhXFFjjZraAH5AXH6ZosZ0rnNaNyBGtWtG43ndkGQ3WTZnG27wAenuOuaiiCbSK MC5w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id jg4si6205479ejc.735.2022.01.11.12.48.00; Tue, 11 Jan 2022 12:48:00 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4C96168AEE4; Tue, 11 Jan 2022 22:47:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (unknown [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 620E568A6E0 for ; Tue, 11 Jan 2022 22:47:27 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id D897B24069A for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id jndoLNKe1Ftc for ; Tue, 11 Jan 2022 21:47:25 +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 1E74A24017C for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id E82333A067C; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:38 +0100 Message-Id: <20220111204610.14262-3-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/35] lavu/fifo: introduce the notion of element size 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +SSnNDxSjmZG Many AVFifoBuffer users operate on fixed-size elements (e.g. pointers), but the current FIFO API deals exclusively in bytes, requiring extra complexity in all these callers. Add a new AVFifoBuffer constructor creating a FIFO with an element size that may be larger than a byte. All operations on such a FIFO then operate on complete elements. --- doc/APIchanges | 6 ++ libavutil/fifo.c | 194 ++++++++++++++++++++++++++++++-------------- libavutil/fifo.h | 53 +++++++++--- libavutil/version.h | 2 +- 4 files changed, 179 insertions(+), 76 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 21fa02ae9d..5646cf2278 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,12 @@ libavutil: 2021-04-27 API changes, most recent first: +2022-01-xx - xxxxxxxxxx - lavu 57.19.100 - fifo.h + Add av_fifo_alloc2(), which allows setting a FIFO element size. + Operations on FIFOs created with this function on these elements + rather than bytes. + Add av_fifo_elem_size(). + 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will become an incomplete type in a future major libavutil version. diff --git a/libavutil/fifo.c b/libavutil/fifo.c index aaade01333..fc7c93470f 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -38,20 +38,28 @@ typedef struct CTX_STRUCT_NAME { // These fields must match then contents of AVFifoBuffer in fifo.h // until FF_API_FIFO_PUBLIC is removed uint8_t *buffer; +#if FF_API_FIFO_PUBLIC uint8_t *rptr, *wptr, *end; uint32_t rndx, wndx; +#endif ///////////////////////////////////////// + + size_t elem_size, nb_elems; + size_t offset_r, offset_w; + // distinguishes the ambigous situation offset_r == offset_w + int is_empty; } FifoBuffer; -AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) +AVFifoBuffer *av_fifo_alloc2(size_t nb_elems, size_t elem_size, + unsigned int flags) { FifoBuffer *f; void *buffer; - if (nmemb > FIFO_SIZE_MAX / size) + if (nb_elems > FIFO_SIZE_MAX / elem_size) return NULL; - buffer = av_realloc_array(NULL, nmemb, size); + buffer = av_realloc_array(NULL, nb_elems, elem_size); if (!buffer) return NULL; f = av_mallocz(sizeof(*f)); @@ -60,11 +68,24 @@ AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) return NULL; } f->buffer = buffer; - f->end = f->buffer + nmemb * size; +#if FF_API_FIFO_PUBLIC + f->end = f->buffer + nb_elems * elem_size; +#endif + + f->nb_elems = nb_elems; + f->elem_size = elem_size; + av_fifo_reset((AVFifoBuffer*)f); return (AVFifoBuffer*)f; } +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) +{ + if (nmemb > SIZE_MAX / size) + return NULL; + return av_fifo_alloc2(nmemb * size, 1, 0); +} + AVFifoBuffer *av_fifo_alloc(unsigned int size) { return av_fifo_alloc_array(size, 1); @@ -88,67 +109,85 @@ void av_fifo_freep(AVFifoBuffer **f) void av_fifo_reset(AVFifoBuffer *f) { + FifoBuffer *fb = (FifoBuffer*)f; + + fb->offset_r = 0; + fb->offset_w = 0; + fb->is_empty = 1; +#if FF_API_FIFO_PUBLIC f->wptr = f->rptr = f->buffer; f->wndx = f->rndx = 0; +#endif +} + +size_t av_fifo_elem_size(const AVFifoBuffer *f) +{ + const FifoBuffer *fb = (const FifoBuffer*)f; + return fb->elem_size; } int av_fifo_size(const AVFifoBuffer *f) { - return (uint32_t)(f->wndx - f->rndx); + const FifoBuffer *fb = (const FifoBuffer*)f; + if (fb->offset_w <= fb->offset_r && !fb->is_empty) + return fb->nb_elems - fb->offset_r + fb->offset_w; + return fb->offset_w - fb->offset_r; } int av_fifo_space(const AVFifoBuffer *f) { - return f->end - f->buffer - av_fifo_size(f); + const FifoBuffer *fb = (const FifoBuffer*)f; + return fb->nb_elems - av_fifo_size(f); } int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { - unsigned int old_size = f->end - f->buffer; + FifoBuffer *fb = (FifoBuffer*)f; if (new_size > FIFO_SIZE_MAX) return AVERROR(EINVAL); - if (old_size < new_size) { - size_t offset_r = f->rptr - f->buffer; - size_t offset_w = f->wptr - f->buffer; + if (fb->nb_elems < new_size) { uint8_t *tmp; - tmp = av_realloc(f->buffer, new_size); + tmp = av_realloc_array(f->buffer, new_size, fb->elem_size); if (!tmp) return AVERROR(ENOMEM); // move the data from the beginning of the ring buffer // to the newly allocated space - // the second condition distinguishes full vs empty fifo - if (offset_w <= offset_r && av_fifo_size(f)) { - const size_t copy = FFMIN(new_size - old_size, offset_w); - memcpy(tmp + old_size, tmp, copy); - if (copy < offset_w) { - memmove(tmp, tmp + copy , offset_w - copy); - offset_w -= copy; + if (fb->offset_w <= fb->offset_r && !fb->is_empty) { + const size_t copy = FFMIN(new_size - fb->nb_elems, fb->offset_w); + memcpy(tmp + fb->nb_elems * fb->elem_size, tmp, copy * fb->elem_size); + if (copy < fb->offset_w) { + memmove(tmp, tmp + copy * fb->elem_size, + (fb->offset_w - copy) * fb->elem_size); + fb->offset_w -= copy; } else - offset_w = old_size + copy; + fb->offset_w = fb->nb_elems + copy; } f->buffer = tmp; +#if FF_API_FIFO_PUBLIC f->end = f->buffer + new_size; - f->rptr = f->buffer + offset_r; - f->wptr = f->buffer + offset_w; + f->rptr = f->buffer + fb->offset_r * fb->elem_size; + f->wptr = f->buffer + fb->offset_w * fb->elem_size; +#endif + fb->nb_elems = new_size; } return 0; } int av_fifo_grow(AVFifoBuffer *f, unsigned int size) { - unsigned int old_size = f->end - f->buffer; - if(size + (unsigned)av_fifo_size(f) < size) + FifoBuffer *fb = (FifoBuffer*)f; + + if (size > UINT_MAX - av_fifo_size(f)) return AVERROR(EINVAL); size += av_fifo_size(f); - - if (old_size < size) - return av_fifo_realloc2(f, FFMAX(size, 2*old_size)); + if (fb->nb_elems < size) + return av_fifo_realloc2(f, FFMAX(size, 2 * fb->nb_elems)); return 0; } @@ -157,62 +196,78 @@ int av_fifo_grow(AVFifoBuffer *f, unsigned int size) int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void *, void *, int)) { + FifoBuffer *fb = (FifoBuffer*)f; int total = size; + size_t offset_w = fb->offset_w; +#if FF_API_FIFO_PUBLIC uint32_t wndx= f->wndx; - uint8_t *wptr= f->wptr; +#endif if (size > av_fifo_space(f)) return AVERROR(ENOSPC); do { - int len = FFMIN(f->end - wptr, size); + size_t len = FFMIN(fb->nb_elems - offset_w, size); + uint8_t *wptr = f->buffer + offset_w * fb->elem_size; + if (func) { - len = func(src, wptr, len); - if (len <= 0) + int ret = func(src, wptr, len); + if (ret <= 0) break; + len = ret; } else { - memcpy(wptr, src, len); - src = (uint8_t *)src + len; + memcpy(wptr, src, len * fb->elem_size); + src = (uint8_t *)src + len * fb->elem_size; } - wptr += len; - if (wptr >= f->end) - wptr = f->buffer; + offset_w += len; + if (offset_w >= fb->nb_elems) + offset_w = 0; +#if FF_API_FIFO_PUBLIC wndx += len; +#endif size -= len; } while (size > 0); +#if FF_API_FIFO_PUBLIC f->wndx= wndx; - f->wptr= wptr; + f->wptr= f->buffer + offset_w * fb->elem_size; +#endif + fb->offset_w = offset_w; + + if (total - size > 0) + fb->is_empty = 0; + return total - size; } int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)) { - uint8_t *rptr = f->rptr; + FifoBuffer *fb = (FifoBuffer*)f; + size_t offset_r = fb->offset_r; if (offset < 0 || buf_size > av_fifo_size(f) - offset) return AVERROR(EINVAL); - if (offset >= f->end - rptr) - rptr += offset - (f->end - f->buffer); + if (offset >= fb->nb_elems - offset_r) + offset_r -= fb->nb_elems - offset; else - rptr += offset; + offset_r += offset; while (buf_size > 0) { + uint8_t *rptr = f->buffer + offset_r * fb->elem_size; int len; - if (rptr >= f->end) - rptr -= f->end - f->buffer; - - len = FFMIN(f->end - rptr, buf_size); + len = FFMIN(fb->nb_elems - offset_r, buf_size); if (func) func(dest, rptr, len); else { - memcpy(dest, rptr, len); - dest = (uint8_t *)dest + len; + memcpy(dest, rptr, len * fb->elem_size); + dest = (uint8_t *)dest + len * fb->elem_size; } buf_size -= len; - rptr += len; + offset_r += len; + if (offset_r >= fb->nb_elems) + offset_r -= fb->nb_elems; } return 0; @@ -221,22 +276,24 @@ 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; + FifoBuffer *fb = (FifoBuffer*)f; + size_t offset_r = fb->offset_r; if (buf_size > av_fifo_size(f)) return AVERROR(EINVAL); do { - int len = FFMIN(f->end - rptr, buf_size); + uint8_t *rptr = f->buffer + offset_r * fb->elem_size; + int len = FFMIN(fb->nb_elems - offset_r, buf_size); if (func) func(dest, rptr, len); else { - memcpy(dest, rptr, len); - dest = (uint8_t *)dest + len; + memcpy(dest, rptr, len * fb->elem_size); + dest = (uint8_t *)dest + len * fb->elem_size; } - rptr += len; - if (rptr >= f->end) - rptr -= f->end - f->buffer; + offset_r += len; + if (offset_r >= fb->nb_elems) + offset_r -= fb->nb_elems; buf_size -= len; } while (buf_size > 0); @@ -246,16 +303,19 @@ int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void *, void *, int)) { + FifoBuffer *fb = (FifoBuffer*)f; + if (buf_size > av_fifo_size(f)) return AVERROR(EINVAL); do { - int len = FFMIN(f->end - f->rptr, buf_size); + uint8_t *rptr = f->buffer + fb->offset_r * fb->elem_size; + int len = FFMIN(fb->nb_elems - fb->offset_r, buf_size); if (func) - func(dest, f->rptr, len); + func(dest, rptr, len); else { - memcpy(dest, f->rptr, len); - dest = (uint8_t *)dest + len; + memcpy(dest, rptr, len * fb->elem_size); + dest = (uint8_t *)dest + len * fb->elem_size; } av_fifo_drain(f, len); buf_size -= len; @@ -266,9 +326,19 @@ int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, /** Discard data from the FIFO. */ void av_fifo_drain(AVFifoBuffer *f, int size) { - av_assert2(av_fifo_size(f) >= size); - f->rptr += size; - if (f->rptr >= f->end) - f->rptr -= f->end - f->buffer; + FifoBuffer *fb = (FifoBuffer*)f; + const size_t cur_size = av_fifo_size(f); + + av_assert2(cur_size >= size); + if (cur_size == size) + fb->is_empty = 1; + + if (fb->offset_r >= fb->nb_elems - size) + fb->offset_r -= fb->nb_elems - size; + else + fb->offset_r += size; +#if FF_API_FIFO_PUBLIC + f->rptr = f->buffer + fb->offset_r * fb->elem_size; f->rndx += size; +#endif } diff --git a/libavutil/fifo.h b/libavutil/fifo.h index ca4e7fe060..22362c0239 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -48,6 +48,9 @@ AVFifoBuffer; * Initialize an AVFifoBuffer. * @param size of FIFO * @return AVFifoBuffer or NULL in case of memory allocation failure + * + * @note the element size of the allocated FIFO will be 1, i.e. all operations + * will be in bytes */ AVFifoBuffer *av_fifo_alloc(unsigned int size); @@ -56,9 +59,26 @@ AVFifoBuffer *av_fifo_alloc(unsigned int size); * @param nmemb number of elements * @param size size of the single element * @return AVFifoBuffer or NULL in case of memory allocation failure + * + * @note the element size of the allocated FIFO will be 1, i.e. all operations + * will be in bytes */ AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); +/** + * Allocate and initialize an AVFifoBuffer with a given element size. + * + * @param f pointer to the newly-allocated FIFO will be written here on success + * @param nb_elems initial number of elements that can be stored in the FIFO + * @param elem_size Size in bytes of a single element. Further operations on + * the returned FIFO will implicitly use this element size. + * @param flags currently unused, must be 0 + * + * @return newly-allocated AVFifoBuffer on success, a negative error code on failure + */ +AVFifoBuffer *av_fifo_alloc2(size_t elems, size_t elem_size, + unsigned int flags); + /** * Free an AVFifoBuffer. * @param f AVFifoBuffer to free @@ -71,6 +91,12 @@ void av_fifo_free(AVFifoBuffer *f); */ void av_fifo_freep(AVFifoBuffer **f); +/** + * @return Element size for FIFO operations. This element size is set at + * FIFO allocation and remains constant during its lifetime + */ +size_t av_fifo_elem_size(const AVFifoBuffer *f); + /** * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. * @param f AVFifoBuffer to reset @@ -78,16 +104,16 @@ void av_fifo_freep(AVFifoBuffer **f); void av_fifo_reset(AVFifoBuffer *f); /** - * Return the amount of data in bytes in the AVFifoBuffer, that is the - * amount of data you can read from it. + * Return the amount of data in the AVFifoBuffer, that is the amount of data + * (in elements, as returned by av_fifo_elem_size()) you can read from it. * @param f AVFifoBuffer to read from * @return size */ int av_fifo_size(const AVFifoBuffer *f); /** - * Return the amount of space in bytes in the AVFifoBuffer, that is the - * amount of data you can write into it. + * Return the amount of space in the AVFifoBuffer, that is the amount of data + * (in elements, as returned by av_fifo_elem_size()) you can write into it. * @param f AVFifoBuffer to write into * @return size */ @@ -97,8 +123,8 @@ int av_fifo_space(const AVFifoBuffer *f); * Feed data at specific position 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 offset offset from current read position - * @param buf_size number of bytes to read + * @param offset offset in elements from current read position + * @param buf_size number of elements to read * @param func generic read function * @param dest data destination * @@ -110,7 +136,7 @@ int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_siz * 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 buf_size number of elements to read * @param func generic read function * @param dest data destination * @@ -121,7 +147,7 @@ int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func) /** * 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 buf_size number of elements to read * @param func generic read function * @param dest data destination * @@ -134,13 +160,13 @@ int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func) * @param f AVFifoBuffer to write to * @param src data source; non-const since it may be used as a * modifiable context by the function defined in func - * @param size number of bytes to write + * @param size number of elements to write * @param func generic write function; the first parameter is src, * the second is dest_buf, the third is dest_buf_size. * func must return the number of bytes written to dest_buf, or <= 0 to * indicate no more data available to write. * If func is NULL, src is interpreted as a simple byte array for source data. - * @return the number of bytes written to the FIFO or a negative error code on failure + * @return the number of elements written to the FIFO or a negative error code on failure */ int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); @@ -149,7 +175,7 @@ int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void * In case of reallocation failure, the old FIFO is kept unchanged. * * @param f AVFifoBuffer to resize - * @param size new AVFifoBuffer size in bytes + * @param size new AVFifoBuffer size in elements * @return <0 for failure, >=0 otherwise */ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); @@ -160,7 +186,8 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); * The new fifo size may be larger than the requested size. * * @param f AVFifoBuffer to resize - * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @param additional_space the amount of space in elements to allocate in + * addition to av_fifo_size() * @return <0 for failure, >=0 otherwise */ int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); @@ -168,7 +195,7 @@ int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); /** * Read and discard the specified amount of data from an AVFifoBuffer. * @param f AVFifoBuffer to read from - * @param size amount of data to read in bytes + * @param size amount of data to read in elements */ void av_fifo_drain(AVFifoBuffer *f, int size); diff --git a/libavutil/version.h b/libavutil/version.h index 7c031f547e..180ebd5223 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 18 +#define LIBAVUTIL_VERSION_MINOR 19 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Tue Jan 11 20:45:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33235 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4047665iog; Tue, 11 Jan 2022 12:47:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJy30kYl3H7RykHnTwf1aY8DJk01rdAkehHF7MSpaQLRTOVFsUjcBDWOeOYfGaOvzrk37Rr0 X-Received: by 2002:a05:6402:42d4:: with SMTP id i20mr6070647edc.52.1641934058165; Tue, 11 Jan 2022 12:47:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934058; cv=none; d=google.com; s=arc-20160816; b=fLJjJwaaFH7Q0JtayTU2oQW72kvLBnTOKuz13cbCIvJERKURrzN/5Itfts0oyuzgDu CLXspq5EWOs9iLpJCcpYa/XRUkqfeVp7Jjw6QiwXkDZRJgxadUJ6BD1cEDMgNtCwEXoM oSjROK5CHf4CjSYFWQBwFt8xGEIud9oELkOvlqDvCK1JmRF+eNsZgGcpdD7tSJnXZ5I1 BseirhxZFbkt5NtZvvu/0uq1rS/QOluAFcIWYJR1lvQ7R7sF1hCGrjjW4JmarVRxO0o7 NRnF1Q46EfWOFWJugHkfSMyw8JXDcc4CAGyseSk+VWYFVmqJ59JZwTLiAc/SS8sCUnZH zquw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=4/jla7SYRH7FijlDa/cM1iMB1E63m28enyOlgr+iaIU=; b=uhdVVngoJMZVxiMiIuDFQ88I0rINhrKZ0N+Afd1DoJbgGqRGh3Iy/HNs5WAt4fncM7 1aLnbXFtK2UZoHSzcdj9I7zYIUIlRCVlDnMrbXoY8hl/8zmpWDJ3CMNxl2d1SB+J3XM+ VnicBbFx0hg1Ysq9AvGL7TUvN3S03WmfTluY5udsc/oJ1jbZSnxPG5ySb+ucCgsxBn60 +sYMGlWihwRsIYcyEWGQArmFhDGA1yAX/WeJXRDgbmEbLZ0peG5jsNtwuVJIVon0ky3Y 3M4OymjfaNM7zXYMcCAUkOdfNbr7pjnugyYxqyPpkNiyH6+AoGCvU0LRKKCC8KgYtG8X Z8wQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y5si4379954edc.129.2022.01.11.12.47.37; Tue, 11 Jan 2022 12:47:38 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1225D68AB96; Tue, 11 Jan 2022 22:47:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (unknown [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D1BFC68AB96 for ; Tue, 11 Jan 2022 22:47:26 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 54E7C240699 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id Fq5Q0K7f0ojm for ; Tue, 11 Jan 2022 21:47:25 +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 222E224017E for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id EC5463A0743; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:39 +0100 Message-Id: <20220111204610.14262-4-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/35] lavu/fifo: add new functions for determinining reading/writing size 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VZ8FUDTrQA7o Consistently use size_t for sizes. The new names should also be more clear - e.g. current av_fifo_size() could be misinterpreted as meaning the allocated size. --- doc/APIchanges | 2 +- libavutil/fifo.c | 16 +++++++++++++--- libavutil/fifo.h | 10 ++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 5646cf2278..9400c5147a 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -18,7 +18,7 @@ API changes, most recent first: Add av_fifo_alloc2(), which allows setting a FIFO element size. Operations on FIFOs created with this function on these elements rather than bytes. - Add av_fifo_elem_size(). + Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index fc7c93470f..8cde2c20e1 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -126,7 +126,7 @@ size_t av_fifo_elem_size(const AVFifoBuffer *f) return fb->elem_size; } -int av_fifo_size(const AVFifoBuffer *f) +size_t av_fifo_can_read(const AVFifoBuffer *f) { const FifoBuffer *fb = (const FifoBuffer*)f; if (fb->offset_w <= fb->offset_r && !fb->is_empty) @@ -134,10 +134,20 @@ int av_fifo_size(const AVFifoBuffer *f) return fb->offset_w - fb->offset_r; } -int av_fifo_space(const AVFifoBuffer *f) +size_t av_fifo_can_write(const AVFifoBuffer *f) { const FifoBuffer *fb = (const FifoBuffer*)f; - return fb->nb_elems - av_fifo_size(f); + return fb->nb_elems - av_fifo_can_read(f); +} + +int av_fifo_size(const AVFifoBuffer *f) +{ + return av_fifo_can_read(f); +} + +int av_fifo_space(const AVFifoBuffer *f) +{ + return av_fifo_can_write(f); } int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) diff --git a/libavutil/fifo.h b/libavutil/fifo.h index 22362c0239..9e78082b3b 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -119,6 +119,16 @@ int av_fifo_size(const AVFifoBuffer *f); */ int av_fifo_space(const AVFifoBuffer *f); +/** + * @return number of elements available for reading from the given FIFO. + */ +size_t av_fifo_can_read(const AVFifoBuffer *f); + +/** + * @return number of elements that can be written into the given FIFO. + */ +size_t av_fifo_can_write(const AVFifoBuffer *f); + /** * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. * Similar as av_fifo_gereric_read but without discarding data. From patchwork Tue Jan 11 20:45:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33238 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4047890iog; Tue, 11 Jan 2022 12:48:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJxDNu65/bEBnfxcupIeB9zjsMEo8rEaiKSlVP2cyMucpS5Urtc3Z+TWfNcQtoCx1aMdSZk1 X-Received: by 2002:a17:907:1b29:: with SMTP id mp41mr5359575ejc.591.1641934092323; Tue, 11 Jan 2022 12:48:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934092; cv=none; d=google.com; s=arc-20160816; b=i1DfM+1gABWPab6Z3JxHL+XRKVmSKM/BlryoXh3EohrOKnroiWsc5hgTbQxkxeYQp5 0cGzeYdNDdDIVLwv1F42/OWGi8wjziKHKavomeB1MmYuXzAdL2/zxNsKZ8sjYSx27zpf myy5NioZRowbZ6UIxM217KRjY0xGttsy2uqin398f5FSwTBsw5UWQnEY8lp7R5w9a1rx kQEkhsAqXOD1rFSxWxLcnjzUQAegUBrp15KQNt4SAvVN/MyjF1rWuM6VXTopeDSUsb6m Nqi3cmxTqYqu4I2FYvCz7vBySy+yX5FnIY4JXTuCJjz/Mme6sXrAOJsUKFkpleVICrhJ nCvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=oq4qra+1a/3aI9rryqNhluZDwCbHndLYgIS9v8oeMmc=; b=s+sTYEH9vFJPDc215OFmHgkv1Eqh5zmaY2IVrytvoS/53aBWNw8WFN4gxwQMAARXg4 N/1MdEdPyU+QsXmpuwsi0EykNhjbdfciwxMfdBHlsxw6sqGguXU0uEdPZVMXssl80ViU iv8m5qmUVKSD9UdYlMyt0IlBIdCKJS6Iub/34ZIU0JWyLemZSpimfw2qg7oOYq/5YE/6 8U78LekpvEsn6/DlftYNxmLN/xoCW0nqTxS07vNUZK19HpxPDS5+nk5qawFOKWW/KGrR YAIoTnddSySLU5wJKb1xZbWiFgxx/LhBqM9YF3b8BQH9BB1olXjNzA+8tkr0WGUVPyGL OXPw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ak17si938656ejc.651.2022.01.11.12.48.11; Tue, 11 Jan 2022 12:48:12 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5E33F68AF0D; Tue, 11 Jan 2022 22:47:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (unknown [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 89EF168A6E0 for ; Tue, 11 Jan 2022 22:47:27 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 12FDF24017C for ; Tue, 11 Jan 2022 21:47:27 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id ZFqcHSWO9KHy for ; Tue, 11 Jan 2022 21:47:26 +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 27CDC2404FE for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id F0DE73A0746; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:40 +0100 Message-Id: <20220111204610.14262-5-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/35] lavu/fifo: add a new FIFO grow function 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MrRjre8Tago/ Consistently use size_t for sizes. Unlike av_fifo_grow(), which addds to the currently used size, this function adds to the allocated size. No new function is provided for a generic realloc, since the current code only supports increasing the FIFO size. --- doc/APIchanges | 3 ++- libavutil/fifo.c | 61 +++++++++++++++++++++++++++--------------------- libavutil/fifo.h | 14 +++++++++++ 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 9400c5147a..98eae55719 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -18,7 +18,8 @@ API changes, most recent first: Add av_fifo_alloc2(), which allows setting a FIFO element size. Operations on FIFOs created with this function on these elements rather than bytes. - Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(). + Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(), + av_fifo_grow2(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index 8cde2c20e1..28d6d1b2e6 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -150,41 +150,48 @@ int av_fifo_space(const AVFifoBuffer *f) return av_fifo_can_write(f); } -int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) +int av_fifo_grow2(AVFifoBuffer *f, size_t inc) { FifoBuffer *fb = (FifoBuffer*)f; + uint8_t *tmp; - if (new_size > FIFO_SIZE_MAX) + if (inc > FIFO_SIZE_MAX - fb->nb_elems) return AVERROR(EINVAL); - if (fb->nb_elems < new_size) { - uint8_t *tmp; - - tmp = av_realloc_array(f->buffer, new_size, fb->elem_size); - if (!tmp) - return AVERROR(ENOMEM); - - // move the data from the beginning of the ring buffer - // to the newly allocated space - if (fb->offset_w <= fb->offset_r && !fb->is_empty) { - const size_t copy = FFMIN(new_size - fb->nb_elems, fb->offset_w); - memcpy(tmp + fb->nb_elems * fb->elem_size, tmp, copy * fb->elem_size); - if (copy < fb->offset_w) { - memmove(tmp, tmp + copy * fb->elem_size, - (fb->offset_w - copy) * fb->elem_size); - fb->offset_w -= copy; - } else - fb->offset_w = fb->nb_elems + copy; - } + tmp = av_realloc_array(f->buffer, fb->nb_elems + inc, fb->elem_size); + if (!tmp) + return AVERROR(ENOMEM); + + // move the data from the beginning of the ring buffer + // to the newly allocated space + if (fb->offset_w <= fb->offset_r && !fb->is_empty) { + const size_t copy = FFMIN(inc, fb->offset_w); + memcpy(tmp + fb->nb_elems * fb->elem_size, tmp, copy * fb->elem_size); + if (copy < fb->offset_w) { + memmove(tmp, tmp + copy * fb->elem_size, + (fb->offset_w - copy) * fb->elem_size); + fb->offset_w -= copy; + } else + fb->offset_w = fb->nb_elems + copy; + } + + f->buffer = tmp; + fb->nb_elems += inc; - f->buffer = tmp; #if FF_API_FIFO_PUBLIC - f->end = f->buffer + new_size; - f->rptr = f->buffer + fb->offset_r * fb->elem_size; - f->wptr = f->buffer + fb->offset_w * fb->elem_size; + f->end = f->buffer + fb->nb_elems * fb->elem_size; + f->rptr = f->buffer + fb->offset_r * fb->elem_size; + f->wptr = f->buffer + fb->offset_w * fb->elem_size; #endif - fb->nb_elems = new_size; - } + + return 0; +} + +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) +{ + FifoBuffer *fb = (FifoBuffer*)f; + if (fb->nb_elems < new_size) + return av_fifo_grow2(f, new_size - fb->nb_elems); return 0; } diff --git a/libavutil/fifo.h b/libavutil/fifo.h index 9e78082b3b..375d0d133b 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -129,6 +129,20 @@ size_t av_fifo_can_read(const AVFifoBuffer *f); */ size_t av_fifo_can_write(const AVFifoBuffer *f); +/** + * Enlarge an AVFifoBuffer. + * + * On success, the FIFO will be large enough to hold exactly + * inc + av_fifo_can_read() + av_fifo_can_write() + * elements. In case of failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param inc number of elements to allocate for, in addition to the current + * allocated size + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_grow2(AVFifoBuffer *f, size_t inc); + /** * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. * Similar as av_fifo_gereric_read but without discarding data. From patchwork Tue Jan 11 20:45:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33253 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049302iog; Tue, 11 Jan 2022 12:50:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJwFgmYP6GgN9F0k6X2timQp9KyOMz/9Ym5im1oAp/PQcyySLGfxvScRjyZ9RW/EZtNlYXnM X-Received: by 2002:a17:907:1c17:: with SMTP id nc23mr5100586ejc.664.1641934236954; Tue, 11 Jan 2022 12:50:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934236; cv=none; d=google.com; s=arc-20160816; b=tCkmdkCG8eq1IM0VdhhLWJU5rswP14qwX1hrLQn66LVUnd6y8OVYl3ieewBw++JpWR KLhnerxYPdHpNk2R5cOPxWY5xM838LEOkn03LJvWehitnhQojHZECvNYQhQO26gyXLiw XPI10dYFCZ2FOjugLysSQP9JjldnchA/J2EjlP0UUg1jpFzcGrxlfG3rE0gvyrIlm95j xZzLXilOBwAWyeBAJyhGA2xu1mGbSn/EAjAygcfcWunmkB6MonZ5FbBTAI8gHTZsQ6+D m35m/rAFHutMYHx0zpQOMOwE/bZdC0RhYwIEr00wmmrtjYdvfoA7HFUT55X0GhsrQiFE /ETQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=ZCHfqdqQfO4rX08XQLO1Ru9lBjYYpVWmT+/mQ4il6kU=; b=Ahrl4DN90pjpqnNlWJpjgBz3SPKEXJCP1svqw/YPKF9rt2WP/EYwUFofmxC0McQlMk KhRo/lGgIDEgPg6KKUBuks0ck1BBwvYWE5F4Dux2QqCkadKPg93bePz6hJVTTL+Onv8v uFTGU60H7rfVxBhqkLQphWuif/W2Ul7yrGrhnyHqElZSYrVGWxeeEHOYVJld2TC63n3j Q4McLcrkTltpTK+bQAxgEc19R0t8leItysSpq2ljmuA2fnSWoWE3Z+U6u4jfmZu9w6bY jjC3SMmEy56rvNmmprcdJ4PIn35hMLuDxs6KxRfPGTexZvYFEjoG4kHgJKZ+5WVgPHST fqtg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id c11si593795ejm.276.2022.01.11.12.50.36; Tue, 11 Jan 2022 12:50:36 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A458068AFBD; Tue, 11 Jan 2022 22:47:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4367268AF2A for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 1F2C424052D for ; Tue, 11 Jan 2022 21:47:29 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id rQyanW1xgvDt for ; Tue, 11 Jan 2022 21:47:27 +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 76111240506 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 00B6B3A0769; Tue, 11 Jan 2022 21:47:24 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:41 +0100 Message-Id: <20220111204610.14262-6-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/35] lavu/fifo: add a new function for draining the FIFO 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P0wUTtGwsyXp Consistently use size_t for sizes --- doc/APIchanges | 2 +- libavutil/fifo.c | 36 +++++++++++++++++++++--------------- libavutil/fifo.h | 7 +++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 98eae55719..f2769d4165 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -19,7 +19,7 @@ API changes, most recent first: Operations on FIFOs created with this function on these elements rather than bytes. Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(), - av_fifo_grow2(). + av_fifo_grow2(), av_fifo_drain2(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index 28d6d1b2e6..e9f439e219 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -187,6 +187,26 @@ int av_fifo_grow2(AVFifoBuffer *f, size_t inc) return 0; } +void av_fifo_drain2(AVFifoBuffer *f, size_t size) +{ + FifoBuffer *fb = (FifoBuffer*)f; + const size_t cur_size = av_fifo_can_read(f); + + av_assert0(cur_size >= size); + if (cur_size == size) + fb->is_empty = 1; + + if (fb->offset_r >= fb->nb_elems - size) + fb->offset_r -= fb->nb_elems - size; + else + fb->offset_r += size; + +#if FF_API_FIFO_PUBLIC + f->rptr = f->buffer + fb->offset_r * fb->elem_size; + f->rndx += size; +#endif +} + int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { FifoBuffer *fb = (FifoBuffer*)f; @@ -343,19 +363,5 @@ int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, /** Discard data from the FIFO. */ void av_fifo_drain(AVFifoBuffer *f, int size) { - FifoBuffer *fb = (FifoBuffer*)f; - const size_t cur_size = av_fifo_size(f); - - av_assert2(cur_size >= size); - if (cur_size == size) - fb->is_empty = 1; - - if (fb->offset_r >= fb->nb_elems - size) - fb->offset_r -= fb->nb_elems - size; - else - fb->offset_r += size; -#if FF_API_FIFO_PUBLIC - f->rptr = f->buffer + fb->offset_r * fb->elem_size; - f->rndx += size; -#endif + return av_fifo_drain2(f, size); } diff --git a/libavutil/fifo.h b/libavutil/fifo.h index 375d0d133b..d593304edb 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -143,6 +143,13 @@ size_t av_fifo_can_write(const AVFifoBuffer *f); */ int av_fifo_grow2(AVFifoBuffer *f, size_t inc); +/** + * Discard the specified amount of data from an AVFifoBuffer. + * @param size number of elements to discard, MUST NOT be larger than + * av_fifo_can_read(f) + */ +void av_fifo_drain2(AVFifoBuffer *f, size_t size); + /** * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. * Similar as av_fifo_gereric_read but without discarding data. From patchwork Tue Jan 11 20:45:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33239 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4047977iog; Tue, 11 Jan 2022 12:48:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzsJjwadjbIuT4hc0sIhnX4U3LwT292ihXgeGOMwyS2iFOkFXHvQHLXr/sWX1RVC3YmPPH9 X-Received: by 2002:a05:6402:848:: with SMTP id b8mr5848937edz.79.1641934103634; Tue, 11 Jan 2022 12:48:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934103; cv=none; d=google.com; s=arc-20160816; b=WoCSnoAgs6WZ2ZjDQbzYUKfdh1JPi2fGfjGTaKANmmk+kHujS3zE2RQj+z7nZPvxEY sU3ZmqFlWG2TWRdnEPZuYgoTytyMl3AqPDr95pbvpMcUtQqFnMR25rEX/i34iH1FJVVN Pa2RVLUWECJWhxPqxz6U2eOkoYJ2G8oVVaUD0nQgH/QhEq0QQmPo4RHviFrDrZURUIw/ /Uu8RjpsN1tS1M65gwNSMfO/n1Up5W7Glny2VJ+VnXLuOmoICXpRhUCUYpbhTyxr81Km 0nyK00Ayx6YuSO+Vq258g9JsokowEyqe1uvQPidFHj4uD2w1QMcp0JL0hb4Jicu64B9i +cBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=6KX009CxFhqeN3UlhNVFz03Gwjbj2AchWz8EiRujrm8=; b=dR7nsafALohKL9dlr81Bq9CzSivYfYHrpHrYCQVXZLpqev4fgLjP5nFQEDdEhk2YZ5 p6V+EGQEngDXMrxGun+lFdzvrrdIJpByjf0C7iLjO1Llj/vqQ9o5E3ZX6Otw+9uKsUhb Mc+MoEL/J+0DBkmYfm68F1w3eoj6KjK4wy3bFuU70tObnK/8iJ6JcjDg+ULA6B7pTSJz nbNJoqzwlQ/S5OSHm+IP3xdE/2o0yeNOc8jttBRdXeGPNuygIZGvmQljsyMISAQO5pRI bJSfohAW9eytac3qmm1h8d5gz4MVYbDua640QkpVjMHSaDqOkE1jCBAi/URQCUxpbCck fqrQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f7si5190803ejh.572.2022.01.11.12.48.22; Tue, 11 Jan 2022 12:48:23 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 538A268AF3B; Tue, 11 Jan 2022 22:47:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 493A968ACF5 for ; Tue, 11 Jan 2022 22:47:28 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 8CDEB2404FE for ; Tue, 11 Jan 2022 21:47:27 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 1RX3xXVlJYYO for ; Tue, 11 Jan 2022 21:47:26 +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 77C30240507 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 055703A078F; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:42 +0100 Message-Id: <20220111204610.14262-7-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/35] lavu/fifo: add new FIFO writing 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: mCwmudcmUKqd Use separate functions for writing from a buffer and a callback, since the overwhelming majority of callers use a buffer and should not be forced to pass extra NULL parameters or use a longer name. Consistently use size_t for sizes. --- doc/APIchanges | 2 +- libavutil/fifo.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ libavutil/fifo.h | 46 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index f2769d4165..0b179c30e5 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -19,7 +19,7 @@ API changes, most recent first: Operations on FIFOs created with this function on these elements rather than bytes. Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(), - av_fifo_grow2(), av_fifo_drain2(). + av_fifo_grow2(), av_fifo_drain2(), av_fifo_write(), av_fifo_write_from_cb(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index e9f439e219..1d94fff457 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -207,6 +207,64 @@ void av_fifo_drain2(AVFifoBuffer *f, size_t size) #endif } +static int fifo_write_common(AVFifoBuffer *f, const uint8_t *buf, size_t *nb_elems, + AVFifoCB read_cb, void *opaque) +{ + FifoBuffer *fb = (FifoBuffer*)f; + size_t to_write = *nb_elems; + size_t offset_w = fb->offset_w; + int ret = 0; +#if FF_API_FIFO_PUBLIC + uint32_t wndx= f->wndx; +#endif + + if (to_write > av_fifo_can_write(f)) + return AVERROR(ENOSPC); + + do { + size_t len = FFMIN(fb->nb_elems - offset_w, to_write); + uint8_t *wptr = f->buffer + offset_w * fb->elem_size; + + if (read_cb) { + ret = read_cb(opaque, wptr, &len); + if (ret < 0 || len == 0) + break; + } else { + memcpy(wptr, buf, len * fb->elem_size); + buf += len * fb->elem_size; + } + offset_w += len; + if (offset_w >= fb->nb_elems) + offset_w = 0; +#if FF_API_FIFO_PUBLIC + wndx += len; +#endif + to_write -= len; + } while (to_write > 0); +#if FF_API_FIFO_PUBLIC + f->wndx= wndx; + f->wptr= f->buffer + offset_w * fb->elem_size; +#endif + fb->offset_w = offset_w; + + if (*nb_elems - to_write > 0) + fb->is_empty = 0; + *nb_elems -= to_write; + + return ret; +} + +int av_fifo_write(AVFifoBuffer *f, const void *buf, size_t nb_elems) +{ + return fifo_write_common(f, buf, &nb_elems, NULL, NULL); +} + +int av_fifo_write_from_cb(AVFifoBuffer *f, AVFifoCB read_cb, + void *opaque, size_t *nb_elems) +{ + return fifo_write_common(f, NULL, nb_elems, read_cb, opaque); +} + int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { FifoBuffer *fb = (FifoBuffer*)f; diff --git a/libavutil/fifo.h b/libavutil/fifo.h index d593304edb..ac1245ff39 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -44,6 +44,24 @@ typedef struct AVFifoBuffer #endif AVFifoBuffer; +/** + * Callback for writing or reading from a FIFO, passed to (and invoked from) the + * av_fifo_*_cb() functions. It may be invoked multiple times from a single + * av_fifo_*_cb() call and may process less data than the maximum size indicated + * by nb_elems. + * + * @param opaque the opaque pointer provided to the av_fifo_*_cb() function + * @param buf the buffer for reading or writing the data, depending on which + * av_fifo_*_cb function is called + * @param nb_elems On entry contains the maximum number of elements that can be + * read from / written into buf. On success, the callback should + * update it to contain the number of elements actually written. + * + * @return 0 on success, a negative error code on failure (will be returned from + * the invoking av_fifo_*_cb() function) + */ +typedef int AVFifoCB(void *opaque, void *buf, size_t *nb_elems); + /** * Initialize an AVFifoBuffer. * @param size of FIFO @@ -143,6 +161,34 @@ size_t av_fifo_can_write(const AVFifoBuffer *f); */ int av_fifo_grow2(AVFifoBuffer *f, size_t inc); +/** + * Write data into a FIFO. + * + * @param f the FIFO buffer + * @param buf Data to be written. nb_elems * av_fifo_elem_size(f) bytes will be + * read from buf. + * @param nb_elems number of elements to write into FIFO + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_write(AVFifoBuffer *f, const void *buf, size_t nb_elems); + +/** + * Write data from a user-provided callback into a FIFO. + * + * @param f the FIFO buffer + * @param read_cb Callback supplying the data to the FIFO. May be called + * multiple times. + * @param opaque opaque user data to be provided to read_cb + * @param nb_elems Should point to the maximum number of elements that can be + * written. Will be updated to contain the number of elements + * actually written. + * + * @return non-negative number on success, a negative error code on failure + */ +int av_fifo_write_from_cb(AVFifoBuffer *f, AVFifoCB read_cb, + void *opaque, size_t *nb_elems); + /** * Discard the specified amount of data from an AVFifoBuffer. * @param size number of elements to discard, MUST NOT be larger than From patchwork Tue Jan 11 20:45:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33250 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049027iog; Tue, 11 Jan 2022 12:50:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJykPAzxEPGdwQigFh59G+epWJuxistbZarSR+ZB2Y/J4gzz458VzLAOzY412EvK6DMg0unE X-Received: by 2002:a05:6402:2885:: with SMTP id eg5mr5871647edb.383.1641934208184; Tue, 11 Jan 2022 12:50:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934208; cv=none; d=google.com; s=arc-20160816; b=lRsnZ1Y0ETwEp0I4SeoHzBl62YI5fgd8Ib1rxRVTWk1UD/ZK+QS7IKSyKPco0jjD4C 7o38pY5CIJqa38vZi4kdZL2tikJ4z5DEZ2MuwiCjBHGe6ol9HkhjrFhHswhVZPs3pf7r yyxhXaTPcRo2rcHpCrPmU9XTKp/cshUJ9Fi1x1++1oprNDAc1LvRHmfqr26sL7yR96Aq 5x4hhg1985hUFU8xSRqKCYdNqHt9np9UtGuSwdq9WNOqjXcpXQG6DFWoeeYuC45jheJM lboQijHdDr8R8QqpHjdizOvC2GzauSzUrSq9obY8PQHWvfgELgVxYnQiqMO3vLxW/p+9 6MLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=xkDbD7aaz1YJN/YolC0Ck6JW2htDDPyaX7Ue4qw9aRA=; b=KJOHsrPIkpQT+LapIxLdZoAIFiSbXPOlMSptH2LXxcpI1VFWPI0sGaJHMT9AbAu/jR Tun+4QB6kEzN3R/2zWGk/EM6RPYC935kZ7obIPjPnZB8kY4jnH/wjbv6MyCXGUPlOvB2 fzhQs3nNJ9249BH7duzTu8fxNdkpY2U/8VcRnYSQUQA22GUJL7gIpv1Xy3naHmk4uSTd Ox1VEjxQq/WLRa8thvBxsTXGZTnlW1iSgif7ALlTAc0gpYjC2WKDIggHIMqoeHudI2CY JFhG7srHh0dIFc3AWb5J+2UWcVfwPPfQC6wXI0q3DdcRd4krgABsxJwPR8SBdTFZb6xY s3IA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ji22si2703157ejc.125.2022.01.11.12.50.07; Tue, 11 Jan 2022 12:50:08 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E756C68AF42; Tue, 11 Jan 2022 22:47:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3A3FA68AF0D for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 558BD240511 for ; Tue, 11 Jan 2022 21:47:28 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id UnfO-GVVIlj5 for ; Tue, 11 Jan 2022 21:47:27 +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 7BD0824050B for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 0A00A3A0804; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:43 +0100 Message-Id: <20220111204610.14262-8-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/35] lavu/fifo: add new FIFO read/peek 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6C58S/+XzMQe As for writing, use separate functions for reading to a buffer and a callback. Allow the callbacks to limit the amount of data read, similarly to what is done for writing. Consistently use size_t for sizes. --- doc/APIchanges | 3 ++- libavutil/fifo.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ libavutil/fifo.h | 60 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 0b179c30e5..f64759d69d 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -19,7 +19,8 @@ API changes, most recent first: Operations on FIFOs created with this function on these elements rather than bytes. Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(), - av_fifo_grow2(), av_fifo_drain2(), av_fifo_write(), av_fifo_write_from_cb(). + av_fifo_grow2(), av_fifo_drain2(), av_fifo_write(), av_fifo_write_from_cb(), + av_fifo_read(), av_fifo_read_to_cb(), av_fifo_peek(), av_fifo_peek_to_cb(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index 1d94fff457..ea944bc936 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -265,6 +265,74 @@ int av_fifo_write_from_cb(AVFifoBuffer *f, AVFifoCB read_cb, return fifo_write_common(f, NULL, nb_elems, read_cb, opaque); } +static int fifo_peek_common(const AVFifoBuffer *f, uint8_t *buf, size_t *nb_elems, + size_t offset, AVFifoCB write_cb, void *opaque) +{ + const FifoBuffer *fb = (FifoBuffer*)f; + size_t to_read = *nb_elems; + size_t offset_r = fb->offset_r; + int ret = 0; + + if (offset > av_fifo_can_read(f) || + to_read > av_fifo_can_read(f) - offset) { + *nb_elems = 0; + return AVERROR(EINVAL); + } + + if (offset_r >= fb->nb_elems - offset) + offset_r -= fb->nb_elems - offset; + else + offset_r += offset; + + do { + size_t len = FFMIN(fb->nb_elems - offset_r, to_read); + uint8_t *rptr = f->buffer + offset_r * fb->elem_size; + + if (write_cb) { + ret = write_cb(opaque, rptr, &len); + if (ret < 0 || len == 0) + break; + } else { + memcpy(buf, rptr, len * fb->elem_size); + buf += len * fb->elem_size; + } + offset_r += len; + if (offset_r >= fb->nb_elems) + offset_r = 0; + to_read -= len; + } while (to_read > 0); + + *nb_elems -= to_read; + + return ret; +} + +int av_fifo_read(AVFifoBuffer *f, void *buf, size_t nb_elems) +{ + int ret = fifo_peek_common(f, buf, &nb_elems, 0, NULL, NULL); + av_fifo_drain2(f, nb_elems); + return ret; +} + +int av_fifo_read_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, + void *opaque, size_t *nb_elems) +{ + int ret = fifo_peek_common(f, NULL, nb_elems, 0, write_cb, opaque); + av_fifo_drain2(f, *nb_elems); + return ret; +} + +int av_fifo_peek(AVFifoBuffer *f, void *buf, size_t nb_elems, size_t offset) +{ + return fifo_peek_common(f, buf, &nb_elems, offset, NULL, NULL); +} + +int av_fifo_peek_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, void *opaque, + size_t *nb_elems, size_t offset) +{ + return fifo_peek_common(f, NULL, nb_elems, offset, write_cb, opaque); +} + int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { FifoBuffer *fb = (FifoBuffer*)f; diff --git a/libavutil/fifo.h b/libavutil/fifo.h index ac1245ff39..c7be5e8f7d 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -189,6 +189,66 @@ int av_fifo_write(AVFifoBuffer *f, const void *buf, size_t nb_elems); int av_fifo_write_from_cb(AVFifoBuffer *f, AVFifoCB read_cb, void *opaque, size_t *nb_elems); +/** + * Read data from a FIFO. + * + * @param f the FIFO buffer + * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes + * will be written into buf. + * @param nb_elems number of elements to read from FIFO + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_read(AVFifoBuffer *f, void *buf, size_t nb_elems); + +/** + * Feed data from a FIFO into a user-provided callback. + * + * @param f the FIFO buffer + * @param write_cb Callback the data will be supplied to. May be called + * multiple times. + * @param opaque opaque user data to be provided to write_cb + * @param nb_elems Should point to the maximum number of elements that can be + * read. Will be updated to contain the total number of elements + * actually sent to the callback. + * + * @return non-negative number on success, a negative error code on failure + */ +int av_fifo_read_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, + void *opaque, size_t *nb_elems); + +/** + * Read data from a FIFO without modifying FIFO state. + * + * @param f the FIFO buffer + * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes + * will be written into buf. + * @param nb_elems number of elements to read from FIFO + * @param offset number of initial elements to skip; offset + nb_elems must not + * be larger than av_fifo_can_read(f). + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_peek(AVFifoBuffer *f, void *buf, size_t nb_elems, size_t offset); + +/** + * Feed data from a FIFO into a user-provided callback. + * + * @param f the FIFO buffer + * @param write_cb Callback the data will be supplied to. May be called + * multiple times. + * @param opaque opaque user data to be provided to write_cb + * @param nb_elems Should point to the maximum number of elements that can be + * read. Will be updated to contain the total number of elements + * actually sent to the callback. + * @param offset number of initial elements to skip; offset + *nb_elems must not + * be larger than av_fifo_can_read(f). + * + * @return a non-negative number on success, a negative error code on failure + */ +int av_fifo_peek_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, void *opaque, + size_t *nb_elems, size_t offset); + /** * Discard the specified amount of data from an AVFifoBuffer. * @param size number of elements to discard, MUST NOT be larger than From patchwork Tue Jan 11 20:45:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33256 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049677iog; Tue, 11 Jan 2022 12:51:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJwKfdREFnlWjCU3crSIJryuflhzhMxSfhctiwGeuRzG594EPJaF+PcItO+j6Q/hajlnI0Ju X-Received: by 2002:a17:907:961d:: with SMTP id gb29mr4927044ejc.123.1641934268534; Tue, 11 Jan 2022 12:51:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934268; cv=none; d=google.com; s=arc-20160816; b=zJHC5Y8zNGs/jYE9pJccoVFE64Z4D3nNFySTxa2ewyf9kVKd1MBsypDmjZJUbCetva 4b+BY7GrGLlCVaK0QxDibH5UmI9kDuCkn7nMA8xRxMQwiX8KjC/jA50WrUpHAwozl3Td V36YLerDRdQAouJmGQUbil+Hz7bolykycV4ed/k7x4zUZU0XQxBcmyDYCXjZRqUETcV+ dxAslnuFJhIAZGnCVkdQgaTNVBP0fiorozV8/co9v003+gQ9COT0eCdryjRH2k3ZJiqp mG3JS1qoOsyUYRoNnool4mQVdGvnVt/7ADDmFbv2meKTI4bgVYViBW1fN3zgC/Sw975a 18fg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=prd9VjHlsPIMcMDYp8aWJeUOY88pW0TCJspRFHg/Mk8=; b=Bhtf2PI0FJXoFHWISPD9FWvUCVILXiHZJtDDrTHt3hoMhqdkii9bv+ar1plhJZ5lwA axXJAcMQPJfPXuXr+wpEJT5XH6WEubHyhTAfTqzyeN9thlorMU1vjE0kVK+TixrqdqJ8 4VG/RzJaJGaS68SIrQe4qHHKRYjESglDMwG+Ot9tTd/sdWPicboZpVJg+I8s1mCwzKaj x2YMtOa/9Wt/IB7NlYLSr9MdimSnabRHh4ZMrWwuoBJntBsVDyiu99D5XsNGUb5yUnGz eRjSkWLlEt1itoYfwI4dm0eCzUxZpTTLGuC2tAFKPqrp+0359N8peutKeXokYHK+cnP6 mTdQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m9si3996771edc.554.2022.01.11.12.51.08; Tue, 11 Jan 2022 12:51:08 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7624768AEE0; Tue, 11 Jan 2022 22:47:54 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9E99068AF2E for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9CAA4240506 for ; Tue, 11 Jan 2022 21:47:29 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id ojY09lZnUMso for ; Tue, 11 Jan 2022 21:47:28 +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 86A5B240512 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 0E2063A09CE; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:44 +0100 Message-Id: <20220111204610.14262-9-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/35] lavu/fifo: add a flag for automatically growing the FIFO as needed 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 48+q5uxKtEhs This will not increase the FIFO beyond 1MB, unless the caller explicitly specifies otherwise. --- doc/APIchanges | 3 ++- libavutil/fifo.c | 41 +++++++++++++++++++++++++++++++++++++++-- libavutil/fifo.h | 15 ++++++++++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index f64759d69d..52b42762ea 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -20,7 +20,8 @@ API changes, most recent first: rather than bytes. Add av_fifo_elem_size(), av_fifo_can_read(), av_fifo_can_write(), av_fifo_grow2(), av_fifo_drain2(), av_fifo_write(), av_fifo_write_from_cb(), - av_fifo_read(), av_fifo_read_to_cb(), av_fifo_peek(), av_fifo_peek_to_cb(). + av_fifo_read(), av_fifo_read_to_cb(), av_fifo_peek(), av_fifo_peek_to_cb(), + av_fifo_auto_grow_limit(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index ea944bc936..2c15df5d5c 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -34,6 +34,9 @@ # define CTX_STRUCT_NAME AVFifoBuffer #endif +// by default the FIFO can be auto-grown to 1MB +#define AUTO_GROW_DEFAULT_BYTES (1024 * 1024) + typedef struct CTX_STRUCT_NAME { // These fields must match then contents of AVFifoBuffer in fifo.h // until FF_API_FIFO_PUBLIC is removed @@ -48,6 +51,9 @@ typedef struct CTX_STRUCT_NAME { size_t offset_r, offset_w; // distinguishes the ambigous situation offset_r == offset_w int is_empty; + + unsigned int flags; + size_t auto_grow_limit; } FifoBuffer; AVFifoBuffer *av_fifo_alloc2(size_t nb_elems, size_t elem_size, @@ -75,10 +81,19 @@ AVFifoBuffer *av_fifo_alloc2(size_t nb_elems, size_t elem_size, f->nb_elems = nb_elems; f->elem_size = elem_size; + f->flags = flags; + f->auto_grow_limit = FFMAX(AUTO_GROW_DEFAULT_BYTES / elem_size, 1); + av_fifo_reset((AVFifoBuffer*)f); return (AVFifoBuffer*)f; } +void av_fifo_auto_grow_limit(AVFifoBuffer *f, size_t max_elems) +{ + FifoBuffer *fb = (FifoBuffer*)f; + fb->auto_grow_limit = max_elems; +} + AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) { if (nmemb > SIZE_MAX / size) @@ -207,6 +222,27 @@ void av_fifo_drain2(AVFifoBuffer *f, size_t size) #endif } +static int fifo_check_space(AVFifoBuffer *f, size_t to_write) +{ + FifoBuffer *fb = (FifoBuffer*)f; + const size_t can_write = av_fifo_can_write(f); + const size_t need_grow = to_write > can_write ? to_write - can_write : 0; + size_t can_grow; + + if (!need_grow) + return 0; + + can_grow = fb->auto_grow_limit > fb->nb_elems ? + fb->auto_grow_limit - fb->nb_elems : 0; + if ((fb->flags & AV_FIFO_FLAG_AUTO_GROW) && need_grow <= can_grow) { + // allocate a bit more than necessary, if we can + const size_t inc = (need_grow < can_grow / 2 ) ? need_grow * 2 : can_grow; + return av_fifo_grow2(f, inc); + } + + return AVERROR(ENOSPC); +} + static int fifo_write_common(AVFifoBuffer *f, const uint8_t *buf, size_t *nb_elems, AVFifoCB read_cb, void *opaque) { @@ -218,8 +254,9 @@ static int fifo_write_common(AVFifoBuffer *f, const uint8_t *buf, size_t *nb_ele uint32_t wndx= f->wndx; #endif - if (to_write > av_fifo_can_write(f)) - return AVERROR(ENOSPC); + ret = fifo_check_space(f, to_write); + if (ret < 0) + return ret; do { size_t len = FFMIN(fb->nb_elems - offset_w, to_write); diff --git a/libavutil/fifo.h b/libavutil/fifo.h index c7be5e8f7d..11eb36944a 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -83,6 +83,13 @@ AVFifoBuffer *av_fifo_alloc(unsigned int size); */ AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); +/** + * Automatically resize the FIFO on writes, so that the data fits. This + * automatic resizing happens up to a limit that can be modified with + * av_fifo_auto_grow_limit(). + */ +#define AV_FIFO_FLAG_AUTO_GROW (1 << 0) + /** * Allocate and initialize an AVFifoBuffer with a given element size. * @@ -90,7 +97,7 @@ AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); * @param nb_elems initial number of elements that can be stored in the FIFO * @param elem_size Size in bytes of a single element. Further operations on * the returned FIFO will implicitly use this element size. - * @param flags currently unused, must be 0 + * @param flags a combination of AV_FIFO_FLAG_* * * @return newly-allocated AVFifoBuffer on success, a negative error code on failure */ @@ -115,6 +122,12 @@ void av_fifo_freep(AVFifoBuffer **f); */ size_t av_fifo_elem_size(const AVFifoBuffer *f); +/** + * Set the maximum size (in elements) to which the FIFO can be resized + * automatically. Has no effect unless AV_FIFO_FLAG_AUTO_GROW is used. + */ +void av_fifo_auto_grow_limit(AVFifoBuffer *f, size_t max_elems); + /** * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. * @param f AVFifoBuffer to reset From patchwork Tue Jan 11 20:45:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33251 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049115iog; Tue, 11 Jan 2022 12:50:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJwDGdIKIEWK3+Q7/CEgW7UnPanXo2u1bVqOkLxSyOU0kLDQKko+47W+pXVk0CPRVNaDda2S X-Received: by 2002:a17:907:7ba6:: with SMTP id ne38mr4895818ejc.315.1641934217607; Tue, 11 Jan 2022 12:50:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934217; cv=none; d=google.com; s=arc-20160816; b=IN78wX7OeG3SB48+A1aSgcHyPQkjSGTLLQp3p+ORaFsRYTuNKYNFAuujQoUv/nGWbW pznjCq/o0lUt6MaVrAJmeH1MR/ELBxMukvg4Zsdo+DKPmA2iy52xiaNO1nFMQuzr/uz1 8We+ASeF+UMwXZTq5LqSB263I+afHpES3nAa7AYf0n9+r9NW/dry7TJ18yPy4va17qLF QT5UXl0vyqCz9jXlfkB0Zi0WCh9aOxGTewUaoVzvA2gotbzghXbIlxePidIOoKpOaVML BCe2tNeBa8uWB5dr3bx05ZuC7VL8C+hDnldIVUIrwaaL7xQT2G/w26XUbfw+F53jcQiP WMjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=jkDjlHv95V9RQRnKwM0KgGvy4j82HOdMkX8wJW03wPY=; b=Dmfe3Mh1M7kKo107EpmPtwPRWBEzeFRwQN7Pdz8/j/egwJHrcPOWUmXHitUhH7e5LW S4kIBTvNM3QqiFMYLfKn9GoKHniGmtKZR50QoDxZ6E3yWKdYDr7mYjB/MFyv0xKExiHb MW0ZMZP0Pp6V16SW7XMWv0HFfFQbW3dyP0lCyN6Io78kB4eiKS48jb8N6ecxLaT2gvq7 Mns1w5sr63PGd4OTIar5L2Hrk7gRTX9Q/9XMiQVw2/6JcQkCtxtqKmmehguehofLywM6 6tZVQai5vT71AjE41JHvDCuFK0oL4u666kUzU3+2Edq05hBaRmTvdMO/QMNeA/V5baE0 OlFA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id rl9si182980ejb.564.2022.01.11.12.50.17; Tue, 11 Jan 2022 12:50:17 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C4EED68AFAA; Tue, 11 Jan 2022 22:47:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3B18D68AF10 for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id D9046240507 for ; Tue, 11 Jan 2022 21:47:27 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id tCvv7RhiZc0m for ; Tue, 11 Jan 2022 21:47:27 +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 8137A240511 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 125743A09DE; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:45 +0100 Message-Id: <20220111204610.14262-10-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/35] lavu/fifo: deprecate old API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Gmh65iFfk3Gf --- doc/APIchanges | 3 +++ libavutil/fifo.c | 10 ++++++++++ libavutil/fifo.h | 37 +++++++++++++++++++++++++++++++++++++ libavutil/version.h | 1 + 4 files changed, 51 insertions(+) diff --git a/doc/APIchanges b/doc/APIchanges index 52b42762ea..3531596a7f 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -22,6 +22,9 @@ API changes, most recent first: av_fifo_grow2(), av_fifo_drain2(), av_fifo_write(), av_fifo_write_from_cb(), av_fifo_read(), av_fifo_read_to_cb(), av_fifo_peek(), av_fifo_peek_to_cb(), av_fifo_auto_grow_limit(). + Deprecate av_fifo_alloc(), av_fifo_alloc_array(), av_fifo_size(), av_fifo_space(), + av_fifo_generic_peek(), av_fifo_generic_peek_at(), av_fifo_generic_read(), + av_fifo_generic_write(), av_fifo_realloc2(), av_fifo_grow(), av_fifo_drain(). 2022-01-xx - xxxxxxxxxx - lavu fifo.h Access to all AVFifoBuffer members is deprecated. The struct will diff --git a/libavutil/fifo.c b/libavutil/fifo.c index 2c15df5d5c..bd227d23e8 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -94,6 +94,8 @@ void av_fifo_auto_grow_limit(AVFifoBuffer *f, size_t max_elems) fb->auto_grow_limit = max_elems; } +#if FF_API_FIFO_OLD_API +FF_DISABLE_DEPRECATION_WARNINGS AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size) { if (nmemb > SIZE_MAX / size) @@ -105,6 +107,8 @@ AVFifoBuffer *av_fifo_alloc(unsigned int size) { return av_fifo_alloc_array(size, 1); } +FF_ENABLE_DEPRECATION_WARNINGS +#endif void av_fifo_free(AVFifoBuffer *f) { @@ -155,6 +159,7 @@ size_t av_fifo_can_write(const AVFifoBuffer *f) return fb->nb_elems - av_fifo_can_read(f); } +#if FF_API_FIFO_OLD_API int av_fifo_size(const AVFifoBuffer *f) { return av_fifo_can_read(f); @@ -164,6 +169,7 @@ int av_fifo_space(const AVFifoBuffer *f) { return av_fifo_can_write(f); } +#endif int av_fifo_grow2(AVFifoBuffer *f, size_t inc) { @@ -370,6 +376,8 @@ int av_fifo_peek_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, void *opaque, return fifo_peek_common(f, NULL, nb_elems, offset, write_cb, opaque); } +#if FF_API_FIFO_OLD_API +FF_DISABLE_DEPRECATION_WARNINGS int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) { FifoBuffer *fb = (FifoBuffer*)f; @@ -528,3 +536,5 @@ void av_fifo_drain(AVFifoBuffer *f, int size) { return av_fifo_drain2(f, size); } +FF_ENABLE_DEPRECATION_WARNINGS +#endif diff --git a/libavutil/fifo.h b/libavutil/fifo.h index 11eb36944a..c2e11e11ab 100644 --- a/libavutil/fifo.h +++ b/libavutil/fifo.h @@ -62,6 +62,7 @@ AVFifoBuffer; */ typedef int AVFifoCB(void *opaque, void *buf, size_t *nb_elems); +#if FF_API_FIFO_OLD_API /** * Initialize an AVFifoBuffer. * @param size of FIFO @@ -69,7 +70,9 @@ typedef int AVFifoCB(void *opaque, void *buf, size_t *nb_elems); * * @note the element size of the allocated FIFO will be 1, i.e. all operations * will be in bytes + * @deprecated use av_fifo_alloc2 */ +attribute_deprecated AVFifoBuffer *av_fifo_alloc(unsigned int size); /** @@ -80,8 +83,11 @@ AVFifoBuffer *av_fifo_alloc(unsigned int size); * * @note the element size of the allocated FIFO will be 1, i.e. all operations * will be in bytes + * @deprecated use av_fifo_alloc2 */ +attribute_deprecated AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); +#endif /** * Automatically resize the FIFO on writes, so that the data fits. This @@ -134,12 +140,15 @@ void av_fifo_auto_grow_limit(AVFifoBuffer *f, size_t max_elems); */ void av_fifo_reset(AVFifoBuffer *f); +#if FF_API_FIFO_OLD_API /** * Return the amount of data in the AVFifoBuffer, that is the amount of data * (in elements, as returned by av_fifo_elem_size()) you can read from it. * @param f AVFifoBuffer to read from * @return size + * @deprecated use av_fifo_can_read() */ +attribute_deprecated int av_fifo_size(const AVFifoBuffer *f); /** @@ -147,8 +156,11 @@ int av_fifo_size(const AVFifoBuffer *f); * (in elements, as returned by av_fifo_elem_size()) you can write into it. * @param f AVFifoBuffer to write into * @return size + * @deprecated use av_fifo_can_write() */ +attribute_deprecated int av_fifo_space(const AVFifoBuffer *f); +#endif /** * @return number of elements available for reading from the given FIFO. @@ -269,6 +281,7 @@ int av_fifo_peek_to_cb(AVFifoBuffer *f, AVFifoCB write_cb, void *opaque, */ void av_fifo_drain2(AVFifoBuffer *f, size_t size); +#if FF_API_FIFO_OLD_API /** * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. * Similar as av_fifo_gereric_read but without discarding data. @@ -279,7 +292,10 @@ void av_fifo_drain2(AVFifoBuffer *f, size_t size); * @param dest data destination * * @return a non-negative number on success, a negative error code on failure + * + * @deprecated use av_fifo_peek() when func==NULL, av_fifo_peek_to_cb() otherwise */ +attribute_deprecated int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); /** @@ -291,7 +307,10 @@ int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_siz * @param dest data destination * * @return a non-negative number on success, a negative error code on failure + * + * @deprecated use av_fifo_peek() when func==NULL, av_fifo_peek_to_cb() otherwise */ +attribute_deprecated int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); /** @@ -302,7 +321,10 @@ int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func) * @param dest data destination * * @return a non-negative number on success, a negative error code on failure + * + * @deprecated use av_fifo_read() when func==NULL, av_fifo_read_to_cb() otherwise */ +attribute_deprecated int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); /** @@ -317,7 +339,10 @@ int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func) * indicate no more data available to write. * If func is NULL, src is interpreted as a simple byte array for source data. * @return the number of elements written to the FIFO or a negative error code on failure + * + * @deprecated use av_fifo_write() when func==NULL, av_fifo_write_to_cb() otherwise */ +attribute_deprecated int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); /** @@ -327,7 +352,11 @@ int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void * @param f AVFifoBuffer to resize * @param size new AVFifoBuffer size in elements * @return <0 for failure, >=0 otherwise + * + * @deprecated use av_fifo_grow2() to increase fifo size, decreasing fifo size + * is not supported */ +attribute_deprecated int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); /** @@ -339,15 +368,23 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); * @param additional_space the amount of space in elements to allocate in * addition to av_fifo_size() * @return <0 for failure, >=0 otherwise + * + * @deprecated use av_fifo_grow2(); note that unlike this function it adds to + * allocated size, rather than to used size */ +attribute_deprecated int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); /** * Read and discard the specified amount of data from an AVFifoBuffer. * @param f AVFifoBuffer to read from * @param size amount of data to read in elements + * + * @deprecated use av_fifo_drain2() */ +attribute_deprecated void av_fifo_drain(AVFifoBuffer *f, int size); +#endif #if FF_API_FIFO_PEEK2 /** diff --git a/libavutil/version.h b/libavutil/version.h index 180ebd5223..756318f495 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -111,6 +111,7 @@ #define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_FIFO_PUBLIC (LIBAVUTIL_VERSION_MAJOR < 58) +#define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 58) /** * @} From patchwork Tue Jan 11 20:45:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33252 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049196iog; Tue, 11 Jan 2022 12:50:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJwaafhWPh8Ue7Msh4Wz1/PP3ZH9UpM6+hU3xMddOHoQW23ibS7cjbMSC4WywITnpF/j9VlI X-Received: by 2002:a50:c94b:: with SMTP id p11mr6283931edh.173.1641934227089; Tue, 11 Jan 2022 12:50:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934227; cv=none; d=google.com; s=arc-20160816; b=mLguxofN3xuQo4u7nVG3GdVWpPAW5kM509/fOpGcCLH17eKGi3k+j51tBoZV06XPIZ RlcjsyLp+KqIOdpRTbLwnU9/T3QEif+2X3kZdVBWXh6I1R+9my0Joi8P2OI6HVLIqn4D M2hXOqeoHb0e5xzq97nlYuzxzom1bs7arZtgpnzOunbGDF88pcck1lywMpVMWPAk8Ppz u57PLWM32jj/UyONZhGmkDrCgf7ojgpqOUuN2gUlPySyfZTt488V3R2eCS7NlsxxFKfL SjCVnkqKfqsAKK0cBsDK81ShaJdzwPvUReRGfDm4p6dOeVWm6MT62yBFPS1u/qfUvVSQ Wkmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=Quk2FUNe0QzyeLxyVRQvM7EHeKZ6svxZ2YXtp8GMvlg=; b=NCBZDF1ge+v7uLGGbRnK6+MOOwB2hJhQTIFY6SCPlmr0g0CShnrFw9FcPGzMe2Vqwn FSdyZ9uiKucFp+Dgx3dkvah56oNaU/ooZ6823UL+d6py0zv7uMyl0tPHKSFcWr/iz5tx NqTi2uUScTr61U8o7z4rsTnWbX3KxF/WloNQ0rzPx0p9lGAp5c0jw+8Yjl1hArf80sDy Jd6dRDFU7ym0rhcHOhWP/wh1v8iJ9Dma7NKem2JkdUfsE/SPvqxJjnTBOIJxfC0+ctlS fnnZ03AWUARmALt5nMdHgVoirKrMjtAYoZJRj+3kIj/q2InijrtCQvzFHqJT6PajvszM TIPw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sg40si5614896ejc.86.2022.01.11.12.50.26; Tue, 11 Jan 2022 12:50:27 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BA36768AFB1; Tue, 11 Jan 2022 22:47:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3FDD768AF26 for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id DC40E24050B for ; Tue, 11 Jan 2022 21:47:28 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id B3vCzeMWHXPc for ; Tue, 11 Jan 2022 21:47:28 +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 8BAA824052D for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 161893A09E6; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:46 +0100 Message-Id: <20220111204610.14262-11-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/35] lavu/tests/fifo: switch to the new API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: o95lDscE8i4e --- libavutil/tests/fifo.c | 45 +++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/libavutil/tests/fifo.c b/libavutil/tests/fifo.c index e5aa88d252..952d0a5b2c 100644 --- a/libavutil/tests/fifo.c +++ b/libavutil/tests/fifo.c @@ -23,74 +23,69 @@ int main(void) { /* create a FIFO buffer */ - AVFifoBuffer *fifo = av_fifo_alloc(13 * sizeof(int)); + AVFifoBuffer *fifo = av_fifo_alloc2(13, sizeof(int), 0); int i, j, n, *p; /* fill data */ - for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++) - av_fifo_generic_write(fifo, &i, sizeof(int), NULL); + for (i = 0; av_fifo_can_write(fifo); i++) + av_fifo_write(fifo, &i, 1); /* peek_at at FIFO */ - n = av_fifo_size(fifo) / sizeof(int); + n = av_fifo_can_read(fifo); for (i = 0; i < n; i++) { - av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL); + av_fifo_peek(fifo, &j, 1, i); printf("%d: %d\n", i, j); } printf("\n"); /* generic peek at FIFO */ - n = av_fifo_size(fifo); - p = malloc(n); + n = av_fifo_can_read(fifo); + p = malloc(n * av_fifo_elem_size(fifo)); if (p == NULL) { fprintf(stderr, "failed to allocate memory.\n"); exit(1); } - (void) av_fifo_generic_peek(fifo, p, n, NULL); + (void) av_fifo_peek(fifo, p, n, 0); /* read data at p */ - n /= sizeof(int); for(i = 0; i < n; ++i) printf("%d: %d\n", i, p[i]); putchar('\n'); /* read data */ - for (i = 0; av_fifo_size(fifo) >= sizeof(int); i++) { - av_fifo_generic_read(fifo, &j, sizeof(int), NULL); + for (i = 0; av_fifo_can_read(fifo); i++) { + av_fifo_read(fifo, &j, 1); printf("%d ", j); } printf("\n"); - /* test *ndx overflow */ - av_fifo_reset(fifo); - fifo->rndx = fifo->wndx = ~(uint32_t)0 - 5; - /* fill data */ - for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++) - av_fifo_generic_write(fifo, &i, sizeof(int), NULL); + for (i = 0; av_fifo_can_write(fifo); i++) + av_fifo_write(fifo, &i, 1); /* peek_at at FIFO */ - n = av_fifo_size(fifo) / sizeof(int); + n = av_fifo_can_read(fifo); for (i = 0; i < n; i++) { - av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL); + av_fifo_peek(fifo, &j, 1, i); printf("%d: %d\n", i, j); } putchar('\n'); /* test fifo_grow */ - (void) av_fifo_grow(fifo, 15 * sizeof(int)); + (void) av_fifo_grow2(fifo, 15); /* fill data */ - n = av_fifo_size(fifo) / sizeof(int); - for (i = n; av_fifo_space(fifo) >= sizeof(int); ++i) - av_fifo_generic_write(fifo, &i, sizeof(int), NULL); + n = av_fifo_can_read(fifo); + for (i = n; av_fifo_can_write(fifo); ++i) + av_fifo_write(fifo, &i, 1); /* peek_at at FIFO */ - n = av_fifo_size(fifo) / sizeof(int); + n = av_fifo_can_read(fifo); for (i = 0; i < n; i++) { - av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL); + av_fifo_peek(fifo, &j, 1, i); printf("%d: %d\n", i, j); } From patchwork Tue Jan 11 20:45:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33259 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049998iog; Tue, 11 Jan 2022 12:51:43 -0800 (PST) X-Google-Smtp-Source: ABdhPJzl91PpDjaXHWO0tz44v/2K048CVG3BVMya0iiXT60xpWH5/Qg/LYM3YOz00V2e+Hq0ncmS X-Received: by 2002:a17:906:4347:: with SMTP id z7mr5300066ejm.671.1641934303306; Tue, 11 Jan 2022 12:51:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934303; cv=none; d=google.com; s=arc-20160816; b=SRz9hxWyX+Zueegzf9iNyB606YsFQq2/Qpd9ucwBcZx/aDoKlGTaMwuBw6rWUjehOv P2X5eOemmp8h0ZV9UX7ufZ11eTejBrQML6laujFZXoVL9r9N7wz0gU/F71U3KUwGqxkZ 1068SlKMeeFvAJEf/hlfFVHNbAnLq1Pm7Z2SSf4N1YFp8dfkCE8jBf/ZwE5xubeLKmJE 6ol0vAc6VwJwb3OrFhduY/7d39kV6shr+zQVzvSqegNO0SA3SDh2CY2VCt0k923afhni 5W6KnrRFadlMcZeg/LtCQ219FAgVPVIWZBBRgwaZFfX2o75wSBOJ9raXBIsx1Ka923Su lAeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=3UrclV/tEUcPsP7yceJIIm/+aX504xX1qhX0iR+7tDw=; b=xLfaygb1034RAYbbGWwv1e7PJyAvz79BlbeM5AZzVgh9c2nPR6c5N7cJxjS7xMCHbP khq7JabMzUvLYa81XPzt4GQP0Ti13hjNL7yeNwqyW8eJ29LkES1pQATAAMs3XdEkMJ6r 9cM7q0Fr+0TkVIY2ItpgslixocW7Cl9kJ4kXw/4fXeoBWeRyGo99tIYPd23UmC94r/IM KgKAM+Fp/jDc25ZF+ZKEqOKnkndbQ93WsxhuYgepwkjF3QiAonADZLJ8rpWymDlfM/7r 2DfhsV8HWXttksXyA0nd6engnK5JeyPva7oma7cTYvr+6Y56SekxGB8NuK6ubLN6k4aF TKBg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v25si5539918edd.190.2022.01.11.12.51.42; Tue, 11 Jan 2022 12:51:43 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 791A668AFEE; Tue, 11 Jan 2022 22:47:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E493B68AE7A for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 79C6F240590 for ; Tue, 11 Jan 2022 21:47:31 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id kQIIEzaP6-XM for ; Tue, 11 Jan 2022 21:47:29 +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 93C03240555 for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 1A60A3A0A2B; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:47 +0100 Message-Id: <20220111204610.14262-12-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/35] lavc/avcodec: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4M6rccUudn+F --- libavcodec/avcodec.c | 15 ++++++--------- libavcodec/decode.c | 22 ++++++++-------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index c00a9b2af8..a75bbe721f 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -183,7 +183,8 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code avci->es.in_frame = av_frame_alloc(); avci->in_pkt = av_packet_alloc(); avci->last_pkt_props = av_packet_alloc(); - avci->pkt_props = av_fifo_alloc(sizeof(*avci->last_pkt_props)); + avci->pkt_props = av_fifo_alloc2(1, sizeof(*avci->last_pkt_props), + AV_FIFO_FLAG_AUTO_GROW); if (!avci->buffer_frame || !avci->buffer_pkt || !avci->es.in_frame || !avci->in_pkt || !avci->last_pkt_props || !avci->pkt_props) { @@ -399,13 +400,10 @@ void avcodec_flush_buffers(AVCodecContext *avctx) av_packet_unref(avci->buffer_pkt); av_packet_unref(avci->last_pkt_props); - while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) { - av_fifo_generic_read(avci->pkt_props, - avci->last_pkt_props, sizeof(*avci->last_pkt_props), - NULL); + while (av_fifo_can_read(avci->pkt_props)) { + av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1); av_packet_unref(avci->last_pkt_props); } - av_fifo_reset(avci->pkt_props); av_frame_unref(avci->es.in_frame); av_packet_unref(avci->in_pkt); @@ -464,10 +462,9 @@ av_cold int avcodec_close(AVCodecContext *avctx) av_frame_free(&avci->buffer_frame); av_packet_free(&avci->buffer_pkt); if (avci->pkt_props) { - while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) { + while (av_fifo_can_read(avci->pkt_props)) { av_packet_unref(avci->last_pkt_props); - av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props, - sizeof(*avci->last_pkt_props), NULL); + av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1); } av_fifo_freep(&avci->pkt_props); } diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 0912f86a14..9f6f2e7fa6 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -165,26 +165,21 @@ static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt) int ret = 0; if (IS_EMPTY(avci->last_pkt_props)) { - if (av_fifo_size(avci->pkt_props) >= sizeof(*pkt)) { - av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props, - sizeof(*avci->last_pkt_props), NULL); + if (av_fifo_can_read(avci->pkt_props)) { + av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1); } else return copy_packet_props(avci->last_pkt_props, pkt); } - if (av_fifo_space(avci->pkt_props) < sizeof(*pkt)) { - ret = av_fifo_grow(avci->pkt_props, sizeof(*pkt)); - if (ret < 0) - return ret; - } - ret = copy_packet_props(&tmp, pkt); if (ret < 0) return ret; - av_fifo_generic_write(avci->pkt_props, &tmp, sizeof(tmp), NULL); + ret = av_fifo_write(avci->pkt_props, &tmp, 1); + if (ret < 0) + av_packet_unref(&tmp); - return 0; + return ret; } static int decode_bsfs_init(AVCodecContext *avctx) @@ -543,9 +538,8 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) avci->draining_done = 1; if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) && - IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) - av_fifo_generic_read(avci->pkt_props, - avci->last_pkt_props, sizeof(*avci->last_pkt_props), NULL); + IS_EMPTY(avci->last_pkt_props) && av_fifo_can_read(avci->pkt_props)) + av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1); if (!ret) { frame->best_effort_timestamp = guess_correct_pts(avctx, From patchwork Tue Jan 11 20:45:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33257 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049770iog; Tue, 11 Jan 2022 12:51:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJxpMF+CFewu8ySOTTTYmqC/ED6CQ3KH3Hwq2gIiJjqJ0I4KTXSbjXzmdnsx547J/mFZh+/X X-Received: by 2002:aa7:d503:: with SMTP id y3mr5982796edq.224.1641934280925; Tue, 11 Jan 2022 12:51:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934280; cv=none; d=google.com; s=arc-20160816; b=c64a/UZ/EtsJNa1A71rdhec1NpdPuiw0KFpsphFKprx37OZ21eyZuHQ9kLmJuCNlAD OgEeeUSTpY+8Or2QGGYVLjdZzeHInQ4Eamq5F2R7QJxoSYfR3LuNI+YG6yUAQAUFQP1d SBEQrmRCWYPQQapQhN8BQK5Te/OBRKUx1bvbhtgZ9yAYZqT7Wbbp4v86Z6UlKvdiZ4xS yfwA5KyeAhZ9/NdcB37J806lzSyjR/KGrdVHVd4v04bI7FWSmpmo3aQWw+pcyDjXg/0s HsY9zHbOSnOrkE50H46emJvf8FgjRGnzUTh2Xow9kigohhEYXk8fDiYAPbmb4CbmNOVi zIwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=fLwx+9l/fGB5y+8lOa12OBEfossZi8GtUhvat/Sg+Zc=; b=bcHfgY5JsHGJPOOHT+78lMekR1eLjIDoe5lZ6r+OUA3byfMGclUOu1MUJqoRYTMWJa /mEpM0AoQ4NebYJ7J6OLc9tIpCmKyGtYN0ng9YrUoTkyuWL1GlrYoyhjs6zmvNcNIgrn dmdiXORI0+8mLQZ0mKYnqCLQWX/icNEbYz55vlsp0tk9/lOswmKPIxMuaxkj5NThs8qv HlE8XJjSiWGP+ixqPW7Q/I15crnKiBOP5sOFb81GER/6BZflcuMSJ/jTCVb/kWuBMTRl NSB9XdMA2mw5wp41MSU2xFq0f0rHRhv3wmoz7vmBMW0YK2ZStcki8KGrwZr/95K37W37 NVwA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w19si3388281edq.469.2022.01.11.12.51.19; Tue, 11 Jan 2022 12:51:20 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6D1A668AFDE; Tue, 11 Jan 2022 22:47:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C44F068AE7A for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 6E48F240512 for ; Tue, 11 Jan 2022 21:47:30 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id Z-yml2HkJYlX for ; Tue, 11 Jan 2022 21:47:29 +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 93C5524055A for ; Tue, 11 Jan 2022 21:47:25 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 1E8073A0A44; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:48 +0100 Message-Id: <20220111204610.14262-13-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/35] lavc/amfenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EP3BSty/XbCt --- fftools/ffmpeg_mux.c | 22 +++++++++++----------- fftools/ffmpeg_opt.c | 2 -- libavcodec/amfenc.c | 39 +++++++++++++-------------------------- 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 52986b002a..e97d7d50c6 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -126,11 +126,11 @@ static int queue_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) AVPacket *tmp_pkt; int ret; - if (!av_fifo_space(ms->muxing_queue)) { - size_t cur_size = av_fifo_size(ms->muxing_queue); + if (!av_fifo_can_write(ms->muxing_queue)) { + size_t cur_size = av_fifo_can_read(ms->muxing_queue); unsigned int are_we_over_size = (ms->muxing_queue_data_size + pkt->size) > ost->muxing_queue_data_threshold; - size_t limit = are_we_over_size ? ost->max_muxing_queue_size : INT_MAX; + size_t limit = are_we_over_size ? ost->max_muxing_queue_size : SIZE_MAX; size_t new_size = FFMIN(2 * cur_size, limit); if (new_size <= cur_size) { @@ -139,7 +139,7 @@ static int queue_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) ost->file_index, ost->st->index); return AVERROR(ENOSPC); } - ret = av_fifo_realloc2(ms->muxing_queue, new_size); + ret = av_fifo_grow2(ms->muxing_queue, new_size - cur_size); if (ret < 0) return ret; } @@ -154,7 +154,7 @@ static int queue_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) av_packet_move_ref(tmp_pkt, pkt); ms->muxing_queue_data_size += tmp_pkt->size; - av_fifo_generic_write(ms->muxing_queue, &tmp_pkt, sizeof(tmp_pkt), NULL); + av_fifo_write(ms->muxing_queue, &tmp_pkt, 1); return 0; } @@ -369,12 +369,12 @@ int of_check_init(OutputFile *of) OutputStream *ost = output_streams[of->ost_index + i]; /* try to improve muxing time_base (only possible if nothing has been written yet) */ - if (!av_fifo_size(ms->muxing_queue)) + if (!av_fifo_can_read(ms->muxing_queue)) ost->mux_timebase = ost->st->time_base; - while (av_fifo_size(ms->muxing_queue)) { + while (av_fifo_can_read(ms->muxing_queue)) { AVPacket *pkt; - av_fifo_generic_read(ms->muxing_queue, &pkt, sizeof(pkt), NULL); + av_fifo_read(ms->muxing_queue, &pkt, 1); ms->muxing_queue_data_size -= pkt->size; write_packet(of, ost, pkt); av_packet_free(&pkt); @@ -429,9 +429,9 @@ static void mux_free(Muxer **pmux, int nb_streams) if (!ms->muxing_queue) continue; - while (av_fifo_size(ms->muxing_queue)) { + while (av_fifo_can_read(ms->muxing_queue)) { AVPacket *pkt; - av_fifo_generic_read(ms->muxing_queue, &pkt, sizeof(pkt), NULL); + av_fifo_read(ms->muxing_queue, &pkt, 1); av_packet_free(&pkt); } av_fifo_freep(&ms->muxing_queue); @@ -479,7 +479,7 @@ int of_muxer_init(OutputFile *of, AVDictionary *opts, int64_t limit_filesize) for (int i = 0; i < of->ctx->nb_streams; i++) { MuxStream *ms = &mux->streams[i]; - ms->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket*)); + ms->muxing_queue = av_fifo_alloc2(8, sizeof(AVPacket*), 0); if (!ms->muxing_queue) { ret = AVERROR(ENOMEM); goto fail; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index cb21a6a42c..4fede8471e 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1610,8 +1610,6 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->max_muxing_queue_size = 128; MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st); - ost->max_muxing_queue_size = FFMIN(ost->max_muxing_queue_size, INT_MAX / sizeof(ost->pkt)); - ost->max_muxing_queue_size *= sizeof(ost->pkt); ost->muxing_queue_data_threshold = 50*1024*1024; MATCH_PER_STREAM_OPT(muxing_queue_data_threshold, i, ost->muxing_queue_data_threshold, oc, st); diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index fb23ed738c..3a8dd2b007 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -117,8 +117,9 @@ static int amf_load_library(AVCodecContext *avctx) if (!ctx->delayed_frame) { return AVERROR(ENOMEM); } - // hardcoded to current HW queue size - will realloc in timestamp_queue_enqueue() if too small - ctx->timestamp_list = av_fifo_alloc((avctx->max_b_frames + 16) * sizeof(int64_t)); + // hardcoded to current HW queue size - will auto-realloc if too small + ctx->timestamp_list = av_fifo_alloc2(avctx->max_b_frames + 16, sizeof(int64_t), + AV_FIFO_FLAG_AUTO_GROW); if (!ctx->timestamp_list) { return AVERROR(ENOMEM); } @@ -432,18 +433,6 @@ static int amf_copy_surface(AVCodecContext *avctx, const AVFrame *frame, return 0; } -static inline int timestamp_queue_enqueue(AVCodecContext *avctx, int64_t timestamp) -{ - AmfContext *ctx = avctx->priv_data; - if (av_fifo_space(ctx->timestamp_list) < sizeof(timestamp)) { - if (av_fifo_grow(ctx->timestamp_list, sizeof(timestamp)) < 0) { - return AVERROR(ENOMEM); - } - } - av_fifo_generic_write(ctx->timestamp_list, ×tamp, sizeof(timestamp), NULL); - return 0; -} - static int amf_copy_buffer(AVCodecContext *avctx, AVPacket *pkt, AMFBuffer *buffer) { AmfContext *ctx = avctx->priv_data; @@ -479,21 +468,19 @@ static int amf_copy_buffer(AVCodecContext *avctx, AVPacket *pkt, AMFBuffer *buff pkt->pts = var.int64Value; // original pts - AMF_RETURN_IF_FALSE(ctx, av_fifo_size(ctx->timestamp_list) > 0, AVERROR_UNKNOWN, "timestamp_list is empty\n"); + AMF_RETURN_IF_FALSE(ctx, av_fifo_can_read(ctx->timestamp_list) > 0, AVERROR_UNKNOWN, "timestamp_list is empty\n"); - av_fifo_generic_read(ctx->timestamp_list, ×tamp, sizeof(timestamp), NULL); + av_fifo_read(ctx->timestamp_list, ×tamp, 1); // calc dts shift if max_b_frames > 0 if (avctx->max_b_frames > 0 && ctx->dts_delay == 0) { int64_t timestamp_last = AV_NOPTS_VALUE; - AMF_RETURN_IF_FALSE(ctx, av_fifo_size(ctx->timestamp_list) > 0, AVERROR_UNKNOWN, + AMF_RETURN_IF_FALSE(ctx, av_fifo_can_read(ctx->timestamp_list) > 0, AVERROR_UNKNOWN, "timestamp_list is empty while max_b_frames = %d\n", avctx->max_b_frames); - av_fifo_generic_peek_at( + av_fifo_peek( ctx->timestamp_list, - ×tamp_last, - (av_fifo_size(ctx->timestamp_list) / sizeof(timestamp) - 1) * sizeof(timestamp_last), - sizeof(timestamp_last), - NULL); + ×tamp_last, 1, + (av_fifo_can_read(ctx->timestamp_list) - 1)); if (timestamp < 0 || timestamp_last < AV_NOPTS_VALUE) { return AVERROR(ERANGE); } @@ -710,9 +697,9 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "SubmitInput() failed with error %d\n", res); av_frame_unref(frame); - if ((ret = timestamp_queue_enqueue(avctx, pts)) < 0) { + ret = av_fifo_write(ctx->timestamp_list, &pts, 1); + if (ret < 0) return ret; - } } } @@ -751,9 +738,9 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) av_frame_unref(ctx->delayed_frame); AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "Repeated SubmitInput() failed with error %d\n", res); - if ((ret = timestamp_queue_enqueue(avctx, pts)) < 0) { + ret = av_fifo_write(ctx->timestamp_list, &pts, 1); + if (ret < 0) return ret; - } } else { av_log(avctx, AV_LOG_WARNING, "Data acquired but delayed frame submission got AMF_INPUT_FULL- should not happen\n"); } From patchwork Tue Jan 11 20:45:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33240 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048070iog; Tue, 11 Jan 2022 12:48:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJxahTacVdbz9l5XyGO6xYj8OtHJRZLFEE6Hllj2zS9PBeWUCiP+mU6k6v4VdCCpzDyPfOuk X-Received: by 2002:a05:6402:712:: with SMTP id w18mr5984007edx.281.1641934112904; Tue, 11 Jan 2022 12:48:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934112; cv=none; d=google.com; s=arc-20160816; b=CFjUZhj1FS4Z7fRhgMJZShyc6foZuWLHajoYsFfUgcZgQ4MKp2xWqcHdLaAvznJGOM ODn6n7438XdrE7lRHTu3qPRkYZNGqetmEHCqS5JCCHTNCzqFbk+3xoiD7KEuT7WYhGl7 loUtNgBVdaSzveiavoJslWWmEgr/Sj3R8SgySULIYPkpq4PLgJX4bg3p8z1abb+NKcbV jTP2261EWRh9lfiq6dMUC7eUR7whrL0R7k5DB80//Iz0fACDS34L+lJI/keXPrPSjOLC M7hkBHfgnh6J2rfdJBJkwilhpeBV/hd3dyLrP7L2bx6EEq8niMf9ZbcrNK0u3qtJzLz4 uRyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=SwgY4bikswTj5quNGmD1XrOhHFbWV3psLwA94/OgI/8=; b=OKdweqBo0Byyk3ySjyGtKAecI8Nrn8APNsFWfgSjWRwg0xFgnBW6PBh/M2kOn2JLoF W7KPJv8/gwrlnt9At7/vfrscHMqoG2d/uCVh+eyhGWP4T6/WBHqM3drYBs2E8HfNX9XQ HXvT0UwnUxgeqedyQqi3hkd+I6lYU6dqBq7RcSeARC7Y/rCW6oXRs4kwITY//nSE+XQ/ fw4MRg77W9gqjqwPmQu6LGGEUbp9WHJ7BcVspZf/ACjwzZ6vWDrLeAOQVPGPj3YSlO2b Cx8eY83DWYfNsWwPxluifAqZ6CG7sllL12j2oO7tHI48uHmRJRMma5ufhNs6RxUWrxF3 TF5A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b8si1656881edz.15.2022.01.11.12.48.32; Tue, 11 Jan 2022 12:48:32 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 30E2A68A6E0; Tue, 11 Jan 2022 22:47:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB10A68AD15 for ; Tue, 11 Jan 2022 22:47:33 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id BA84D24017C for ; Tue, 11 Jan 2022 21:47:32 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id k2tsPITvZPIY for ; Tue, 11 Jan 2022 21:47:32 +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 35C97240592 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 228233A0A7F; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:49 +0100 Message-Id: <20220111204610.14262-14-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/35] lavc/cuviddec: do not reallocate the fifo unnecessarily 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: JK3Y145G5sO3 --- libavcodec/cuviddec.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index f03bbd8c4b..b1a3d674ab 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -1030,13 +1030,7 @@ static void cuvid_flush(AVCodecContext *avctx) if (ret < 0) goto error; - av_fifo_freep(&ctx->frame_queue); - - ctx->frame_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(CuvidParsedFrame)); - if (!ctx->frame_queue) { - av_log(avctx, AV_LOG_ERROR, "Failed to recreate frame queue on flush\n"); - return; - } + av_fifo_reset(ctx->frame_queue); if (ctx->cudecoder) { ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder); From patchwork Tue Jan 11 20:45:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33249 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048927iog; Tue, 11 Jan 2022 12:49:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJyljfSQ48vbYdkaj7hW4WruIZhzGcK8g+GKYX6eXpBBlJUhEfQw/7gYilz6N5vdIcgZyI+n X-Received: by 2002:a17:906:d29b:: with SMTP id ay27mr775470ejb.338.1641934198968; Tue, 11 Jan 2022 12:49:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934198; cv=none; d=google.com; s=arc-20160816; b=jlmHG6ETiO57phls4A17UwBcGKgkXH4q7XySAJsf2GuDeffxgDcouPgCRRvOekRrpq CI+EpE4bwcoFIX6fxoFCTM8io2eSUyrfDBM68BX+PIeGZzTWuSDhZBj7+Eg6uwMYyAfq inojyApHfZpowesRr20ddhq7hrq7d5z58yWuwf6zUPZzZwMMXJXRLKdISiarRd0Yj9Sx t4t7Cyex4ErQyRBtMW9pw7BMsqlRs6rG4prgHbDCriDO8NmefkBS5zXaxgfP5LZTH1gx tmCneIUdAhldPL0ngRrQYZXKlR+FkKSczW8iAVVBuKR+vKuvVf4TmIMx7ZD7h8cPCHVF PUwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=ftFnOoaYxwrtJ+7CGqtcS5UwS06ZfZHQ82YpvGolLfQ=; b=YvdmBaeWvYTwT3BL0Au/i2zvJH+WbxGusGb6UOdmZjPGc0mBX3NPk1hoyJoMSsGdR8 efKw5Vfg1rJO51oG7boN3yhwRDk4RHGOEfzvfZ6WxuGykSTWv2hCrRJ4VtT0MQJLmUV+ hZ7TZFdeHlV+M2iYBTE15V4BIST7j2bI9cgkKj+WXzB2Czr3armYtIKvfwAYi0xbmm1I xT3Lz6r4jLXniqLAgp22Rgc1V4W3Jve7VQ3v5q2B5xd+rCOp9s08R/wePQ93MDoO2rSo bV/+/mGy5SomBh+l8je3GaOtBZekkIjgrA+MjpQw7Ktj7bWeY4ws7FaUxKq6znc/eQNc jmbg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v1si1023544edc.565.2022.01.11.12.49.58; Tue, 11 Jan 2022 12:49:58 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E655E68AF99; Tue, 11 Jan 2022 22:47:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DDC0B68ACF5 for ; Tue, 11 Jan 2022 22:47:36 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 6E84C24017C for ; Tue, 11 Jan 2022 21:47:36 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id orW0UUlodbBp for ; Tue, 11 Jan 2022 21:47:35 +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 4DDEA24068D for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 26ABD3A0AB5; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:50 +0100 Message-Id: <20220111204610.14262-15-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/35] lavc/cuviddec: convert to the new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: dovTADyE5cO8 --- libavcodec/cuviddec.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index b1a3d674ab..5121fdb6a4 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -363,13 +363,13 @@ static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINF parsed_frame.dispinfo.progressive_frame = ctx->progressive_sequence; if (ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) { - av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL); + av_fifo_write(ctx->frame_queue, &parsed_frame, 1); } else { parsed_frame.is_deinterlacing = 1; - av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL); + av_fifo_write(ctx->frame_queue, &parsed_frame, 1); if (!ctx->drop_second_field) { parsed_frame.second_field = 1; - av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL); + av_fifo_write(ctx->frame_queue, &parsed_frame, 1); } } @@ -384,7 +384,7 @@ static int cuvid_is_buffer_full(AVCodecContext *avctx) if (ctx->deint_mode != cudaVideoDeinterlaceMode_Weave && !ctx->drop_second_field) delay *= 2; - return (av_fifo_size(ctx->frame_queue) / sizeof(CuvidParsedFrame)) + delay >= ctx->nb_surfaces; + return av_fifo_can_read(ctx->frame_queue) + delay >= ctx->nb_surfaces; } static int cuvid_decode_packet(AVCodecContext *avctx, const AVPacket *avpkt) @@ -487,7 +487,7 @@ static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame) if (ret < 0) return ret; - if (av_fifo_size(ctx->frame_queue)) { + if (av_fifo_can_read(ctx->frame_queue)) { const AVPixFmtDescriptor *pixdesc; CuvidParsedFrame parsed_frame; CUVIDPROCPARAMS params; @@ -495,7 +495,7 @@ static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame) int offset = 0; int i; - av_fifo_generic_read(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL); + av_fifo_read(ctx->frame_queue, &parsed_frame, 1); memset(¶ms, 0, sizeof(params)); params.progressive_frame = parsed_frame.dispinfo.progressive_frame; @@ -834,7 +834,7 @@ static av_cold int cuvid_decode_init(AVCodecContext *avctx) goto error; } - ctx->frame_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(CuvidParsedFrame)); + ctx->frame_queue = av_fifo_alloc2(ctx->nb_surfaces, sizeof(CuvidParsedFrame), 0); if (!ctx->frame_queue) { ret = AVERROR(ENOMEM); goto error; From patchwork Tue Jan 11 20:45:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33242 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048267iog; Tue, 11 Jan 2022 12:48:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJzBBKqKvb2SaPx3M25z5ZTPzHlFEp2p9B6lth9Sb/JvP4pGWHHTqFMasElQTxyctjwNb7iW X-Received: by 2002:a17:907:3e12:: with SMTP id hp18mr4811913ejc.576.1641934132365; Tue, 11 Jan 2022 12:48:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934132; cv=none; d=google.com; s=arc-20160816; b=LuyYNJVpPm+TAd+zNAkOqmJZbNvPIm8o6UsW6N2dhUPNC/xiKr7r0g+mbSiiR2onMr cXMwqmcqT31mm03YSsK+TA/l3sMoozF6VcvM0KvzU/LK8qQlaWnE9BtcC4PHLPa5iv/d M33UjdZlD7oafb2O6TkhN1iUHOfzY803CS629woBweWkOI5SbOWCAGx6U2Um4crDTSMI l4d1/Uegcxc2BRFmk+bFijd4cq617vhvSMIzUQpLhlQ6/BAhVsb5rQ4Ar+/2pkqL+sT5 2X6bbB5WtpvZ1JIXrvZEuHzGa3/xDQkZbD5sOwmnRBqkA/lEKef/mU6WB4IBl5JJ3x7/ rtWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=bSQTt7xVOheYai4iJ3L+CzmQx6CWR7dDpUPqs1/0iRA=; b=C4f6mlQUkkiF7YerJj7efx/jt1gAGYdSubwDKPBS0PIwxL6fp0slGIHu4BY3Qx8Xap Qq/sq3u2pqwvo+eGr5NTWO6TOfJvUz+xCFjzzgTSIPScUr4S/iSjrPx5X6OmZmr2CbE6 b0mEyT3KlYH5gcC6pROxwZ7+B+UtEOB+PV2L11lWop3h7QkJ4q6muwYeUJbEEv4jpXlb tUI2v5kWRF+B8zkk3bdNN0CfA5vwdDV0nJvDaU1BLAJRIRKN07zSG/xNZY5sWv3bdCQ3 DlcAAQs26gvI9Qlnv4uDIXZ1QQwbYTvDJmifucnDApqIi33PHCUQSLu0EChVelFDoLIn AIIw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sa41si5313342ejc.888.2022.01.11.12.48.52; Tue, 11 Jan 2022 12:48:52 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0E15768AF7E; Tue, 11 Jan 2022 22:47:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 19EC568AE87 for ; Tue, 11 Jan 2022 22:47:34 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id E088324056A for ; Tue, 11 Jan 2022 21:47:32 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id mvFidiFG6K-U for ; Tue, 11 Jan 2022 21:47:31 +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 1F978240179 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2AE493A0B4A; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:51 +0100 Message-Id: <20220111204610.14262-16-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/35] lavc/libvorbisenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: /42DN3DBi+Gg --- libavcodec/libvorbisenc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c index fa0d5f4b42..8db782b188 100644 --- a/libavcodec/libvorbisenc.c +++ b/libavcodec/libvorbisenc.c @@ -271,7 +271,7 @@ static av_cold int libvorbis_encode_init(AVCodecContext *avctx) avctx->frame_size = LIBVORBIS_FRAME_SIZE; ff_af_queue_init(avctx, &s->afq); - s->pkt_fifo = av_fifo_alloc(BUFFER_SIZE); + s->pkt_fifo = av_fifo_alloc2(BUFFER_SIZE, 1, 0); if (!s->pkt_fifo) { ret = AVERROR(ENOMEM); goto error; @@ -327,12 +327,12 @@ static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, /* add any available packets to the output packet buffer */ while ((ret = vorbis_bitrate_flushpacket(&s->vd, &op)) == 1) { - if (av_fifo_space(s->pkt_fifo) < sizeof(ogg_packet) + op.bytes) { + if (av_fifo_can_write(s->pkt_fifo) < sizeof(ogg_packet) + op.bytes) { av_log(avctx, AV_LOG_ERROR, "packet buffer is too small\n"); return AVERROR_BUG; } - av_fifo_generic_write(s->pkt_fifo, &op, sizeof(ogg_packet), NULL); - av_fifo_generic_write(s->pkt_fifo, op.packet, op.bytes, NULL); + av_fifo_write(s->pkt_fifo, &op, sizeof(ogg_packet)); + av_fifo_write(s->pkt_fifo, op.packet, op.bytes); } if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "error getting available packets\n"); @@ -345,14 +345,14 @@ static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, } /* check for available packets */ - if (av_fifo_size(s->pkt_fifo) < sizeof(ogg_packet)) + if (av_fifo_can_read(s->pkt_fifo) < sizeof(ogg_packet)) return 0; - av_fifo_generic_read(s->pkt_fifo, &op, sizeof(ogg_packet), NULL); + av_fifo_read(s->pkt_fifo, &op, sizeof(ogg_packet)); if ((ret = ff_get_encode_buffer(avctx, avpkt, op.bytes, 0)) < 0) return ret; - av_fifo_generic_read(s->pkt_fifo, avpkt->data, op.bytes, NULL); + av_fifo_read(s->pkt_fifo, avpkt->data, op.bytes); avpkt->pts = ff_samples_to_time_base(avctx, op.granulepos); From patchwork Tue Jan 11 20:45:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33243 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048356iog; Tue, 11 Jan 2022 12:49:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJzIlTEK1Da/eSPsTi9weK0e5ELS9gGpXLbo1eQoNdLPv72TPfaZ4ear85oKPwwfrr9ebJl1 X-Received: by 2002:a17:907:9810:: with SMTP id ji16mr2722870ejc.202.1641934141909; Tue, 11 Jan 2022 12:49:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934141; cv=none; d=google.com; s=arc-20160816; b=iLU6y14xhL7BYGSolz+YW22QMB2g+8GHULwpjQtgPxuNwlhHli3PYJipt8cpWMO024 q9qeM+8dicaLqQhEvLqXa7p4MQSzbgdtDwgQKTMUl5Mz8bFyOuAhhYeBlCyhXLS3+CMm LTJnDCyuMrqOgufZ0tzygSlwxw916UVADp8kTRV3a98+z4ebn6cL5EzFI5nSPmFefc7E 3x4xoNyq7511zZe8p4N9ZnJ66dtvUJ3tMHCRyAToFGXg54Mg9OQros0iW1pYe03Y5Y32 oYjEmFt0JGY43rU26FR7zcvrbrWQfdefMQt6Xt24GySvsYvVz1qtssERdrmaupjimtiB 5lWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=VfygAAls869d9n6nTRFJPeYqm/UJu7lXhXpWM9iae58=; b=Kovv29D0cXfgdfPYhox2xpq2d+cWAirpsx+PqbdWY+55FPjn7HhC5qMLtkHuI2Fvll 1gnFWiPME5vtWELTzBn/Jt0QhigWbsPRfdrIkDGlEh0/3V6XcacHCEskr4h+sT9yPkcc ZUofBUesYzcyVSd8sE4ROlLiRPrac7XYuw+BPIfOgparBBrmMMed8stBRgh92DE0i/ud b1gT6VJTUI53iYy1pD/Y2t6uOZ/Enyl7JfIbeuw/dCuKfveYyjn7xZgrNCGhb6tN/kSr un00aCu01+0nZfjgIFqXdnS2iyxX97Guf/zFmczV7r7gIHpXTvB0frBagjisYwVd2X8X 6LeA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p14si5605884edy.524.2022.01.11.12.49.01; Tue, 11 Jan 2022 12:49:01 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F2ED868AF86; Tue, 11 Jan 2022 22:47:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A24868AEAF for ; Tue, 11 Jan 2022 22:47:34 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 77BB52404FE for ; Tue, 11 Jan 2022 21:47:33 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id g-NVOgpIH7Jg for ; Tue, 11 Jan 2022 21:47:32 +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 3B164240593 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2F1B03A0BC7; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:52 +0100 Message-Id: <20220111204610.14262-17-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/35] lavc/libvpxenc: switch to the new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lU6R1uDEIS/C --- libavcodec/libvpxenc.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 10e5a22fa9..55f587c490 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -324,20 +324,11 @@ static av_cold void free_frame_list(struct FrameListData *list) } } -static av_cold int add_hdr10_plus(AVFifoBuffer *fifo, struct FrameHDR10Plus *data) -{ - int err = av_fifo_grow(fifo, sizeof(*data)); - if (err < 0) - return err; - av_fifo_generic_write(fifo, data, sizeof(*data), NULL); - return 0; -} - static av_cold void free_hdr10_plus_fifo(AVFifoBuffer **fifo) { FrameHDR10Plus frame_hdr10_plus; - while (av_fifo_size(*fifo) >= sizeof(frame_hdr10_plus)) { - av_fifo_generic_read(*fifo, &frame_hdr10_plus, sizeof(frame_hdr10_plus), NULL); + while (av_fifo_can_read(*fifo)) { + av_fifo_read(*fifo, &frame_hdr10_plus, 1); av_buffer_unref(&frame_hdr10_plus.hdr10_plus); } av_fifo_freep(fifo); @@ -347,16 +338,12 @@ static int copy_hdr10_plus_to_pkt(AVFifoBuffer *fifo, AVPacket *pkt) { FrameHDR10Plus frame_hdr10_plus; uint8_t *data; - if (!pkt) - return 0; - if (av_fifo_size(fifo) < sizeof(frame_hdr10_plus)) + if (!pkt || !av_fifo_can_read(fifo)) return 0; - av_fifo_generic_peek(fifo, &frame_hdr10_plus, sizeof(frame_hdr10_plus), NULL); + av_fifo_peek(fifo, &frame_hdr10_plus, 1, 0); if (!frame_hdr10_plus.hdr10_plus || frame_hdr10_plus.pts != pkt->pts) return 0; - av_fifo_generic_read(fifo, &frame_hdr10_plus, sizeof(frame_hdr10_plus), NULL); - if (!frame_hdr10_plus.hdr10_plus) - return 0; + av_fifo_drain2(fifo, 1); data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, frame_hdr10_plus.hdr10_plus->size); if (!data) { @@ -933,7 +920,8 @@ static av_cold int vpx_init(AVCodecContext *avctx, // it has PQ trc (SMPTE2084). if (enccfg.g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) { ctx->discard_hdr10_plus = 0; - ctx->hdr10_plus_fifo = av_fifo_alloc(sizeof(FrameHDR10Plus)); + ctx->hdr10_plus_fifo = av_fifo_alloc2(1, sizeof(FrameHDR10Plus), + AV_FIFO_FLAG_AUTO_GROW); if (!ctx->hdr10_plus_fifo) return AVERROR(ENOMEM); } @@ -1727,7 +1715,7 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, data.hdr10_plus = av_buffer_ref(hdr10_plus_metadata->buf); if (!data.hdr10_plus) return AVERROR(ENOMEM); - err = add_hdr10_plus(ctx->hdr10_plus_fifo, &data); + err = av_fifo_write(ctx->hdr10_plus_fifo, &data, 1); if (err < 0) { av_buffer_unref(&data.hdr10_plus); return err; From patchwork Tue Jan 11 20:45:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33244 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048454iog; Tue, 11 Jan 2022 12:49:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJyI+Dz2+/5a+0C0jzhWoEGDIrU9g3qPd9j4ddWPQwUA+a6TnPs7vMZKcUCn9SLY54Vs3ApB X-Received: by 2002:a17:907:3e0b:: with SMTP id hp11mr4915172ejc.584.1641934151843; Tue, 11 Jan 2022 12:49:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934151; cv=none; d=google.com; s=arc-20160816; b=AgnJG6zsI5e/7ogja9HSRENXJFVFNOU3/t812mNUv/NZ/bjOYtmBcZ2b7v/5A3i0iR +fuADk9r1NVQZGpvv1Pja+uv0cAXBSR/6ikTC8h7G9A5ufWv06MqjwDJ7X1V6U9WXBm9 VLXpfwQO+gP08tDo4EZNkYkCeaT+l5pBLN8+qU6WcUXjNn+R6b6uXhrgMCHHQ0N9Cz1C yITHPv0XKvxVsS29fAccrjywj69ld6YfdcnDPb+ao8koO/z9amV9ljwS5dYD/XBBWZ/l bN246Esvs9YfGvE0XJ1uo274y0MMCn39Ywgirq3DxeKaFG2A3Qxtg4UAx5qNoSrUual3 nwbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=J/IT66NWKNubez00hicfiDEHW1sRSvbCPj/N8FVcOaE=; b=lYiDUvPYID0ajFYI+NEYAtdE0YN54nqcCIiHLXhJlc5XqxAw4qM9eoTbcaMocqZ3QR f0HurG/AQmCjn6L3gHtOnkM/R7c0MrAps3k5BvH54o83zD8cb6CssNmYeesY0C5hVR29 XIzndcbUFddsyvC38+Vxg29a8O4CJFdBNHyRd7GTxs9jWFNuhlfAO73HHL4DyliyrjI2 GUzi2Jad/5G1zw7sFfsG0PhRS4ru/Jm3jB2qNZJA192ff5feUy2otMmKBhOHBEPh8NAg OqtNwNvbDoHHei+oOeWPgs9PI6aiEexSJRlrQ2ft6ThSKa3snOjF/+6xFa6pJ5Ei5/u5 BzJw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l11si5867273ejo.781.2022.01.11.12.49.11; Tue, 11 Jan 2022 12:49:11 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 10D6368A55A; Tue, 11 Jan 2022 22:47:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5F8A468AE87 for ; Tue, 11 Jan 2022 22:47:34 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id E8C6324017C for ; Tue, 11 Jan 2022 21:47:33 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 6B7zhhHyw_NX for ; Tue, 11 Jan 2022 21:47:33 +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 3E8CC24062A for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 334E23A0BE6; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:53 +0100 Message-Id: <20220111204610.14262-18-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/35] lavc/libvpxenc: remove unneeded context variable 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: QiQRP9AiDyRM discard_hdr10_plus is 0 IFF hdr10_plus_fifo is non-NULL, so we can test for the latter and avoid an extra variable. --- libavcodec/libvpxenc.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 55f587c490..6bb19289ff 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -127,7 +127,6 @@ typedef struct VPxEncoderContext { int tune_content; int corpus_complexity; int tpl_model; - int discard_hdr10_plus; AVFifoBuffer *hdr10_plus_fifo; /** * If the driver does not support ROI then warn the first time we @@ -899,7 +898,6 @@ static av_cold int vpx_init(AVCodecContext *avctx, #endif AVDictionaryEntry* en = NULL; - ctx->discard_hdr10_plus = 1; av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str()); av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config()); @@ -919,7 +917,6 @@ static av_cold int vpx_init(AVCodecContext *avctx, // Keep HDR10+ if it has bit depth higher than 8 and // it has PQ trc (SMPTE2084). if (enccfg.g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) { - ctx->discard_hdr10_plus = 0; ctx->hdr10_plus_fifo = av_fifo_alloc2(1, sizeof(FrameHDR10Plus), AV_FIFO_FLAG_AUTO_GROW); if (!ctx->hdr10_plus_fifo) @@ -1289,7 +1286,7 @@ static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, } if (cx_frame->frame_number != -1) { VPxContext *ctx = avctx->priv_data; - if (!ctx->discard_hdr10_plus) { + if (ctx->hdr10_plus_fifo) { int err = copy_hdr10_plus_to_pkt(ctx->hdr10_plus_fifo, pkt); if (err < 0) return err; @@ -1704,7 +1701,7 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, } } - if (!ctx->discard_hdr10_plus) { + if (ctx->hdr10_plus_fifo) { AVFrameSideData *hdr10_plus_metadata; // Add HDR10+ metadata to queue. hdr10_plus_metadata = av_frame_get_side_data(frame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS); From patchwork Tue Jan 11 20:45:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33246 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048656iog; Tue, 11 Jan 2022 12:49:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJzTw/0X2YV+Oc36l+DDu1XReKi5rRSrBlBsf06SIcSL6QPUGS35QTEoxUzbAU9haldkKYVm X-Received: by 2002:a05:6402:5241:: with SMTP id t1mr5971388edd.291.1641934171690; Tue, 11 Jan 2022 12:49:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934171; cv=none; d=google.com; s=arc-20160816; b=0duMIFFOvNB9iHp3/ecFlNq/nJHhfjqQGvGlAZXen7yrZS/BGfhxPqa6u3l9xKVQoq w/Oebm2I8sECWE7GMRZfSUbczf3WzaPqhtxXhWkoMTGeMedaoyEywPi0MCv0obM6tFQS TYKd4B/k7Jh1/k+j0pOlgs2l3z/14p6PiIN/NnUkQttERomoRWoaSBx7cUXw6szXfmVt Avd9bQLvQ2pXmvTDLP8O7pfiyX7LpmfGF02GuBEATT+/0pONobHfLdHIyQSNt+qGW7VL 7Hp+W7uulEqx4taqaxP8VABDewQz6UDeh0AnSf0JOJhGvKijjUVwQURpImND9kx9l3dW AE8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=s4hmk+k4Q/asLGU+WUJGYqEYgtXkr9cBEMfv502UBM4=; b=D87+MnVZGwX7mTPeZrV/UR1QBuzHSCuGR8NUALJjqB3QsIaTNqJodD1iJhzZfUgy9Z rY6Pl0LBnQ1kA4SZB0IRiEQnGX6/LMA5QjRHLKnsxl3SCGX0D8quJaw0Gvdg1rHunsLA bPcWlpkMwyW9l2oJ57jsTD8SueeBeKZnDrc+IPlxadzzX7sYrXpitj2U4l57T46d6Tlj eNXrpPpky+5sMFPbSv+MIx6kWrrIlXLvFRg4Ebm2dsBMBTLrsabQ5xBoFsNW7RWto80g y3StFObKzNu7x8FQu82zS66XknBnJKcEyQXWcI+dA0aMqmDU6tjOY6B5yj/Sb/w3j52s Xpzg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u4si6178052ejy.613.2022.01.11.12.49.31; Tue, 11 Jan 2022 12:49:31 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 13C8D68AF89; Tue, 11 Jan 2022 22:47:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2C7CD68AC71 for ; Tue, 11 Jan 2022 22:47:35 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9C14224017C for ; Tue, 11 Jan 2022 21:47:34 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id MnJl2XItXrnS for ; Tue, 11 Jan 2022 21:47:33 +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 3C16D2405F0 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 378D43A0BF3; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:54 +0100 Message-Id: <20220111204610.14262-19-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/35] lavc/nvenc: switch to the new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: idj/I/e2EXS0 --- libavcodec/nvenc.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 850c46022b..ae57399e96 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1568,7 +1568,7 @@ static av_cold int nvenc_alloc_surface(AVCodecContext *avctx, int idx) ctx->surfaces[idx].output_surface = allocOut.bitstreamBuffer; - av_fifo_generic_write(ctx->unused_surface_queue, &tmp_surface, sizeof(tmp_surface), NULL); + av_fifo_write(ctx->unused_surface_queue, &tmp_surface, 1); return 0; } @@ -1582,18 +1582,18 @@ static av_cold int nvenc_setup_surfaces(AVCodecContext *avctx) if (!ctx->surfaces) return AVERROR(ENOMEM); - ctx->timestamp_list = av_fifo_alloc(ctx->nb_surfaces * sizeof(int64_t)); + ctx->timestamp_list = av_fifo_alloc2(ctx->nb_surfaces, sizeof(int64_t), 0); if (!ctx->timestamp_list) return AVERROR(ENOMEM); - ctx->unused_surface_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(NvencSurface*)); + ctx->unused_surface_queue = av_fifo_alloc2(ctx->nb_surfaces, sizeof(NvencSurface*), 0); if (!ctx->unused_surface_queue) return AVERROR(ENOMEM); - ctx->output_surface_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(NvencSurface*)); + ctx->output_surface_queue = av_fifo_alloc2(ctx->nb_surfaces, sizeof(NvencSurface*), 0); if (!ctx->output_surface_queue) return AVERROR(ENOMEM); - ctx->output_surface_ready_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(NvencSurface*)); + ctx->output_surface_ready_queue = av_fifo_alloc2(ctx->nb_surfaces, sizeof(NvencSurface*), 0); if (!ctx->output_surface_ready_queue) return AVERROR(ENOMEM); @@ -1777,11 +1777,11 @@ static NvencSurface *get_free_frame(NvencContext *ctx) { NvencSurface *tmp_surf; - if (!(av_fifo_size(ctx->unused_surface_queue) > 0)) + if (!av_fifo_can_read(ctx->unused_surface_queue)) // queue empty return NULL; - av_fifo_generic_read(ctx->unused_surface_queue, &tmp_surf, sizeof(tmp_surf), NULL); + av_fifo_read(ctx->unused_surface_queue, &tmp_surf, 1); return tmp_surf; } @@ -2000,14 +2000,14 @@ static void nvenc_codec_specific_pic_params(AVCodecContext *avctx, static inline void timestamp_queue_enqueue(AVFifoBuffer* queue, int64_t timestamp) { - av_fifo_generic_write(queue, ×tamp, sizeof(timestamp), NULL); + av_fifo_write(queue, ×tamp, 1); } static inline int64_t timestamp_queue_dequeue(AVFifoBuffer* queue) { int64_t timestamp = AV_NOPTS_VALUE; - if (av_fifo_size(queue) > 0) - av_fifo_generic_read(queue, ×tamp, sizeof(timestamp), NULL); + if (av_fifo_can_read(queue)) + av_fifo_read(queue, ×tamp, 1); return timestamp; } @@ -2152,8 +2152,8 @@ static int output_ready(AVCodecContext *avctx, int flush) NvencContext *ctx = avctx->priv_data; int nb_ready, nb_pending; - nb_ready = av_fifo_size(ctx->output_surface_ready_queue) / sizeof(NvencSurface*); - nb_pending = av_fifo_size(ctx->output_surface_queue) / sizeof(NvencSurface*); + nb_ready = av_fifo_can_read(ctx->output_surface_ready_queue); + nb_pending = av_fifo_can_read(ctx->output_surface_queue); if (flush) return nb_ready > 0; return (nb_ready > 0) && (nb_ready + nb_pending >= ctx->async_depth); @@ -2442,15 +2442,15 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) return nvenc_print_error(avctx, nv_status, "EncodePicture failed!"); if (frame && frame->buf[0]) { - av_fifo_generic_write(ctx->output_surface_queue, &in_surf, sizeof(in_surf), NULL); + av_fifo_write(ctx->output_surface_queue, &in_surf, 1); timestamp_queue_enqueue(ctx->timestamp_list, frame->pts); } /* all the pending buffers are now ready for output */ if (nv_status == NV_ENC_SUCCESS) { - while (av_fifo_size(ctx->output_surface_queue) > 0) { - av_fifo_generic_read(ctx->output_surface_queue, &tmp_out_surf, sizeof(tmp_out_surf), NULL); - av_fifo_generic_write(ctx->output_surface_ready_queue, &tmp_out_surf, sizeof(tmp_out_surf), NULL); + while (av_fifo_can_read(ctx->output_surface_queue)) { + av_fifo_read (ctx->output_surface_queue, &tmp_out_surf, 1); + av_fifo_write(ctx->output_surface_ready_queue, &tmp_out_surf, 1); } } @@ -2483,7 +2483,7 @@ int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt) av_frame_unref(frame); if (output_ready(avctx, avctx->internal->draining)) { - av_fifo_generic_read(ctx->output_surface_ready_queue, &tmp_out_surf, sizeof(tmp_out_surf), NULL); + av_fifo_read(ctx->output_surface_ready_queue, &tmp_out_surf, 1); res = nvenc_push_context(avctx); if (res < 0) @@ -2498,7 +2498,7 @@ int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt) if (res) return res; - av_fifo_generic_write(ctx->unused_surface_queue, &tmp_out_surf, sizeof(tmp_out_surf), NULL); + av_fifo_write(ctx->unused_surface_queue, &tmp_out_surf, 1); } else if (avctx->internal->draining) { return AVERROR_EOF; } else { From patchwork Tue Jan 11 20:45:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33254 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049434iog; Tue, 11 Jan 2022 12:50:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJz3YeOT9CtYvknTL/W+Tp+GzCzE3XDpo0b1OIjlrbR1hRK17qgf9bcWulxv/byjncO4zYYo X-Received: by 2002:a05:6402:350a:: with SMTP id b10mr5872242edd.89.1641934247502; Tue, 11 Jan 2022 12:50:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934247; cv=none; d=google.com; s=arc-20160816; b=m4Tih3XjSexpTmfLsGZO4Nx8EjHMU6l2KZbeVVrH0MhKtZt597L0CX78RANsFN9sAZ u1eSMik5brMF149w4m7pyVfOe/jNallmFNS78AqH+IB0iIGvrLPAsPaJUI9VkGx32kjt xx/keme6qzmXEXspe2TSaNeiJ3q2ovLrDg4AQGZ/WWP1z2NdqYIJTprys0Kg6wKLyZyQ Yk4k4MkQW7ETsEntKuMV9b1VKH94cZMzKlOj0yJw+d9WS4VCB8R4y6YAr5utIjrL+kC5 x0FRUVXDi1/wKFk7ZsOzOZK/XqLodW+40ta+9bflIvWHAUYdiudSOITs6R2N8yHlNd6v oBVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=+CNfBY9pBMn6zgkgrj87U6j8Q7k/nDJ0AonOp9grsEQ=; b=zFaQNtBW8jC1PqN0oRll7P5YXygGghTRZ/9yNB84xVtX12QL0I7fQdXzecJB28we9/ FJHR7UmNPP5RfoKuObHeaNSJdxTPR2UvC628WpikBnIj1IWZaqPuQgRB4a8/amwksBfu ISyC6U22DgU/EiXs7SOhW3lLiG2pSa6/MwKM99NZTm18mZjGtUxzcNwKhDxUXOVeF1RJ j2p57Ez8LUEgokrQw/qSCYb44oFO8mtq1mFl5fmXL3WsZymFIajU85iOcFPVp0kAhi8C /nlEh+hty6OG7Irbtfxj5kY9L1f+M17krewHTr0V4k0gCx7Fj55VOb8aY0XNZYiShX8t A8Ow== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q27si5267626eji.585.2022.01.11.12.50.47; Tue, 11 Jan 2022 12:50:47 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9C0F468AFCB; Tue, 11 Jan 2022 22:47:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5131868AE0F for ; Tue, 11 Jan 2022 22:47:37 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id BBCB52404FE for ; Tue, 11 Jan 2022 21:47:36 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id KuwHteX9OrCr for ; Tue, 11 Jan 2022 21:47:34 +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 4AB93240688 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 3C8583A0C0A; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:55 +0100 Message-Id: <20220111204610.14262-20-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/35] lavc/qsvdec: switch to the new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: d1i6h4sZjctd --- libavcodec/qsvdec.c | 80 +++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 08370c8a0b..acdf7804f6 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -56,6 +56,11 @@ static const AVRational mfx_tb = { 1, 90000 }; AV_NOPTS_VALUE : pts_tb.num ? \ av_rescale_q(mfx_pts, mfx_tb, pts_tb) : mfx_pts) +typedef struct QSVAsyncFrame { + mfxSyncPoint *sync; + QSVFrame *frame; +} QSVAsyncFrame; + typedef struct QSVContext { // the session used for decoding mfxSession session; @@ -208,16 +213,6 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses return 0; } -static inline unsigned int qsv_fifo_item_size(void) -{ - return sizeof(mfxSyncPoint*) + sizeof(QSVFrame*); -} - -static inline unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) -{ - return av_fifo_size(fifo) / qsv_fifo_item_size(); -} - static int qsv_decode_preinit(AVCodecContext *avctx, QSVContext *q, enum AVPixelFormat pix_fmt, mfxVideoParam *param) { mfxSession session = NULL; @@ -235,7 +230,7 @@ static int qsv_decode_preinit(AVCodecContext *avctx, QSVContext *q, enum AVPixel } if (!q->async_fifo) { - q->async_fifo = av_fifo_alloc(q->async_depth * qsv_fifo_item_size()); + q->async_fifo = av_fifo_alloc2(q->async_depth, sizeof(QSVAsyncFrame), 0); if (!q->async_fifo) return AVERROR(ENOMEM); } @@ -502,7 +497,6 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q, AVFrame *frame, int *got_frame, const AVPacket *avpkt) { - QSVFrame *out_frame; mfxFrameSurface1 *insurf; mfxFrameSurface1 *outsurf; mfxSyncPoint *sync; @@ -561,6 +555,7 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q, } if (*sync) { + QSVAsyncFrame aframe; QSVFrame *out_frame = find_frame(q, outsurf); if (!out_frame) { @@ -571,35 +566,36 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q, } out_frame->queued = 1; - av_fifo_generic_write(q->async_fifo, &out_frame, sizeof(out_frame), NULL); - av_fifo_generic_write(q->async_fifo, &sync, sizeof(sync), NULL); + + aframe = (QSVAsyncFrame){ sync, out_frame }; + av_fifo_write(q->async_fifo, &aframe, 1); } else { av_freep(&sync); } - if ((qsv_fifo_size(q->async_fifo) >= q->async_depth) || - (!avpkt->size && av_fifo_size(q->async_fifo))) { + if ((av_fifo_can_read(q->async_fifo) >= q->async_depth) || + (!avpkt->size && av_fifo_can_read(q->async_fifo))) { + QSVAsyncFrame aframe; AVFrame *src_frame; - av_fifo_generic_read(q->async_fifo, &out_frame, sizeof(out_frame), NULL); - av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); - out_frame->queued = 0; + av_fifo_read(q->async_fifo, &aframe, 1); + aframe.frame->queued = 0; if (avctx->pix_fmt != AV_PIX_FMT_QSV) { do { - ret = MFXVideoCORE_SyncOperation(q->session, *sync, 1000); + ret = MFXVideoCORE_SyncOperation(q->session, *aframe.sync, 1000); } while (ret == MFX_WRN_IN_EXECUTION); } - av_freep(&sync); + av_freep(&aframe.sync); - src_frame = out_frame->frame; + src_frame = aframe.frame->frame; ret = av_frame_ref(frame, src_frame); if (ret < 0) return ret; - outsurf = &out_frame->surface; + outsurf = &aframe.frame->surface; frame->pts = MFX_PTS_TO_PTS(outsurf->Data.TimeStamp, avctx->pkt_timebase); @@ -611,10 +607,10 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q, outsurf->Info.PicStruct & MFX_PICSTRUCT_FIELD_TFF; frame->interlaced_frame = !(outsurf->Info.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); - frame->pict_type = ff_qsv_map_pictype(out_frame->dec_info.FrameType); + frame->pict_type = ff_qsv_map_pictype(aframe.frame->dec_info.FrameType); //Key frame is IDR frame is only suitable for H264. For HEVC, IRAPs are key frames. if (avctx->codec_id == AV_CODEC_ID_H264) - frame->key_frame = !!(out_frame->dec_info.FrameType & MFX_FRAMETYPE_IDR); + frame->key_frame = !!(aframe.frame->dec_info.FrameType & MFX_FRAMETYPE_IDR); /* update the surface properties */ if (avctx->pix_fmt == AV_PIX_FMT_QSV) @@ -633,14 +629,11 @@ static void qsv_decode_close_qsvcontext(QSVContext *q) if (q->session) MFXVideoDECODE_Close(q->session); - while (q->async_fifo && av_fifo_size(q->async_fifo)) { - QSVFrame *out_frame; - mfxSyncPoint *sync; + while (q->async_fifo && av_fifo_can_read(q->async_fifo)) { + QSVAsyncFrame aframe; - av_fifo_generic_read(q->async_fifo, &out_frame, sizeof(out_frame), NULL); - av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); - - av_freep(&sync); + av_fifo_read(q->async_fifo, &aframe, 1); + av_freep(&aframe.sync); } while (cur) { @@ -650,8 +643,7 @@ static void qsv_decode_close_qsvcontext(QSVContext *q) cur = q->work_frames; } - av_fifo_free(q->async_fifo); - q->async_fifo = NULL; + av_fifo_freep(&q->async_fifo); ff_qsv_close_internal_session(&q->internal_qs); @@ -742,8 +734,8 @@ typedef struct QSVDecContext { static void qsv_clear_buffers(QSVDecContext *s) { AVPacket pkt; - while (av_fifo_size(s->packet_fifo) >= sizeof(pkt)) { - av_fifo_generic_read(s->packet_fifo, &pkt, sizeof(pkt), NULL); + while (av_fifo_can_read(s->packet_fifo)) { + av_fifo_read(s->packet_fifo, &pkt, 1); av_packet_unref(&pkt); } @@ -797,7 +789,8 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx) } s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12; - s->packet_fifo = av_fifo_alloc(sizeof(AVPacket)); + s->packet_fifo = av_fifo_alloc2(1, sizeof(AVPacket), + AV_FIFO_FLAG_AUTO_GROW); if (!s->packet_fifo) { ret = AVERROR(ENOMEM); goto fail; @@ -823,17 +816,10 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, if (avpkt->size) { AVPacket input_ref; - if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) { - ret = av_fifo_realloc2(s->packet_fifo, - av_fifo_size(s->packet_fifo) + sizeof(input_ref)); - if (ret < 0) - return ret; - } - ret = av_packet_ref(&input_ref, avpkt); if (ret < 0) return ret; - av_fifo_generic_write(s->packet_fifo, &input_ref, sizeof(input_ref), NULL); + av_fifo_write(s->packet_fifo, &input_ref, 1); } /* process buffered data */ @@ -841,12 +827,12 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, /* prepare the input data */ if (s->buffer_pkt.size <= 0) { /* no more data */ - if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) + if (!av_fifo_can_read(s->packet_fifo)) return avpkt->size ? avpkt->size : qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); /* in progress of reinit, no read from fifo and keep the buffer_pkt */ if (!s->qsv.reinit_flag) { av_packet_unref(&s->buffer_pkt); - av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL); + av_fifo_read(s->packet_fifo, &s->buffer_pkt, 1); } } From patchwork Tue Jan 11 20:45:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33245 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048556iog; Tue, 11 Jan 2022 12:49:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJz9NJ2gaifsp6LCRA6wgNFuIK3Wr8gGQjRA5byj4yL5Gd5kHE6LuEIYX3aBR9iTQmbcLIlt X-Received: by 2002:a05:6402:2709:: with SMTP id y9mr5907783edd.346.1641934161574; Tue, 11 Jan 2022 12:49:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934161; cv=none; d=google.com; s=arc-20160816; b=Ub1ZDN8rnkcFVvkYpwcY8hHsOn8dxa9MMjXTt7ZtRhTWY66oxQ1GcLD3k9XSZsoGnB HL0dx/xFTRvifurkB3vo1MAoGbqpsR/EXsW38Q0p+7UbOUhMHDcLgZ6IX6AvhYMaVY+a gq9OWEZcrDPcXIcv++IIkVjUkq4u0DAHE5kQLxh0+EXlnyaHStv7sWYiELAUuVnSEO8w 2MOhHc1YhPcvslwTXDtqWeTzcv5QGAEq4R/bYKxTb84NCx0u3DXa6I4mUlO9rKp3oSMz KKaF5YyMDGR+2ahgYF8SJWZmSJzDnYnpWp79/aHvgS3vGn1LsVhwMDZpBHSJDl9dLy5B dCMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=zUJpmg3Vu1NlPMdPuCvyMED0CzZXS6hoFtWkypcAKRs=; b=gmo2rNSS+m0ftN/lRmKVYawElXnbeXFUZ1i6osO8lFzRQAgq8Zwz3Uz9p3EXNVBlh3 SMgy9I2BpRQq+eV5Ff990zbvXkDUlhb+GdI/4jMiVd3FZGkMxpp6HdgC8X77Y3vZaIhe jR8EObEv0zIsaW6ggRMq9izOhBawEfiujW+z+0InC2oYxEeE4Gq0zyio3dXAE79P0P+q RpI47XrDyeXw6rfB/0qws67QESICRv11v2IYDd0/LBM3m5hrgthir6bYL16LD3ka25SU ZVIqqEX/WR9L3l3ED2TPxoqdbGmZFdafmD0yA6jVDSPzokaO6d7zO5UHoEAH/0vNJX0q gGQQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h19si6234150edb.370.2022.01.11.12.49.21; Tue, 11 Jan 2022 12:49:21 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1E87868AF2D; Tue, 11 Jan 2022 22:47:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A4C1B68AEBD for ; Tue, 11 Jan 2022 22:47:34 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 2FD082404FE for ; Tue, 11 Jan 2022 21:47:34 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id GFokBOZ2ZdjI for ; Tue, 11 Jan 2022 21:47:32 +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 3D2BE2405F5 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4049B3A0C43; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:56 +0100 Message-Id: <20220111204610.14262-21-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 21/35] lavc/qsvenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: FxFYweEBtkSQ --- libavcodec/qsvenc.c | 120 +++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 68 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 4e7a15f060..ee489325f5 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -85,6 +85,12 @@ static const struct profile_names vp9_profiles[] = { #endif }; +typedef struct QSVPacket { + AVPacket pkt; + mfxSyncPoint *sync; + mfxBitstream *bs; +} QSVPacket; + static const char *print_profile(enum AVCodecID codec_id, mfxU16 profile) { const struct profile_names *profiles; @@ -1258,16 +1264,6 @@ static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q) return 0; } -static inline unsigned int qsv_fifo_item_size(void) -{ - return sizeof(AVPacket) + sizeof(mfxSyncPoint*) + sizeof(mfxBitstream*); -} - -static inline unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) -{ - return av_fifo_size(fifo)/qsv_fifo_item_size(); -} - int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) { int iopattern = 0; @@ -1276,7 +1272,7 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) q->param.AsyncDepth = q->async_depth; - q->async_fifo = av_fifo_alloc(q->async_depth * qsv_fifo_item_size()); + q->async_fifo = av_fifo_alloc2(q->async_depth, sizeof(QSVPacket), 0); if (!q->async_fifo) return AVERROR(ENOMEM); @@ -1578,15 +1574,13 @@ static void print_interlace_msg(AVCodecContext *avctx, QSVEncContext *q) static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, const AVFrame *frame) { - AVPacket new_pkt = { 0 }; - mfxBitstream *bs = NULL; + QSVPacket pkt = { { 0 } }; #if QSV_VERSION_ATLEAST(1, 26) mfxExtAVCEncodedFrameInfo *enc_info = NULL; mfxExtBuffer **enc_buf = NULL; #endif mfxFrameSurface1 *surf = NULL; - mfxSyncPoint *sync = NULL; QSVFrame *qsv_frame = NULL; mfxEncodeCtrl* enc_ctrl = NULL; int ret; @@ -1609,17 +1603,17 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, } } - ret = av_new_packet(&new_pkt, q->packet_size); + ret = av_new_packet(&pkt.pkt, q->packet_size); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error allocating the output packet\n"); return ret; } - bs = av_mallocz(sizeof(*bs)); - if (!bs) + pkt.bs = av_mallocz(sizeof(*pkt.bs)); + if (!pkt.bs) goto nomem; - bs->Data = new_pkt.data; - bs->MaxLength = new_pkt.size; + pkt.bs->Data = pkt.pkt.data; + pkt.bs->MaxLength = pkt.pkt.size; #if QSV_VERSION_ATLEAST(1, 26) if (avctx->codec_id == AV_CODEC_ID_H264) { @@ -1629,13 +1623,13 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, enc_info->Header.BufferId = MFX_EXTBUFF_ENCODED_FRAME_INFO; enc_info->Header.BufferSz = sizeof (*enc_info); - bs->NumExtParam = 1; + pkt.bs->NumExtParam = 1; enc_buf = av_mallocz(sizeof(mfxExtBuffer *)); if (!enc_buf) goto nomem; enc_buf[0] = (mfxExtBuffer *)enc_info; - bs->ExtParam = enc_buf; + pkt.bs->ExtParam = enc_buf; } #endif @@ -1643,12 +1637,12 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl); } - sync = av_mallocz(sizeof(*sync)); - if (!sync) + pkt.sync = av_mallocz(sizeof(*pkt.sync)); + if (!pkt.sync) goto nomem; do { - ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, bs, sync); + ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, pkt.bs, pkt.sync); if (ret == MFX_WRN_DEVICE_BUSY) av_usleep(500); } while (ret == MFX_WRN_DEVICE_BUSY || ret == MFX_WRN_IN_EXECUTION); @@ -1667,15 +1661,13 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, ret = 0; - if (*sync) { - av_fifo_generic_write(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL); - av_fifo_generic_write(q->async_fifo, &sync, sizeof(sync), NULL); - av_fifo_generic_write(q->async_fifo, &bs, sizeof(bs), NULL); + if (*pkt.sync) { + av_fifo_write(q->async_fifo, &pkt, 1); } else { free: - av_freep(&sync); - av_packet_unref(&new_pkt); - av_freep(&bs); + av_freep(&pkt.sync); + av_packet_unref(&pkt.pkt); + av_freep(&pkt.bs); #if QSV_VERSION_ATLEAST(1, 26) if (avctx->codec_id == AV_CODEC_ID_H264) { av_freep(&enc_info); @@ -1699,60 +1691,56 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, if (ret < 0) return ret; - if ((qsv_fifo_size(q->async_fifo) >= q->async_depth) || - (!frame && av_fifo_size(q->async_fifo))) { - AVPacket new_pkt; - mfxBitstream *bs; - mfxSyncPoint *sync; + if ((av_fifo_can_read(q->async_fifo) >= q->async_depth) || + (!frame && av_fifo_can_read(q->async_fifo))) { + QSVPacket qpkt; #if QSV_VERSION_ATLEAST(1, 26) mfxExtAVCEncodedFrameInfo *enc_info; mfxExtBuffer **enc_buf; #endif enum AVPictureType pict_type; - av_fifo_generic_read(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL); - av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); - av_fifo_generic_read(q->async_fifo, &bs, sizeof(bs), NULL); + av_fifo_read(q->async_fifo, &qpkt, 1); do { - ret = MFXVideoCORE_SyncOperation(q->session, *sync, 1000); + ret = MFXVideoCORE_SyncOperation(q->session, *qpkt.sync, 1000); } while (ret == MFX_WRN_IN_EXECUTION); - new_pkt.dts = av_rescale_q(bs->DecodeTimeStamp, (AVRational){1, 90000}, avctx->time_base); - new_pkt.pts = av_rescale_q(bs->TimeStamp, (AVRational){1, 90000}, avctx->time_base); - new_pkt.size = bs->DataLength; + qpkt.pkt.dts = av_rescale_q(qpkt.bs->DecodeTimeStamp, (AVRational){1, 90000}, avctx->time_base); + qpkt.pkt.pts = av_rescale_q(qpkt.bs->TimeStamp, (AVRational){1, 90000}, avctx->time_base); + qpkt.pkt.size = qpkt.bs->DataLength; - if (bs->FrameType & MFX_FRAMETYPE_IDR || bs->FrameType & MFX_FRAMETYPE_xIDR) { - new_pkt.flags |= AV_PKT_FLAG_KEY; + if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType & MFX_FRAMETYPE_xIDR) { + qpkt.pkt.flags |= AV_PKT_FLAG_KEY; pict_type = AV_PICTURE_TYPE_I; - } else if (bs->FrameType & MFX_FRAMETYPE_I || bs->FrameType & MFX_FRAMETYPE_xI) + } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType & MFX_FRAMETYPE_xI) pict_type = AV_PICTURE_TYPE_I; - else if (bs->FrameType & MFX_FRAMETYPE_P || bs->FrameType & MFX_FRAMETYPE_xP) + else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType & MFX_FRAMETYPE_xP) pict_type = AV_PICTURE_TYPE_P; - else if (bs->FrameType & MFX_FRAMETYPE_B || bs->FrameType & MFX_FRAMETYPE_xB) + else if (qpkt.bs->FrameType & MFX_FRAMETYPE_B || qpkt.bs->FrameType & MFX_FRAMETYPE_xB) pict_type = AV_PICTURE_TYPE_B; - else if (bs->FrameType == MFX_FRAMETYPE_UNKNOWN) { + else if (qpkt.bs->FrameType == MFX_FRAMETYPE_UNKNOWN) { pict_type = AV_PICTURE_TYPE_NONE; av_log(avctx, AV_LOG_WARNING, "Unknown FrameType, set pict_type to AV_PICTURE_TYPE_NONE.\n"); } else { - av_log(avctx, AV_LOG_ERROR, "Invalid FrameType:%d.\n", bs->FrameType); + av_log(avctx, AV_LOG_ERROR, "Invalid FrameType:%d.\n", qpkt.bs->FrameType); return AVERROR_INVALIDDATA; } #if QSV_VERSION_ATLEAST(1, 26) if (avctx->codec_id == AV_CODEC_ID_H264) { - enc_buf = bs->ExtParam; - enc_info = (mfxExtAVCEncodedFrameInfo *)(*bs->ExtParam); - ff_side_data_set_encoder_stats(&new_pkt, + enc_buf = qpkt.bs->ExtParam; + enc_info = (mfxExtAVCEncodedFrameInfo *)(*enc_buf); + ff_side_data_set_encoder_stats(&qpkt.pkt, enc_info->QP * FF_QP2LAMBDA, NULL, 0, pict_type); av_freep(&enc_info); av_freep(&enc_buf); } #endif - av_freep(&bs); - av_freep(&sync); + av_freep(&qpkt.bs); + av_freep(&qpkt.sync); - av_packet_move_ref(pkt, &new_pkt); + av_packet_move_ref(pkt, &qpkt.pkt); *got_packet = 1; } @@ -1782,26 +1770,22 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) cur = q->work_frames; } - while (q->async_fifo && av_fifo_size(q->async_fifo)) { - AVPacket pkt; - mfxSyncPoint *sync; - mfxBitstream *bs; + while (q->async_fifo && av_fifo_can_read(q->async_fifo)) { + QSVPacket pkt; - av_fifo_generic_read(q->async_fifo, &pkt, sizeof(pkt), NULL); - av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); - av_fifo_generic_read(q->async_fifo, &bs, sizeof(bs), NULL); + av_fifo_read(q->async_fifo, &pkt, 1); #if QSV_VERSION_ATLEAST(1, 26) if (avctx->codec_id == AV_CODEC_ID_H264) { - mfxExtBuffer **enc_buf = bs->ExtParam; - mfxExtAVCEncodedFrameInfo *enc_info = (mfxExtAVCEncodedFrameInfo *)(*bs->ExtParam); + mfxExtBuffer **enc_buf = pkt.bs->ExtParam; + mfxExtAVCEncodedFrameInfo *enc_info = (mfxExtAVCEncodedFrameInfo *)(*enc_buf); av_freep(&enc_info); av_freep(&enc_buf); } #endif - av_freep(&sync); - av_freep(&bs); - av_packet_unref(&pkt); + av_freep(&pkt.sync); + av_freep(&pkt.bs); + av_packet_unref(&pkt.pkt); } av_fifo_free(q->async_fifo); q->async_fifo = NULL; From patchwork Tue Jan 11 20:45:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33262 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4050406iog; Tue, 11 Jan 2022 12:52:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJz0aY+5C8uYeloAPGQuIKUv0LIZvtw5sH3kl+B4SV7SmRjXdQtF8VInUAbDsrQR1g976/t9 X-Received: by 2002:a17:907:1701:: with SMTP id le1mr4859955ejc.608.1641934346891; Tue, 11 Jan 2022 12:52:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934346; cv=none; d=google.com; s=arc-20160816; b=FgKCQ1dUbPBuGIxEV58IEJ0te6JA7UF6qOvX+pT5vtOtnd6NHN3iagsbNiZYStXnZ3 hZvyEfcLWxVsUaXuzGq9SBnWSpoVKDpp30uzrr8zN+ABsMVJDCur2OSHgx5CFPnOgiLD 4F0ZncnF8qpf/tgKX6cnzajczhBlslMN6NzjMtnJ0BjA4k2wqQEFugvUiDP0g/71HjZn GRMIYygOeuzCC43QuBnwwGdLNtEOLudJPD4WAQoWrWZ7f4vPhyiBStFsvPN11Wgp5jbu hRdJyKJKnT6GWhTdYDrfSNYFVkXb20i3iFz6gzESb9ko19v8Y91I71EopEF0kntyIW4/ hkXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=4PeSt9sKCxCqPl24gdp+g+kZzOPuaanoTYdEcChlbRA=; b=v19Dg7YjFWJlYOiQbeuNYlUBEgJI4Olp323tlbnR/oG7fiPHbwpBDOugylcB0/Ux83 +im6uEQOO7gb5ylrA/SBQGZBng0X2XvWfMCR/EqplNVpWhF2lp58bxcNvbg9rCVA+dyE D6QTUp+r6Ydx6H9VhOCaP7JbcQmFKcAzPSbRlU1w7SeM5hslcN+5+aWX4e91RKH1jmKW u2NycfdEEzSalGEx/GSTOBTDQMXJdXA3IlgC36DxYXQa4rqFoQULjMVbmzkc4xO7bGRm bfJIsfSmLa7Sbst+BDTjuHgvqP/e2NMAZEYqYj1tL7PKX3UNwBHIlAsr/EmGK9JTRKOC uhRQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id fj4si6145235ejc.32.2022.01.11.12.52.07; Tue, 11 Jan 2022 12:52:26 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6CD0268AF55; Tue, 11 Jan 2022 22:47:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AA4B468ACA5 for ; Tue, 11 Jan 2022 22:47:38 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 3A28E2404FE for ; Tue, 11 Jan 2022 21:47:38 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 5Rsz9YvOEwCi for ; Tue, 11 Jan 2022 21:47:36 +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 5083D240690 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4448B3A0C80; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:57 +0100 Message-Id: <20220111204610.14262-22-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 22/35] lavf/dvenc: return an error on audio/video desync 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: IQA2H/YMopN0 --- libavformat/dvenc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libavformat/dvenc.c b/libavformat/dvenc.c index b76539b59f..03b63cff89 100644 --- a/libavformat/dvenc.c +++ b/libavformat/dvenc.c @@ -255,8 +255,10 @@ static int dv_assemble_frame(AVFormatContext *s, switch (st->codecpar->codec_type) { case AVMEDIA_TYPE_VIDEO: /* FIXME: we have to have more sensible approach than this one */ - if (c->has_video) + if (c->has_video) { av_log(s, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient audio data or severe sync problem.\n", c->frames); + return AVERROR(EINVAL); + } if (data_size != c->sys->frame_size) { av_log(s, AV_LOG_ERROR, "Unexpected frame size, %d != %d\n", data_size, c->sys->frame_size); @@ -270,8 +272,10 @@ static int dv_assemble_frame(AVFormatContext *s, for (i = 0; i < c->n_ast && st != c->ast[i]; i++); /* FIXME: we have to have more sensible approach than this one */ - if (av_fifo_size(c->audio_data[i]) + data_size >= 100*MAX_AUDIO_FRAME_SIZE) + if (av_fifo_size(c->audio_data[i]) + data_size >= 100*MAX_AUDIO_FRAME_SIZE) { av_log(s, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames); + return AVERROR(EINVAL); + } av_fifo_generic_write(c->audio_data[i], data, data_size, NULL); reqasize = 4 * dv_audio_frame_size(c->sys, c->frames, st->codecpar->sample_rate); From patchwork Tue Jan 11 20:45:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33258 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4049886iog; Tue, 11 Jan 2022 12:51:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJzQdVNgca+4jv6kbekwHnJCes95ETuaDs32RQPNvJlqZCEgNd8ZPqeHnOExng8+Y+VXDhQn X-Received: by 2002:aa7:ce8b:: with SMTP id y11mr6104353edv.54.1641934290822; Tue, 11 Jan 2022 12:51:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934290; cv=none; d=google.com; s=arc-20160816; b=AUw4L394SRQg6tNnQC48wemtsw915lJ3XYsEfwgQuey7Do9C4x8Jda8OzPx4WhjoYI BoV4ovYXc9bUO52dLdi96B3m5Xb+oGCdDVISWB7YGJnzX3J/QH0sIFuCb7gRr1/WBXtS YIRNq4jZwUx6CzzLWrp1ESD/g0vdzTUGMkliWu1qsFd1HMNhEN1pPmTZPQK6cn/UKdzz 9u42WhmpXrgZYnN8Ovrw7NXBxV5gTL+kcIyri39BzKOEU1wt9o6++3LOu+4loWGf0xsR 5B4qeWnKxFO0m/gBWV7dM3M0dWlgJ+iuIZa7E2pJE9ESwy7L6a+cUUQwg3ZCy48+8GG9 pRFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=xH/QxFasKWa0i4zJJM12kxgoChIlOkxS0umTVrIOKSY=; b=oRb3oeqWl4By+ZhqqEF3pwVPolFCxA5RyU21XA+Ax7r58p+aUUJvh73B/zJi7uEIvx bWyctYxc7OlRnSUOPiGgsBDfqsUQ5fJSaDBz4Ca/BVLoVYXWBtCOwXSd/dM0ovQEYH+S Km/BQAR9wVGPCK641pkk3h+jDYVq5PLNr9VMESyQwkn23sJ/L299JPsoAX3Q4JbT8m3V t6A3jgPBv3Z+X4ZgWDFJYS0pB5OF6GoxWUw3/15R+9llTcYlmy4wjz/4b6qkcOC2noLb JwCN9GRIMIN/RVK513/sasYjGK/sFYi6oNoQE1OTlqo1g4Mce22CTs3jg9/qULZV8zSF Jv/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id du16si5513266ejc.905.2022.01.11.12.51.30; Tue, 11 Jan 2022 12:51:30 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7269D68AFE7; Tue, 11 Jan 2022 22:47:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E497668AF2E for ; Tue, 11 Jan 2022 22:47:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 0B2EE24055A for ; Tue, 11 Jan 2022 21:47:31 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id ivEzWt_PxDGJ for ; Tue, 11 Jan 2022 21:47:30 +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 206AB240590 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4856A3A0D18; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:58 +0100 Message-Id: <20220111204610.14262-23-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 23/35] lavf/dvenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RkcC44rV/Pga --- libavformat/dvenc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/libavformat/dvenc.c b/libavformat/dvenc.c index 03b63cff89..b9c9ba236d 100644 --- a/libavformat/dvenc.c +++ b/libavformat/dvenc.c @@ -202,7 +202,7 @@ static void dv_inject_audio(DVMuxContext *c, int channel, uint8_t* frame_ptr) continue; // FIXME: maybe we have to admit that DV is a big-endian PCM - av_fifo_generic_peek_at(c->audio_data[channel], frame_ptr + d, of * 2, 2, NULL); + av_fifo_peek(c->audio_data[channel], frame_ptr + d, 2, of * 2); FFSWAP(uint8_t, frame_ptr[d], frame_ptr[d + 1]); } frame_ptr += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */ @@ -272,16 +272,16 @@ static int dv_assemble_frame(AVFormatContext *s, for (i = 0; i < c->n_ast && st != c->ast[i]; i++); /* FIXME: we have to have more sensible approach than this one */ - if (av_fifo_size(c->audio_data[i]) + data_size >= 100*MAX_AUDIO_FRAME_SIZE) { + if (av_fifo_can_write(c->audio_data[i]) < data_size) { av_log(s, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames); return AVERROR(EINVAL); } - av_fifo_generic_write(c->audio_data[i], data, data_size, NULL); + av_fifo_write(c->audio_data[i], data, data_size); reqasize = 4 * dv_audio_frame_size(c->sys, c->frames, st->codecpar->sample_rate); /* Let us see if we've got enough audio for one DV frame. */ - c->has_audio |= ((reqasize <= av_fifo_size(c->audio_data[i])) << i); + c->has_audio |= ((reqasize <= av_fifo_can_read(c->audio_data[i])) << i); break; default: @@ -295,8 +295,8 @@ static int dv_assemble_frame(AVFormatContext *s, for (i=0; i < c->n_ast; i++) { dv_inject_audio(c, i, *frame); reqasize = 4 * dv_audio_frame_size(c->sys, c->frames, c->ast[i]->codecpar->sample_rate); - av_fifo_drain(c->audio_data[i], reqasize); - c->has_audio |= ((reqasize <= av_fifo_size(c->audio_data[i])) << i); + av_fifo_drain2(c->audio_data[i], reqasize); + c->has_audio |= ((reqasize <= av_fifo_can_read(c->audio_data[i])) << i); } c->has_video = 0; @@ -374,9 +374,11 @@ static DVMuxContext* dv_init_mux(AVFormatContext* s) ff_parse_creation_time_metadata(s, &c->start_time, 1); for (i=0; i < c->n_ast; i++) { - if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc_array(100, MAX_AUDIO_FRAME_SIZE))) { + if (!c->ast[i]) + continue; + c->audio_data[i] = av_fifo_alloc2(100 * MAX_AUDIO_FRAME_SIZE, 1, 0); + if (!c->audio_data[i]) goto bail_out; - } } return c; From patchwork Tue Jan 11 20:45:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33241 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048160iog; Tue, 11 Jan 2022 12:48:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJxSlBpEz8/hzhJ6aQ/P3s9OGZKXo/OtEHNCgW95Pt+C5RroYQ+eMZKFTVI26Oon7Zul1w3g X-Received: by 2002:aa7:cd9a:: with SMTP id x26mr6105027edv.159.1641934122830; Tue, 11 Jan 2022 12:48:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934122; cv=none; d=google.com; s=arc-20160816; b=WrvZwAuyZ+9TILmiFDLYQ/nDuH7r0+tCvYt2B2X0EGV2DkibpdYcKzbTpLL9yGaZzk 4m07DECuEDMAhGIC+pR1b6VKF5O5OlhQn7JcajxHPuCS85X/22QDhtYcFrekLS6mNkpp LuwcC7Cx0twIp7Y+9tQHiVyCjzJForSX9y/b3BAxzyOu+SsuWiQAfZyEuiMFI8r7P1d0 jeXMqRjGDHL3pbNp/dOvj7cHP700Lxm/4LGjsCgPzlHHqa1dFVnuZZbaHBXjBdTFr9Zv seBd4y0G7rDDovk/S4na7fh9kdvEEaZuak3+f0X5plm174D+DZ01/vURWrt16YD4CLge hnYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=GSnqaNGRWg8+t0gyhgSfR/6Y137uNhpWsU8LE8uQgOg=; b=FxVANkldOqCQ5XYS7oz07uQ7whJ35iL5NwzYrCCQf+tZ+6OQX031MsH7IXydPUgulV 0DFJdqC/10eq6iSeyME5/nyzPdDt4qyWsSU1RJPLtYj7ikZUdKYo7Yu/j/Ob5uDUerHK NsUN80gA6bEaBNXQQYbFAglFYZFsRc6cdwmtD9blWNs6TMSftxmxgEdPn1Lf304cmsGn vPb55/3wNwR2cSfFMs1aayvFByGU/0AbtmZCpoDR0yNRGfhY1+I/r22p3VLn87LE7M7k +stvOx/jS7GM4uwq2N7XNinkuziuQi4kNwu/J9512wmyOgoT/u8oTw5l2XTMuI8YKCcP wQ9Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id he18si3446070ejc.934.2022.01.11.12.48.42; Tue, 11 Jan 2022 12:48:42 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0DD7A68AF41; Tue, 11 Jan 2022 22:47:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B09A268AE71 for ; Tue, 11 Jan 2022 22:47:33 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 2A7E7240555 for ; Tue, 11 Jan 2022 21:47:32 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id LrKoCBrkKg0u for ; Tue, 11 Jan 2022 21:47:31 +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 491CB240687 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4C6333A0D2E; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:45:59 +0100 Message-Id: <20220111204610.14262-24-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 24/35] lavf/mpegenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ajHqVNmklLhf --- libavformat/mpegenc.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index b1d8bf9c38..909df7f484 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -459,7 +459,7 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) av_get_media_type_string(st->codecpar->codec_type), i); return AVERROR(EINVAL); } - stream->fifo = av_fifo_alloc(16); + stream->fifo = av_fifo_alloc2(16, 1, 0); if (!stream->fifo) return AVERROR(ENOMEM); } @@ -626,6 +626,12 @@ static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len) return nb_frames; } +static int fifo_avio_wrapper(void *opaque, void *buf, size_t *nb_elems) +{ + avio_write(opaque, buf, *nb_elems); + return 0; +} + /* flush the packet on stream stream_index */ static int flush_packet(AVFormatContext *ctx, int stream_index, int64_t pts, int64_t dts, int64_t scr, int trailer_size) @@ -741,6 +747,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, packet_size -= pad_packet_bytes + zero_trail_bytes; if (packet_size > 0) { + size_t fifo_data; /* packet header size */ packet_size -= 6; @@ -776,7 +783,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, startcode = 0x100 + id; } - stuffing_size = payload_size - av_fifo_size(stream->fifo); + stuffing_size = payload_size - av_fifo_can_read(stream->fifo); // first byte does not fit -> reset pts/dts + stuffing if (payload_size <= trailer_size && pts != AV_NOPTS_VALUE) { @@ -814,7 +821,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, stuffing_size = 0; if (startcode == PRIVATE_STREAM_1 && id >= 0xa0) { - if (payload_size < av_fifo_size(stream->fifo)) + if (payload_size < av_fifo_can_read(stream->fifo)) stuffing_size += payload_size % stream->lpcm_align; } @@ -907,11 +914,10 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, } /* output data */ - av_assert0(payload_size - stuffing_size <= av_fifo_size(stream->fifo)); - av_fifo_generic_read(stream->fifo, ctx->pb, - payload_size - stuffing_size, - (void (*)(void*, void*, int))avio_write); - stream->bytes_to_iframe -= payload_size - stuffing_size; + fifo_data = payload_size - stuffing_size; + av_assert0(fifo_data <= av_fifo_can_read(stream->fifo)); + av_fifo_read_to_cb(stream->fifo, fifo_avio_wrapper, ctx->pb, &fifo_data); + stream->bytes_to_iframe -= fifo_data; } else { payload_size = stuffing_size = 0; @@ -1005,7 +1011,7 @@ retry: for (i = 0; i < ctx->nb_streams; i++) { AVStream *st = ctx->streams[i]; StreamInfo *stream = st->priv_data; - const int avail_data = av_fifo_size(stream->fifo); + const size_t avail_data = av_fifo_can_read(stream->fifo); const int space = stream->max_buffer_size - stream->buffer_index; int rel_space = 1024LL * space / stream->max_buffer_size; PacketDesc *next_pkt = stream->premux_packet; @@ -1075,7 +1081,7 @@ retry: st = ctx->streams[best_i]; stream = st->priv_data; - av_assert0(av_fifo_size(stream->fifo) > 0); + av_assert0(av_fifo_can_read(stream->fifo) > 0); av_assert0(avail_space >= s->packet_size || ignore_constraints); @@ -1095,7 +1101,7 @@ retry: es_size = flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size); } else { - av_assert0(av_fifo_size(stream->fifo) == trailer_size); + av_assert0(av_fifo_can_read(stream->fifo) == trailer_size); es_size = flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size); } @@ -1199,7 +1205,7 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) pkt_desc->unwritten_size = pkt_desc->size = size; - ret = av_fifo_realloc2(stream->fifo, av_fifo_size(stream->fifo) + size); + ret = av_fifo_grow2(stream->fifo, size); if (ret < 0) return ret; @@ -1208,13 +1214,13 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) if (is_iframe && (s->packet_number == 0 || pts != AV_NOPTS_VALUE && (pts - stream->vobu_start_pts >= 36000))) { - stream->bytes_to_iframe = av_fifo_size(stream->fifo); + stream->bytes_to_iframe = av_fifo_can_read(stream->fifo); stream->align_iframe = 1; stream->vobu_start_pts = pts; } } - av_fifo_generic_write(stream->fifo, buf, size, NULL); + av_fifo_write(stream->fifo, buf, size); for (;;) { int ret = output_packet(ctx, 0); @@ -1244,7 +1250,7 @@ static int mpeg_mux_end(AVFormatContext *ctx) for (i = 0; i < ctx->nb_streams; i++) { stream = ctx->streams[i]->priv_data; - av_assert0(av_fifo_size(stream->fifo) == 0); + av_assert0(av_fifo_can_read(stream->fifo) == 0); } return 0; } From patchwork Tue Jan 11 20:46:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33247 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048743iog; Tue, 11 Jan 2022 12:49:40 -0800 (PST) X-Google-Smtp-Source: ABdhPJxbj8VmWcSzATSqx03vVyagiPd2/nRuhrV4qIYWZPPoQBu9lMtZ5D2+3xnRv1FaoRu9lXH6 X-Received: by 2002:a17:906:d9cf:: with SMTP id qk15mr1267769ejb.230.1641934180601; Tue, 11 Jan 2022 12:49:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934180; cv=none; d=google.com; s=arc-20160816; b=VP1QRLtZ5hteubB5F11mxHwB3XsvweHejmyebMLwnMEBvdl8cjm6opbDgxmXDnvxPK kCTaeRYF0oxrxbzwIrxatRZHxqk7TBPjFfmsLOlxAvK4f5/xQdamHoY0mDzbUa4FnzLW 29rFaV94yEHMccHexqaH47TeFlGqnQeo/EWiXx34vqO5/XK7Ltb9Zj44JriCBhDzWdaO uFAkA2nSxo18QFXz6yxYAQi6LX1MID0twyVhWPZmBcDS/RdEIQfABF/SxkSK4/TsJ3kf afd9qMz643M8btvJvcUZ2Sbgxndqt7B9oFVj9GfKPUSefR/slu0nBx0xDtUgbkaP9GAJ QHCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=tsG+pQ5HZiiP5X/30a38n5MnWuMTJapgjPZeLauvN24=; b=vjM7ZCl/BcoO1sx+CYsBfl+Hce4x8xRdyQBFPuClN3e5dwnWDtJ6R6cWpY6WqCoYVT HnBrwI/qtqgI0E9rjPBriAO43JZ8689lJrZ1Pi86MkRg83FltN4G7ZfLjCtgByC9Y0m9 zWvIYaPd2vVlxPe5jgmrp1kGR+1yTZstS7GY/+PxfXZVN6e7jH/44XUUmSDGVOWd4Hy/ vReDcDrjkRnDbmVzyf8//avzYHDT0w6k3YVCT5vIfo5nZ51yQd0o25JV/VX8K9hfqfbh KnGeSBkv68zIeyKwdcJ+7sbx2aoETaF89b9i6cL71XjiTdrQOSyGKjmUpnqr1COSKlcm yoiA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h15si5120385edz.177.2022.01.11.12.49.40; Tue, 11 Jan 2022 12:49:40 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F160968AF91; Tue, 11 Jan 2022 22:47:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9D3368AEAF for ; Tue, 11 Jan 2022 22:47:35 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 3EFA924017C for ; Tue, 11 Jan 2022 21:47:35 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id TMGUz891PJmX for ; Tue, 11 Jan 2022 21:47:34 +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 478DD240685 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 509C93A0631; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:00 +0100 Message-Id: <20220111204610.14262-25-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 25/35] lavf/swfenc: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: j0zIocBN/Ce7 --- libavformat/swfenc.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c index 1fd2ad81a3..ca9a358ccc 100644 --- a/libavformat/swfenc.c +++ b/libavformat/swfenc.c @@ -211,7 +211,7 @@ static int swf_write_header(AVFormatContext *s) } if (par->codec_id == AV_CODEC_ID_MP3) { swf->audio_par = par; - swf->audio_fifo= av_fifo_alloc(AUDIO_FIFO_SIZE); + swf->audio_fifo = av_fifo_alloc2(AUDIO_FIFO_SIZE, 1, 0); if (!swf->audio_fifo) return AVERROR(ENOMEM); } else { @@ -362,6 +362,12 @@ static int swf_write_header(AVFormatContext *s) return 0; } +static int fifo_avio_wrapper(void *opaque, void *buf, size_t *nb_elems) +{ + avio_write(opaque, buf, *nb_elems); + return 0; +} + static int swf_write_video(AVFormatContext *s, AVCodecParameters *par, const uint8_t *buf, int size, unsigned pkt_flags) { @@ -454,12 +460,12 @@ static int swf_write_video(AVFormatContext *s, swf->swf_frame_number++; /* streaming sound always should be placed just before showframe tags */ - if (swf->audio_par && av_fifo_size(swf->audio_fifo)) { - int frame_size = av_fifo_size(swf->audio_fifo); + if (swf->audio_par && av_fifo_can_read(swf->audio_fifo)) { + size_t frame_size = av_fifo_can_read(swf->audio_fifo); put_swf_tag(s, TAG_STREAMBLOCK | TAG_LONG); avio_wl16(pb, swf->sound_samples); avio_wl16(pb, 0); // seek samples - av_fifo_generic_read(swf->audio_fifo, pb, frame_size, (void*)avio_write); + av_fifo_read_to_cb(swf->audio_fifo, fifo_avio_wrapper, pb, &frame_size); put_swf_end_tag(s); /* update FIFO */ @@ -482,12 +488,12 @@ static int swf_write_audio(AVFormatContext *s, if (swf->swf_frame_number == 16000) av_log(s, AV_LOG_INFO, "warning: Flash Player limit of 16000 frames reached\n"); - if (av_fifo_size(swf->audio_fifo) + size > AUDIO_FIFO_SIZE) { + if (av_fifo_can_write(swf->audio_fifo) < size) { av_log(s, AV_LOG_ERROR, "audio fifo too small to mux audio essence\n"); return -1; } - av_fifo_generic_write(swf->audio_fifo, buf, size, NULL); + av_fifo_write(swf->audio_fifo, buf, size); swf->sound_samples += av_get_audio_frame_duration2(par, size); /* if audio only stream make sure we add swf frames */ From patchwork Tue Jan 11 20:46:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33260 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4050090iog; Tue, 11 Jan 2022 12:51:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJyhTI8vMhktH2bTFJX/Kypg4we3mTtnKCDOYJb2ETrm0SR9AihC8uAWVzHakYh/4HiEWpoK X-Received: by 2002:a17:906:830b:: with SMTP id j11mr5121294ejx.347.1641934315732; Tue, 11 Jan 2022 12:51:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934315; cv=none; d=google.com; s=arc-20160816; b=GZCkbRD5JSjF+h1348GskiazTgfcDvdSle7aw6hlKFnUFAI8d+DUbKCqP2xAdRAcaQ bswyMSWQtLeP8tqFwps0B9YCT7Yrn3o6MbwTRM7Gqf7Fbm12JUP5YQBcKxgM1YOUvXjP SWLTOZb6TYhH0Ei6zU6QxJ9g1Gb0ipUjxnnToBV64rOWz6aVG/sNW2tdK1XgehcthLim QtrI4yM88ZUoUTqzqUpbrG3N16tWoI79rMsp4Dy49V1DnwxxMCMDZbY/m4B44lhtEdzG 920ALOc6TH0mcaussjP6i4LVG+ggNY7l+KJt9RryDh1Uf/aYWYfKb9JnNq+L1fLh3P/j aI6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=tyRKv+nswD2Ki4xgJAUZYz3DAmTpUwaI7TGe8myJiyY=; b=OOKRuV4DEeaYMRh5RoULRjrKFa1rpgi/yDwY1dVM67XTf3vMqzjOv5S7zTIJHwlTw1 iFgyHB3LETJXwHZSlw2BnrfRMnNj+fAM0X0zmf+J7U1DBNc2l660kRcuNcPZg5oH1R70 5XMS7xP/fk+IsV2nBepLFdW4p7UY/xcpc22pDjT8Xv/9yeqwGFirEoFz9lAMHlTX3eAq 3r925BlrxllIQIU+hOcJYPCt3LIM6bkLGMVMmel8oh31BRx82fb78omonKz8lZtOreeX PqVZS381f1iBoyh5fKfP2WVXuifmLCkoqG9nVfxcGMdjJkRBnkxG19bVJTvSqf8s+KxS x7Jg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sc18si5897530ejc.114.2022.01.11.12.51.54; Tue, 11 Jan 2022 12:51:55 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7596568AFF3; Tue, 11 Jan 2022 22:47:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 64D9968ACA5 for ; Tue, 11 Jan 2022 22:47:38 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id D63E124017C for ; Tue, 11 Jan 2022 21:47:37 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id RxzUZlFnjXBU for ; Tue, 11 Jan 2022 21:47:37 +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 521C9240691 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 529553A073E; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:01 +0100 Message-Id: <20220111204610.14262-26-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 26/35] lavf/udp: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9LqxWQ674k66 --- libavformat/udp.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libavformat/udp.c b/libavformat/udp.c index 83c042d079..4c8f104d9d 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -500,7 +500,7 @@ static void *circular_buffer_task_rx( void *_URLContext) continue; AV_WL32(s->tmp, len); - if(av_fifo_space(s->fifo) < len + 4) { + if (av_fifo_can_write(s->fifo) < len + 4) { /* No Space left */ if (s->overrun_nonfatal) { av_log(h, AV_LOG_WARNING, "Circular buffer overrun. " @@ -514,7 +514,7 @@ static void *circular_buffer_task_rx( void *_URLContext) goto end; } } - av_fifo_generic_write(s->fifo, s->tmp, len+4, NULL); + av_fifo_write(s->fifo, s->tmp, len + 4); pthread_cond_signal(&s->cond); } @@ -548,22 +548,22 @@ static void *circular_buffer_task_tx( void *_URLContext) uint8_t tmp[4]; int64_t timestamp; - len = av_fifo_size(s->fifo); + len = av_fifo_can_read(s->fifo); while (len<4) { if (s->close_req) goto end; pthread_cond_wait(&s->cond, &s->mutex); - len = av_fifo_size(s->fifo); + len = av_fifo_can_read(s->fifo); } - av_fifo_generic_read(s->fifo, tmp, 4, NULL); + av_fifo_read(s->fifo, tmp, 4); len = AV_RL32(tmp); av_assert0(len >= 0); av_assert0(len <= sizeof(s->tmp)); - av_fifo_generic_read(s->fifo, s->tmp, len, NULL); + av_fifo_read(s->fifo, s->tmp, len); pthread_mutex_unlock(&s->mutex); @@ -906,7 +906,7 @@ static int udp_open(URLContext *h, const char *uri, int flags) if ((!is_output && s->circular_buffer_size) || (is_output && s->bitrate && s->circular_buffer_size)) { /* start the task going */ - s->fifo = av_fifo_alloc(s->circular_buffer_size); + s->fifo = av_fifo_alloc2(s->circular_buffer_size, 1, 0); if (!s->fifo) { ret = AVERROR(ENOMEM); goto fail; @@ -970,19 +970,19 @@ static int udp_read(URLContext *h, uint8_t *buf, int size) if (s->fifo) { pthread_mutex_lock(&s->mutex); do { - avail = av_fifo_size(s->fifo); + avail = av_fifo_can_read(s->fifo); if (avail) { // >=size) { uint8_t tmp[4]; - av_fifo_generic_read(s->fifo, tmp, 4, NULL); + av_fifo_read(s->fifo, tmp, 4); avail = AV_RL32(tmp); if(avail > size){ av_log(h, AV_LOG_WARNING, "Part of datagram lost due to insufficient buffer size\n"); avail = size; } - av_fifo_generic_read(s->fifo, buf, avail, NULL); - av_fifo_drain(s->fifo, AV_RL32(tmp) - avail); + av_fifo_read(s->fifo, buf, avail); + av_fifo_drain2(s->fifo, AV_RL32(tmp) - avail); pthread_mutex_unlock(&s->mutex); return avail; } else if(s->circular_buffer_error){ @@ -1043,14 +1043,14 @@ static int udp_write(URLContext *h, const uint8_t *buf, int size) return err; } - if(av_fifo_space(s->fifo) < size + 4) { + if (av_fifo_can_write(s->fifo) < size + 4) { /* What about a partial packet tx ? */ pthread_mutex_unlock(&s->mutex); return AVERROR(ENOMEM); } AV_WL32(tmp, size); - av_fifo_generic_write(s->fifo, tmp, 4, NULL); /* size of packet */ - av_fifo_generic_write(s->fifo, (uint8_t *)buf, size, NULL); /* the data */ + av_fifo_write(s->fifo, tmp, 4); /* size of packet */ + av_fifo_write(s->fifo, (uint8_t *)buf, size); /* the data */ pthread_cond_signal(&s->cond); pthread_mutex_unlock(&s->mutex); return size; From patchwork Tue Jan 11 20:46:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33248 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4048818iog; Tue, 11 Jan 2022 12:49:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJw1zIBXVVGqL7JFiUsiiiZO7KauYThS20SSujltVyfNElAaEiqzv2kWpeUcgHR3M/SgPJzd X-Received: by 2002:a17:907:6e23:: with SMTP id sd35mr2607149ejc.615.1641934190035; Tue, 11 Jan 2022 12:49:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934190; cv=none; d=google.com; s=arc-20160816; b=wedzIzjuIaNFFJRcsv7n4zblNB+bd+MU2t052IxCri0hvp5/ACwy6Jv+bu1H5tyPN6 8TLGBcf2wDc92Z8aWOYgcaUTli/mA6iSSS6smzX6G6ToM3GCVS5zFXw4wckmv1qqmpci Pox7TWfXOB1u04p6c5is6CZVLP/B0zHOyxpxLVetTVLNWlQAtK2j9+7Slc2EiFQEhVqq KmDTeFvjNiUKlKNJRqlfZuPmm2LCDlStMNqrML7bHanJx3Kd4vPfxmgNfsyhaJa3c+Dv 8wrhz4jKOCZrSWwy+Ei5MpkxCqqKG+0PGSKfSElhN8rIN1Lz/D2E1XyQiYaA/BVE594H qtQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=KkYEuAj85zJYp2vymU0zfnpjEWa/1LtBFBTFbELYoRY=; b=zDu2Ktl6tSepbOBQNnzsSX60bGorddfxVopKjH9LXj2XgzWPm20LwiRzdmjQYUNPjH 6f1Rg1wrzmTndf7u/41Dx3hgzMfKU2x5ghz4lwLgKoMAMmlG1cCzOXSnbcon6hVyTPvp w2THbK7Lik2SI9Uw9m5wvvz/nPMH7fxgrBBN2evO44xrgCMz63DibL+elACej++m7H1T fPsa/Hh2TZvJmAymEDDdF9KVA55O/R9bkU8fl0lOTg83nbfQikIavX0taI5WC4jKAXk3 yIdHCs1t61WAlBgxOxL6VqFlF+FO//HqWjupwX9fIOqmzJdOh1NZq8J6x7P0KuztrZ50 ziEw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i21si5126166ejz.98.2022.01.11.12.49.49; Tue, 11 Jan 2022 12:49:50 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E34AB68AF98; Tue, 11 Jan 2022 22:47:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7390568AEEC for ; Tue, 11 Jan 2022 22:47:36 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id E0CA124017C for ; Tue, 11 Jan 2022 21:47:35 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id aTsUPIzBCgGl for ; Tue, 11 Jan 2022 21:47:35 +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 4C44724068C for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 571F23A0D4A; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:02 +0100 Message-Id: <20220111204610.14262-27-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/35] lavf/async: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P1VcHuVda/3Q --- libavformat/async.c | 62 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/libavformat/async.c b/libavformat/async.c index 5a81507ef1..59b0e7d352 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -83,7 +83,7 @@ typedef struct Context { static int ring_init(RingBuffer *ring, unsigned int capacity, int read_back_capacity) { memset(ring, 0, sizeof(RingBuffer)); - ring->fifo = av_fifo_alloc(capacity + read_back_capacity); + ring->fifo = av_fifo_alloc2(capacity + read_back_capacity, 1, 0); if (!ring->fifo) return AVERROR(ENOMEM); @@ -104,34 +104,48 @@ static void ring_reset(RingBuffer *ring) static int ring_size(RingBuffer *ring) { - return av_fifo_size(ring->fifo) - ring->read_pos; + return av_fifo_can_read(ring->fifo) - ring->read_pos; } static int ring_space(RingBuffer *ring) { - return av_fifo_space(ring->fifo); + return av_fifo_can_write(ring->fifo); } -static int ring_generic_read(RingBuffer *ring, void *dest, int buf_size, void (*func)(void*, void*, int)) +static int ring_read(RingBuffer *ring, void *dest, int buf_size) { - int ret; + int ret = 0; av_assert2(buf_size <= ring_size(ring)); - ret = av_fifo_generic_peek_at(ring->fifo, dest, ring->read_pos, buf_size, func); + if (dest) + ret = av_fifo_peek(ring->fifo, dest, buf_size, ring->read_pos); ring->read_pos += buf_size; if (ring->read_pos > ring->read_back_capacity) { - av_fifo_drain(ring->fifo, ring->read_pos - ring->read_back_capacity); + av_fifo_drain2(ring->fifo, ring->read_pos - ring->read_back_capacity); ring->read_pos = ring->read_back_capacity; } return ret; } -static int ring_generic_write(RingBuffer *ring, void *src, int size, int (*func)(void*, void*, int)) +static int wrapped_url_read(void *src, void *dst, size_t *size) +{ + URLContext *h = src; + Context *c = h->priv_data; + int ret; + + ret = ffurl_read(c->inner, dst, *size); + *size = ret > 0 ? ret : 0; + c->inner_io_error = ret < 0 ? ret : 0; + + return c->inner_io_error; +} + +static int ring_write(RingBuffer *ring, URLContext *h, size_t size) { av_assert2(size <= ring_space(ring)); - return av_fifo_generic_write(ring->fifo, src, size, func); + return av_fifo_write_from_cb(ring->fifo, wrapped_url_read, h, &size); } static int ring_size_of_read_back(RingBuffer *ring) @@ -161,18 +175,6 @@ static int async_check_interrupt(void *arg) return c->abort_request; } -static int wrapped_url_read(void *src, void *dst, int size) -{ - URLContext *h = src; - Context *c = h->priv_data; - int ret; - - ret = ffurl_read(c->inner, dst, size); - c->inner_io_error = ret < 0 ? ret : 0; - - return ret; -} - static void *async_buffer_task(void *arg) { URLContext *h = arg; @@ -221,7 +223,7 @@ static void *async_buffer_task(void *arg) pthread_mutex_unlock(&c->mutex); to_copy = FFMIN(4096, fifo_space); - ret = ring_generic_write(ring, (void *)h, to_copy, wrapped_url_read); + ret = ring_write(ring, h, to_copy); pthread_mutex_lock(&c->mutex); if (ret <= 0) { @@ -327,11 +329,11 @@ static int async_close(URLContext *h) return 0; } -static int async_read_internal(URLContext *h, void *dest, int size, int read_complete, - void (*func)(void*, void*, int)) +static int async_read_internal(URLContext *h, void *dest, int size) { Context *c = h->priv_data; RingBuffer *ring = &c->ring; + int read_complete = !dest; int to_read = size; int ret = 0; @@ -346,8 +348,8 @@ static int async_read_internal(URLContext *h, void *dest, int size, int read_com fifo_size = ring_size(ring); to_copy = FFMIN(to_read, fifo_size); if (to_copy > 0) { - ring_generic_read(ring, dest, to_copy, func); - if (!func) + ring_read(ring, dest, to_copy); + if (dest) dest = (uint8_t *)dest + to_copy; c->logical_pos += to_copy; to_read -= to_copy; @@ -376,11 +378,7 @@ static int async_read_internal(URLContext *h, void *dest, int size, int read_com static int async_read(URLContext *h, unsigned char *buf, int size) { - return async_read_internal(h, buf, size, 0, NULL); -} - -static void fifo_do_not_copy_func(void* dest, void* src, int size) { - // do not copy + return async_read_internal(h, buf, size); } static int64_t async_seek(URLContext *h, int64_t pos, int whence) @@ -422,7 +420,7 @@ static int64_t async_seek(URLContext *h, int64_t pos, int whence) if (pos_delta > 0) { // fast seek forwards - async_read_internal(h, NULL, pos_delta, 1, fifo_do_not_copy_func); + async_read_internal(h, NULL, pos_delta); } else { // fast seek backwards ring_drain(ring, pos_delta); From patchwork Tue Jan 11 20:46:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33261 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4050318iog; Tue, 11 Jan 2022 12:52:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJxw/7G9i0pop+sx/3iwRcCZI0SGdv1BRZsRvE+zTzD+aAwIW7+rSuouCxzZNulFOWqyM8AP X-Received: by 2002:a17:906:9f01:: with SMTP id fy1mr4953281ejc.475.1641934338894; Tue, 11 Jan 2022 12:52:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934338; cv=none; d=google.com; s=arc-20160816; b=lIEVhVJE1vRtxra/Ih/NS/e/S5B6HfENaNxPglM0k4ZvOSIk+MFGRHDwjHgIpkvswT kN60YcWcLlAQOaCB7r/P62K7b6BS8/zNWCFNKau3aHX9W1FBEtvxUNnoT5gSKfioV0K0 0yeuCG8JizCCLXuM0+dMkuoaOb5KX1oXaCHCy1gebuP74eGFRMuGzGlaJJKC14XBKxt9 oiR9aeXeWEnc9Q+lEc9lXtGyKWKv9JKGPw+IelGQK2LvKic8QDmJizoZiSjp+Qi/lwbL jhguA8l//6GM4/B+fICkN9ZczQ0D8hH3IsPoriWb6y/g2zC5w7EVMrjiH4StgeXltrFG 0zfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=kPBQCrtAYdhAHYegWzcmMe0/DIdNg8vgmqRKMx6MFKY=; b=KKSzR8phancSmJ6DWv7swnRagvgcauRbI2cEuGnQCJQf68m7G3wsPUvuGJR+gEEnXN N4JudJ3YRdsOm+gq/mv+ov2BGqpf/IERUvfzBRhrbvRdTMBdJR/IdH9I4CYpaUzPvLiz 2I6ZDZHTxBI7zQcfMUxzyIyjUR+unPp41DySPRFcAxF3kxdCCRUYmkaS8EsLfNkIRxP/ 7KvmMNNYi7VwzzxvXrwfbutBClmAhpeRMBItaHvO1JpehJ+gH5ltKwJta2yhlE2RUADP xj1i/WuPnguOchyRGoUH1YRiNOoXrnzHywMFbZct5NrU7nmnyW8UAdgRA3xeW0QweU1n o3mQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id nd41si5591969ejc.477.2022.01.11.12.52.18; Tue, 11 Jan 2022 12:52:18 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7C4BD68B000; Tue, 11 Jan 2022 22:48:00 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1D1B868AF41 for ; Tue, 11 Jan 2022 22:47:39 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 8915B24017C for ; Tue, 11 Jan 2022 21:47:38 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id xxHd5lrQb33Y for ; Tue, 11 Jan 2022 21:47:37 +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 53037240692 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 5B92F3A0743; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:03 +0100 Message-Id: <20220111204610.14262-28-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 28/35] lavd/jack: switch to the new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ZSuda/envEk0 --- libavdevice/jack.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libavdevice/jack.c b/libavdevice/jack.c index 0d5465e407..eb75cc9dc6 100644 --- a/libavdevice/jack.c +++ b/libavdevice/jack.c @@ -81,13 +81,14 @@ static int process_callback(jack_nframes_t nframes, void *arg) self->buffer_size); /* Check if an empty packet is available, and if there's enough space to send it back once filled */ - if ((av_fifo_size(self->new_pkts) < sizeof(pkt)) || (av_fifo_space(self->filled_pkts) < sizeof(pkt))) { + if (!av_fifo_can_read(self->new_pkts) || + !av_fifo_can_write(self->filled_pkts)) { self->pkt_xrun = 1; return 0; } /* Retrieve empty (but allocated) packet */ - av_fifo_generic_read(self->new_pkts, &pkt, sizeof(pkt), NULL); + av_fifo_read(self->new_pkts, &pkt, 1); pkt_data = (float *) pkt.data; latency = 0; @@ -106,7 +107,7 @@ static int process_callback(jack_nframes_t nframes, void *arg) pkt.pts = (cycle_time - (double) latency / (self->nports * self->sample_rate)) * 1000000.0; /* Send the now filled packet back, and increase packet counter */ - av_fifo_generic_write(self->filled_pkts, &pkt, sizeof(pkt), NULL); + av_fifo_write(self->filled_pkts, &pkt, 1); sem_post(&self->packet_count); return 0; @@ -134,12 +135,12 @@ static int supply_new_packets(JackData *self, AVFormatContext *context) /* Supply the process callback with new empty packets, by filling the new * packets FIFO buffer with as many packets as possible. process_callback() * can't do this by itself, because it can't allocate memory in realtime. */ - while (av_fifo_space(self->new_pkts) >= sizeof(pkt)) { + while (av_fifo_can_write(self->new_pkts)) { if ((test = av_new_packet(&pkt, pkt_size)) < 0) { av_log(context, AV_LOG_ERROR, "Could not create packet of size %d\n", pkt_size); return test; } - av_fifo_generic_write(self->new_pkts, &pkt, sizeof(pkt), NULL); + av_fifo_write(self->new_pkts, &pkt, 1); } return 0; } @@ -193,9 +194,9 @@ static int start_jack(AVFormatContext *context) } /* Create FIFO buffers */ - self->filled_pkts = av_fifo_alloc_array(FIFO_PACKETS_NUM, sizeof(AVPacket)); + self->filled_pkts = av_fifo_alloc2(FIFO_PACKETS_NUM, sizeof(AVPacket), 0); /* New packets FIFO with one extra packet for safety against underruns */ - self->new_pkts = av_fifo_alloc_array((FIFO_PACKETS_NUM + 1), sizeof(AVPacket)); + self->new_pkts = av_fifo_alloc2((FIFO_PACKETS_NUM + 1), sizeof(AVPacket), 0); if (!self->new_pkts) { jack_client_close(self->client); return AVERROR(ENOMEM); @@ -212,8 +213,8 @@ static int start_jack(AVFormatContext *context) static void free_pkt_fifo(AVFifoBuffer **fifo) { AVPacket pkt; - while (av_fifo_size(*fifo)) { - av_fifo_generic_read(*fifo, &pkt, sizeof(pkt), NULL); + while (av_fifo_can_read(*fifo)) { + av_fifo_read(*fifo, &pkt, 1); av_packet_unref(&pkt); } av_fifo_freep(fifo); @@ -313,7 +314,7 @@ static int audio_read_packet(AVFormatContext *context, AVPacket *pkt) } /* Retrieve the packet filled with audio data by process_callback() */ - av_fifo_generic_read(self->filled_pkts, pkt, sizeof(*pkt), NULL); + av_fifo_read(self->filled_pkts, pkt, 1); if ((test = supply_new_packets(self, context))) return test; From patchwork Tue Jan 11 20:46:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33263 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4050534iog; Tue, 11 Jan 2022 12:52:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJxdyztjFSE46Vrr9NNXuFqDdOg5l+elNhydbJMY/NjY7L7110fS4MA1esj4yos7lVyjdbtE X-Received: by 2002:a17:906:3a59:: with SMTP id a25mr5020125ejf.762.1641934359260; Tue, 11 Jan 2022 12:52:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934359; cv=none; d=google.com; s=arc-20160816; b=eVDbJJfDDyWiwW/Wkl4AevxL+Sc4r+j0RaZ2pSy26mMwBfwQ1yjevXjke3y/3tvXAl UXdVFiAZPQV3tX5J3Pl/Ce/iAfVHXi14Plg13GC7r3IdLz1CnDXmbX0SPt/f2pZ6CFVn 3zpkabiIOZqjchNygSq7VbMcxr9KnFKUkw7GCv9RvhNgzuqs+kX2Wl21IdgWTfce+ZVf TRqk0W7LxjRKsM5MbUWfuk160JMGmztk0HZiFd87zn+QHjZr78GDU/pAyswmt09yJ3nr QB+hS/AW6+2RPrIvZo+q+9B/3baKRwiyAPV+0pCcprXjO9voHJfsyXQMyd0igModU3uK Z/3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=4aAwk6KDxpvHGmx9vUHk/RxEro2CDEeFRmPuRtpr3z8=; b=IbxfrsiIgZTymFubcg/8mLP/GbM5VCB/gAmszVrHO8jqcsVQ4nR2fhGoY/bNL/+pyf POPzgo/10bS/8BdPzuEm1D+rreEJ3xn6TkAEX6V9Yhqe2MmCSEpk2WGcn47zbHziOxSh e2v1Gla+p1W18rrP5L4bI9W1cgBu7jfRujAqlvgkGG2A/NBBioFJCSiF2eCAAcusMiek aQcjl2aCJh3mksLtr6bZALFpa7mLIjQT8UOnesjM50Q8+0q0/r6q0GGfYGjaE05RC0cu X/RiKpOolEV5gNpHAODkAx3PxF1AGFVmULcZqu3ZjkMiLMSMcyldEdvVJH/OVvsjtCX2 TAmA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y19si6790451edd.122.2022.01.11.12.52.29; Tue, 11 Jan 2022 12:52:39 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 57E8468B008; Tue, 11 Jan 2022 22:48:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B944068AF3E for ; Tue, 11 Jan 2022 22:47:39 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 453F424017C for ; Tue, 11 Jan 2022 21:47:39 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id VMjsQXhwJMuG for ; Tue, 11 Jan 2022 21:47:38 +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 53CCF240694 for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 5FC793A0DA3; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:04 +0100 Message-Id: <20220111204610.14262-29-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 29/35] lavu/audio_fifo: drop an unnecessary include 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kc9CcqZmEpkW Nothing in audio_fifo.h uses anything from fifo.h --- libavutil/audio_fifo.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libavutil/audio_fifo.h b/libavutil/audio_fifo.h index d8a9194a8d..9d570b04c0 100644 --- a/libavutil/audio_fifo.h +++ b/libavutil/audio_fifo.h @@ -28,7 +28,6 @@ #define AVUTIL_AUDIO_FIFO_H #include "avutil.h" -#include "fifo.h" #include "samplefmt.h" /** From patchwork Tue Jan 11 20:46:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33264 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4050569iog; Tue, 11 Jan 2022 12:52:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJxvM8LmIvYFO2ixtd3MytPI44Asd4VRviehCvoeqIJq2v/4YfqAU6JOWY3uqDoVXzV1Xen8 X-Received: by 2002:a17:907:8a04:: with SMTP id sc4mr4961848ejc.392.1641934362534; Tue, 11 Jan 2022 12:52:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934362; cv=none; d=google.com; s=arc-20160816; b=QgbQLTacRPgK560Jl7jA60EocFfykDvtC5cgAb+FBh2tDJHiJTBneZhKmEzjc+M+hf L8kSFhYKuLxU0/8uvr+R4i4JJIoSq99tpPGUU7YLxLTT5YN5hNrn0bd3qqrTdoqeNwRx Sl5h+5JmGKCxaDhXcJxkOawgJgzQ7g4v8GOY5eGF7gfoVlLu9G2jSK7Np0SfrpdGyXKB l6VWqKOH72cO2OJmIRLmjLARW48vtMRYkhspY2OYETAUX59y0SoaM+1C4oSz266PQVNb sRl1UOqv2tPnAk0K1tNUu6WH/dQL0Me9fSfpceZ0A6Ar1YhB6sDjFws6IyjAtkJzld93 ztJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=aqGeV573mS6AnxzkseysO0DW3T9Pux1L3h+go5MEhZE=; b=q1Er/QWBMpBTZ/onRZ9XMrywPL6b6roy5v1V1Fxc1unmNu3caShljIMXKh+thRGPGZ OF83iCS6mYBZm4XP9Tm1IGWtyXkrrjMtc9XaUtNw/YCHhiHecAuWoPQ512cd7OLlr2QT N/j2BRyoRmE4HyW6ZrOk0QG5IkiYOIofIqnXfew+/g0caO+DgF+HQIYDKIrAV+m36rrM hfnhg0v9/87OTxaRFOBZanTZkNFbec8wQzyDmODwC0DAydHDv9lY4/dH6WrzW6jtSDvl 0kuGIoWOOki3QipZN9QAx6ONYyTSPsGZProt4HiwTn4iwjlwqutdPAEo8mjToOH0R48r S0OQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id jg39si2759580ejc.437.2022.01.11.12.52.42; Tue, 11 Jan 2022 12:52:42 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8571A68AF54; Tue, 11 Jan 2022 22:48:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3428468AF3A for ; Tue, 11 Jan 2022 22:47:41 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id A09CC24017C for ; Tue, 11 Jan 2022 21:47:40 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id g4XNMMwSQvMV for ; Tue, 11 Jan 2022 21:47:38 +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 8770624017E for ; Tue, 11 Jan 2022 21:47:26 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 641B43A0E05; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:05 +0100 Message-Id: <20220111204610.14262-30-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 30/35] lavu/audio_fifo: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5Z2MV6Afe++1 --- libavutil/audio_fifo.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/libavutil/audio_fifo.c b/libavutil/audio_fifo.c index 243efc39e4..1ab0c9bcdc 100644 --- a/libavutil/audio_fifo.c +++ b/libavutil/audio_fifo.c @@ -80,7 +80,7 @@ AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, goto error; for (i = 0; i < af->nb_buffers; i++) { - af->buf[i] = av_fifo_alloc(buf_size); + af->buf[i] = av_fifo_alloc2(buf_size, 1, 0); if (!af->buf[i]) goto error; } @@ -95,15 +95,19 @@ error: int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples) { + const size_t cur_size = av_fifo_can_read (af->buf[0]) + + av_fifo_can_write(af->buf[0]); int i, ret, buf_size; if ((ret = av_samples_get_buffer_size(&buf_size, af->channels, nb_samples, af->sample_fmt, 1)) < 0) return ret; - for (i = 0; i < af->nb_buffers; i++) { - if ((ret = av_fifo_realloc2(af->buf[i], buf_size)) < 0) - return ret; + if (buf_size > cur_size) { + for (i = 0; i < af->nb_buffers; i++) { + if ((ret = av_fifo_grow2(af->buf[i], buf_size - cur_size)) < 0) + return ret; + } } af->allocated_samples = nb_samples; return 0; @@ -126,8 +130,8 @@ int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples) size = nb_samples * af->sample_size; for (i = 0; i < af->nb_buffers; i++) { - ret = av_fifo_generic_write(af->buf[i], data[i], size, NULL); - if (ret != size) + ret = av_fifo_write(af->buf[i], data[i], size); + if (ret < 0) return AVERROR_BUG; } af->nb_samples += nb_samples; @@ -137,21 +141,7 @@ int av_audio_fifo_write(AVAudioFifo *af, void **data, int 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; + return av_audio_fifo_peek_at(af, data, nb_samples, 0); } int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset) @@ -171,7 +161,7 @@ int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offs offset *= af->sample_size; size = nb_samples * af->sample_size; for (i = 0; i < af->nb_buffers; i++) { - if ((ret = av_fifo_generic_peek_at(af->buf[i], data[i], offset, size, NULL)) < 0) + if ((ret = av_fifo_peek(af->buf[i], data[i], size, offset)) < 0) return AVERROR_BUG; } @@ -190,7 +180,7 @@ int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples) size = nb_samples * af->sample_size; for (i = 0; i < af->nb_buffers; i++) { - if (av_fifo_generic_read(af->buf[i], data[i], size, NULL) < 0) + if (av_fifo_read(af->buf[i], data[i], size) < 0) return AVERROR_BUG; } af->nb_samples -= nb_samples; @@ -209,7 +199,7 @@ int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples) if (nb_samples) { size = nb_samples * af->sample_size; for (i = 0; i < af->nb_buffers; i++) - av_fifo_drain(af->buf[i], size); + av_fifo_drain2(af->buf[i], size); af->nb_samples -= nb_samples; } return 0; From patchwork Tue Jan 11 20:46:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33266 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4051999iog; Tue, 11 Jan 2022 12:55:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJyvW6/a4AI4xitkuYxIoOREQXG7tRHHhrtUM+t3Kv3+KIcf2g7+rFqMcszJIr/+UNNsTum4 X-Received: by 2002:a05:6402:50cf:: with SMTP id h15mr5902599edb.318.1641934508519; Tue, 11 Jan 2022 12:55:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934508; cv=none; d=google.com; s=arc-20160816; b=y1xuOFiaq/j/2Y+CZK3Jv5Ei2oRnnT4F6heFrn/pyM/QszivLSZ17lME7Nq8AlzvnM B4IWsgqk5dEdR2Q1JqLgpnBmKJNdAIJILOXJNiumexNM7Wv7obS+wq5HxNoYSsOvCD8m Jt4aI0C8h4q4pIGCC5rDgkvvQjbDs7n6vFeTI6d6aM28PZBuhunwKc6BsaVKwY1cxq8o ktaLavA5O0VuyWd1qAW0noL6WRRoSUBklEKokZkXQxkx/M62x7OB9Dq5JN8YTM1sNHnv flXiQsgQKxHQefeRPi8OQsWDFbznCjJn0SMdywwjOZs2QwWQhGq9SuW+XaTatXE7Mzyn GuPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=Lqqy8NjC2XRaTra6haBFBVWfzDgHDOnT1jO0T8QBrM4=; b=FcvndRSMJGNlkm1nDF0ydfpwKVLaGQi9XB0VurV6GR1xTCHuKoKtzMOPeH/Dtnipzn 9CEJCOmzIhe1uJwHgR+mtxmn4MzAuxLMPbcIN7yEmkYiF3yI+iW44uielAdDcWyYvabd WjCLruCsee+NsM4MAQlObZiE9hcFuObPRBj9diJnpc8183nc51Ss9H84LTMozrfVlSqB GnpZS9bJlPGtB3ai5qDNOtJRJ2CwdoI9T47IWc3b3bgh/v22Cgo2hJnZFEZRS4DDAMXM cmKqNG8FFvTOMgbDCqwdncGr91/mVNzl8UQORbSb/t17GWbKDYVQKt5J/5+ESiX66wcY DHGQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id du4si6488970ejc.961.2022.01.11.12.55.08; Tue, 11 Jan 2022 12:55:08 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ACE4668AF8A; Tue, 11 Jan 2022 22:54:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7B9ED68AEFF for ; Tue, 11 Jan 2022 22:54:48 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 054C224017E for ; Tue, 11 Jan 2022 21:54:48 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id j_vKVsgBlyWQ for ; Tue, 11 Jan 2022 21:54:47 +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 C3E1224017C for ; Tue, 11 Jan 2022 21:54:46 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 683C13A0E5A; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:06 +0100 Message-Id: <20220111204610.14262-31-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 31/35] lavu/threadmessage: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CeBt9wDhVTVZ --- libavutil/threadmessage.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/libavutil/threadmessage.c b/libavutil/threadmessage.c index 764b7fb813..39d3525a78 100644 --- a/libavutil/threadmessage.c +++ b/libavutil/threadmessage.c @@ -64,7 +64,7 @@ int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, av_free(rmq); return AVERROR(ret); } - if (!(rmq->fifo = av_fifo_alloc(elsize * nelem))) { + if (!(rmq->fifo = av_fifo_alloc2(nelem, elsize, 0))) { pthread_cond_destroy(&rmq->cond_send); pthread_cond_destroy(&rmq->cond_recv); pthread_mutex_destroy(&rmq->lock); @@ -107,9 +107,9 @@ int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq) #if HAVE_THREADS int ret; pthread_mutex_lock(&mq->lock); - ret = av_fifo_size(mq->fifo); + ret = av_fifo_can_read(mq->fifo); pthread_mutex_unlock(&mq->lock); - return ret / mq->elsize; + return ret; #else return AVERROR(ENOSYS); #endif @@ -121,14 +121,14 @@ static int av_thread_message_queue_send_locked(AVThreadMessageQueue *mq, void *msg, unsigned flags) { - while (!mq->err_send && av_fifo_space(mq->fifo) < mq->elsize) { + while (!mq->err_send && !av_fifo_can_write(mq->fifo)) { if ((flags & AV_THREAD_MESSAGE_NONBLOCK)) return AVERROR(EAGAIN); pthread_cond_wait(&mq->cond_send, &mq->lock); } if (mq->err_send) return mq->err_send; - av_fifo_generic_write(mq->fifo, msg, mq->elsize, NULL); + av_fifo_write(mq->fifo, msg, 1); /* one message is sent, signal one receiver */ pthread_cond_signal(&mq->cond_recv); return 0; @@ -138,14 +138,14 @@ static int av_thread_message_queue_recv_locked(AVThreadMessageQueue *mq, void *msg, unsigned flags) { - while (!mq->err_recv && av_fifo_size(mq->fifo) < mq->elsize) { + while (!mq->err_recv && !av_fifo_can_read(mq->fifo)) { if ((flags & AV_THREAD_MESSAGE_NONBLOCK)) return AVERROR(EAGAIN); pthread_cond_wait(&mq->cond_recv, &mq->lock); } - if (av_fifo_size(mq->fifo) < mq->elsize) + if (!av_fifo_can_read(mq->fifo)) return mq->err_recv; - av_fifo_generic_read(mq->fifo, msg, mq->elsize, NULL); + av_fifo_read(mq->fifo, msg, 1); /* one message space appeared, signal one sender */ pthread_cond_signal(&mq->cond_send); return 0; @@ -208,25 +208,25 @@ void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, } #if HAVE_THREADS -static void free_func_wrap(void *arg, void *msg, int size) +static int free_func_wrap(void *arg, void *buf, size_t *nb_elems) { AVThreadMessageQueue *mq = arg; - mq->free_func(msg); + uint8_t *msg = buf; + for (size_t i = 0; i < *nb_elems; i++) + mq->free_func(msg + i * mq->elsize); + return 0; } #endif void av_thread_message_flush(AVThreadMessageQueue *mq) { #if HAVE_THREADS - int used, off; - void *free_func = mq->free_func; + size_t used; pthread_mutex_lock(&mq->lock); - used = av_fifo_size(mq->fifo); - if (free_func) - for (off = 0; off < used; off += mq->elsize) - av_fifo_generic_peek_at(mq->fifo, mq, off, mq->elsize, free_func_wrap); - av_fifo_drain(mq->fifo, used); + used = av_fifo_can_read(mq->fifo); + if (mq->free_func) + av_fifo_read_to_cb(mq->fifo, free_func_wrap, mq, &used); /* only the senders need to be notified since the queue is empty and there * is nothing to read */ pthread_cond_broadcast(&mq->cond_send); From patchwork Tue Jan 11 20:46:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33269 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4052322iog; Tue, 11 Jan 2022 12:55:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJyoMZohoYfT2/b516aeUQuriBTpIlGUlodxPUqGrmZSsNkvLmPSeAD0YfHwS/l8+SNnUenu X-Received: by 2002:a17:906:99c3:: with SMTP id s3mr5238559ejn.486.1641934545824; Tue, 11 Jan 2022 12:55:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934545; cv=none; d=google.com; s=arc-20160816; b=PTDFbMTtVznbwDSuzzAOiy9LzpEH2+hdkq0nIcjg8NR6PLmej5rV8s+S7igirZqJxt FAsqelXi6xfxrUhx0p/Pjex2inB2oQH4R8RAQpOE8GEXvpC8CaF6PVSw1I8gSYRqQoaT Tz8YwLWQUDyBWbZMWmzVz9XZS/Ow1DuuRhcU8+UEADFO6CGAJde2Zf4QafTsAYgYUU15 KmvKTLLHlcLdJS9JxfpNpp5MtxNpK5rsrotKrijMDwjVQlMu4yr12o3pNNY94LCIESCL Hcqj9pHRpsgXmHtFyQq0YBhqRT/bbJ6neEHbQL7TGaKKC1LbTzsiLu1aekAYD/DWaNmw uIlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=C0BfCSsS/rY/QXHs0Zi9RaH3XtwWWz3ZAyoaG1saZn8=; b=GW+V/DK1qMy1MhXJOk0FhZ8zsHoW4QMIh2J+D+pjs8CS7nKJB0b9RN3j2Sw62IUzOt S/gaTlZCE43djedPPEMuRLprJ68HRv/KwpvjXH3RsDslorqEZFHuiGlmQcPeK/jp+nJZ I/inM7OXrk1f8dPyfYyFuMXCHXQEvyXYvT+dMyD1RRCO7WGol+XlWMIKOTfrYXHecjTe KD7ZdBAIj802/X/8gwE3Wmppe+zbdsoidCLxUavrw4Zb/3krOEIgOUp1DrSbpnCc1lra sw6hZ8H3qojmM7wFLwu7AuLRnCXe9oNBZTF0u9qA595B1p+J0UY2qvFhdxIICrZvijnB doag== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ds15si6185291ejc.509.2022.01.11.12.55.45; Tue, 11 Jan 2022 12:55:45 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ACE9868AFD8; Tue, 11 Jan 2022 22:54:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 447D968AF57 for ; Tue, 11 Jan 2022 22:54:49 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id B8B122404FE for ; Tue, 11 Jan 2022 21:54:48 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id g4ApduHry6L2 for ; Tue, 11 Jan 2022 21:54:48 +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 D9AEB240506 for ; Tue, 11 Jan 2022 21:54:46 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 6C77A3A0E76; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:07 +0100 Message-Id: <20220111204610.14262-32-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 32/35] lavfi/qsvvpp: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: XatUSxjDyf5W --- libavfilter/qsvvpp.c | 46 +++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index d1218355c7..60da1d47c5 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -40,6 +40,11 @@ static const AVRational default_tb = { 1, 90000 }; +typedef struct QSVAsyncFrame { + mfxSyncPoint sync; + QSVFrame *frame; +} QSVAsyncFrame; + static const struct { int mfx_iopattern; const char *desc; @@ -642,16 +647,6 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) return 0; } -static unsigned int qsv_fifo_item_size(void) -{ - return sizeof(mfxSyncPoint) + sizeof(QSVFrame*); -} - -static unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) -{ - return av_fifo_size(fifo)/qsv_fifo_item_size(); -} - int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param) { int i; @@ -727,7 +722,7 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p s->got_frame = 0; /** keep fifo size at least 1. Even when async_depth is 0, fifo is used. */ - s->async_fifo = av_fifo_alloc((param->async_depth + 1) * qsv_fifo_item_size()); + s->async_fifo = av_fifo_alloc2(param->async_depth + 1, sizeof(QSVAsyncFrame), 0); s->async_depth = param->async_depth; if (!s->async_fifo) { ret = AVERROR(ENOMEM); @@ -799,24 +794,25 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr { AVFilterContext *ctx = inlink->dst; AVFilterLink *outlink = ctx->outputs[0]; + QSVAsyncFrame aframe; mfxSyncPoint sync; QSVFrame *in_frame, *out_frame, *tmp; int ret, filter_ret; - while (s->eof && qsv_fifo_size(s->async_fifo)) { - av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); - av_fifo_generic_read(s->async_fifo, &sync, sizeof(sync), NULL); - if (MFXVideoCORE_SyncOperation(s->session, sync, 1000) < 0) + while (s->eof && av_fifo_can_read(s->async_fifo)) { + av_fifo_read(s->async_fifo, &aframe, 1); + + if (MFXVideoCORE_SyncOperation(s->session, aframe.sync, 1000) < 0) av_log(ctx, AV_LOG_WARNING, "Sync failed.\n"); - filter_ret = s->filter_frame(outlink, tmp->frame); + filter_ret = s->filter_frame(outlink, aframe.frame->frame); if (filter_ret < 0) { - av_frame_free(&tmp->frame); + av_frame_free(&aframe.frame->frame); return filter_ret; } - tmp->queued--; + aframe.frame->queued--; s->got_frame = 1; - tmp->frame = NULL; + aframe.frame->frame = NULL; }; if (!picref) @@ -853,16 +849,14 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr default_tb, outlink->time_base); out_frame->queued++; - av_fifo_generic_write(s->async_fifo, &out_frame, sizeof(out_frame), NULL); - av_fifo_generic_write(s->async_fifo, &sync, sizeof(sync), NULL); - + aframe = (QSVAsyncFrame){ sync, out_frame }; + av_fifo_write(s->async_fifo, &aframe, 1); - if (qsv_fifo_size(s->async_fifo) > s->async_depth) { - av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); - av_fifo_generic_read(s->async_fifo, &sync, sizeof(sync), NULL); + if (av_fifo_can_read(s->async_fifo) > s->async_depth) { + av_fifo_read(s->async_fifo, &aframe, 1); do { - ret = MFXVideoCORE_SyncOperation(s->session, sync, 1000); + ret = MFXVideoCORE_SyncOperation(s->session, aframe.sync, 1000); } while (ret == MFX_WRN_IN_EXECUTION); filter_ret = s->filter_frame(outlink, tmp->frame); From patchwork Tue Jan 11 20:46:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33268 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4052216iog; Tue, 11 Jan 2022 12:55:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJyBGSuStOhjGPPttPtjV+dx0W4f9/lh8a9TFyFuOoXzE8pjjkpKSsmBe7G+pptz3kwa08nB X-Received: by 2002:a17:906:9b08:: with SMTP id eo8mr5288217ejc.234.1641934533293; Tue, 11 Jan 2022 12:55:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934533; cv=none; d=google.com; s=arc-20160816; b=uvw4blcK7aJ75dh89OkFMLs56tPow2Nd/AzGF9SasFoOJgl3xVnlBX0xnY7IKMfBkk 421+KWhu9OZkvC9ZL2GbbFfq0KQQet+pS+drSMzIfT4pZ5GvFLdi5yCwprzM3FbQMUkT CUbhhGRuDEBGmgqHPH0p4BBJ5ok8JrdKscx0RknMPMLBKtNQ3e3cjAu4+RU24d3+pJDr 2OOqYm3WkgrLvs8ENsDNiVSZFtrufIlwMjqfhtAFssjXbqO7OSbeP40mmDer4snk88Pm F6p9SYlGMQSWp9JlRDeFFNqfkXjqV7SICk34xAV76+7FKLZdINOGAiOgfPre/agZMsuH jXYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=rjKiZGvKdNBT8I8owybYMOdqy82+HiafgKEGWgLBNOQ=; b=fhGe+CEFft2JdelSssuLLt9jqcuMtUDjwfxgorsoya1rSscT5vcq7kXZ9ffDafrpXj cfXonUW87YMjo7L8TA64dWWokoHtN6TpFKQywSR0pcOA6DfMgZcAgterbKklPt8hw9kt AuRcuBWUZF5haLIM5Q7ISMcK/TSuVG9wTj3i7DAYO5drdmn/UT7lZP+q/fSmDCECeUYo 6zsqD65p/rs8wwDh6il/xyo85pv7xxfHUh6XICUvZ4l1yj4lI+3diG4elcUwvVUt8g6r duyQ0GXhFQg2QQ8MD/xq6xQ77oazwtixAxILkj0Z8wo5yDtTWJBOCCg8pvXLAo3vUdr9 Ejww== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id oz43si68983ejc.708.2022.01.11.12.55.32; Tue, 11 Jan 2022 12:55:33 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BC0B068AFB7; Tue, 11 Jan 2022 22:54:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1910268AF3A for ; Tue, 11 Jan 2022 22:54:49 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 920BF240179 for ; Tue, 11 Jan 2022 21:54:48 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id g-kKQfSHe1ts for ; Tue, 11 Jan 2022 21:54:48 +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 CC00C2404FE for ; Tue, 11 Jan 2022 21:54:46 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 70AF53A0746; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:08 +0100 Message-Id: <20220111204610.14262-33-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 33/35] lavfi/vf_deshake_opencl: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Jfcyi5RuE19b --- libavfilter/vf_deshake_opencl.c | 80 ++++++++++----------------------- 1 file changed, 24 insertions(+), 56 deletions(-) diff --git a/libavfilter/vf_deshake_opencl.c b/libavfilter/vf_deshake_opencl.c index 9c761ba5ad..c8ad1d2a4a 100644 --- a/libavfilter/vf_deshake_opencl.c +++ b/libavfilter/vf_deshake_opencl.c @@ -156,14 +156,8 @@ static void free_debug_matches(AbsoluteFrameMotion *afm) { return; } - while (av_fifo_size(afm->debug_matches) > 0) { - av_fifo_generic_read( - afm->debug_matches, - &dm, - sizeof(DebugMatches), - NULL - ); - + while (av_fifo_can_read(afm->debug_matches)) { + av_fifo_read(afm->debug_matches, &dm, 1); av_freep(&dm.matches); } @@ -863,7 +857,7 @@ static void ringbuf_float_at( } else { // This expression represents the last valid index in the buffer, // which we use repeatedly at the end of the video. - clip_end = deshake_ctx->smooth_window - (av_fifo_space(values) / sizeof(float)) - 1; + clip_end = deshake_ctx->smooth_window - av_fifo_can_write(values) - 1; } if (deshake_ctx->abs_motion.data_start_offset != -1) { @@ -881,13 +875,7 @@ static void ringbuf_float_at( clip_end ); - av_fifo_generic_peek_at( - values, - val, - offset_clipped * sizeof(float), - sizeof(float), - NULL - ); + av_fifo_peek(values, val, 1, offset_clipped); } // Returns smoothed current frame value of the given buffer of floats based on the @@ -1188,10 +1176,8 @@ static int deshake_opencl_init(AVFilterContext *avctx) } for (int i = 0; i < RingbufCount; i++) { - ctx->abs_motion.ringbuffers[i] = av_fifo_alloc_array( - ctx->smooth_window, - sizeof(float) - ); + ctx->abs_motion.ringbuffers[i] = av_fifo_alloc2(ctx->smooth_window, + sizeof(float), 0); if (!ctx->abs_motion.ringbuffers[i]) { err = AVERROR(ENOMEM); @@ -1200,9 +1186,9 @@ static int deshake_opencl_init(AVFilterContext *avctx) } if (ctx->debug_on) { - ctx->abs_motion.debug_matches = av_fifo_alloc_array( + ctx->abs_motion.debug_matches = av_fifo_alloc2( ctx->smooth_window / 2, - sizeof(DebugMatches) + sizeof(DebugMatches), 0 ); if (!ctx->abs_motion.debug_matches) { @@ -1424,12 +1410,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *input_frame) const float luma_h_over_chroma_h = ((float)input_frame->height / (float)chroma_height); if (deshake_ctx->debug_on) { - av_fifo_generic_read( + av_fifo_read( deshake_ctx->abs_motion.debug_matches, - &debug_matches, - sizeof(DebugMatches), - NULL - ); + &debug_matches, 1); } if (input_frame->pkt_duration) { @@ -1441,13 +1424,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *input_frame) // Get the absolute transform data for this frame for (int i = 0; i < RingbufCount; i++) { - av_fifo_generic_peek_at( - deshake_ctx->abs_motion.ringbuffers[i], - &old_vals[i], - deshake_ctx->abs_motion.curr_frame_offset * sizeof(float), - sizeof(float), - NULL - ); + av_fifo_peek(deshake_ctx->abs_motion.ringbuffers[i], + &old_vals[i], 1, + deshake_ctx->abs_motion.curr_frame_offset); } if (deshake_ctx->tripod_mode) { @@ -1842,7 +1821,7 @@ static int queue_frame(AVFilterLink *link, AVFrame *input_frame) { sizeof(cl_mem), &deshake_ctx->brief_pattern} ); - if (av_fifo_size(deshake_ctx->abs_motion.ringbuffers[RingbufX]) == 0) { + if (!av_fifo_can_read(deshake_ctx->abs_motion.ringbuffers[RingbufX])) { // This is the first frame we've been given to queue, meaning there is // no previous frame to match descriptors to @@ -1892,7 +1871,7 @@ static int queue_frame(AVFilterLink *link, AVFrame *input_frame) // old data (and just treat them all as part of the new values) if (deshake_ctx->abs_motion.data_end_offset == -1) { deshake_ctx->abs_motion.data_end_offset = - av_fifo_size(deshake_ctx->abs_motion.ringbuffers[RingbufX]) / sizeof(float) - 1; + av_fifo_can_read(deshake_ctx->abs_motion.ringbuffers[RingbufX]) - 1; } goto no_motion_data; @@ -1934,13 +1913,10 @@ static int queue_frame(AVFilterLink *link, AVFrame *input_frame) // Get the absolute transform data for the previous frame for (int i = 0; i < RingbufCount; i++) { - av_fifo_generic_peek_at( + av_fifo_peek( deshake_ctx->abs_motion.ringbuffers[i], - &prev_vals[i], - av_fifo_size(deshake_ctx->abs_motion.ringbuffers[i]) - sizeof(float), - sizeof(float), - NULL - ); + &prev_vals[i], 1, + av_fifo_can_read(deshake_ctx->abs_motion.ringbuffers[i]) - 1); } new_vals[RingbufX] = prev_vals[RingbufX] + relative.translation.s[0]; @@ -2011,21 +1987,13 @@ end: } debug_matches.num_matches = num_vectors; - av_fifo_generic_write( + av_fifo_write( deshake_ctx->abs_motion.debug_matches, - &debug_matches, - sizeof(DebugMatches), - NULL - ); + &debug_matches, 1); } for (int i = 0; i < RingbufCount; i++) { - av_fifo_generic_write( - deshake_ctx->abs_motion.ringbuffers[i], - &new_vals[i], - sizeof(float), - NULL - ); + av_fifo_write(deshake_ctx->abs_motion.ringbuffers[i], &new_vals[i], 1); } return ff_framequeue_add(&deshake_ctx->fq, input_frame); @@ -2063,9 +2031,9 @@ static int activate(AVFilterContext *ctx) // If there is no more space in the ringbuffers, remove the oldest // values to make room for the new ones - if (av_fifo_space(deshake_ctx->abs_motion.ringbuffers[RingbufX]) == 0) { + if (!av_fifo_can_write(deshake_ctx->abs_motion.ringbuffers[RingbufX])) { for (int i = 0; i < RingbufCount; i++) { - av_fifo_drain(deshake_ctx->abs_motion.ringbuffers[i], sizeof(float)); + av_fifo_drain2(deshake_ctx->abs_motion.ringbuffers[i], 1); } } ret = queue_frame(inlink, frame); @@ -2092,7 +2060,7 @@ static int activate(AVFilterContext *ctx) // Finish processing the rest of the frames in the queue. while(ff_framequeue_queued_frames(&deshake_ctx->fq) != 0) { for (int i = 0; i < RingbufCount; i++) { - av_fifo_drain(deshake_ctx->abs_motion.ringbuffers[i], sizeof(float)); + av_fifo_drain2(deshake_ctx->abs_motion.ringbuffers[i], 1); } ret = filter_frame(inlink, ff_framequeue_take(&deshake_ctx->fq)); From patchwork Tue Jan 11 20:46:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33265 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4051897iog; Tue, 11 Jan 2022 12:54:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJzA+nT6os+rdPsSZozlb85qbIr2flZzqfJeQsFxAP6juhc/ZHvveqL0AcDPDPGK6UvF6jvM X-Received: by 2002:a05:6402:27ca:: with SMTP id c10mr6024505ede.67.1641934497824; Tue, 11 Jan 2022 12:54:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934497; cv=none; d=google.com; s=arc-20160816; b=hq4dDoE/+Glcr9eWch5PcXfaBtH1CbzPLMNInonzN8pPXoKssnFPNINC3OZFKxfvzV m/tJ1kZwQkp4j4Q6tio9hqpnX6LMo2/qBoaky0Wd96guH3pMrvwUCn3NUwIRLg+84wks jygDbhc0L60GCPp5gOERJ6ygIVkTRd6OozFSegBKINOBWUUIiefFBpmk1QKLrjK26lXv 1F8539xB6RWJJJUseMgg8SwBM+Z9hzsKbjm9+nfEjP60z2EgU5e7NpQ62VakqieTknyE rKoAXwE/FYeJA1eKfUFk0s3Up8R3LFfaL2hZvT4tgx3lCLFrW+J4ZZ+muAyQ8spzsfZl y26w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=gbnUabugTmhxNL6J1Qfmdt7UNSBad/gjuGpjGaSJGKI=; b=ZvwMz9JYTlKwY5kWz2che4Luf0O6PEFc6mtkcRrbhJ8hkJh7LcLLhIOIU43iGuphu2 rUHikvCK595F7P8yFvAnt6p/yz9qW3vjVwt5X6ua2aNWeXX1X7SkLQ5wOIFR2D0NodZb ABEUt89h71Kyc6OSmlv0oA0NzSEox2QtuMKCQryQvU9BUAT90UwHLRs+QsLkx+i8haK+ 55aquayFFhyaqUH4HQfbq1zvbsYuXK6UR1CZJq6KBtN2RgSxIRj59PB4xBAI2hLY3gN7 dudPNxTJa81crZeMhssBT2ULPDsADZwW7Zz2RLiK+chd8VLncpl/Zx3YTEGBPm5mc3G7 wDUQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id dr19si992386ejc.871.2022.01.11.12.54.57; Tue, 11 Jan 2022 12:54:57 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9D07A68AF2D; Tue, 11 Jan 2022 22:54:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D36CD68A441 for ; Tue, 11 Jan 2022 22:54:47 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 5EBA2240507 for ; Tue, 11 Jan 2022 21:54:47 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 1Tqcvph9RyLi for ; Tue, 11 Jan 2022 21:54:46 +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 C810024017E for ; Tue, 11 Jan 2022 21:54:46 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 74EBB3A0F66; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:09 +0100 Message-Id: <20220111204610.14262-34-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 34/35] ffplay: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +cnOKhLE3TS8 --- fftools/ffplay.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fftools/ffplay.c b/fftools/ffplay.c index e7b20be76b..4bef9a6ecc 100644 --- a/fftools/ffplay.c +++ b/fftools/ffplay.c @@ -424,19 +424,18 @@ int64_t get_valid_channel_layout(int64_t channel_layout, int channels) static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt) { MyAVPacketList pkt1; + int ret; if (q->abort_request) return -1; - if (av_fifo_space(q->pkt_list) < sizeof(pkt1)) { - if (av_fifo_grow(q->pkt_list, sizeof(pkt1)) < 0) - return -1; - } pkt1.pkt = pkt; pkt1.serial = q->serial; - av_fifo_generic_write(q->pkt_list, &pkt1, sizeof(pkt1), NULL); + ret = av_fifo_write(q->pkt_list, &pkt1, 1); + if (ret < 0) + return ret; q->nb_packets++; q->size += pkt1.pkt->size + sizeof(pkt1); q->duration += pkt1.pkt->duration; @@ -477,7 +476,7 @@ static int packet_queue_put_nullpacket(PacketQueue *q, AVPacket *pkt, int stream static int packet_queue_init(PacketQueue *q) { memset(q, 0, sizeof(PacketQueue)); - q->pkt_list = av_fifo_alloc(sizeof(MyAVPacketList)); + q->pkt_list = av_fifo_alloc2(1, sizeof(MyAVPacketList), AV_FIFO_FLAG_AUTO_GROW); if (!q->pkt_list) return AVERROR(ENOMEM); q->mutex = SDL_CreateMutex(); @@ -499,8 +498,8 @@ static void packet_queue_flush(PacketQueue *q) MyAVPacketList pkt1; SDL_LockMutex(q->mutex); - while (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) { - av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL); + while (av_fifo_can_read(q->pkt_list)) { + av_fifo_read(q->pkt_list, &pkt1, 1); av_packet_free(&pkt1.pkt); } q->nb_packets = 0; @@ -551,8 +550,8 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria break; } - if (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) { - av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL); + if (av_fifo_can_read(q->pkt_list)) { + av_fifo_read(q->pkt_list, &pkt1, 1); q->nb_packets--; q->size -= pkt1.pkt->size + sizeof(pkt1); q->duration -= pkt1.pkt->duration; From patchwork Tue Jan 11 20:46:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 33267 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp4052090iog; Tue, 11 Jan 2022 12:55:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJylnPaZRXKNMRF+B9O6I79nCYv6JIDgyvpG939xUwAod+Gyw5Bz3u/J7F2H48JFUr5J4mQn X-Received: by 2002:aa7:d60f:: with SMTP id c15mr6041092edr.197.1641934521084; Tue, 11 Jan 2022 12:55:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641934521; cv=none; d=google.com; s=arc-20160816; b=ggLvQ6RNFTFQtQOlov5LYEilr733FDWy2mbWqbWtHxj1Qs0LUnjl76u/qyspsYvWrf CUODwY0S2c7buqPUDInBU9eKCL/s1ppbOQSLyRM97AAT/EegLeRvVIUG34rfJCdmQKMr KeORxrCdVQGEsW0VgAdrNeAW0thLUmPhk570u26K3fa+xYdasJZ7BkFt4Pyofvfo31Ei Yj/PuuieYgnksofOTYsAybMLLDxZ5F2jp1B+B68rysRcJK9v1CVdI9W5ZvwWfsSdKcUd XNKqk/oqKwN5a2/csoMT07WC7PG3P4BrwMUPq0+J0gbI8hKC29OlG2ABKPKYt21YV6TL PISw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=27XUX3DMXQsiWsQckGjon6WQ/rOXj3tw4NDAX5anImE=; b=U486l48wtF+meJBVx4ZmfHsDk9tC/DUmjNt7neSQNW+X41/XdSShwuZ9UPrqb71LwG ouwpAaEXkrJNrVx/cg5mOzYQzMjfYWZYiig4912F6TL0esL4SbXMW5ztT5dr4ALWy8In xe8CXGykRqqj24cb+Zqven6U6MnxPoHtUJP8WFPqQZjZeFrwlV8Yn9zMUHFxTtTAEn/l jMeo2Khyam/1UDd16GuL/QlaFSvuM7Zca1nmfwCpoGZrxv4gpwKc58xKU0Pw3uCoWEwB rbIOSPZvQb8ZAIk/GTDSkVH8f6ev+8aG83Z72vwdZTSJBeKdzx0Icm9jh8Q6/rctV1WH OG6Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id nc36si3097270ejc.451.2022.01.11.12.55.20; Tue, 11 Jan 2022 12:55:21 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE85368AEFF; Tue, 11 Jan 2022 22:54:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9C6E868AF10 for ; Tue, 11 Jan 2022 22:54:48 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 2986C24017C for ; Tue, 11 Jan 2022 21:54:48 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 92W2z_wR0uOA for ; Tue, 11 Jan 2022 21:54:46 +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 C2D52240179 for ; Tue, 11 Jan 2022 21:54:46 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id 7977B3A1041; Tue, 11 Jan 2022 21:47:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jan 2022 21:46:10 +0100 Message-Id: <20220111204610.14262-35-anton@khirnov.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220111204610.14262-1-anton@khirnov.net> References: <20220111204610.14262-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 35/35] ffmpeg: switch to new FIFO API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aNz0QCcCOWc6 --- fftools/ffmpeg.c | 36 ++++++++++++++---------------------- fftools/ffmpeg_filter.c | 12 ++++++------ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index c89a95937e..319e295df3 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -525,19 +525,17 @@ static void ffmpeg_cleanup(int ret) InputFilter *ifilter = fg->inputs[j]; struct InputStream *ist = ifilter->ist; - while (av_fifo_size(ifilter->frame_queue)) { + while (av_fifo_can_read(ifilter->frame_queue)) { AVFrame *frame; - av_fifo_generic_read(ifilter->frame_queue, &frame, - sizeof(frame), NULL); + av_fifo_read(ifilter->frame_queue, &frame, 1); av_frame_free(&frame); } av_fifo_freep(&ifilter->frame_queue); av_freep(&ifilter->displaymatrix); if (ist->sub2video.sub_queue) { - while (av_fifo_size(ist->sub2video.sub_queue)) { + while (av_fifo_can_read(ist->sub2video.sub_queue)) { AVSubtitle sub; - av_fifo_generic_read(ist->sub2video.sub_queue, - &sub, sizeof(sub), NULL); + av_fifo_read(ist->sub2video.sub_queue, &sub, 1); avsubtitle_free(&sub); } av_fifo_freep(&ist->sub2video.sub_queue); @@ -1954,15 +1952,11 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_ref if (!tmp) return AVERROR(ENOMEM); - if (!av_fifo_space(ifilter->frame_queue)) { - ret = av_fifo_realloc2(ifilter->frame_queue, 2 * av_fifo_size(ifilter->frame_queue)); - if (ret < 0) { - av_frame_free(&tmp); - return ret; - } - } - av_fifo_generic_write(ifilter->frame_queue, &tmp, sizeof(tmp), NULL); - return 0; + ret = av_fifo_write(ifilter->frame_queue, &tmp, 1); + if (ret < 0) + av_frame_free(&tmp); + + return ret; } ret = reap_filters(1); @@ -2285,15 +2279,13 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output, sub2video_update(ist, INT64_MIN, &subtitle); } else if (ist->nb_filters) { if (!ist->sub2video.sub_queue) - ist->sub2video.sub_queue = av_fifo_alloc(8 * sizeof(AVSubtitle)); + ist->sub2video.sub_queue = av_fifo_alloc2(8, sizeof(AVSubtitle), AV_FIFO_FLAG_AUTO_GROW); if (!ist->sub2video.sub_queue) exit_program(1); - if (!av_fifo_space(ist->sub2video.sub_queue)) { - ret = av_fifo_realloc2(ist->sub2video.sub_queue, 2 * av_fifo_size(ist->sub2video.sub_queue)); - if (ret < 0) - exit_program(1); - } - av_fifo_generic_write(ist->sub2video.sub_queue, &subtitle, sizeof(subtitle), NULL); + + ret = av_fifo_write(ist->sub2video.sub_queue, &subtitle, 1); + if (ret < 0) + exit_program(1); free_sub = 0; } diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 1f6cba2c04..c468456d54 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -178,7 +178,7 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost) ifilter->graph = fg; ifilter->format = -1; - ifilter->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*)); + ifilter->frame_queue = av_fifo_alloc2(8, sizeof(AVFrame*), AV_FIFO_FLAG_AUTO_GROW); if (!ifilter->frame_queue) exit_program(1); @@ -286,7 +286,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) ifilter->type = ist->st->codecpar->codec_type; ifilter->name = describe_filter_link(fg, in, 1); - ifilter->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*)); + ifilter->frame_queue = av_fifo_alloc2(8, sizeof(AVFrame*), AV_FIFO_FLAG_AUTO_GROW); if (!ifilter->frame_queue) exit_program(1); @@ -1106,9 +1106,9 @@ int configure_filtergraph(FilterGraph *fg) } for (i = 0; i < fg->nb_inputs; i++) { - while (av_fifo_size(fg->inputs[i]->frame_queue)) { + while (av_fifo_can_read(fg->inputs[i]->frame_queue)) { AVFrame *tmp; - av_fifo_generic_read(fg->inputs[i]->frame_queue, &tmp, sizeof(tmp), NULL); + av_fifo_read(fg->inputs[i]->frame_queue, &tmp, 1); ret = av_buffersrc_add_frame(fg->inputs[i]->filter, tmp); av_frame_free(&tmp); if (ret < 0) @@ -1129,9 +1129,9 @@ int configure_filtergraph(FilterGraph *fg) for (i = 0; i < fg->nb_inputs; i++) { InputStream *ist = fg->inputs[i]->ist; if (ist->sub2video.sub_queue && ist->sub2video.frame) { - while (av_fifo_size(ist->sub2video.sub_queue)) { + while (av_fifo_can_read(ist->sub2video.sub_queue)) { AVSubtitle tmp; - av_fifo_generic_read(ist->sub2video.sub_queue, &tmp, sizeof(tmp), NULL); + av_fifo_read(ist->sub2video.sub_queue, &tmp, 1); sub2video_update(ist, INT64_MIN, &tmp); avsubtitle_free(&tmp); }