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 2CC8147277 for ; Mon, 2 Oct 2023 18:12:42 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AA92468CBCE; Mon, 2 Oct 2023 21:12:38 +0300 (EEST) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2095.outbound.protection.outlook.com [40.92.74.95]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E742168CAE4 for ; Mon, 2 Oct 2023 21:12:32 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ahwdeRMA/1tY1miyqDzUYzdJYJ2tktRwLescsW6scJBjn/tQX94xtbAafGAilj3Hrj1JTOnd8v1rKXOX29d+/eGm4tpH89sy8yMdCI2pX5dp0YukgC/6yXoaJxu1P5NrKy4OBvxcf+b1bI47b/rFxbaPu8hJ7LwzxnWSGLwHKnjia6/pN0E4SI+u4txyDVxtXKwvc4xal1YtQp/yO7v+9rk32yO0OUTXHZ8SpMNpINTAqx0NQLbV0xzUpcYIqsZE7VLdXTDdcWCNbdYUh6NBeYkCLV2FS/13AQmyVEHaAIOaZnLgo9USA06zN9NsfLbh9hKllfXRLg/+Rst5Kbh59A== 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=DlNi9IFBGKrPKsL1c067RasDnsZYgS8xQw5L89IqdPw=; b=Nfxe3moSJGg3O52NemLbLkanKxOKQgWqb+1DDtPYv56U5iDBGbXcz30ZTQm8CcLzpFekFxFol1CYJSogMCINfMg3mmE44b0gLay10G/5yMpia/mEh/4L8GKkRhQYWqyENYBfEaqmGmvhcJeXtPztYDU/CThJRRwcNXjr3PJnnGjmJtfybhXtk/oBP69SuC/qh5iM7HV975b3zglFz+aM+b43/8kZQrR5G6INeZ7xFduNOs/yNLiy0tvnl+ddrspTOfuW6DVFxQfjwCaJNymuTNtjRPl3j7d7OQkwQbf7tizGYYRxCAY/pPRezbVrGiBaPzEvriynMlePTavFP4MI6Q== 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=DlNi9IFBGKrPKsL1c067RasDnsZYgS8xQw5L89IqdPw=; b=tx1Ckmh7BTGofLkzjcBk9SwQlPjM5d2AkiotCeFx5lMuomO7ap+ioKEe5kAb7Gfs6TjvbRkZAzL4DeYj4mQPU6V9ze7hov0hdW/u+iHNawWFCtawz7RMUIaE6mkTlstfEErppUY7wSFGbJu0pyeSRkh4XeOxyuhUtbnNT5DA8OlaM+nWwGJc4Q7f0CTbdpEwQ29mgfo6r+ddhjpmVROGGreKmMusSf9flJ00YK7fZVlJqfGt3KwN5sXUzet8eZWHKWYSZ3W33OtNJwtivtKj5npqeGKOUS5AOd3vbI/6tFicJOhvINt1F+eOz+Hw3X5IxLyvJG3HhcBfdIEgRpXVZA== 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:29 +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:29 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 2 Oct 2023 20:13:32 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [3JNJXFmlr7VIRpiTGJIJKWxoJqN9lbwf] 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-1-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: f3dba30d-4b8c-4fad-465a-08dbc37323a6 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 53+BQ6icOc5UZi++WFUTQZHDBN3t6WNVItqtySD/nBIhIyMbSqInTrkek+A+R8X88ND4SgHhUyCcOI9/i0D3+3AtrHIbmpody84o1qVgzV7pP07sKG+kZp8jfsN9MrtUNSyr9bAd+jbyFu6TWKENUAiA2MHRkcwyiBa9hPl4M1VBB2VdXO5ngrVPACf6VQwo+fxVZKqikzlCnpQN0bbnruxA0SgV6VW4kaA6+sEsLYmPPW9fl9MGi/JvWMUkApbimKrugrtI9IRkpvSQ7i2Yj0qxDWkiHPAMNsjdNSYfUOO8LrZrydOI/xuc1ZNWKEgHRn4b5rx3Vu/RnKtlWDVPLZIUNi4aG88MML8drLFOyqrUtPS62biSANIeiBI8KA7L2dpvsN/Ehf/f0lcxeazK31J3Bs1NbTT6H1bp0a/AOC3Ob8Xpx9r94KOXiu5WP09aArxkD+6e4DAiJSk2Zgdmwiw3+BTmPm46v/xCbeiVH7JFiUmpf1nKk5WY7b1/dkxL4nALO/vWzhP/whJltoAJh7ku3XLXBHPDk86Lgwh718xaYvec+xMnpb4GgqF8W70ilBHpBchefnG1v8jUlwrpCNVuyic52UYi5lEiYy83zNV3aCZ1JUebuimqaElh5kEC X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?VKSK+Tysws8W9YuB8EGskJr8sk/ZYQJdYI5gQ4vd4ZdM/FGERHiB/16Hg0Ei?= =?us-ascii?Q?WNh5nGnICeOaxVMSSpKzM/EZmD7f5hgEn5y68pFmLtK2WsYhAI23utqBFJqa?= =?us-ascii?Q?YeWufvffLnuToaI5+Iw3THH95VJLhIu6QIYbXUlaYFpO1eWYti/VwyM+igoH?= =?us-ascii?Q?Xx4S591gQoFNn3hjBdRF/pFfSmqeSi62ImKUbqOMuj/HUnTgbEgDQsKdlJHW?= =?us-ascii?Q?38W9TO0O25o80uxtLCqZPSFV1/GNlG8dO/J53Wz7YQt8PKghE8vJyOToznFp?= =?us-ascii?Q?hIF4XhU9o0XV3yNXu4J/JV2cOTsVSa3NBw06savvGx/xzZhE6hmyZ2PLKN2w?= =?us-ascii?Q?HZNFSbQFR+OPZ24t0qpkVdayYRqg+KB4uxRe+Ul1pFSlexp7IX0VIpnpAsOc?= =?us-ascii?Q?cwM2JB7m4UNHyqfXVgdVNke3momKh5l8AcBYFfediwa8f0t1HFqswV02yBul?= =?us-ascii?Q?6Hfv8PHUiOxKUZno+71FZuWCm0JEA3NNIVQdQvr3+QsV8JRJAq8fgRDn+pLl?= =?us-ascii?Q?czXwxxMoWnVPDva5SEkfl0FCuH5EqTL3yiWkUANMZ2ReRUlc1iiKg3pOwtsm?= =?us-ascii?Q?hqjLNM63WwsN5tRfJUYL0OKUJe47wpk4w/NcHmuWf5OlpWV+Co7b9FmMYQNO?= =?us-ascii?Q?Eet2C9Ac6wrbiVdPD/Q3KZjB2DGj3pSKu9LM4D5npYkgshGDhvzkHQWDH0Uu?= =?us-ascii?Q?pVQqSEAhSy6gyLmIVN+e2smSzc2ooQ8D2OpEtzscAAdiph+mp8x2vO5pqjaI?= =?us-ascii?Q?4+/7Ro5KhU0PL3qSP1LYLPwQ5AH2Du4fUShRFFEHCgIV1knVGRp0/KWlDrm3?= =?us-ascii?Q?gWcJI4EYJbcuNbwmkMI0ZlNWCi2J3JWWry5NgwW5tKIoHp1lNY5zXtVRpYhz?= =?us-ascii?Q?5AXN3Mncc83yyPs4Qe+wWJ4wvsR/iGgzOdzkU59305atNQeoj01Tu7aSLpoO?= =?us-ascii?Q?rFt8In7yLmFT3HaG5iOXeUCkvoX/9jVadTwyYImDkEXWE90oAw/7+GboyIBR?= =?us-ascii?Q?Qzry/NJJI1l/5d1LPtAAKWshoNZ6X290400jyEqIbmAqNbuUwfdUQei4dmY+?= =?us-ascii?Q?s/EAAE1+EuBjR5dgd7QCoYyOndNHCHAgA2gA4OqodChcrcn5E6iccNZEwjUA?= =?us-ascii?Q?xhhR/5kV7+i0V9yctnMVhRBp0YzE4084h0jchz+TrID/CZ2WnRQ/h5lbSF3F?= =?us-ascii?Q?xfWfwXdDwORyllqJJjijlCr+Rk3LulEdfR3hmbTBw3SJyNOvfiHvJcF/Ajsw?= =?us-ascii?Q?pz8vUALCK47d0FhaeXjg?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f3dba30d-4b8c-4fad-465a-08dbc37323a6 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:29.3160 (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 43/49] avcodec/qsv: Use RefStruct API for memory id (mids) array 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 therefore error checks and cleanup code; also avoids indirections. Signed-off-by: Andreas Rheinhardt --- Would be nice if someone could test these additional patches; I only ensured that they compile properly. Here is current branch (there will be merge conflicts with vaapi_encode.c and ffv1dec.c when using the patches sent to the ML): https://github.com/mkver/FFmpeg/commits/refstruct9 libavcodec/qsv.c | 55 +++++++++++++++------------------------ libavcodec/qsv_internal.h | 11 ++++---- libavcodec/qsvdec.c | 3 ++- libavcodec/qsvenc.c | 3 ++- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 7563625627..4f639e33f5 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -34,6 +34,7 @@ #include "avcodec.h" #include "qsv_internal.h" +#include "refstruct.h" #define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) #define QSV_HAVE_USER_PLUGIN !QSV_ONEVPL @@ -741,20 +742,19 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, return 0; } -static void mids_buf_free(void *opaque, uint8_t *data) +static void mids_buf_free(FFRefStructOpaque opaque, void *obj) { - AVBufferRef *hw_frames_ref = opaque; + AVBufferRef *hw_frames_ref = opaque.nc; av_buffer_unref(&hw_frames_ref); - av_freep(&data); } -static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref) +static QSVMid *qsv_create_mids(AVBufferRef *hw_frames_ref) { AVHWFramesContext *frames_ctx = (AVHWFramesContext*)hw_frames_ref->data; AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx; int nb_surfaces = frames_hwctx->nb_surfaces; - AVBufferRef *mids_buf, *hw_frames_ref1; + AVBufferRef *hw_frames_ref1; QSVMid *mids; int i; @@ -762,35 +762,27 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref) if (!hw_frames_ref1) return NULL; - mids = av_calloc(nb_surfaces, sizeof(*mids)); + mids = ff_refstruct_alloc_ext(nb_surfaces * sizeof(*mids), 0, + hw_frames_ref1, mids_buf_free); if (!mids) { av_buffer_unref(&hw_frames_ref1); return NULL; } - mids_buf = av_buffer_create((uint8_t*)mids, nb_surfaces * sizeof(*mids), - mids_buf_free, hw_frames_ref1, 0); - if (!mids_buf) { - av_buffer_unref(&hw_frames_ref1); - av_freep(&mids); - return NULL; - } - for (i = 0; i < nb_surfaces; i++) { QSVMid *mid = &mids[i]; mid->handle_pair = (mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId; mid->hw_frames_ref = hw_frames_ref1; } - return mids_buf; + return mids; } static int qsv_setup_mids(mfxFrameAllocResponse *resp, AVBufferRef *hw_frames_ref, - AVBufferRef *mids_buf) + QSVMid *mids) { AVHWFramesContext *frames_ctx = (AVHWFramesContext*)hw_frames_ref->data; AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx; - QSVMid *mids = (QSVMid*)mids_buf->data; int nb_surfaces = frames_hwctx->nb_surfaces; int i; @@ -811,12 +803,7 @@ static int qsv_setup_mids(mfxFrameAllocResponse *resp, AVBufferRef *hw_frames_re return AVERROR(ENOMEM); } - resp->mids[resp->NumFrameActual + 1] = av_buffer_ref(mids_buf); - if (!resp->mids[resp->NumFrameActual + 1]) { - av_buffer_unref((AVBufferRef**)&resp->mids[resp->NumFrameActual]); - av_freep(&resp->mids); - return AVERROR(ENOMEM); - } + resp->mids[resp->NumFrameActual + 1] = ff_refstruct_ref(mids); return 0; } @@ -850,7 +837,7 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, return MFX_ERR_UNSUPPORTED; } - ret = qsv_setup_mids(resp, ctx->hw_frames_ctx, ctx->mids_buf); + ret = qsv_setup_mids(resp, ctx->hw_frames_ctx, ctx->mids); if (ret < 0) { av_log(ctx->logctx, AV_LOG_ERROR, "Error filling an external frame allocation request\n"); @@ -861,7 +848,8 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, AVHWFramesContext *ext_frames_ctx = (AVHWFramesContext*)ctx->hw_frames_ctx->data; mfxFrameInfo *i = &req->Info; - AVBufferRef *frames_ref, *mids_buf; + AVBufferRef *frames_ref; + QSVMid *mids; AVHWFramesContext *frames_ctx; AVQSVFramesContext *frames_hwctx; @@ -889,14 +877,14 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, return MFX_ERR_MEMORY_ALLOC; } - mids_buf = qsv_create_mids(frames_ref); - if (!mids_buf) { + mids = qsv_create_mids(frames_ref); + if (!mids) { av_buffer_unref(&frames_ref); return MFX_ERR_MEMORY_ALLOC; } - ret = qsv_setup_mids(resp, frames_ref, mids_buf); - av_buffer_unref(&mids_buf); + ret = qsv_setup_mids(resp, frames_ref, mids); + ff_refstruct_unref(&mids); av_buffer_unref(&frames_ref); if (ret < 0) { av_log(ctx->logctx, AV_LOG_ERROR, @@ -913,7 +901,7 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, static mfxStatus qsv_frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) { av_buffer_unref((AVBufferRef**)&resp->mids[resp->NumFrameActual]); - av_buffer_unref((AVBufferRef**)&resp->mids[resp->NumFrameActual + 1]); + ff_refstruct_unref(&resp->mids[resp->NumFrameActual + 1]); av_freep(&resp->mids); return MFX_ERR_NONE; } @@ -1105,11 +1093,10 @@ int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *psession, qsv_frames_ctx->logctx = avctx; /* allocate the memory ids for the external frames */ - av_buffer_unref(&qsv_frames_ctx->mids_buf); - qsv_frames_ctx->mids_buf = qsv_create_mids(qsv_frames_ctx->hw_frames_ctx); - if (!qsv_frames_ctx->mids_buf) + ff_refstruct_unref(&qsv_frames_ctx->mids); + qsv_frames_ctx->mids = qsv_create_mids(qsv_frames_ctx->hw_frames_ctx); + if (!qsv_frames_ctx->mids) return AVERROR(ENOMEM); - qsv_frames_ctx->mids = (QSVMid*)qsv_frames_ctx->mids_buf->data; qsv_frames_ctx->nb_mids = frames_hwctx->nb_surfaces; err = MFXVideoCORE_SetFrameAllocator(session, &frame_allocator); diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index c2d301b4a2..d970cd20f0 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -115,11 +115,12 @@ typedef struct QSVFramesContext { AVBufferRef *hw_frames_ctx; void *logctx; - /* The memory ids for the external frames. - * Refcounted, since we need one reference owned by the QSVFramesContext - * (i.e. by the encoder/decoder) and another one given to the MFX session - * from the frame allocator. */ - AVBufferRef *mids_buf; + /** + * The memory ids for the external frames. + * Refcounted (via the RefStruct API), since we need one reference + * owned by the QSVFramesContext (i.e. by the encoder/decoder) and + * another one given to the MFX session from the frame allocator. + */ QSVMid *mids; int nb_mids; } QSVFramesContext; diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index da700f25e9..e53d320d0d 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -50,6 +50,7 @@ #include "hwconfig.h" #include "qsv.h" #include "qsv_internal.h" +#include "refstruct.h" #if QSV_ONEVPL #include @@ -875,7 +876,7 @@ static void qsv_decode_close_qsvcontext(QSVContext *q) ff_qsv_close_internal_session(&q->internal_qs); av_buffer_unref(&q->frames_ctx.hw_frames_ctx); - av_buffer_unref(&q->frames_ctx.mids_buf); + ff_refstruct_unref(&q->frames_ctx.mids); av_buffer_pool_uninit(&q->pool); } diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index a0144b0760..8a607ee5e7 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -41,6 +41,7 @@ #include "qsv.h" #include "qsv_internal.h" #include "qsvenc.h" +#include "refstruct.h" struct profile_names { mfxU16 profile; @@ -2622,7 +2623,7 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) ff_qsv_close_internal_session(&q->internal_qs); av_buffer_unref(&q->frames_ctx.hw_frames_ctx); - av_buffer_unref(&q->frames_ctx.mids_buf); + ff_refstruct_unref(&q->frames_ctx.mids); cur = q->work_frames; while (cur) { -- 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".