From patchwork Mon Oct 2 18:13:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 44108 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1204:b0:15d:8365:d4b8 with SMTP id v4csp1574839pzf; Mon, 2 Oct 2023 11:13:42 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHFc4pF5cznNiiPOZh6j9zmMzlvCIihS+V5MBO6Tr25KwxOULcTV6/1CAIXFyChVClOrbYV X-Received: by 2002:aa7:c582:0:b0:532:c08a:eac0 with SMTP id g2-20020aa7c582000000b00532c08aeac0mr10057974edq.26.1696270422158; Mon, 02 Oct 2023 11:13:42 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q18-20020aa7d452000000b0053119ab8821si13114628edr.293.2023.10.02.11.13.37; Mon, 02 Oct 2023 11:13:42 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=vN+ckseU; arc=fail (body hash mismatch); 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6E9C568CCA2; Mon, 2 Oct 2023 21:12:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2057.outbound.protection.outlook.com [40.92.74.57]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A0A1568CC56 for ; Mon, 2 Oct 2023 21:12:52 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IrTK0NwFTcow+Bw7muKIDAQ19zuaG0n54KGE6MocbWzg4kXPU0xh4MDaadcmGJx68HGflZGqaax4UiVeky3IY/rGmH/5mgHjBxVcv3kIkg04RBUzcmhauJV6kJ4OC9aMsphK32Z95imjQMlcA3sGt58E74C+1ltfQ7jk+/Zah02wui7KdwUiVjrgZTwTClaw6Vd/APbXW+9ph/CR+U+Od7Z0/ybz7tKDXWEbGJMo5HiGVcpUn2Y0TnVWraMNjNUsNbp9Q/aiBBH1znofbJIZRqRSA6JMLwGJVDAhDgTZsUacmnXBMp4f+fAN3TlGeu6ZHXqEYFJa3z5wyifZigFyMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=C/rTKzk/NOaUOn/K8f5OCZj/Msyz1HPunecJLj3pMKg=; b=Eic27uqxOUlXcrHS/F9HQFwNpVQIlE0qEc2WBOdRHLa7kiaKdRnLn4Eh12nKeIPP4n3k44NGd7svL6/I2TaYy0Q7eXB7W9OnYBNJibFQ29PV5kvMyMwSK/ofdetu5r+28SoSAidTzyIhQ/ztDnVz0Oyrz1lE5GCMc7++iSzfrtohypKqqPJOWU7oNj0MaQu9FksXFasSCFzsL1E0k/C5FHj9cTodl//Ei1v2SEqmWi30sNAtiB5ceg4LsoH2ZdLMisy52pIebUACf/1D0k/DJMlnvhyR4KBSfKmn1ZqELBpJAKvSa5YagzB1Ip27rTwL6BvbKsCm4yoT8WPIA0AiZA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=C/rTKzk/NOaUOn/K8f5OCZj/Msyz1HPunecJLj3pMKg=; b=vN+ckseUpf4S4tMc9Jls8Ba4wSElaQ5E8bDGshTE5RMVfOQs8+EzFQ71mCvNaCmSw/P46OBTAk61UMn+yqPeZyTPkAgjd6iLgmwzHyY4Vb305aZjGpg75e9o6qK30eweCIWHPj6n3a1cbfpSZbVa3mQDdd8l9xGjooVv4NrFnu7OlxwzQ0TQbNWY1bcOn5VD04qAqYmQaH7pZZwtEIWarQyGuye06E7neyv6wH2tID+VdUE3hyiWpQJIDwvkxXIwq/q2m3aIfKdEovG1x98E0SygkGTtMSppR6TTyLRqlXhGNDTxkskoSDjgJ21BdanfWPfIfQcgTa69OWSLKXAOtQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AS8P250MB0218.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:379::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.27; Mon, 2 Oct 2023 18:12:51 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6792.026; Mon, 2 Oct 2023 18:12:51 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 2 Oct 2023 20:13:38 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [pkhNUR/1o+wN7v9xJ9iCKsrGCcrmf+ro] X-ClientProxiedBy: ZR0P278CA0087.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::20) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20231002181338.1030463-7-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AS8P250MB0218:EE_ X-MS-Office365-Filtering-Correlation-Id: 03abf2c4-6dfc-401c-0a00-08dbc37330b9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FBLvqj76kt34eWAh6ce8d84mmyy3Vpcqf3JhcgJdXVHBPXIwzXmqvh31EBp2nG4XBvrUmMxlIsDcTcyVMJi4O5RVfajQKU9v6bP4MbCWkuGyTmLB6YScVH3MuDt8PDcrY01J4rmCdcPLvmg1wzSz7JvLJk32tWQ3WtwaFhbb8p6/ixvTIfaGRWAAtdcRDXdmEJ3ldSct90eVZVshV3mjS3dNiEl9X+Yr1yhGto9LjqgZIRO2QrIJ5bWTTCyk2MbvtqBf5e7yhGyQ3v4q6eUsqFFeitKtaTbAasUnlKds/wxyq0UnAre1rHE2J46aC7bJeAcAT3lhYi/pzrDyYzn9DQ8Vq593goMalqjPQ+1Dsv/y4gnloQtMt7AbJ/7ag4Ah65jXrrwRdz9wNa0HT9YKpRWq1M9MNrwJ5aoXe/KQa7w9ClbZrWmzolQ5M4OwcMBPj+38ldOXxJOORNDIZONY3ppbMPoFvVHW5rINmLSf3EhgI44DYyrSmjza+zNAEAqpC2IB5TmdurtvPbSwnklBKkiRPAkzTOlGhMmrHvo2iAUjikustVj4fULtgcoBHDQcOlr3XdH7oBknHcLaNJI3wX9JYiOaq6JVJ7KwfmJ8m9nRMPvKJyn1YIYwt+UxYi4U X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: i3aNAbCfGzxBBAKPk4Hn1qXCPiZdkhnFUtRxLCWlaviU7/SBz60zkseM0bB8lJa2WCkh6Ln2HDl+FDYYohtjMS8tcx3S2m76Vlz+1+U3K5xwLtTBupcsTY4BnX3fPy03lqlWBq6W8jpLCDjRWzFWS7HVf8ZxUzE01xhBn8p4JWcJ/RlFNI22juicyCTSqT6kq2azSbPEwe8UIVuO7gGs/4Pd7S6SWDhW6N3OWx/Ul+HFfzV1ZLlT8jhts3L+IWeAUKbFCkGeA1yRbCFJ+7P/5hLLT07ZY2z5XNN16QpIYFO9Ea917UHv1irEWAafo6URAgzoWBKo9zSBRXGkjlkciVBwfNL20gSDm1b7Xg5wAc8DP7vtP33IvJ8X0XM4gPRtcP2CYi0CNK07BILa1rFQHozwTdbve1cIJf6g/r1BHfuIXxIOCF7tpLufBv3RVbvJvElfLJBoAyHF3R7dVOYpR/MZq3O6LxDKJlFHPfi1vdFs7LW1lJB+gPMQImb73MMEObsmmjwJ65uyc/C/pw4Y6vuATkrmZa1OtjnoFyDv4vY4UieEUIrYt3MdkoKtDctsUDh1E/cBwNbbbXEti+1mmXV3wbzJQ+deRA0M4bV51/w8s2Aaptuq/BR1VgeHOJXVF3eB/OquHmXuPh86PTJBXAPdHypED3i/FdCRBNzj9TZLx1+H4c+UjerMjmevvrpH6sOvXaM5kkhnWPRzraHg23nTfClHD/cTQRLCvZXuru/ZB1aSsTo+7MOFLB92mp3pTj78/Rum1VLeKHB5U+qpvgrB4C6Ba+gL60dQ/aQ3QNwXHUieirYqncFhOGejQSENnR9KFG4oDmd7IkhotqwsjRE0WpVRJYnyyrGA7GNMtGa6hVyl/k4FcJsLo5XrvAKnoZ89OjuyRvJr4nZAaIfYWAeCrj4TMuDgPjWjxZZz6XMHQ2n/Iw2aKitGEL0klNzMc0tg39mIoZPJeGiIQd3CdlHmo9SijT9vP9nCvAdTqglOMbdN+feS1o033zWZ2RzHH6VGB9+DGlSjoqW/+dTkol3zfZ+C2h0We7vC6/QYpQlJI8U/jcQLRWh/GwC8ivUVVy3J1ZVnM2EcUE45T8nLasb+QCR4ojIziJGzQ1d/OClLZt3hcW/WYyk7tdaSArrpfbDcQpdCPH49gwdI2TX4VyAMF7GPBGa2/GzkFLceL1aP4fsWogKiLD7knUjPf6YVLH+3nZ3OJcOOf25LbS/ZEXPXB/Uix7JEazQDVvj5TTUw7tHo+iOHq/n4mIi7ayf3 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 03abf2c4-6dfc-401c-0a00-08dbc37330b9 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Oct 2023 18:12:51.2167 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8P250MB0218 Subject: [FFmpeg-devel] [PATCH 49/49] avcodec/v4l2_(m2m|buffers): Use RefStruct API for context references 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: f4RVvSc87JjA Avoids allocations and therefore error checks; also avoids indirections and allows to remove the boilerplate code for creating an object with a dedicated free function. Signed-off-by: Andreas Rheinhardt --- libavcodec/v4l2_buffers.c | 7 +++---- libavcodec/v4l2_buffers.h | 6 +++--- libavcodec/v4l2_m2m.c | 25 +++++++++---------------- libavcodec/v4l2_m2m.h | 5 ++--- 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 2277135699..23474ee143 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -29,6 +29,7 @@ #include #include "libavcodec/avcodec.h" #include "libavutil/pixdesc.h" +#include "refstruct.h" #include "v4l2_context.h" #include "v4l2_buffers.h" #include "v4l2_m2m.h" @@ -229,7 +230,7 @@ static void v4l2_free_buffer(void *opaque, uint8_t *unused) ff_v4l2_buffer_enqueue(avbuf); } - av_buffer_unref(&avbuf->context_ref); + ff_refstruct_unref(&avbuf->context_ref); } } @@ -240,9 +241,7 @@ static int v4l2_buf_increase_ref(V4L2Buffer *in) if (in->context_ref) atomic_fetch_add(&in->context_refcount, 1); else { - in->context_ref = av_buffer_ref(s->self_ref); - if (!in->context_ref) - return AVERROR(ENOMEM); + in->context_ref = ff_refstruct_ref(s->self_ref); in->context_refcount = 1; } diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h index 3d2ff1b9a5..e35b161309 100644 --- a/libavcodec/v4l2_buffers.h +++ b/libavcodec/v4l2_buffers.h @@ -28,7 +28,6 @@ #include #include -#include "libavutil/buffer.h" #include "libavutil/frame.h" #include "packet.h" @@ -46,8 +45,9 @@ typedef struct V4L2Buffer { struct V4L2Context *context; /* This object is refcounted per-plane, so we need to keep track - * of how many context-refs we are holding. */ - AVBufferRef *context_ref; + * of how many context-refs we are holding. + * This pointer is a RefStruct reference. */ + const struct V4L2m2mContext *context_ref; atomic_uint context_refcount; /* keep track of the mmap address and mmap length */ diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index bac3eb0588..007e725b70 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -31,6 +31,7 @@ #include "libavutil/pixdesc.h" #include "libavutil/imgutils.h" #include "libavutil/pixfmt.h" +#include "refstruct.h" #include "v4l2_context.h" #include "v4l2_fmt.h" #include "v4l2_m2m.h" @@ -246,9 +247,9 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s) return 0; } -static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) +static void v4l2_m2m_destroy_context(FFRefStructOpaque unused, void *context) { - V4L2m2mContext *s = (V4L2m2mContext*)context; + V4L2m2mContext *s = context; ff_v4l2_context_release(&s->capture); sem_destroy(&s->refsync); @@ -257,8 +258,6 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) close(s->fd); av_frame_free(&s->frame); av_packet_unref(&s->buf_pkt); - - av_free(s); } int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) @@ -282,7 +281,7 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) ff_v4l2_context_release(&s->output); s->self_ref = NULL; - av_buffer_unref(&priv->context_ref); + ff_refstruct_unref(&priv->context); return 0; } @@ -327,17 +326,11 @@ int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv) int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s) { - *s = av_mallocz(sizeof(V4L2m2mContext)); + *s = ff_refstruct_alloc_ext(sizeof(**s), 0, NULL, + &v4l2_m2m_destroy_context); if (!*s) return AVERROR(ENOMEM); - priv->context_ref = av_buffer_create((uint8_t *) *s, sizeof(V4L2m2mContext), - &v4l2_m2m_destroy_context, NULL, 0); - if (!priv->context_ref) { - av_freep(s); - return AVERROR(ENOMEM); - } - /* assign the context */ priv->context = *s; (*s)->priv = priv; @@ -345,13 +338,13 @@ int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s) /* populate it */ priv->context->capture.num_buffers = priv->num_capture_buffers; priv->context->output.num_buffers = priv->num_output_buffers; - priv->context->self_ref = priv->context_ref; + priv->context->self_ref = priv->context; priv->context->fd = -1; priv->context->frame = av_frame_alloc(); if (!priv->context->frame) { - av_buffer_unref(&priv->context_ref); - *s = NULL; /* freed when unreferencing context_ref */ + ff_refstruct_unref(&priv->context); + *s = NULL; /* freed when unreferencing context */ return AVERROR(ENOMEM); } diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 04d86d7b92..4ba33dc335 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -62,7 +62,7 @@ typedef struct V4L2m2mContext { AVFrame *frame; /* Reference to self; only valid while codec is active. */ - AVBufferRef *self_ref; + struct V4L2m2mContext *self_ref; /* reference back to V4L2m2mPriv */ void *priv; @@ -71,8 +71,7 @@ typedef struct V4L2m2mContext { typedef struct V4L2m2mPriv { AVClass *class; - V4L2m2mContext *context; - AVBufferRef *context_ref; + V4L2m2mContext *context; ///< RefStruct reference int num_output_buffers; int num_capture_buffers;