From patchwork Mon Apr 8 20:13:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 47947 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3f98:b0:1a7:a0dc:8de5 with SMTP id ay24csp136095pzb; Mon, 8 Apr 2024 13:15:54 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVyGHLootm67nb8nn74Psd6aAIn3RsKOeKDzXloPtlx5rOE8tcZDBdF2itNS1cOjTyv5xP+pW+4/k4uwg/xngcw9CLfhvMzUeLYag== X-Google-Smtp-Source: AGHT+IHAjnT3BhhdVhMcGTold4yUaLpBq0y3pwi1RSzNRyro6tDpHg2Qq1y70qxV2rbMyvd6JuAH X-Received: by 2002:ac2:5215:0:b0:516:c5b1:1b21 with SMTP id a21-20020ac25215000000b00516c5b11b21mr6068866lfl.45.1712607354117; Mon, 08 Apr 2024 13:15: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 e18-20020a196912000000b00516d27c7808si2381943lfc.395.2024.04.08.13.15.53; Mon, 08 Apr 2024 13:15: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="XWxSn/eW"; 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 8402968D3AF; Mon, 8 Apr 2024 23:15:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01olkn2044.outbound.protection.outlook.com [40.92.66.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 19AFF68D306 for ; Mon, 8 Apr 2024 23:15:08 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jcesAaFYnJbNjc0ZQKYWxbM5Uwed9e/V27RlV/m9E86CbT/8ErzvhhGFrIKeUuKUm/yzPFAsNUPR8S701b8MLxtWXbW3RV69xF2g6DPR0gLwmNpJ/SgQGq7fyL+Pcswjcj5vwmv4rXj7DDkIOpeUlAjiw40+/s4AZaw37QQXwGQ+Ki51Q8dOQ1xGYtW7jE1cApfADPizflCLYQ4yoLerzBTNblJ5p85fNyU35xH2au90Bo+d1QmC9+vPhBK0iBPq+7x/AZZGVQovl6NvAb2J6iLXFlHC5CHbRk2SzgauXgRz9eOZ7kSwThRVWyCF9M6Sq8QzJThD3XVu8kqW0BtLGg== 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=d8DxSTksw3xsKVwZvWq9d7izSc/GWrwettwofThgVLc=; b=jNyzTF/hpCu4O/g2aLIbn/hJCgHCGgcpfgrJmjky5NIO3naUUHuSn+BHKI6qg4d4u6dUok38KZ2I6tC4/Hxb+t9zS+ZTZhkCRoT2/HL64ZzB2O0KyjoUpGcvK1wfCUh/oF89YDY44vMbCVI6rrz4UK5T5vDwsMtR3lWy1Kcfn8x12mkVm636Us2B0KeQ24F7VyZ1oGNvh0Ys5LH8Aj9UqAaJHPzMWMHkkn06qHFYMNr8b3YmF2F+5K/jwi+5AM/vCQgkcpJ1TrJz8c6YyTmi+yymOZdAe5+JycCpr2l+H/Y7qlSsBLSxC3OLFpUKHqtFj6gFEwmib6Xwlf0qRtbefw== 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=d8DxSTksw3xsKVwZvWq9d7izSc/GWrwettwofThgVLc=; b=XWxSn/eW313oUPGZQNrogmw5uplPe89aNfN6LmXcg1p9oQV6EZbNIQ32tfBgpV/YrGqWms5K+U9YP+mGYS2oVdsCIAymS0zewpsCoewtNh+zMUmHovcz2jzwwRLzETahgheO/f8wAa0vh7Bas+odBPvP8Ln3HFOBr9AMaKVvGkRxFNOlr6i8rRDCK/+jAfRIWQ6y1wckUzhr/O8X5e+mkCzGXLN3Mk6g9UypovInTgHHT70WEfy3JkibinmR1HwqaDeN0VwLnDTBcUMrW78h1u5qbBZAG8FOgEfPoLn28WT3gmktbOl+0T4/elSxN7scf4Xv0ZWCGM+jsraodp+Epg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by PAXP250MB0494.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:28d::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Mon, 8 Apr 2024 20:15:04 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d%4]) with mapi id 15.20.7409.042; Mon, 8 Apr 2024 20:15:04 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Apr 2024 22:13:48 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [iz0KFAm4QZAw7vY+8ooNvY39K/gPyOKQKX4evFBC4ew=] X-ClientProxiedBy: ZR0P278CA0124.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:20::21) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240408201405.2136840-9-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|PAXP250MB0494:EE_ X-MS-Office365-Filtering-Correlation-Id: 1e84ec53-f22b-466c-d0d8-08dc580893ab X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DqjnhVGPT4D8Bfo27TeFxNLyRWqvlxHUyFyVOQG8wDvIQn0lXJXjjCb4NUz3jl6MsGyQUC2PszdsLEGoUIzkBFwgqVGDa5NdfiTGDUjSR52+z53YIkAWUU0SwD/rPtEpgz9AT1+HLSiXpHAnx3tgef7XaJTregURgUX/HIVZ03ODNAAqukOyeOTHaWSFIi14dPyGn6zkd7NeHnOEtsUeNCMw8Ub/L61NMP2wcpMfs2zRSFTUfep3A2ppHN7pB4LHbFcl+Nspi8N3CWgtN0CFc7e5fZH8ljsZPcXEwsiQyuMe0z8ZZYhaOWANY9XlIIuhLmOWKgZNo9sMg6t7ZroqOuE8Fj3wlQ6ZVTsv+PPXBTzQk9/l34eGs40mikTV2SFs24sEwW6FQ6IJCv+ympeT1RyDqJ52sI/xm5B/Jx9ECTF4Eyd8rLPbLlrAF4ONijp4WTfFNf8VUsRaRl7/Sh8dHXeczEd3Sx80NC7JRO+WXgBtUlI2PXrOU5uNVfCx0g3tmNrMzUdljDgfD40jPW+jsSvrM3kyc0q9VKSEdHZjK3edr56/5cIa2AxlYF1auAvqMaCpMejutH8DTjBBPwoWPDD27x02dkO+MIYH19GGKUuRZfK86nRt4TlcGMOMYg8H X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: xAlVV1h5v/zNBZEQuuoFcuByrwaPYXMuIt+pH1PZJY4/FAgxVNQXMh1XtAeuJ12nJWlmC2DD++RudEcHzcY7I43xLxaZ1BCbjbBWNU/MKqg7zX34vSVRZ7xSsSfoD/xOtOFvFLv9Tze/rHlK7ZdSkUTe6jwGo0wtAEdUjNW/STDOafA3ZX1J+xBuW3VXJ35wLQ4s1orw124KLeYso9kt4UA/HKZ3Sa2I9gZccVijTLnj+4DBlvz/tvOGQHqpufTcmf3Cn8fxS+cQPHb1RSAE2FrydOF3VTdlSAkBvXDeUZ0yaHAuv/q/JR7nQLc2jqIg1tOWx2zhCHZC255xCGATCm7OgwZGZbdd5sEEw/jRuDsLaSxGPy3EqGkCcXc/1zZC08V4M/HiSc6pOn8uqP2P5e07SF/th583J8ef1PbGwi+httTbBrBmXtLEGHs6AmDuD0zxwumV3Im3eEnjSf63JOk9feHquqDaHAddGJZNOxV8jvWr09hC8KcAwFYDNYhEbTLoBbFo38XxWWvibG2DKyWnCEZPo+tBISz+bSTYp/8l5dTNGIHPHh14QAr70duy5KgtKPGkdbdY0OsY25mxS8DGXvMICPrNyJUO5H3zzzKHS1HDYn0eDC28t8xDMLjJYAnungrEU2VclwleIruM15cqR8ZxEJbwz3L8W5JQIaCNuMys2Dvcjwj1MO+9gvhlR79TKExkl/paMkfWPAZr9o7BIXjRtiEz+CyUrAvP+FaHM75dcNnQ4mnVMlMFKM1/6gU/a+U4U6wj5sBeXKV6pgBRTJqWfZAWavj4VFdvBLXD4XuRXsJMU5mguOb+sSEUNpKi2VpYqbreOjd1u+33jy9jmiDmvsWHA4efwkj4NTovYOeBj5Du9h2hM8bnPtBzdbrthEQ+67CiE6niYTj003P+TbeCEMjy0TgoTLBB6DhUuuGk4K44w90DQ2ywyo2ueOD8LmUHPGNP5wezIV9VMzii9IMn/SyEKNj7luiaVtGF/7X27e42/zi9bdxhF8rYbtXERVQCFCtBw3QGuYWm6q0gwCi9Z+nbU2gaWhGZH6ORWY3tEouhb6G3cCzmS9q/GIlGV38Oz61G5CxzYtlpGRj1WnqIrLYzOQvN9s6K2CLhu8owe36UJerDJS8N+2h0dZK0edwz4mb/BvZA+0P3ffkIh5jpceFMEP6qwJAcx9qTq6skWS7vUFjdlv8UyzytEvijMfUK0xFr1zzOecvotKe2eMcsexWy4uU4E7mRbopwy2b5jNyzwllW/yKbKCEO/oEp6UamuAyAHsNASiPhLA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e84ec53-f22b-466c-d0d8-08dc580893ab X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2024 20:15:04.2143 (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: PAXP250MB0494 Subject: [FFmpeg-devel] [PATCH v2 10/27] avcodec/pthread_frame: Add API to share RefStruct refs just once 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: CqBnOsSyMrL+ This is useful when the lifetime of the object to be shared is the whole decoding process as it allows to avoid having to sync them every time in update_thread_context. Signed-off-by: Andreas Rheinhardt --- libavcodec/decode.c | 7 +++++++ libavcodec/pthread_frame.c | 20 ++++++++++++++++++++ libavcodec/thread.h | 30 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index f18f85c33c..e196c05f11 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -1747,6 +1747,13 @@ void ff_progress_frame_await(const ProgressFrame *f, int n) ff_thread_progress_await(&f->progress->progress, n); } +#if !HAVE_THREADS +enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset) +{ + return FF_THREAD_NO_FRAME_THREADING; +} +#endif /* !HAVE_THREADS */ + static av_cold int progress_frame_pool_init_cb(FFRefStructOpaque opaque, void *obj) { const AVCodecContext *avctx = opaque.nc; diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 6b2c4312e0..ee571be610 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -1001,3 +1001,23 @@ void ff_thread_release_ext_buffer(ThreadFrame *f) if (f->f) av_frame_unref(f->f); } + +enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset) +{ + PerThreadContext *p; + const void *ref; + + if (!avctx->internal->is_copy) + return avctx->active_thread_type & FF_THREAD_FRAME ? + FF_THREAD_IS_FIRST_THREAD : FF_THREAD_NO_FRAME_THREADING; + + p = avctx->internal->thread_ctx; + + av_assert1(memcpy(&ref, (char*)avctx->priv_data + offset, sizeof(ref)) && ref == NULL); + + memcpy(&ref, (const char*)p->parent->threads[0].avctx->priv_data + offset, sizeof(ref)); + av_assert1(ref); + ff_refstruct_replace((char*)avctx->priv_data + offset, ref); + + return FF_THREAD_IS_COPY; +} diff --git a/libavcodec/thread.h b/libavcodec/thread.h index f772d7ff18..5ab12848b4 100644 --- a/libavcodec/thread.h +++ b/libavcodec/thread.h @@ -84,4 +84,34 @@ int ff_slice_thread_init_progress(AVCodecContext *avctx); void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n); void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift); +enum ThreadingStatus { + FF_THREAD_IS_COPY, + FF_THREAD_IS_FIRST_THREAD, + FF_THREAD_NO_FRAME_THREADING, +}; + +/** + * Allows to synchronize objects whose lifetime is the whole decoding + * process among all frame threads. + * + * When called from a non-copy thread, do nothing. + * When called from another thread, place a new RefStruct reference + * at the given offset in the calling thread's private data from + * the RefStruct reference in the private data of the first decoding thread. + * The first thread must have a valid RefStruct reference at the given + * offset in its private data; the calling thread must not have + * a reference at this offset in its private data (must be NULL). + * + * @param avctx an AVCodecContext + * @param offset offset of the RefStruct reference in avctx's private data + * + * @retval FF_THREAD_IS_COPY if frame-threading is in use and the + * calling thread is a copy; in this case, the RefStruct reference + * will be set. + * @retval FF_THREAD_IS_MAIN_THREAD if frame-threading is in use + * and the calling thread is the main thread. + * @retval FF_THREAD_NO_FRAME_THREADING if frame-threading is not in use. + */ +enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset); + #endif /* AVCODEC_THREAD_H */