From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 3F1A7476B6 for ; Tue, 19 Sep 2023 19:59:09 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0B0DD68C97E; Tue, 19 Sep 2023 22:57:37 +0300 (EEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2047.outbound.protection.outlook.com [40.92.89.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2152168C919 for ; Tue, 19 Sep 2023 22:57:34 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ctymNf1a8iVdnNkO1oNw+kXJ6qtFdXG/rVI9mfCCJ35Gc1t7hA4cwZrleIhniSLDrSgxsVadAbpeUTXc5XPreXOjxk5UDB4Ty4ZnxkyDTUN+iiqva+BRrrLch+AoS5GHb7OIT74sAL4pbx3hVokep5YJqe3e5nA+wXBMpnS4fzbInEdDnpn9ETn8+MKY9bobvlFgISbK2u86SmsoFuz1lH1wt+JsoHrsgg5Tld1Wp64SYTbj4Jm11ROjLal19aGFrGi5cEuuGr/U2M2Z/DWwr5Nu0VEbnWMUnmvldHFxg7RlQc7/XbkmO8wNjU3tTlgCS78a4qxPfFJP6KXpRZex2w== 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=u/r9PqtluL7PlMc4jLUIXSmRn6N5NNZWrRtd4hzgPq8=; b=Wcq39977ouqIALU+QRUKRoqxypuAXucrjh5K2bNHJDVtAv8gJUHWp/O41Dm7onVgeEl1fyW8cNKOGtRqDRwBSZrDIrpG46NMtBaI042ntuUNEwTA78PfhSRDn7Iot7lMWmAzo7hs2nMe8tERoXI5cBm8qUiR7avfxRiIaRp89Yp6yWbnGV9abudD40TnH/RLrdxV3ZIujGewrUhm3qItBh2OuPF6NcTCFOGHuZ5ycPeFlY4qNrJsOOPZkxvymiI1RjNLIMssMPswPMxNB7tg2Fj0+JJKeJOSL+8RKwaSIPnAuea+SxLLVvOpNvTl/n1Ikzlg/7wa35N4Yyus8h//fg== 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=u/r9PqtluL7PlMc4jLUIXSmRn6N5NNZWrRtd4hzgPq8=; b=uNs75ewuS2z7bLN2ZdOx8dcBzG5W+urFqxafeOWzTrpUPetfWMmDapDOZk/KarM2SuR62x6vcsAzZ9ebYWMCJ4hGn33LAPZE1qsuGhS9l7KEagQi8iMWoV1XrS2dAGbPnaEBSshpHpi6KhrsDLvxgbYAMXv/ykjRbXbh8iXyJLropFVQbg4l1dKX0qmPo9iK25KWVR7zlK00C/pdxDqFP8tNawYvE7c7HRAFbLkvyvOqd5rkiW++GsgUd5+Li9gVnfkAD6nRN+Z3x6cgwujRyHiyBztHtqtlf893Tr9gYZ0LSC8Fn74KY+dh/7qt5rCEXUUg/IY56/0j4hG38vhxDA== 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:33 +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:33 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Sep 2023 21:57:08 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [z/5eFQSrHL3tPsHH+XDdDHV+Yb/Xmuqb] 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-16-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: 93c1d6e3-2602-407f-f689-08dbb94aaa04 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dE/B/iWg2iPj7NRfBej62tnlAqp6B4vbE7UBn2qkiB8FrV6SR/veCJwmQXFyLVAkkYqDP/zGcF4KYp+NksNBdmw97JoVI2K99f1+S1nFhFfd229TPB+Fe1CQr3vX7FyUy5l/lP7FelwjT2Ve0kcErZijkzhpeHGUeWGpuNS/EILavrbwPL2Z+8psCAx51BBcT6USUz81tE085vn760BndFAOD8FtLzoUEVdQiiUs5S36veko87UfUxTw6lPccx5XLmacHzIiPHFUsSJrbKUTIhw311Shmjd+RX/cgUd4dkMjToD3P7gdXYJVV0Kv8FQkXshXFU5+ZEPkK6zbPjfdoo+et+jWs4zE7wP/8MZf4cUhj714kyCcaYdOmWDztf4g98gotOtBlntZB+1C/DJD46454CVot1nVAmj2AuOAjTvita0vZ18LtwWWDlW4Ux1J3Zk88cqJAFqyTPGO2gitrBhQJ3rcRopsgo4XS4hIZNjrLcPtuWNFoDQ4lbNoSBQqePoTIubDWRNjvCuk1/dbhQzX3J0EyVGRhLSB+MjnfDpJtSw8+Ul8La6Bo2ogF8qRupWi1KjYH7GJkQjCk4unnfmcvmdvbBBjZE24Z3ZYak03CZHBJnW4Db94Xf0A5ucI X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0oUbij7VTJtkHjmYXLmOBNWzeVpfVZ9THzuV3RzQ+qHvbkzC/p1MModdpoaO?= =?us-ascii?Q?hleCj5ga2Ry2eeu4m8HMXFyM2l0nNWwYVe8Fa1j/rDDUISheY4XZ8vymsAYz?= =?us-ascii?Q?YhLI3zbmvqv7U1LecmuUkOQAgB693vXbvV2Dj5ZwyIqoMS90wLPiBGKaOiLJ?= =?us-ascii?Q?Iualtv7uZRhfI1n040ktD7VMFCFqN3gV02jlJqwFSbyN+46pC0IEu8sUwd+K?= =?us-ascii?Q?bsJ8En5+KeNqkkwk+edmtTm4vT+GlBdaeWx0bLwT5qqHhfpDB0lj4SRvK6jj?= =?us-ascii?Q?Q4OLNohBk6onzWa/WDUBiXowl/d9QJGrDD/flSyu9qTSNFUO5nF1Zfzd//rw?= =?us-ascii?Q?TG/i73wSbQ6XNd8JRuySUxMv1lUHmTer611PjRt9nRA+XZ5ASA/lhukkAaI/?= =?us-ascii?Q?1rgKl0MBbw7e6QBD/8Nv81rpuobYjXEcvs33v17VnkjLASQhrtMqMqA9zmt2?= =?us-ascii?Q?flu+P8ch6kw1f1veCHrzRG+E1mWWoSUx8dy1QsS5zpqaBSns9RJ7CjZiVIm+?= =?us-ascii?Q?7mHooFqjdYXDdLFqNyQoxEx0rPEreRyvSBr61pTuX7qYOA0QnSnvSophoR0Z?= =?us-ascii?Q?BaSwB7rjKQJ7FvAUw+x3D5Y5087ud2TZggcA8jcE2mWUWvneF4ybjBdBZpPn?= =?us-ascii?Q?L7/PBLxpubZmnIdbHE6eHz+XVJxqg23yBDycFkSDNheQLhqvlD0/0VqEmtJr?= =?us-ascii?Q?VaVjgYcbxowyuivgOCFzuTAbsrjVy3uKGtrDbRDYr6/cYwsEcJz7oOOtg+hs?= =?us-ascii?Q?dq0i+YAonjrSzQFw4n0NIFqT0aFxfYMeRah96VB5K/dSWwgdI+HqLRn8hGmO?= =?us-ascii?Q?Tx7X/xh6+dPq8XBdYEHJhIFyTE7Jnf6PRm1yer9bhqzKmTPVEJk/8++ziZiX?= =?us-ascii?Q?lNP+q1VMgg5hPBMKCvMYdPR+Q5nZzLjLrpB482cIg8TN0XihZLaNGwC7zqCH?= =?us-ascii?Q?UMz+4fWTWz2MUek+G0Y+brWKcz+N3k3ufkcT7r1OQU9jZkXo7/geHumQVV7s?= =?us-ascii?Q?QKrTLAOieJewO5LVh/XvX6/L3DUyMwM/bTBu6D9celgM8cCTJeW1yoCxeLLh?= =?us-ascii?Q?DWkEfftexv71xW1izWGfrEHOqWlXEedVjM2XyVqeubL/WROOFFRztatf5Szz?= =?us-ascii?Q?BBjNnj+Ix8m7XUwl/iKbZn65Y1olo30kLQaeGzW5/QT+s8+kWBBsG7XJD7Sv?= =?us-ascii?Q?MeN3grBTqY2YZsDyV0Cd8Ex/5XkVYgbiRspdmWqyE2mWmrrf2sLMT59cRZxL?= =?us-ascii?Q?H8T1fzDhKEIsqKYTAU02?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 93c1d6e3-2602-407f-f689-08dbb94aaa04 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:33.6493 (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 16/42] avcodec/nvdec: Use RefStruct API for decoder_ref 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Avoids allocations and error checks as well as the boilerplate code for creating an AVBuffer with a custom free callback. Also increases type safety. Signed-off-by: Andreas Rheinhardt --- libavcodec/nvdec.c | 50 ++++++++++++++++++---------------------------- libavcodec/nvdec.h | 4 ++-- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c index a477449d14..0ec8e896a6 100644 --- a/libavcodec/nvdec.c +++ b/libavcodec/nvdec.c @@ -35,6 +35,7 @@ #include "decode.h" #include "nvdec.h" #include "internal.h" +#include "refstruct.h" #if !NVDECAPI_CHECK_VERSION(9, 0) #define cudaVideoSurfaceFormat_YUV444 2 @@ -161,9 +162,9 @@ static int nvdec_test_capabilities(NVDECDecoder *decoder, return 0; } -static void nvdec_decoder_free(void *opaque, uint8_t *data) +static void nvdec_decoder_free(FFRefStructOpaque unused, void *obj) { - NVDECDecoder *decoder = (NVDECDecoder*)data; + NVDECDecoder *decoder = obj; if (decoder->decoder) { void *logctx = decoder->hw_device_ref->data; @@ -177,33 +178,24 @@ static void nvdec_decoder_free(void *opaque, uint8_t *data) av_buffer_unref(&decoder->hw_device_ref); cuvid_free_functions(&decoder->cvdl); - - av_freep(&decoder); } -static int nvdec_decoder_create(AVBufferRef **out, AVBufferRef *hw_device_ref, +static int nvdec_decoder_create(NVDECDecoder **out, AVBufferRef *hw_device_ref, CUVIDDECODECREATEINFO *params, void *logctx) { AVHWDeviceContext *hw_device_ctx = (AVHWDeviceContext*)hw_device_ref->data; AVCUDADeviceContext *device_hwctx = hw_device_ctx->hwctx; - AVBufferRef *decoder_ref; NVDECDecoder *decoder; CUcontext dummy; int ret; - decoder = av_mallocz(sizeof(*decoder)); + decoder = ff_refstruct_alloc_ext(sizeof(*decoder), 0, + NULL, nvdec_decoder_free); if (!decoder) return AVERROR(ENOMEM); - decoder_ref = av_buffer_create((uint8_t*)decoder, sizeof(*decoder), - nvdec_decoder_free, NULL, AV_BUFFER_FLAG_READONLY); - if (!decoder_ref) { - av_freep(&decoder); - return AVERROR(ENOMEM); - } - decoder->hw_device_ref = av_buffer_ref(hw_device_ref); if (!decoder->hw_device_ref) { ret = AVERROR(ENOMEM); @@ -237,11 +229,11 @@ static int nvdec_decoder_create(AVBufferRef **out, AVBufferRef *hw_device_ref, goto fail; } - *out = decoder_ref; + *out = decoder; return 0; fail: - av_buffer_unref(&decoder_ref); + ff_refstruct_unref(&decoder); return ret; } @@ -275,7 +267,7 @@ int ff_nvdec_decode_uninit(AVCodecContext *avctx) ctx->nb_slices = 0; ctx->slice_offsets_allocated = 0; - av_buffer_unref(&ctx->decoder_ref); + ff_refstruct_unref(&ctx->decoder); av_buffer_pool_uninit(&ctx->decoder_pool); return 0; @@ -408,7 +400,7 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) params.ulNumDecodeSurfaces = frames_ctx->initial_pool_size; params.ulNumOutputSurfaces = unsafe_output ? frames_ctx->initial_pool_size : 1; - ret = nvdec_decoder_create(&ctx->decoder_ref, frames_ctx->device_ref, ¶ms, avctx); + ret = nvdec_decoder_create(&ctx->decoder, frames_ctx->device_ref, ¶ms, avctx); if (ret < 0) { if (params.ulNumDecodeSurfaces > 32) { av_log(avctx, AV_LOG_WARNING, "Using more than 32 (%d) decode surfaces might cause nvdec to fail.\n", @@ -420,7 +412,7 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) return ret; } - decoder = (NVDECDecoder*)ctx->decoder_ref->data; + decoder = ctx->decoder; decoder->unsafe_output = unsafe_output; decoder->real_hw_frames_ref = real_hw_frames_ref; real_hw_frames_ref = NULL; @@ -453,8 +445,8 @@ static void nvdec_fdd_priv_free(void *priv) return; av_buffer_unref(&cf->idx_ref); - av_buffer_unref(&cf->decoder_ref); av_buffer_unref(&cf->ref_idx_ref); + ff_refstruct_unref(&cf->decoder); av_freep(&priv); } @@ -462,7 +454,7 @@ static void nvdec_fdd_priv_free(void *priv) static void nvdec_unmap_mapped_frame(void *opaque, uint8_t *data) { NVDECFrame *unmap_data = (NVDECFrame*)data; - NVDECDecoder *decoder = (NVDECDecoder*)unmap_data->decoder_ref->data; + NVDECDecoder *decoder = unmap_data->decoder; void *logctx = decoder->hw_device_ref->data; CUdeviceptr devptr = (CUdeviceptr)opaque; int ret; @@ -478,8 +470,8 @@ static void nvdec_unmap_mapped_frame(void *opaque, uint8_t *data) finish: av_buffer_unref(&unmap_data->idx_ref); - av_buffer_unref(&unmap_data->decoder_ref); av_buffer_unref(&unmap_data->ref_idx_ref); + ff_refstruct_unref(&unmap_data->decoder); av_free(unmap_data); } @@ -487,7 +479,7 @@ static int nvdec_retrieve_data(void *logctx, AVFrame *frame) { FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data; NVDECFrame *cf = (NVDECFrame*)fdd->hwaccel_priv; - NVDECDecoder *decoder = (NVDECDecoder*)cf->decoder_ref->data; + NVDECDecoder *decoder = cf->decoder; AVHWFramesContext *hwctx = (AVHWFramesContext *)frame->hw_frames_ctx->data; @@ -534,11 +526,11 @@ 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)) || - !(unmap_data->decoder_ref = av_buffer_ref(cf->decoder_ref))) { + if (!(unmap_data->idx_ref = av_buffer_ref(cf->idx_ref))) { ret = AVERROR(ENOMEM); goto copy_fail; } + unmap_data->decoder = ff_refstruct_ref(cf->decoder); av_pix_fmt_get_chroma_sub_sample(hwctx->sw_format, &shift_h, &shift_v); for (i = 0; frame->linesize[i]; i++) { @@ -583,11 +575,7 @@ int ff_nvdec_start_frame(AVCodecContext *avctx, AVFrame *frame) if (!cf) return AVERROR(ENOMEM); - cf->decoder_ref = av_buffer_ref(ctx->decoder_ref); - if (!cf->decoder_ref) { - ret = AVERROR(ENOMEM); - goto fail; - } + cf->decoder = ff_refstruct_ref(ctx->decoder); cf->idx_ref = av_buffer_pool_get(ctx->decoder_pool); if (!cf->idx_ref) { @@ -645,7 +633,7 @@ fail: int ff_nvdec_end_frame(AVCodecContext *avctx) { NVDECContext *ctx = avctx->internal->hwaccel_priv_data; - NVDECDecoder *decoder = (NVDECDecoder*)ctx->decoder_ref->data; + NVDECDecoder *decoder = ctx->decoder; void *logctx = avctx; CUVIDPICPARAMS *pp = &ctx->pic_params; diff --git a/libavcodec/nvdec.h b/libavcodec/nvdec.h index 66f3ca59e7..efacb5b691 100644 --- a/libavcodec/nvdec.h +++ b/libavcodec/nvdec.h @@ -46,7 +46,7 @@ typedef struct NVDECFrame { unsigned int ref_idx; AVBufferRef *idx_ref; AVBufferRef *ref_idx_ref; - AVBufferRef *decoder_ref; + struct NVDECDecoder *decoder; ///< RefStruct reference } NVDECFrame; typedef struct NVDECContext { @@ -54,7 +54,7 @@ typedef struct NVDECContext { AVBufferPool *decoder_pool; - AVBufferRef *decoder_ref; + struct NVDECDecoder *decoder; ///< RefStruct reference uint8_t *bitstream; int bitstream_len; -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".