From patchwork Tue Sep 19 19:57:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43827 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a886:b0:149:dfde:5c0a with SMTP id ca6csp186557pzb; Tue, 19 Sep 2023 12:59:54 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFvFDOb+oRMMrD0ua1O+v9eqmx7yvEyZmQ8I08a2SlLQqqhwuJMfEYyI7ODIQvGsLY3Nt1A X-Received: by 2002:aa7:cb94:0:b0:52f:fa53:9fb6 with SMTP id r20-20020aa7cb94000000b0052ffa539fb6mr386237edt.10.1695153594181; Tue, 19 Sep 2023 12:59:54 -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 s1-20020a056402164100b00532dfe167e2si840336edx.453.2023.09.19.12.59.53; Tue, 19 Sep 2023 12:59:54 -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="ExK/n798"; 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 12EBB68C995; Tue, 19 Sep 2023 22:58:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2052.outbound.protection.outlook.com [40.92.89.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 846DF68C8FD for ; Tue, 19 Sep 2023 22:58:00 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MpdzB3Y5pPEfZymKKV6mvNmctIyfzMckfN06Ss1pkTrynOaKIkJObb/MueBbc4u3hIzJYtQuiI418DSAqEwrJ2AsgdSRseIzj9selgjUiHAKzhgtmT87whHz51hyBDkvnsZcMmdeEsW1WWu97IYnfRYJn3WL7prdjl+Si0j+C/d3ldAEPVUPn1F9PSlr9KMtU2U2zMf/2zc15y85H4pcqFlOkpAFOm36ARAUIaRJOy7biG9nC15j0cc6ZS6Wsz6SusrzvavYiyx6/2T08r7gnFZntdVZ0aMpDq/rCMrA128gU+dIM29IKpexgAjwLycaIAD72WT3CaTUW0f+m523vg== 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=L+yEKc1Gq3x0WgzpIi/i8ZQs+Ro4Y54nnvkzsyN5ErU=; b=Cj6lS6a3DEJSsrOZC897bPUBdjSoTDN7gbxxbjfLG29F0HyL7NtzW1uDs4Z9v59GWPc6SOgtDRb36GKoqZOifKdlNemvTCc/y5TE+PDLizEMHvprNMnQgxjMai6WAMpNyQWFLDtMATKTTc9jPUDDi6CeA/R8LL4s20E9+7Zraemep4gOXiEc6Zgb9JPUaDiPlQNOsZWNsKKlJxuVYWKIBIHAyPs9fqEuk95DvmxGvjaw84AzFMB6d5Plhepxgw5U2mLMGvgdRZxUaFsMgb2L4QA490E7qlBum3tBd0bbU21pYGkOrbcQC5APh59znZ6G1Rd68KUkERNjaLjmU+dZ8g== 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=L+yEKc1Gq3x0WgzpIi/i8ZQs+Ro4Y54nnvkzsyN5ErU=; b=ExK/n798cUzcwpGWpkCOHChwlO2nzzpFKF0dwCvJDpPbPG17u5uIzjgIhdGLatBmy0JyMDyFaxopd1lGXlR/q6kSNGThz7Yf+jvs2rjRm50lJZbmFi7kUcSzg08l4O/dLb6ZwN6N3+7oUkSbhrhMLH0DaNPOFbMkAMpuQqgJ1Tj24lwI69cpMNPEfmik4S7w8jUy6fspCHZgr/ipj9IJLf0MJyhVF4kfwKEsMRBu0Zd9cg/0M99L2NJMsjGsfqZ1pM3bLEJBO82ZRJM9BGKh6fuksGrS0RPhK/gp101R6pYlnYWA4ehNk67k0jEy5mVhRNRzVrG30S8rO0nFAuXC7w== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0215.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:326::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.26; Tue, 19 Sep 2023 19:57:59 +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; Tue, 19 Sep 2023 19:57:59 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Sep 2023 21:57:12 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [j0gssKUwqMr0Ugxm/ttlpzoaw9Tb/nNs] X-ClientProxiedBy: ZR0P278CA0086.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::19) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230919195734.1005750-20-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0215:EE_ X-MS-Office365-Filtering-Correlation-Id: 2684735a-6009-4259-65bc-08dbb94ab91f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ibhIoxS5vcudspMq9bP5HKjGoxVb/NyEHMFZxvU/sbb+TzhgtC3JdcuuGA6lNfvpfyK2VXyyEagCCYHvaoU4BCZhHHy5YQ7b0OeoLo8JEaPl/BMDE0+wjqb3Stp4nTbrRrYddtih+JIujqh+azJ1DN2NVkmU0mxiA8E6ZdLK8vx9uiOVI5EE5iXEqZLat6NDxdMV8GMHJihx1CqwOce1XUTN3GSv29w7fopHmd+MbaZhxXrVGoQLVIEojBwU8T/bFjX6mTVHmmSUoCgnDijT4ybBN1sZgKDZ1JMoLUqsGGSAvm2WmvzxqH+fkBHsKUr6bly5JMNvRIMLGroW1PjSJCxhTi9YNFF68jMI25ufRmAsdbX1+CmHstBFcaNKB0IQ5/hpfoh458k53Ca9wLr2jMdGWljrE7xRekA3SLCfo+Dv/ETbO7FrwIeXauhSiIsfauBdP/1A+TTccZ4kxHjtuh0VqqVRyboEqmWJF5Gdp9eqwvRN4RJWWm09JVWV9lD8tOoiPNwU6BbMIwDvWcIPanCxl++VbGKLeRQRnULFndBbOUIPa7dSJdXPIWSHO1jPjKlrxWgKFr79S1dVCPKWopzbH2O1NFHgrBozGqdcYEmpI9fTIGsWzJmEB1UWerPG X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: AMpA0YlEC7iohOayppiEkfgCO4GrHFlCDNm/gZ/piNPRUHy0F3bpfeOrV83nWlY+4cKspgzyID+hBjjGzqi2WHX8LG3caBWMlGdYQHf2yd4vECdpMLBdCCaIunPmOvl1gdV2V7nQXY8RxK8opswzT+YWL8o53EuDkO0VC9Vcbc/xrD+Zm/gI/6J8mn/POhh7n8P5FBXKqxMbUVgS349p0TKARwunkrwBNPIOMr+iEs3YjSMSvCniTxhzjXnT2McQRlxt59aX1ziCrPLVLXTuO26UKW4PS7TXayNGzaT7cqtmkQpa8430bwlsVct8e0ebHatmD2pFwF2aVTXgum/uF1bzvj5+RJ6aMXkrjSvaxvFD8w7nbpCHb0aOJKUqJtVjM8J/xuB/MwFxbyNFS2yNpvPyHXLbU+ka1PWf9oEvsKdXeURD4/4oWsq5XZg6fVKm2URnitXqun0cH4+aJHjuJqz6pshynYiB3HHSKxqVlQQxLdvI7ntYc9u1zyonxKjGiWfKi5BgDF3ZIm11M1ep8RQP8dOeHXv3hQt6Lr9+eMKSkulW6nU01ZD7JnZAqAL3Gaj7gqUwmw2hEsk8oW+7mC0H+XfSIMDGxbxiWI5MLjYi8Z0U+5L6207KBlh12VPgjKOod4ZpiLVlqcy9aINga3LVfAHxiEORHtcKTyeFOUSP4nB77X/unsaAkDm05/EorKBYXZGSKlPBint4VbZ1839mPHqS5kEUyj2hCdZQg794YoXJtzk4s9mHMLz5n39vR5bWeZHniK+4zONPML5yyDYX7aZJP3hzPd6KbK0utMKZRE7bxhDIVxGztQxBm4ndZdXmLiTb/M0NhEijV18I8jm7yvqjxrXaeJHEo0w0yY3roZxiYsCFDhgQZVcWk2H26nwkO4YHjce/jvwAPrBb6I0RYpFnOoUJBfKVoJGsUbshcq2d6F+FbU7Yrc+yPlwhP08m7jx/xvGdZ2bWvaop7OKwpYIx2qVWqzU9MrN/7M+g7zZD5JCk6J/OsrWkzko0hcMDEE/KVZC83q1r+iB8YhXw58BpcqWBivY9ZIRN/deiyjmcoI3ndfvdCb3lazsKPHuPJcMnh/Vs0IKocISq9REsD0KNgvMIiTGk85vC70+1FQvym83fZNB89sBcJe5Is5wFkjJVSHecyt9Gw9fHgzhMeOJzwPvMtu4gM0UYo/srBwVZp6whifkOwk3iuiw3ziG4r0HySxnt5WbR9seYVFTzeGap6AgPun8pnoP25zyZ/lk672Xug9/3nZqUtn2W X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2684735a-6009-4259-65bc-08dbb94ab91f X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2023 19:57:58.9740 (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: AM8P250MB0215 Subject: [FFmpeg-devel] [PATCH 20/42] avcodec/nvdec: Use RefStruct-pool API for decoder pool 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: IkbVpKH2bdoF It involves less allocations, in particular no allocations after the entry has been created. Therefore creating a new reference from an existing one can't fail and therefore need not be checked. It also avoids indirections and casts. Also note that nvdec_decoder_frame_init() (the callback to initialize new entries from the pool) does not use atomics to read and replace the number of entries currently used by the pool. This relies on nvdec (like most other hwaccels) not being run in a truely frame-threaded way. Signed-off-by: Andreas Rheinhardt --- Notice that the AVBufferPool API serializes creating new entries as well as getting an already existing entry from the pool, so not using atomics here would be fine for it even if nvdec were run in a truely multithreaded way. libavcodec/nvdec.c | 49 +++++++++++++++++++++++----------------------- libavcodec/nvdec.h | 6 +++--- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c index 0ec8e896a6..27be644356 100644 --- a/libavcodec/nvdec.c +++ b/libavcodec/nvdec.c @@ -237,21 +237,22 @@ fail: return ret; } -static AVBufferRef *nvdec_decoder_frame_alloc(void *opaque, size_t size) +static int nvdec_decoder_frame_init(FFRefStructOpaque opaque, void *obj) { - NVDECFramePool *pool = opaque; - AVBufferRef *ret; + NVDECFramePool *pool = opaque.nc; + unsigned int *intp = obj; if (pool->nb_allocated >= pool->dpb_size) - return NULL; + return AVERROR(ENOMEM); - ret = av_buffer_alloc(sizeof(unsigned int)); - if (!ret) - return NULL; + *intp = pool->nb_allocated++; - *(unsigned int*)ret->data = pool->nb_allocated++; + return 0; +} - return ret; +static void nvdec_decoder_frame_pool_free(FFRefStructOpaque opaque) +{ + av_free(opaque.nc); } int ff_nvdec_decode_uninit(AVCodecContext *avctx) @@ -268,7 +269,7 @@ int ff_nvdec_decode_uninit(AVCodecContext *avctx) ctx->slice_offsets_allocated = 0; ff_refstruct_unref(&ctx->decoder); - av_buffer_pool_uninit(&ctx->decoder_pool); + ff_refstruct_pool_uninit(&ctx->decoder_pool); return 0; } @@ -424,8 +425,9 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) } pool->dpb_size = frames_ctx->initial_pool_size; - ctx->decoder_pool = av_buffer_pool_init2(sizeof(int), pool, - nvdec_decoder_frame_alloc, av_free); + ctx->decoder_pool = ff_refstruct_pool_alloc_ext(sizeof(unsigned int), 0, pool, + nvdec_decoder_frame_init, + NULL, NULL, nvdec_decoder_frame_pool_free); if (!ctx->decoder_pool) { ret = AVERROR(ENOMEM); goto fail; @@ -444,8 +446,8 @@ static void nvdec_fdd_priv_free(void *priv) if (!cf) return; - av_buffer_unref(&cf->idx_ref); - av_buffer_unref(&cf->ref_idx_ref); + ff_refstruct_unref(&cf->idx_ref); + ff_refstruct_unref(&cf->ref_idx_ref); ff_refstruct_unref(&cf->decoder); av_freep(&priv); @@ -469,8 +471,8 @@ static void nvdec_unmap_mapped_frame(void *opaque, uint8_t *data) CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy)); finish: - av_buffer_unref(&unmap_data->idx_ref); - av_buffer_unref(&unmap_data->ref_idx_ref); + ff_refstruct_unref(&unmap_data->idx_ref); + ff_refstruct_unref(&unmap_data->ref_idx_ref); ff_refstruct_unref(&unmap_data->decoder); av_free(unmap_data); } @@ -526,10 +528,7 @@ static int nvdec_retrieve_data(void *logctx, AVFrame *frame) goto copy_fail; unmap_data->idx = cf->idx; - if (!(unmap_data->idx_ref = av_buffer_ref(cf->idx_ref))) { - ret = AVERROR(ENOMEM); - goto copy_fail; - } + unmap_data->idx_ref = ff_refstruct_ref(cf->idx_ref); unmap_data->decoder = ff_refstruct_ref(cf->decoder); av_pix_fmt_get_chroma_sub_sample(hwctx->sw_format, &shift_h, &shift_v); @@ -577,13 +576,13 @@ int ff_nvdec_start_frame(AVCodecContext *avctx, AVFrame *frame) cf->decoder = ff_refstruct_ref(ctx->decoder); - cf->idx_ref = av_buffer_pool_get(ctx->decoder_pool); + cf->idx_ref = ff_refstruct_pool_get(ctx->decoder_pool); if (!cf->idx_ref) { av_log(avctx, AV_LOG_ERROR, "No decoder surfaces left\n"); ret = AVERROR(ENOMEM); goto fail; } - cf->ref_idx = cf->idx = *(unsigned int*)cf->idx_ref->data; + cf->ref_idx = cf->idx = *cf->idx_ref; fdd->hwaccel_priv = cf; fdd->hwaccel_priv_free = nvdec_fdd_priv_free; @@ -611,16 +610,16 @@ int ff_nvdec_start_frame_sep_ref(AVCodecContext *avctx, AVFrame *frame, int has_ if (has_sep_ref) { if (!cf->ref_idx_ref) { - cf->ref_idx_ref = av_buffer_pool_get(ctx->decoder_pool); + cf->ref_idx_ref = ff_refstruct_pool_get(ctx->decoder_pool); if (!cf->ref_idx_ref) { av_log(avctx, AV_LOG_ERROR, "No decoder surfaces left\n"); ret = AVERROR(ENOMEM); goto fail; } } - cf->ref_idx = *(unsigned int*)cf->ref_idx_ref->data; + cf->ref_idx = *cf->ref_idx_ref; } else { - av_buffer_unref(&cf->ref_idx_ref); + ff_refstruct_unref(&cf->ref_idx_ref); cf->ref_idx = cf->idx; } diff --git a/libavcodec/nvdec.h b/libavcodec/nvdec.h index efacb5b691..353e95bf42 100644 --- a/libavcodec/nvdec.h +++ b/libavcodec/nvdec.h @@ -44,15 +44,15 @@ typedef struct NVDECFrame { unsigned int idx; unsigned int ref_idx; - AVBufferRef *idx_ref; - AVBufferRef *ref_idx_ref; + unsigned int *idx_ref; ///< RefStruct reference + unsigned int *ref_idx_ref; ///< RefStruct reference struct NVDECDecoder *decoder; ///< RefStruct reference } NVDECFrame; typedef struct NVDECContext { CUVIDPICPARAMS pic_params; - AVBufferPool *decoder_pool; + struct FFRefStructPool *decoder_pool; struct NVDECDecoder *decoder; ///< RefStruct reference