From patchwork Mon Feb 7 00:37:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34150 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5351788iov; Sun, 6 Feb 2022 16:38:09 -0800 (PST) X-Google-Smtp-Source: ABdhPJyuqNvYCDA8wW9ypHR8MXC/Fh503IYFyha8idCzzWK6gtee9DEQveSv+KLR4tq41psZle9/ X-Received: by 2002:a05:6402:40c1:: with SMTP id z1mr10941025edb.23.1644194289346; Sun, 06 Feb 2022 16:38:09 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hs12si6715843ejc.232.2022.02.06.16.38.08; Sun, 06 Feb 2022 16:38:09 -0800 (PST) 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=nxoIrfoL; 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 697C768B1CA; Mon, 7 Feb 2022 02:38:04 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-oln040092072030.outbound.protection.outlook.com [40.92.72.30]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9767E68B12D for ; Mon, 7 Feb 2022 02:37:57 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ebVt6wk7OmLoxgXKmTqJvZ1xIfkRpuY7MCjQzCtsvxP1ryQ5RKCW2bjXGtnfvTGrY2+5s5kLRgDJVTgF3fULxo2bAuheAkuA0BRg5Xn/ppvd4Njb2TjOJK3rohKXUHV/jxY57ButGrma88BHgoE3Olcgtoor05UOl/4bik7c4IxWVfclZh2ioIC0TJvRM+Q9cvTpEVtgyGcE6uuXc9xZUPpbQ040OzMiXzpM7mONv3+IkKrZQgsKq+EbuG1o3AFmY253C3rjZtzzPdBjCMct4iPdqUWTQi0PnXyBq3m5Tdm+wqRaOzrSjrMou7r1YtL84+mnks7b095t5LZFrrQmkA== 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=57BOQRsq2sx+ZCRdnIwqSrC6n/yyJenzPFLY5EGTaAo=; b=eAdJptHwKykzqVTsi/CIR3S3KV289SDV111niXI+fJuAZySJ02wMqAUpKiA5WHPE+BpgaVgzBJD2qUDlivSeGEZc7jXA0ZuNV30PHDmr7HrXW5Cl7kZIk8w4BOQ1Fpcq5Zf0jM+7Nkg2ZL6wdV0a5TgufompCML5sXMdPRtW8p3uAxoNdOgZT6FCw14ui12jEw1cUdWsxBZI0lnCMOl97VYYij3nN25EMXzUZImnIGdHwJVI18TGbO/VRd6qT4es4wPNNFcOlQgHwlUQSdS68ke2pjxTZEEM11l7EgRnn12CIK3dIfCRGHBluu+2bW0u9eZ+n3fLESo9nK/07reUVQ== 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=57BOQRsq2sx+ZCRdnIwqSrC6n/yyJenzPFLY5EGTaAo=; b=nxoIrfoLDPG5iQZB4OHM+DWjdp3uPAOwtI9oYCTE9ql07ydhBsTBg/XOiZEZK/5LCPr6C3JpQx+hGtzCyXpvf5edLI+u0XHY1Bw4AA2yx5k3JR7+rEhjkCl6sM1Es8HBamHsRpk/8gASoxlQGlovQZDP88pnzKJhvdn/BxpuGiv4GvOaPvRmIM6dFVHUIAWy7BOdpQnB1c/PaMkJDL9bJLThNnh78W4xhUIq+Zsx7FpW/dHCFFUVmAmpU1VKF8KwX4DnroB/CQ2JjdhnnOtJpB8tMZXWXBT6+qfOIic93KwezasSoZfo2AQ5uGzUIlO4TDq8aT/OpNNRU8+vzyjKtw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM0PR03MB3746.eurprd03.prod.outlook.com (2603:10a6:208:43::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:37:55 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:37:55 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:37:43 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 X-TMN: [R+MXqubW6tVefvuLnnyDknnzkXXx8kPz] X-ClientProxiedBy: AS9PR06CA0292.eurprd06.prod.outlook.com (2603:10a6:20b:45a::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207003748.635071-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a66f44df-08ab-4b3e-8aad-08d9e9d21501 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiSDApSgY9IItRoaJ3UYzLbj06aKBXvQqLN1fVpcQqcqske9SPsxq7xh00NWKDXj+IZZzrLr7Y4Iase3ps9n7AUxrBqP8mMTKCPgV9QWFWABQWfwJb1pawkAdreSVMhYJ61Y6hHWNJNdJIH1EOz2vQA8uGWenewtPN0xYO2Pvum2pHZUSLzt50ku+VuPBSToaGp7DReQQGyKjnv+zaaPzTlfpCTGGAUYmvA8PKxjhR9GFhnAq9xsC5hAvO7MRGZQ1KAqmzU/CGfsgXcdcI/+kXVhYg/NeM5jbg0JdI1B07/oVeYemO7mSnUqM0Z4+zSyGJf2Xtih/qJ3XURs8xRwCQTeMUxeLMeyQxUbXvLgML5UzTBLAL1vDpNer9m+2r726TSRtRQ6p2WAXYkDxhHBkTmH634YlEmKTUIiYjZOOIxRBC1IAOjfV7/dlSk+jIoAcCpGlu3rvYmFpGdzxUeOvSAfKVN99o35itGxMoXbu3sEUGK4zlM/InITA58nVYXRMv9M0kbUTiDMNZCf57l3T6FcukWSEZct2EnwWJPqlqy+eSMklQ4goSOrMF7FMfJEV/F2xwoO60ljqBWNTKnA6sdNiAgCBTw/eEWX81Ypk5zPh+LJ65wXTi1GclsFa65OMqbCGIdEls4Nsq6WWw5CKDtz+aU1L0jruKOOtGj4jO6+88OWg/Gn+O6UnFdLkVgRYzVofTquVEZVKLktKs+MGsOB9ZwX+Iz5R62YBCTuq30tsgVw5xzX4R2gAjSvEEBGtgQ= X-MS-TrafficTypeDiagnostic: AM0PR03MB3746:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nNNeJS+DZoH+zcQ+RJb7/U5nPihnYyhbK+xCEY8iI9lTY6XvPPcc6LTw9+KBATaV6jQS6Qc3CTaL4fsVsilczAamY8NM0rLQT0ejros0t9ABBjWJ0gXnY+fY8Z0fDQghzEsd8TOKgGGc1ew6Z3ECQxLkHEIJxCHv+A1JkWEhBl0adAp+ssj7gqNpZe37AT6rnzxd5py9BzEKidgsJOnXSd/h/y1lOGwGJWX3kJ09bW0lU9x0ZEl7jzB/448/7ad2HmnceCKnFqWUuf+b8/mpSowOLRAGnYuuLdJ1meT+0UDiJx3RzJ5PHj4k3spFLmt5JGFWFRsX0z6xhkpnIXQQVN5QF1jWmNEF92QzZTs27mOEWig0a5/J6f66GAvJcg5fqwra/S7qfwVSR5FnbcV2xf4aV41gUYoVhQMwdkxAtUqDvMVT+khCXvvXQ8E9HEmvaMYMTpqTvNRXgveQlX28Cbr7WrjD+t/rFp/h7jZqT0ZLE8aFyjqnlipn3J2IVUehnWo5zaO8QvEds8aB6SJ6HVGtMJxmC5sVGAz+cUuycmT2xQV1psG82GzuM325ORrOj+KU8Bx4eAsmdigbxngN6w== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 69FZ9864kAZ/9dWqEbBPjf3cDBmgT1NKP9YGQSjLNiQjCFjxzONRrVKnAr7rmCUHmBnuoij5v7KT44J3DZLESnZJLJsg9buZyNh2MRSMYCeLCa01CI1MFgIVK4fEQwpQD698RizbtF+MwWf+sKyBlNmN+5Kp4y66RSl6Me+jAtS9A1HL/5NgoGrlytN94gyHC9eBa98FxM6U6B61ZNAPm1imTGlW2kKxpFGMQ95esoQjfAnHMTYjEEcrDGwtG24WadQ32VlCB0e+GojcoeXnSzEIFAjSoR7uir4QXSx5Fql4uOLTVHUbDDtLmTM8K/GTknjEdL6PZ29OQUsml2PFswFJTjOn7NaYbDmif4eVS+0j8QA7MyA/HwXpboBQy0j5nlj5Ra+Ingei6l6tTcaHx1SDssXyzvPKS/pLgdrMOeLl/1vGN6yRWDu0Xe7fbUPnKA6jXekp3J10es5vRgoE43SjDP3bLcMo2ZluBTuozL1sBCQpv02yrcWzzbGiuqGxwHC4ckIZiOZKq3a8slmVhZJWORQodfpTvRerhm0PLfy1+9GE/85GZ1eb8dEY+Z6d86XYYRLyGpWjEMe4WaMYBSr7UOyYc1Gfe3HcACT32rKX62sXMaMpT1PPs92djAFSWAieWfwTh2TfucHI1sqNNq1hoji0sNOSVBGo8s0l8PQLo/bRDbYIStccJ28LRpzJ/k67gAsCK4trqMD1xvlWMsGETQ9scauviA6iKht3kdSfKP/hasGtqaAgi4NX/Vn3ra8V+ain6R5euUmepnn/kXEupYd4Hq0AykEInHXYBU8pq3skvYjmo7uYRiKsbOX8gqjVVakUBphqd/BMdEc0Gg5BhJGWbB2gQXv6Z14zpDGE7UhRfR9wNSJdm6FrhCDSNIzUuCvl/WNu67mi9gb6zgZQD1nT+IPD0/Jx4o9rJbbXWty2YXqvlaIZgSwwWe42fZR2ciFKrXHKmETeBY7A9w== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a66f44df-08ab-4b3e-8aad-08d9e9d21501 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:37:55.8056 (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: AM0PR03MB3746 Subject: [FFmpeg-devel] [PATCH 1/6] avcodec/pthread_frame: Don't prematurily presume frame-threading 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: ZQCp2cyXK2nt Several of our decoders support both frame- as well as slice-threading; in case of the latter avctx->internal->thread_ctx points to a SliceThreadContext, not to a frame-thread PerThreadContext. So only treat avctx->internal->thread_ctx as the latter after having checked that frame-threading is active. Signed-off-by: Andreas Rheinhardt --- libavcodec/pthread_frame.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 85a6bc98c1..43e097ff06 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -949,7 +949,7 @@ FF_ENABLE_DEPRECATION_WARNINGS static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int flags) { - PerThreadContext *p = avctx->internal->thread_ctx; + PerThreadContext *p; int err; f->owner[0] = f->owner[1] = avctx; @@ -957,6 +957,7 @@ static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int if (!(avctx->active_thread_type & FF_THREAD_FRAME)) return ff_get_buffer(avctx, f->f, flags); + p = avctx->internal->thread_ctx; FF_DISABLE_DEPRECATION_WARNINGS if (atomic_load(&p->state) != STATE_SETTING_UP && (avctx->codec->update_thread_context @@ -1020,10 +1021,12 @@ FF_DISABLE_DEPRECATION_WARNINGS enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt) { enum AVPixelFormat res; - PerThreadContext *p = avctx->internal->thread_ctx; + PerThreadContext *p; if (!(avctx->active_thread_type & FF_THREAD_FRAME) || avctx->thread_safe_callbacks || avctx->get_format == avcodec_default_get_format) return ff_get_format(avctx, fmt); + + p = avctx->internal->thread_ctx; if (atomic_load(&p->state) != STATE_SETTING_UP) { av_log(avctx, AV_LOG_ERROR, "get_format() cannot be called after ff_thread_finish_setup()\n"); return -1; @@ -1057,7 +1060,7 @@ void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) { #if FF_API_THREAD_SAFE_CALLBACKS FF_DISABLE_DEPRECATION_WARNINGS - PerThreadContext *p = avctx->internal->thread_ctx; + PerThreadContext *p; FrameThreadContext *fctx; AVFrame *dst; int ret = 0; @@ -1084,6 +1087,7 @@ FF_ENABLE_DEPRECATION_WARNINGS return; } + p = avctx->internal->thread_ctx; fctx = p->parent; pthread_mutex_lock(&fctx->buffer_mutex); From patchwork Mon Feb 7 00:58:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34151 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5361720iov; Sun, 6 Feb 2022 16:58:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJye2UNUnGmXy2eQcgbpNKnnMmF8WneBQddnORKVvMwTr/H9OilN/1nRMvKumuO4TXf/7XBb X-Received: by 2002:a17:906:b116:: with SMTP id u22mr7914201ejy.427.1644195509435; Sun, 06 Feb 2022 16:58:29 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hj1si8051512ejc.934.2022.02.06.16.58.28; Sun, 06 Feb 2022 16:58:29 -0800 (PST) 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=ICODUmKr; 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 59B9568B0E7; Mon, 7 Feb 2022 02:58:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8FCD568B0E7 for ; Mon, 7 Feb 2022 02:58:18 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EylA/71ubpp2iZIs+XO+DVUoeOvJcHCFFaB2FrlB66GQGQoml8Szc6Q5MulmJkFIt22LQ+roMtAvx7OW3h4U76yIaySTum/EPDCJdIEgrktkuOfm56wQMHdlCv0JC0EWTKz3Eb4XdQgoLhW05JTn0IZkx7zEniUxbYfWXZMot6m2TuhVnx6xOa432htOaRvGYLU4fdIHZDiuYcDP6LN1gnVGkxQwjFGunr/Yso3brkvryrKZujaHoa7pX1u268JLDeTsTgHVOI/UgoGv2SLgNAKI8xBLJ1se8KyFCZ1xcCbFaWDGu1T1+HEqeNoSFOFrthhLCOcle2A/LIRqbDnnbw== 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=591HMNkPrdkK8A1aXSKbUz4pbYiHY9m5evmlIXtULAc=; b=KAoW3HgIa8CI5U5KiCnCrLzpF/JiXqlLr6RW8T0cILWZhgwWa1r08tBLuE0RGThZ1Lwi4YAgQbzMCEgxmBwBNSaN1W9dMIdKg6BWKmh/B4TVn1jNDhxPTm7NZROMngKGcPp3OEEEwpAJKnsC/r2wNfu2N3gs/hQETTiWIlhEgFdNima8Aaom5dSeG1n73QOdODJH8xesgempJDX2sW+R8PB5w7zrsnveftzyEay5Oyeab4iNrwrLE2NHWqJitLeWWbPwP92OkftyuG/gv0HrWWRP41O/fc85Uc4cirzVrHq6uX4haBmmdqV8FNGkDbTbj3uo9/o4maVetlKfSS2esg== 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=591HMNkPrdkK8A1aXSKbUz4pbYiHY9m5evmlIXtULAc=; b=ICODUmKrC4tvM1OktzHE4FeIDJKNUAgAR/ylpKdp6IpmeOrUPDf0bjY6GFRrNgDPGuGaxGTwOwL1QqKXLKy4W/Poh0qvNtOrD1ZFQte+ApmK2tRRfAnzVf5y4EMTTcpdkSCRCuuBPHlkfFiJQ3rUgVaANVOLZyozKAkk016iupyEf5ZT03NXOZumCxh8LHpk/3wjqVVTU5+ks4X0XJhGxmAR2VNrS9im7gH66jURktSOJSMyIp6pPUeDnM23uVC6WUyyj9NUdOraNq4gA5Itpr6NsnL4qzYGGfXGGnIHYD2eeigRmkMTRXySGpRabL9fGIqMw/gfXpLnJkE/zMBbWQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:16 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:15 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:04 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [5z3Ue32zGT66m+GEZlDeQ8Yz2THBob1C] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0f30a2cb-1768-4e16-58e1-08d9e9d4ec50 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiSDApSgY9IItRoaJ3UYzLbjEGQeiE6tlnro6EJu0IHufDofUR2AD9ZvtMDjadh3qo//J6KnGkYTTMOrN/8kMcOQxR603tTplwELKc931b5riXdAjj1iYmYbsFX/KcE/hvENBI697keOCAaybns9tvtzDfW1WIQRmUxL15CbhJjSF/dx1lxUyW8ldijpK0VSAJQKiyTSKeDQ4cbdwB1k2dH4qWh79ZlvmCuebA271uZCDtmiwAAoYxp34Ww9JmF0CltupA6cfGaDz4bOti0ttAHsrziriUNc3vDK8KA+TtD3ni4Uo9dY3uuMXcrvaIHNXVUfAFoPPBTa0CKqTgUW0KUNb6MWDZ2WcJRqkiV+Q8LLFbTUzUEJwUCDAmjRAjwmifgE8PvDhR0w37mHjdHNPuYoZygW2gzciJPshY6xd4HDbLU5LYpnrNro3nbg4eeBg8kJ+v7tG9LE4ajHcQUjNaSGtd61PitgTJtj4hA9Riqkw9UN4zBcoTbLQUJnRTIz2zE4YDKasFFzu24DbRfVljZCCrXcE9sxxVSWLdNF3xBsSkXw+fYOPIqbsvcLCPp366s6+8QWSom6EwIz9l0SeVSJHx5CAn2gR2VNGq2HekuJzEvMz4kzJVkda0o8sDEoPBTNfm6Ka4H7ecOL3YVCYaX+2HHBrxL4/WVqzdkXXM+q/KWfcPA7KtT74M8MjFMoziv63VkoLmXrXMrhDbrtvehPRRBCMsZyeOnZTujmwOOHxQ2PKZwhHxC6fyYx5B84QpI= X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CBkxRUv5IfcUOHuG6oU9Xcd9ez4IcPW57qWzH6N9ho9sXH+CQEB6j6Xm/hkoFpqKTdqrnCMcviAArnNNolArM9Iktd79vcEepa0sjNIVH8YkwIupyqQvxhNMZ0JwRLNcxJUa4tqNUgMX+Ivj3dKG3gsfGZYZDhciGZqJgDcdTfGWRnxulmsPGNAkC8Us9F7EIIp1QxKMzWfeAq/XHwOFwbp2i2DXQQRyPWMhGfVzWS0nhQ49T2PfM0Ki6Ibq9mCejY/BssRJwDn7MhVSU4doCpxZ1jXjbDQL7AdcEWdf9Nckk2sFdNlFY02qmR16dduQPB+f9O/J5s/jfxxD1mcO/AOwxoOhNEgBBr6jcZRzLkV/I4u1Le4LxBF4YQgBwjCa10iPGMGq9qvJr9KvBJ6RWAs5TFX0jCHP92BgLekLFk3y1wycX300/ucvSWOpctH+KoF44qKg2UkoqhZf6rnqmINQMRYiMjIjtnbs3ZNjmnCxzaf8ZDa8QkCZWl0MlPCtuhltonEcFLmPVza8u1ZIeyfp4kgKv9dUgyPBhHlJAqEnuDNYmdo6lSlEIP7PSwlRE/NKY+TPq7xo2dCSM5d0MA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vqNxUrnLiJk7pHqcSs/jWsQiNLgoOprjasp2HF5NU8vHZHK7pyZGgJn8VUtBZrUGK1/iteKWxnKmAcNH9RSkOaaalJEYJ3BEFEbiTosoqY766op3NcGuT9wjGNtqh8bfvBgzu0Z5o2VVAqLKdTbyjHnubMcBm6JUmDnb8E3FGB3LvvN8R6aoFBgqtW55p/EinhgFeBBy53vTCLHCUaJxbMpF3LJeemLejwPR4VyNPG74cDb7z8urk/NYHWFAFqdUG2asfH12fH/EzbDxP8GLiB13+D2F4ZJfLCT97E0+ANCZYvVicnRaXnBJZShny2d4cy2LjjMW80xW+pWn9UhnuWUAVENDNZvsuyKy9m23d3W56MXNXLkkPOYFG+ip30TMPeNSNZ+FC5zzPQQMkbL08Gr+gEENJBpht5DVk5Mq5/zXXetdsmBdaZChRFZAfunBPSQJYgHgJEpwc4upiGQZ/9dINBWKkjOP/27WWM6VVhSgOeifI6WvxrU2R3lQv0EswULG19ElpWnFi75gSaunIVy8fZ0U8K1SOMX+YXfLw+ZBzUl+0j640yLfnRfoBT3xjBZM4A5Hy5USRETzfvExZeaOp9oTTVA/Y6kC+Mb7gZVa+VuddNVipJ1oGIECbGUjQV8osFnWTK385hytER1EgwLShM+Jit0dqkmu1RCNR0beqfpUrDp+8QbMo446qN+OopGYZ1VAz/tQdQbWZdVhOkYGNZIIC4nG1ufNasUXrYdYvKSw8Lx3dimEO29Haw3ea8v6fj3g8RRj5jPZDj67agHWEO5Dx9LdzyKDq0unnWvn7cNUG6OCVEogonC+bbk2Sug6LAZ81iYbnQFxf08NxptRiFBJuPvAYJ18uD3tWsvmXsaVveLrdg/Dt7KPg5XVHpU0fsFiAa2r7U93o2bMaXfE8l5TlrHMd7oMSwmXMnY2B+NhrpLkcZEkLjRU/U6CZZ5QNgXFpsisd0Q8D2TD7w== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0f30a2cb-1768-4e16-58e1-08d9e9d4ec50 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:15.8694 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 2/6] avcodec/hapdec: Remove always-false check 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: ShqbWve1TiVm Signed-off-by: Andreas Rheinhardt --- libavcodec/hapdec.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libavcodec/hapdec.c b/libavcodec/hapdec.c index 2c8c5c36ba..45c44ad78d 100644 --- a/libavcodec/hapdec.c +++ b/libavcodec/hapdec.c @@ -352,9 +352,6 @@ static int hap_decode(AVCodecContext *avctx, void *data, start_texture_section += ctx->texture_section_size + 4; - if (avctx->codec->update_thread_context) - ff_thread_finish_setup(avctx); - /* Unpack the DXT texture */ if (hap_can_use_tex_in_place(ctx)) { int tex_size; From patchwork Mon Feb 7 00:58:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34152 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5361780iov; Sun, 6 Feb 2022 16:58:40 -0800 (PST) X-Google-Smtp-Source: ABdhPJxlqkZybvknlZlpnpBxmHoi2rgc5H8ZDt8U7sL/JqvipMiKenXlgc4z6rcG09fIhhk3CMN8 X-Received: by 2002:a05:6402:4415:: with SMTP id y21mr11186805eda.162.1644195519922; Sun, 06 Feb 2022 16:58:39 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 5si5907722ejh.208.2022.02.06.16.58.38; Sun, 06 Feb 2022 16:58:39 -0800 (PST) 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=RIiMRP1v; 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 5C54968B1E9; Mon, 7 Feb 2022 02:58:30 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AD7C268B0D5 for ; Mon, 7 Feb 2022 02:58:23 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XwzDeoJfHMi+zxatb4qHggDd1dSQ94uB5gcfbHAO6UpXl5kCUGY1WAPbAcBd/8jWDVXphGGYR5oDQsJHh4sHZxBy4K82zA/gzmfr1CATuetIBapFo7hXu9sZs850SXo8M2XJVEyCCNOjkDuJ7AYi4qb5BugKelRGmCQ542BhtnnH2TOo1WByrhGQB5UMZxINGLQ3GNzudS+odmKh2QhZzf7nZGpKhf15GKdCXkMpfEYXGA3DYS2I3e2y8J/RFp7yiDbe7Ujs9BRzkX66cfcSm72CNn7WZZJ2cg/lbiUYMON7WV3f7dm22nx0dG2afr0I0N8mBcOTYMk/bsUJ6X+/UQ== 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=I28zXyAAwcQpX/7jklfUMPnpIVXOekfRic7ACUV0lzw=; b=DWDu+KlTFbcNR/4uvb6EGztlnuc/hlUlAG+OlrN9CKGMVlyIc8+AMIFYRmzkVVNtQSVrNqQ8L7aIMLmqU4NBlz4lWIfZ1WHwibCzkH/GhD8GdSsxP1OL7gHvtnD99tJr3yoRFb95Vzo45VE7bkkSHXq0kPJ1b0DHb2RG/wC2HS56upZiyzAe3osmiGfO5D19cUSzkNnaDTiHRAFRVnq9FpaUnidpssoLAmskWM6aH0V6BZ64uNtbi/rrPziRxcbGPEti1iiqibkoBUAUyGV2vhIWK2FAdTLY0cnKujn4eFS+O3jcg/XS3SIG21EqHVHbgyP/EfCEGHALP8S2jpkylw== 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=I28zXyAAwcQpX/7jklfUMPnpIVXOekfRic7ACUV0lzw=; b=RIiMRP1veou9Mr3UaeQcT4dS/pbR4PS00XhzpGNl7M42+ag9LQNM119VfPEFv96Y8w3mlX4gMi4X8FzBUNH4FLbNsSlLAh2VEGKMWxAJ53mOs+skiaG9AD0NAJB6J5csnhEqdPmBoFmnl+WQMAv4GkW3xFHKV5ifnOfoeuVoVbd+M1jF6jb0Wz3Azu9Sz4RjkrIBBKrV8EZNzPMHPpP4YFE9LxFXwMvYhLMc34ImvNSmF6IilO/ZT8lDxDbJXTG1FD16nf4JedeiLKjtjVO3DLQoLVUW6i6QMDy4fYCoCIrbTxltie22iffIQOFXtFm7kCSFQNtyBOnElpAXp1Dfcg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:20 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:20 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:05 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [LEHr2AKwuuishOFKXLROGEX1jj2KqCe0] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: df9d2ba8-8d92-47ad-d0c3-08d9e9d4ef41 X-MS-Exchange-SLBlob-MailProps: q+fD6XS3/UK5ZiRUPg1K1tIn8lmq4wyh4YAyKZmhA9QIB7UxU9Rp/P1Rjx0CW6JqnBD/V7Ff9RPP9YSalU5jBOFwdUh5fPrfOWNrlyL7iz9R3uCTlwm5nzaTYf9qD7yCiWY/dVFl7pQzjS+UjyP7LHelPCSThP6ETt8mHaoqYjDtvbEhoX1ZBW5PxnwWM2C7wQoRUJRESbFhNLwIN+r+DvHi4xEFzzNJNcTwAzm/y2YQHH57cy8GI5g60AkZTi9CTn9KhdLvB2CxYKLxO+Tg4G5+av1hI+kzjT0jjdF5qb4hrxgCnZSOjca7B4SfoIC7UwHMaSZcblyA0pITkUkd3C0JHAiHbkdJ5l/n+AB8Urk2Mc8gOR1oJnSJjAbN+K2gxSwA9U8a4GFlJa1f0Wc+crsHMo4orylTChY8aSsk/fsbDpNDbhyznW1nHZvna+pI5w1U8clhd8++Klj2WPoS6c6CwdPkrYwnoiBZmq0fwvj4vahUd5sqAZm7p6JazvNpFEM+UFiT58MXtZc2mx1NyAP4GuAjHVW4ZGeT9IFlfjcaT7m7ycJK/0MVPVIpRePY8uIO5l9cCUBwJxohCVreOhB7ymOArAfw7tfmtzx03hpVm0howYiNKnq97DDcgRYTMACYTCcQOZe8PKkO9B7LonPN970r7X7vw9CeBa4mEn0MNvKDfRsPCR7Bx9QVrZliggwCl0dbSpQ9U7axIKq8KQ== X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: UpooNLciWbfpV0KZTKk7I4aGWgI1LI85XQoSS0/u1jx/nJcYmJO6XNqK0CN9ccP0yK7H0BoYFwa/H3p0Psu+UuLxFVjHMRUjnFjPGMsDfL8Xv6/2OMjKhW+Ctft/rrT2hJ+MWxfS4q3sX5H8tdx0d//8RT09DkepD/+K3Ba8VaKLdvYUHKCPZIegLYqsEJwxeR849qXWLlHehnmd9d1t5S8h3YR02KRrk/7fyvQk+WfVgxtbV7S6wt35hJVsmtuKlh1Zju/R/gzKVKbjI21XJYJ9gtI6b+brXM2/e/haUWbhtaNLS23YU3qBz8BpIpYQfFnt5cJU03+EkSDCz43swB1dNJjXRYybN+BOlLhkcQVlPbxJ72d1zPKxO+jy2s0rJAVysnuWZulDYxfBdSpoRH4WB0nCq3S6y9CUS9D+iGEsOxjRipLg+GnbPbS1AywvraKYDaETSJby4I2DYn775AkO6FSBZ9J1bejb6ZDfJwgtO0lrnyX1tAOOGGhS8/PRcvZ/fCP/L6+nGor2Lj+cj3Q0ofKzjnydDmALNqletpePTIWCeQJEHwPnk7BmQJzN0oIcuLWq3aKm6v6wfEqUDg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: C03jWf3fNYy03zpvH6IBHIdVdWg6ZwDOAq2HoBjuCEs7c8Fzimi7nCPERhZeJ3kWZb43EXpVghih9WttHL9Bg4dZT3Dn9qDLI1bnlxaU71FEPzgE8qi01yfuYFMx8wzJwXj8QH5UOGtTVZAlMaFcXJgHCN6tBLtNKMlsyJQUO0hjaHtGFk4mlbe6/63Fk3aFsC0FVYeMtbI3Hia68Z6bzoRdm/fRV2lSh8H8E5QxEziCbdqUAWKeKKn4w8ulc+cDmyLVan5DSodPYA4N9Ans7ZJd9aY07MykZbSAKZspJFDsmnHVLGADgVc9tlRF52TEeQK86c8yl2TKEjBix9Z/T0N7eTGdDFt6Ud6TjZKW3csn0+bG8hyLQgheDPClLkShV1KHTuTY7Pom9BG7rCnvuAJ96RkZv757ZHsalAfuYswgmcCmwmd3COV0MAy6fcQd7a4tkwwL6nL6osL/JT9t2RyOKsQrsfVTK5ZWzEBXMiqQR6WpDDGVnFcULfjD/lcz6/2EkKmndjZqM0DyxW2yEOxfAdNLWOqTJEdO/0iIa5rJWkPWDfv8DrBoK7knWqyEegf3jCZA124sannX4dc2glvpRvOLumF+0738dCdoUXAFwYNdq3acx+hXJk1v19XEp4WuAG3+vjiXXd3eHC+QRjsaSvtLGd9xVm4VzLikmE6jWOFPb1Qiva5kDOdNEPljE3R+ItDZUFOTsZEytl+E9iod+GnJI3eqRAaHFaTqQgZRAdqooH2zAlcAMOdWgUdY4sgsx2186UYXmmfrNfebr5NDqLxYi2ImfAKRxYBaxeroLa/RbU06Hp39Yc7V9cmyYZPGRPGzSlI+dwcCiRtAHUQkvZxYNjfLgTE2ROsTvRz7NNhrjGkN7yRmZhwzBnMz84kSJXEXfQnnwwE0Qx5Yx4G0E21HuD9szJUYa/9FSR/8ZB2wgiKfGjSk6n/5Ntfq1Z599sWGlUvrsCq/kOtzKw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: df9d2ba8-8d92-47ad-d0c3-08d9e9d4ef41 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:20.7760 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 3/6] avcodec/thread: Move ff_thread_(await|report)_progress to new header 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: JMu/u3sWzssD This is in preparation for further commits that will stop using ThreadFrame for frame-threaded codecs that don't use ff_thread_(await|report)_progress(); the API for those codecs having inter-frame dependencies will live in threadframe.h. Signed-off-by: Andreas Rheinhardt --- libavcodec/error_resilience.c | 2 +- libavcodec/ffv1dec.c | 1 + libavcodec/h264_direct.c | 2 +- libavcodec/h264_mb.c | 2 +- libavcodec/h264_picture.c | 2 +- libavcodec/h264_slice.c | 2 +- libavcodec/h264dec.c | 2 +- libavcodec/hevc_filter.c | 1 + libavcodec/hevc_mvs.c | 1 + libavcodec/hevc_refs.c | 1 + libavcodec/hevcdec.c | 1 + libavcodec/mimic.c | 1 + libavcodec/mpeg4videodec.c | 2 +- libavcodec/mpegvideo.c | 2 +- libavcodec/mpegvideo_dec.c | 2 +- libavcodec/pngdec.c | 1 + libavcodec/pthread_frame.c | 1 + libavcodec/rv34.c | 2 +- libavcodec/thread.h | 26 ----------------- libavcodec/threadframe.h | 53 +++++++++++++++++++++++++++++++++++ libavcodec/utils.c | 1 + libavcodec/vp3.c | 1 + libavcodec/vp8.c | 1 + libavcodec/vp9.c | 1 + libavcodec/vp9block.c | 1 + libavcodec/vp9mvs.c | 1 + libavcodec/vp9recon.c | 1 + libavcodec/wavpack.c | 1 + 28 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 libavcodec/threadframe.h diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index 91cd8a4444..551ef914ce 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -34,7 +34,7 @@ #include "mpegutils.h" #include "mpegvideo.h" #include "rectangle.h" -#include "thread.h" +#include "threadframe.h" /** * @param stride the number of MVs to get to the next row diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 810b2e18f0..3f90a8fb55 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -37,6 +37,7 @@ #include "golomb.h" #include "mathops.h" #include "ffv1.h" +#include "threadframe.h" static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed) diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c index 93c2e1e438..014491e29b 100644 --- a/libavcodec/h264_direct.c +++ b/libavcodec/h264_direct.c @@ -30,7 +30,7 @@ #include "h264_ps.h" #include "mpegutils.h" #include "rectangle.h" -#include "thread.h" +#include "threadframe.h" #include diff --git a/libavcodec/h264_mb.c b/libavcodec/h264_mb.c index 3cd17b7e4b..0b31774556 100644 --- a/libavcodec/h264_mb.c +++ b/libavcodec/h264_mb.c @@ -34,7 +34,7 @@ #include "h264dec.h" #include "h264_ps.h" #include "qpeldsp.h" -#include "thread.h" +#include "threadframe.h" static inline int get_lowest_part_list_y(H264SliceContext *sl, int n, int height, int y_offset, int list) diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index dcd5874c2e..50a21c260f 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -30,7 +30,7 @@ #include "avcodec.h" #include "h264dec.h" #include "mpegutils.h" -#include "thread.h" +#include "threadframe.h" void ff_h264_unref_picture(H264Context *h, H264Picture *pic) { diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index dc636c5e78..600a109889 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -45,7 +45,7 @@ #include "mathops.h" #include "mpegutils.h" #include "rectangle.h" -#include "thread.h" +#include "threadframe.h" static const uint8_t field_scan[16+1] = { 0 + 0 * 4, 0 + 1 * 4, 1 + 0 * 4, 0 + 2 * 4, diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index a47caa95e8..1d648f04b7 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -46,7 +46,7 @@ #include "mpegutils.h" #include "profiles.h" #include "rectangle.h" -#include "thread.h" +#include "threadframe.h" const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 }; diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c index 3c45b5a39e..1ef214b0ff 100644 --- a/libavcodec/hevc_filter.c +++ b/libavcodec/hevc_filter.c @@ -26,6 +26,7 @@ #include "libavutil/internal.h" #include "hevcdec.h" +#include "threadframe.h" #define LUMA 0 #define CB 1 diff --git a/libavcodec/hevc_mvs.c b/libavcodec/hevc_mvs.c index 1f6ca5a314..7477efcf52 100644 --- a/libavcodec/hevc_mvs.c +++ b/libavcodec/hevc_mvs.c @@ -23,6 +23,7 @@ #include "hevc.h" #include "hevcdec.h" +#include "threadframe.h" static const uint8_t l0_l1_cand_idx[12][2] = { { 0, 1, }, diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index 06e42d9c53..d0a7888e21 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -28,6 +28,7 @@ #include "thread.h" #include "hevc.h" #include "hevcdec.h" +#include "threadframe.h" void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags) { diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 8d7a4f7147..6d86a5bfdb 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -45,6 +45,7 @@ #include "hevcdec.h" #include "hwconfig.h" #include "profiles.h" +#include "threadframe.h" const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c index ade973d860..6a51da5748 100644 --- a/libavcodec/mimic.c +++ b/libavcodec/mimic.c @@ -35,6 +35,7 @@ #include "hpeldsp.h" #include "idctdsp.h" #include "thread.h" +#include "threadframe.h" #define MIMIC_HEADER_SIZE 20 #define MIMIC_VLC_BITS 11 diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 2aea845580..655be5697d 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -38,7 +38,7 @@ #include "h263.h" #include "h263dec.h" #include "profiles.h" -#include "thread.h" +#include "threadframe.h" #include "xvididct.h" #include "unary.h" diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index bbcf00b014..14768ca8e8 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -43,7 +43,7 @@ #include "mpeg4video.h" #include "mpegvideodata.h" #include "qpeldsp.h" -#include "thread.h" +#include "threadframe.h" #include "wmv2.h" #include diff --git a/libavcodec/mpegvideo_dec.c b/libavcodec/mpegvideo_dec.c index 1e238bd1e1..57465e41a0 100644 --- a/libavcodec/mpegvideo_dec.c +++ b/libavcodec/mpegvideo_dec.c @@ -31,7 +31,7 @@ #include "internal.h" #include "mpegutils.h" #include "mpegvideo.h" -#include "thread.h" +#include "threadframe.h" void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx) { diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 3c00007907..3b12f4057a 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -36,6 +36,7 @@ #include "png.h" #include "pngdsp.h" #include "thread.h" +#include "threadframe.h" #include diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 43e097ff06..73dc4d3669 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -32,6 +32,7 @@ #include "internal.h" #include "pthread_internal.h" #include "thread.h" +#include "threadframe.h" #include "version.h" #include "libavutil/avassert.h" diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index e68072de06..febd41f577 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -41,7 +41,7 @@ #include "mpeg_er.h" #include "qpeldsp.h" #include "rectangle.h" -#include "thread.h" +#include "threadframe.h" #include "rv34vlc.h" #include "rv34data.h" diff --git a/libavcodec/thread.h b/libavcodec/thread.h index d7d2ddd8f1..091dc8a35e 100644 --- a/libavcodec/thread.h +++ b/libavcodec/thread.h @@ -70,32 +70,6 @@ int ff_thread_decode_frame(AVCodecContext *avctx, AVFrame *picture, */ void ff_thread_finish_setup(AVCodecContext *avctx); -/** - * Notify later decoding threads when part of their reference picture is ready. - * Call this when some part of the picture is finished decoding. - * Later calls with lower values of progress have no effect. - * - * @param f The picture being decoded. - * @param progress Value, in arbitrary units, of how much of the picture has decoded. - * @param field The field being decoded, for field-picture codecs. - * 0 for top field or frame pictures, 1 for bottom field. - */ -void ff_thread_report_progress(ThreadFrame *f, int progress, int field); - -/** - * Wait for earlier decoding threads to finish reference pictures. - * Call this before accessing some part of a picture, with a given - * value for progress, and it will return after the responsible decoding - * thread calls ff_thread_report_progress() with the same or - * higher value for progress. - * - * @param f The picture being referenced. - * @param progress Value, in arbitrary units, to wait for. - * @param field The field being referenced, for field-picture codecs. - * 0 for top field or frame pictures, 1 for bottom field. - */ -void ff_thread_await_progress(ThreadFrame *f, int progress, int field); - #if FF_API_THREAD_SAFE_CALLBACKS /** * Wrapper around get_format() for frame-multithreaded codecs. diff --git a/libavcodec/threadframe.h b/libavcodec/threadframe.h new file mode 100644 index 0000000000..c2caf511b9 --- /dev/null +++ b/libavcodec/threadframe.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2022 Andreas Rheinhardt + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_THREADFRAME_H +#define AVCODEC_THREADFRAME_H + +#include "avcodec.h" +#include "thread.h" + +/** + * Notify later decoding threads when part of their reference picture is ready. + * Call this when some part of the picture is finished decoding. + * Later calls with lower values of progress have no effect. + * + * @param f The picture being decoded. + * @param progress Value, in arbitrary units, of how much of the picture has decoded. + * @param field The field being decoded, for field-picture codecs. + * 0 for top field or frame pictures, 1 for bottom field. + */ +void ff_thread_report_progress(ThreadFrame *f, int progress, int field); + +/** + * Wait for earlier decoding threads to finish reference pictures. + * Call this before accessing some part of a picture, with a given + * value for progress, and it will return after the responsible decoding + * thread calls ff_thread_report_progress() with the same or + * higher value for progress. + * + * @param f The picture being referenced. + * @param progress Value, in arbitrary units, to wait for. + * @param field The field being referenced, for field-picture codecs. + * 0 for top field or frame pictures, 1 for bottom field. + */ +void ff_thread_await_progress(ThreadFrame *f, int progress, int field); + +#endif diff --git a/libavcodec/utils.c b/libavcodec/utils.c index b19befef21..0fd4469a74 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -38,6 +38,7 @@ #include "codec.h" #include "hwconfig.h" #include "thread.h" +#include "threadframe.h" #include "internal.h" #include "put_bits.h" #include "raw.h" diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 791e531862..06b0e873b6 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -43,6 +43,7 @@ #include "internal.h" #include "mathops.h" #include "thread.h" +#include "threadframe.h" #include "videodsp.h" #include "vp3data.h" #include "vp4data.h" diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index a70d94bd82..6aba0c5feb 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -33,6 +33,7 @@ #include "mathops.h" #include "rectangle.h" #include "thread.h" +#include "threadframe.h" #include "vp8.h" #include "vp8data.h" diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 24841c5b9f..1250425dce 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -27,6 +27,7 @@ #include "internal.h" #include "profiles.h" #include "thread.h" +#include "threadframe.h" #include "pthread_internal.h" #include "videodsp.h" diff --git a/libavcodec/vp9block.c b/libavcodec/vp9block.c index 5e6cded2bc..5fdda63545 100644 --- a/libavcodec/vp9block.c +++ b/libavcodec/vp9block.c @@ -23,6 +23,7 @@ #include "libavutil/avassert.h" +#include "threadframe.h" #include "vp56.h" #include "vp9.h" #include "vp9data.h" diff --git a/libavcodec/vp9mvs.c b/libavcodec/vp9mvs.c index 88db1c341c..3c4491f407 100644 --- a/libavcodec/vp9mvs.c +++ b/libavcodec/vp9mvs.c @@ -22,6 +22,7 @@ */ #include "internal.h" +#include "threadframe.h" #include "vp56.h" #include "vp9.h" #include "vp9data.h" diff --git a/libavcodec/vp9recon.c b/libavcodec/vp9recon.c index 503091e545..bfafde8c9c 100644 --- a/libavcodec/vp9recon.c +++ b/libavcodec/vp9recon.c @@ -24,6 +24,7 @@ #include "libavutil/avassert.h" #include "libavutil/mem_internal.h" +#include "threadframe.h" #include "videodsp.h" #include "vp9data.h" #include "vp9dec.h" diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 6b2ec19bf1..5a338d7658 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -29,6 +29,7 @@ #include "get_bits.h" #include "internal.h" #include "thread.h" +#include "threadframe.h" #include "unary.h" #include "wavpack.h" #include "dsd.h" From patchwork Mon Feb 7 00:58:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34153 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5361849iov; Sun, 6 Feb 2022 16:58:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJzrtfFugPT23UV4H996LmSbBdww7kLc+RDa/L3kATUm9R2s9KhSj1r9ItZXXgjdKnMIa2Rh X-Received: by 2002:a17:907:7f1c:: with SMTP id qf28mr7810619ejc.94.1644195530006; Sun, 06 Feb 2022 16:58:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n2si6529339edi.143.2022.02.06.16.58.49; Sun, 06 Feb 2022 16:58:49 -0800 (PST) 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=obSCTsoh; 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 71CEE68B1F3; Mon, 7 Feb 2022 02:58:35 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C605A68AFCF for ; Mon, 7 Feb 2022 02:58:28 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MXY7uRWPAvbOc/zmpio9++FGk0d5gcNflQ789Y63WcwC6+HyBRBQzV/X7wNEasYxB+RLeJUgHNbez5yZnive8qazXdoB5vVUz2kv7/tBXe4vwKYTkX5Etd7bcetCulx+U2fbAV8FV6zRl6PdtrmE4qYAgep/r7NotMvwS1IsWHABdR0oOCpz6NKxjSci4IAMGFc+kpG8Dq1ulsKhMbiTHd2bynRmPcnyh0MInyKdXV2x0JwGCFiWThahNKDQyZC51QhdEqH3LbTYJCkCsn8xbSWMjN1wB+Swa4H0O4Iv7mo74Hv4alevWC8p2495Hcqr5G1UGvxSSpEP2BvAkWY2RA== 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=zJFdbZ0AMf2KjWOFguPiAuAnHYi27UwNf0lwsHuR+YA=; b=XeShj0gd2kc43ZKYTB88jEhkLKA2ToPYoyKlC1gUHq+soMvrx9DYNekRU9uJv00oBZV4LvCIZL4cSjioW19xSe9sV0KZQnCdefOKX3R/8G406IZQE1AzEjSiyqkknlYzJd8JxSq7AX9jARM4AoI2pYwDGwwCMvUrxyuKKJLn6XCQPmYQO+CvOoBEUr/7sdsDIo25c1t00ohUN0atD7LsvdrR+Ko2Qiw0XXReH5HK94jaqB+ZeX+8yTpRj6yxKK0BHy3WhqJIUPdmdsMeczKFGJkkKXh3+VbmMhJzDyVNlOAx692ak0UVmbNTK9mp8veXxCtF/m+CbHZ91VXMifd8fw== 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=zJFdbZ0AMf2KjWOFguPiAuAnHYi27UwNf0lwsHuR+YA=; b=obSCTsoh1XSXJJmtaGSYEE3Rm0sQXrtfZD/7KgxrFoHcPytIffRZYz8L/p01YVIDRRFY9vu0XdXhXvmCQfrY4KxNi0BLQpcBzSB0+/9Ldhk0O04uKHQol1lQk1IpqPC4JD4DASaW/OaqRMCSPkHisuph34pj8NYY3WeZX/bv9p3ABV8uQqB2DxVmoNvf+IgVAMiS75sE1E/3Z0GqrGZY2zKqvEVNs+txVlIwBssMQYXv3YfhVxS5GEGDHlF1c1GgROEM61tkACsLYKJNmSFu/zmxgYULO7H2fPe0JDGRHtJehc+MSGXoGQoDMYF2/yqeSz1O/PMPfjdHkmG4ut6j+w== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:22 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:22 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:06 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [wVpdK39w96T32l+phY0aalwic0zcdtEK] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2eac013f-8a0d-4515-8e90-08d9e9d4f02b X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNX9TGuA1ZT0pdzH+4wnQw+JlkuwBd7BSFIXivNFF6qUkC1+eviWEIHwpPHC2lHcNz5lA75bxX+YaJARxRW4olP8Gbp0pcB8IDyRbyLHbry5hZXE1psW2ryT4UszTctuBCDX3SMMfTmgk/yXt0DhseplAezD2CP/a8KhbVnq/dhBFVTwA3m0xGLHvy6Nn3mCXHoChHSZyCVSCNIlmYAUymuZ9GYiL/rr8JrYbGZ8C7AHbemhF9j2jfkOOSVw5MXcTVBqmjhcq8TaqFcqDNoQ5f0+Chkpd4u+aKjKI4mhiPNJsA6EaehIoMrCEnoFN9f+pQ/Rg+kBiO7086gWiMFHlLmnH8Kvt87Tri945efQBSnO7QOovIGkQDefB3bhupbxRy8SGbG7CUwP0tW8jT+Ph+r5yoJiv6+s1Iq6ZpMlcrf2PpQb+nB2GdL/7dWuMn4EQeZSq9Qr7+Acj3vA1gHVoAbWHh3amDzkafsSrzhX3x2QVRjWaStlgdfjkJKdNl++Cab/60/DZ3pSVTHndOjufzgJp22A1C/bGGmfqF0ReFW8an2c15RVbKRv+4fgXViQwZ+C/OQ4eCR3whtvC4M7G362b5aZecO56gfZMOMG2iQkDqLVUrND3Xot4cuOsy5njTOL1jXPhBMGcq7KVzWX2pknMXUJvUKg95lSWEFfwufJ5Kez33cO/W4JTt5C8tHRmAIJ42HQGMo0SBn5RZEx+U2hPnJPksNJbGo= X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WR/faB1h484A6DHR3cYF046LRVz6F2LZiOuxuF1F+/5OvBPqA9F1TtCjQ82MVuC1hX7ROX8uJU7aA1kF+x5CHPxmMOEVTbw1le6LtSWDLg6euYxUfjVLffsRKE61smqVZj7btKdl54ifMpUYfzfMDF0sEU5AsVSmW8Z9rbnPc1fgxpBvkkZxdVQ4yc6BYRUChEp1od7LB4PAx5FzSNJHyK9jmO7qtweNzBoeNi1Dc1LyYjsPBcsTCnPfYm2upDR28P/xhN3XAVeVoWETTJG+yN6ZdguomDrrSm5LNFUsmkpM5BaR/0HQlqIWjP9kWurjBXaVvrl4zCmdyKD51KAEaBw82yVvYJU6L+tamymsxGJZZ0tyeLVH9UKfOTF0USt2ZQ7uw+CdJnodf0VoT82vDKMySBShMkS/d9e91V8LnEKhmIpTLJKL7cqG1KIkkfkCTJLVQMw0JZUegE5fRxhb4eI9sdIQ4ffEo1L9Yt96wO+KE5pPNiNG0pKHkQu66lFN+P/XGcC23n541pMzbHnaTv4yQABu8i445haXC4HNetlFDxi//JPWDtOW3dZ6C/4YyN/sqqFxerlC4SGiPElrmg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kRR2oSxOVX1X0W0WC974Se3cWoOebUg8H8JRkGdskYr19H4sQ4bOwFWaKw3HucxhjQQSAH8+6kzY7py1Yof/yv5btHYu7RyCoutvw2CO+KMBMp9LPzxezpeXtjE1XYl8q7mxatlbv8iy4DAnxyzpkeDtYYnrppYrZd51kS3ue8nE5EIWXNxslpyj5HYse8bYfhWMXEveCR0oLgQvRFuKpetxeOZdy5mscIQtOe0BiTSUWZU+paZD0vcjNBuKG5Cr5g6ev+4jT30rJJJGuSlfEtmbTv2mr93fF3LFukpBs9Y+QG5XsXvnuuRBiRAaehDa71m6jBV0/kZSUXEsKeEGFfT4Y32GfgUVspG7e4cGfASKQGW0zRhwOuWFSuoQb3GGziglNKmUr4LbYh//J5F3c4vuyOrOjz9uDxPbjqWLU9QwkqUi/pQgeUhSr4pAPkXCs5Lh/FUfIzCB7jv4VLrXRthJD3Ax9Lf5JRg4yyOtWR23XZV33A/qg8+0QY22v+nUoK9/zrb/lneNIiJTmPfpX5KvcMmASL64b/GlWSTv8f7lZEbGfoAf2K+gWRb+A7wH3vi6ddZ/+3gv8yyWFwLW82+IlglSjDR6nCCzddUHS4Ww2xNF5gdyi2wOcjOqa2kCTPAEpoJ/9RcZ/h6oJBdtlXjwrJwDJp7bI2EX8u+IC90S0ZNvO/8yFhRzDBuJhtZzzEVXZmV69NbVgnVvpl8VqgDqTJ+xFfpCXZ2LlyNeFI8pDd8e3KmBz1HcN6KbJ81Ji7uTa0a98wtO50tI8nXzNyCMKAmnUZjeS0sdswab8r5DGOClcIJor23ULQ8qi78AsBawA3eJ3axpuLZmparHX5YbwsXUAk3gIHxtEIKgGN6cGMKdfyRpgl67ARHlAw9CoaNLVwLxbsHfpc6oBQHYNngi/iFNBv7EN12a9Gv9fTzLouVvTUWmjl0Hno40VfG3xBX0+nZOBvZrWcPYxLxHZg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2eac013f-8a0d-4515-8e90-08d9e9d4f02b X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:22.3704 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 4/6] avcodec/threadframe: Add ff_thread_(get|release)_ext_buffer() 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: Lx98GW/RhK3w These will be used by the codecs that need allocated progress and is in preparation for no longer using ThreadFrame by the codecs that don't. Signed-off-by: Andreas Rheinhardt --- libavcodec/ffv1.c | 5 +++-- libavcodec/ffv1dec.c | 9 +++++---- libavcodec/h264_picture.c | 4 ++-- libavcodec/h264_slice.c | 6 +++--- libavcodec/hevc_refs.c | 6 +++--- libavcodec/mimic.c | 12 ++++++------ libavcodec/mpegpicture.c | 7 ++++--- libavcodec/pngdec.c | 17 +++++++++-------- libavcodec/pthread_frame.c | 10 ++++++++++ libavcodec/threadframe.h | 24 ++++++++++++++++++++++++ libavcodec/utils.c | 15 ++++++++++++++- libavcodec/vp3.c | 23 ++++++++++++----------- libavcodec/vp8.c | 8 ++++---- libavcodec/vp9.c | 18 +++++++++--------- libavcodec/wavpack.c | 18 ++++++++++-------- 15 files changed, 118 insertions(+), 64 deletions(-) diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index d8a0c39254..6bde984815 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -37,6 +37,7 @@ #include "rangecoder.h" #include "mathops.h" #include "ffv1.h" +#include "threadframe.h" av_cold int ff_ffv1_common_init(AVCodecContext *avctx) { @@ -204,11 +205,11 @@ av_cold int ff_ffv1_close(AVCodecContext *avctx) int i, j; if (s->picture.f) - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); av_frame_free(&s->picture.f); if (s->last_picture.f) - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); av_frame_free(&s->last_picture.f); for (j = 0; j < s->max_slice_count; j++) { diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 3f90a8fb55..45ecf3152e 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -842,7 +842,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac AVFrame *p; if (f->last_picture.f) - ff_thread_release_buffer(avctx, &f->last_picture); + ff_thread_release_ext_buffer(avctx, &f->last_picture); FFSWAP(ThreadFrame, f->picture, f->last_picture); f->cur = p = f->picture.f; @@ -874,7 +874,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac p->key_frame = 0; } - if ((ret = ff_thread_get_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF)) < 0) + ret = ff_thread_get_ext_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF); + if (ret < 0) return ret; if (avctx->debug & FF_DEBUG_PICT_INFO) @@ -966,7 +967,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac ff_thread_report_progress(&f->picture, INT_MAX, 0); if (f->last_picture.f) - ff_thread_release_buffer(avctx, &f->last_picture); + ff_thread_release_ext_buffer(avctx, &f->last_picture); if ((ret = av_frame_ref(data, f->picture.f)) < 0) return ret; @@ -1037,7 +1038,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) av_assert1(fdst->max_slice_count == fsrc->max_slice_count); - ff_thread_release_buffer(dst, &fdst->picture); + ff_thread_release_ext_buffer(dst, &fdst->picture); if (fsrc->picture.f->data[0]) { if ((ret = ff_thread_ref_frame(&fdst->picture, &fsrc->picture)) < 0) return ret; diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index 50a21c260f..c7f5b64b99 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -40,7 +40,7 @@ void ff_h264_unref_picture(H264Context *h, H264Picture *pic) if (!pic->f || !pic->f->buf[0]) return; - ff_thread_release_buffer(h->avctx, &pic->tf); + ff_thread_release_ext_buffer(h->avctx, &pic->tf); ff_thread_release_buffer(h->avctx, &pic->tf_grain); av_buffer_unref(&pic->hwaccel_priv_buf); @@ -155,7 +155,7 @@ int ff_h264_replace_picture(H264Context *h, H264Picture *dst, const H264Picture av_assert0(src->tf.f == src->f); dst->tf.f = dst->f; - ff_thread_release_buffer(h->avctx, &dst->tf); + ff_thread_release_ext_buffer(h->avctx, &dst->tf); ret = ff_thread_ref_frame(&dst->tf, &src->tf); if (ret < 0) goto fail; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 600a109889..32d2e090d5 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -191,8 +191,8 @@ static int alloc_picture(H264Context *h, H264Picture *pic) av_assert0(!pic->f->data[0]); pic->tf.f = pic->f; - ret = ff_thread_get_buffer(h->avctx, &pic->tf, pic->reference ? - AV_GET_BUFFER_FLAG_REF : 0); + ret = ff_thread_get_ext_buffer(h->avctx, &pic->tf, + pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); if (ret < 0) goto fail; @@ -1699,7 +1699,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, ff_thread_await_progress(&prev->tf, INT_MAX, 0); if (prev->field_picture) ff_thread_await_progress(&prev->tf, INT_MAX, 1); - ff_thread_release_buffer(h->avctx, &h->short_ref[0]->tf); + ff_thread_release_ext_buffer(h->avctx, &h->short_ref[0]->tf); h->short_ref[0]->tf.f = h->short_ref[0]->f; ret = ff_thread_ref_frame(&h->short_ref[0]->tf, &prev->tf); if (ret < 0) diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index d0a7888e21..0dd456bb92 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -38,7 +38,7 @@ void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags) frame->flags &= ~flags; if (!frame->flags) { - ff_thread_release_buffer(s->avctx, &frame->tf); + ff_thread_release_ext_buffer(s->avctx, &frame->tf); ff_thread_release_buffer(s->avctx, &frame->tf_grain); frame->needs_fg = 0; @@ -90,8 +90,8 @@ static HEVCFrame *alloc_frame(HEVCContext *s) if (frame->frame->buf[0]) continue; - ret = ff_thread_get_buffer(s->avctx, &frame->tf, - AV_GET_BUFFER_FLAG_REF); + ret = ff_thread_get_ext_buffer(s->avctx, &frame->tf, + AV_GET_BUFFER_FLAG_REF); if (ret < 0) return NULL; diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c index 6a51da5748..d3343b5da7 100644 --- a/libavcodec/mimic.c +++ b/libavcodec/mimic.c @@ -112,7 +112,7 @@ static av_cold int mimic_decode_end(AVCodecContext *avctx) for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) { if (ctx->frames[i].f) - ff_thread_release_buffer(avctx, &ctx->frames[i]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[i]); av_frame_free(&ctx->frames[i].f); } @@ -164,7 +164,7 @@ static int mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCod dst->prev_index = src->next_prev_index; for (i = 0; i < FF_ARRAY_ELEMS(dst->frames); i++) { - ff_thread_release_buffer(avctx, &dst->frames[i]); + ff_thread_release_ext_buffer(avctx, &dst->frames[i]); if (i != src->next_cur_index && src->frames[i].f->data[0]) { ret = ff_thread_ref_frame(&dst->frames[i], &src->frames[i]); if (ret < 0) @@ -395,11 +395,11 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - ff_thread_release_buffer(avctx, &ctx->frames[ctx->cur_index]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[ctx->cur_index]); ctx->frames[ctx->cur_index].f->pict_type = is_pframe ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; - if ((res = ff_thread_get_buffer(avctx, &ctx->frames[ctx->cur_index], - AV_GET_BUFFER_FLAG_REF)) < 0) + if ((res = ff_thread_get_ext_buffer(avctx, &ctx->frames[ctx->cur_index], + AV_GET_BUFFER_FLAG_REF)) < 0) return res; ctx->next_prev_index = ctx->cur_index; @@ -420,7 +420,7 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data, ff_thread_report_progress(&ctx->frames[ctx->cur_index], INT_MAX, 0); if (res < 0) { if (!(avctx->active_thread_type & FF_THREAD_FRAME)) - ff_thread_release_buffer(avctx, &ctx->frames[ctx->cur_index]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[ctx->cur_index]); return res; } diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c index 27e497c404..be6e6967e0 100644 --- a/libavcodec/mpegpicture.c +++ b/libavcodec/mpegpicture.c @@ -29,6 +29,7 @@ #include "motion_est.h" #include "mpegpicture.h" #include "mpegutils.h" +#include "threadframe.h" static void av_noinline free_picture_tables(Picture *pic) { @@ -130,8 +131,8 @@ static int alloc_frame_buffer(AVCodecContext *avctx, Picture *pic, pic->f->height = avctx->height + 2 * EDGE_WIDTH; } - r = ff_thread_get_buffer(avctx, &pic->tf, - pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); + r = ff_thread_get_ext_buffer(avctx, &pic->tf, + pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); } else { pic->f->width = avctx->width; pic->f->height = avctx->height; @@ -321,7 +322,7 @@ void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *pic) if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE && avctx->codec_id != AV_CODEC_ID_VC1IMAGE && avctx->codec_id != AV_CODEC_ID_MSS2) - ff_thread_release_buffer(avctx, &pic->tf); + ff_thread_release_ext_buffer(avctx, &pic->tf); else if (pic->f) av_frame_unref(pic->f); diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 3b12f4057a..7571def907 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -721,8 +721,9 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, s->bpp += byte_depth; } - ff_thread_release_buffer(avctx, &s->picture); - if ((ret = ff_thread_get_buffer(avctx, &s->picture, AV_GET_BUFFER_FLAG_REF)) < 0) + ff_thread_release_ext_buffer(avctx, &s->picture); + if ((ret = ff_thread_get_ext_buffer(avctx, &s->picture, + AV_GET_BUFFER_FLAG_REF)) < 0) return ret; p->pict_type = AV_PICTURE_TYPE_I; @@ -1560,7 +1561,7 @@ static int decode_frame_png(AVCodecContext *avctx, goto the_end; if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); FFSWAP(ThreadFrame, s->picture, s->last_picture); } @@ -1624,9 +1625,9 @@ static int decode_frame_apng(AVCodecContext *avctx, if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) { - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); } else { - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); FFSWAP(ThreadFrame, s->picture, s->last_picture); } } @@ -1677,7 +1678,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) src_frame = psrc->dispose_op == APNG_DISPOSE_OP_PREVIOUS ? &psrc->last_picture : &psrc->picture; - ff_thread_release_buffer(dst, &pdst->last_picture); + ff_thread_release_ext_buffer(dst, &pdst->last_picture); if (src_frame && src_frame->f->data[0]) { ret = ff_thread_ref_frame(&pdst->last_picture, src_frame); if (ret < 0) @@ -1712,9 +1713,9 @@ static av_cold int png_dec_end(AVCodecContext *avctx) { PNGDecContext *s = avctx->priv_data; - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); av_frame_free(&s->last_picture.f); - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); av_frame_free(&s->picture.f); av_freep(&s->buffer); s->buffer_size = 0; diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 73dc4d3669..f405622ca1 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -1057,6 +1057,11 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) return ret; } +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +{ + return ff_thread_get_buffer(avctx, f, flags); +} + void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) { #if FF_API_THREAD_SAFE_CALLBACKS @@ -1126,3 +1131,8 @@ fail: } #endif } + +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) +{ + ff_thread_release_buffer(avctx, f); +} diff --git a/libavcodec/threadframe.h b/libavcodec/threadframe.h index c2caf511b9..be63e62435 100644 --- a/libavcodec/threadframe.h +++ b/libavcodec/threadframe.h @@ -50,4 +50,28 @@ void ff_thread_report_progress(ThreadFrame *f, int progress, int field); */ void ff_thread_await_progress(ThreadFrame *f, int progress, int field); +/** + * Wrapper around ff_get_buffer() for frame-multithreaded codecs. + * Call this function instead of ff_get_buffer() if you might need + * to wait for progress on this frame. + * Cannot be called after the codec has called ff_thread_finish_setup(). + * + * @param avctx The current context. + * @param f The frame to write into. + * @note: It is fine to call this with codecs that do not support + * frame threading. + */ +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); + +/** + * Unref a ThreadFrame. + * + * This is basically a wrapper around av_frame_unref() and should + * be called instead of it. + * + * @param avctx The current context. + * @param f The picture being released. + */ +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f); + #endif diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 0fd4469a74..bc16424f91 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -879,7 +879,7 @@ int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src) if (src->progress && !(dst->progress = av_buffer_ref(src->progress))) { - ff_thread_release_buffer(dst->owner[0], dst); + ff_thread_release_ext_buffer(dst->owner[0], dst); return AVERROR(ENOMEM); } @@ -899,12 +899,25 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) return ff_get_buffer(avctx, f->f, flags); } +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +{ + f->owner[0] = f->owner[1] = avctx; + return ff_get_buffer(avctx, f->f, flags); +} + void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) { if (f->f) av_frame_unref(f->f); } +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) +{ + f->owner[0] = f->owner[1] = NULL; + if (f->f) + av_frame_unref(f->f); +} + void ff_thread_finish_setup(AVCodecContext *avctx) { } diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 06b0e873b6..e9ab54d736 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -333,11 +333,11 @@ static void vp3_decode_flush(AVCodecContext *avctx) Vp3DecodeContext *s = avctx->priv_data; if (s->golden_frame.f) - ff_thread_release_buffer(avctx, &s->golden_frame); + ff_thread_release_ext_buffer(avctx, &s->golden_frame); if (s->last_frame.f) - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); if (s->current_frame.f) - ff_thread_release_buffer(avctx, &s->current_frame); + ff_thread_release_ext_buffer(avctx, &s->current_frame); } static av_cold int vp3_decode_end(AVCodecContext *avctx) @@ -2507,25 +2507,25 @@ static int update_frames(AVCodecContext *avctx) int ret = 0; /* shuffle frames (last = current) */ - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); ret = ff_thread_ref_frame(&s->last_frame, &s->current_frame); if (ret < 0) goto fail; if (s->keyframe) { - ff_thread_release_buffer(avctx, &s->golden_frame); + ff_thread_release_ext_buffer(avctx, &s->golden_frame); ret = ff_thread_ref_frame(&s->golden_frame, &s->current_frame); } fail: - ff_thread_release_buffer(avctx, &s->current_frame); + ff_thread_release_ext_buffer(avctx, &s->current_frame); return ret; } #if HAVE_THREADS static int ref_frame(Vp3DecodeContext *s, ThreadFrame *dst, ThreadFrame *src) { - ff_thread_release_buffer(s->avctx, dst); + ff_thread_release_ext_buffer(s->avctx, dst); if (src->f->data[0]) return ff_thread_ref_frame(dst, src); return 0; @@ -2675,7 +2675,8 @@ static int vp3_decode_frame(AVCodecContext *avctx, s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; s->current_frame.f->key_frame = s->keyframe; - if ((ret = ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_get_ext_buffer(avctx, &s->current_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) goto error; if (!s->edge_emu_buffer) @@ -2734,10 +2735,10 @@ static int vp3_decode_frame(AVCodecContext *avctx, "vp3: first frame not a keyframe\n"); s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I; - if ((ret = ff_thread_get_buffer(avctx, &s->golden_frame, - AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_get_ext_buffer(avctx, &s->golden_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) goto error; - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); if ((ret = ff_thread_ref_frame(&s->last_frame, &s->golden_frame)) < 0) goto error; diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 6aba0c5feb..40a7e13683 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -72,8 +72,8 @@ static void free_buffers(VP8Context *s) static int vp8_alloc_frame(VP8Context *s, VP8Frame *f, int ref) { int ret; - if ((ret = ff_thread_get_buffer(s->avctx, &f->tf, - ref ? AV_GET_BUFFER_FLAG_REF : 0)) < 0) + if ((ret = ff_thread_get_ext_buffer(s->avctx, &f->tf, + ref ? AV_GET_BUFFER_FLAG_REF : 0)) < 0) return ret; if (!(f->seg_map = av_buffer_allocz(s->mb_width * s->mb_height))) goto fail; @@ -90,7 +90,7 @@ static int vp8_alloc_frame(VP8Context *s, VP8Frame *f, int ref) fail: av_buffer_unref(&f->seg_map); - ff_thread_release_buffer(s->avctx, &f->tf); + ff_thread_release_ext_buffer(s->avctx, &f->tf); return AVERROR(ENOMEM); } @@ -99,7 +99,7 @@ static void vp8_release_frame(VP8Context *s, VP8Frame *f) av_buffer_unref(&f->seg_map); av_buffer_unref(&f->hwaccel_priv_buf); f->hwaccel_picture_private = NULL; - ff_thread_release_buffer(s->avctx, &f->tf); + ff_thread_release_ext_buffer(s->avctx, &f->tf); } #if CONFIG_VP8_DECODER diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 1250425dce..7ef10f7a80 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -93,7 +93,7 @@ static void vp9_tile_data_free(VP9TileData *td) static void vp9_frame_unref(AVCodecContext *avctx, VP9Frame *f) { - ff_thread_release_buffer(avctx, &f->tf); + ff_thread_release_ext_buffer(avctx, &f->tf); av_buffer_unref(&f->extradata); av_buffer_unref(&f->hwaccel_priv_buf); f->segmentation_map = NULL; @@ -105,7 +105,7 @@ static int vp9_frame_alloc(AVCodecContext *avctx, VP9Frame *f) VP9Context *s = avctx->priv_data; int ret, sz; - ret = ff_thread_get_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF); + ret = ff_thread_get_ext_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF); if (ret < 0) return ret; @@ -1237,9 +1237,9 @@ static av_cold int vp9_decode_free(AVCodecContext *avctx) } av_buffer_pool_uninit(&s->frame_extradata_pool); for (i = 0; i < 8; i++) { - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); av_frame_free(&s->s.refs[i].f); - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); av_frame_free(&s->next_refs[i].f); } @@ -1571,7 +1571,7 @@ static int vp9_decode_frame(AVCodecContext *avctx, void *frame, ((AVFrame *)frame)->pkt_dts = pkt->dts; for (i = 0; i < 8; i++) { if (s->next_refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); if (s->s.refs[i].f->buf[0] && (ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.refs[i])) < 0) return ret; @@ -1611,7 +1611,7 @@ static int vp9_decode_frame(AVCodecContext *avctx, void *frame, // ref frame setup for (i = 0; i < 8; i++) { if (s->next_refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); if (s->s.h.refreshrefmask & (1 << i)) { ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.frames[CUR_FRAME].tf); } else if (s->s.refs[i].f->buf[0]) { @@ -1760,7 +1760,7 @@ finish: // ref frame setup for (i = 0; i < 8; i++) { if (s->s.refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); if (s->next_refs[i].f->buf[0] && (ret = ff_thread_ref_frame(&s->s.refs[i], &s->next_refs[i])) < 0) return ret; @@ -1783,7 +1783,7 @@ static void vp9_decode_flush(AVCodecContext *avctx) for (i = 0; i < 3; i++) vp9_frame_unref(avctx, &s->s.frames[i]); for (i = 0; i < 8; i++) - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); } static av_cold int vp9_decode_init(AVCodecContext *avctx) @@ -1832,7 +1832,7 @@ static int vp9_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo } for (i = 0; i < 8; i++) { if (s->s.refs[i].f->buf[0]) - ff_thread_release_buffer(dst, &s->s.refs[i]); + ff_thread_release_ext_buffer(dst, &s->s.refs[i]); if (ssrc->next_refs[i].f->buf[0]) { if ((ret = ff_thread_ref_frame(&s->s.refs[i], &ssrc->next_refs[i])) < 0) return ret; diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 5a338d7658..30790ef16e 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -1019,7 +1019,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) if (dst == src) return 0; - ff_thread_release_buffer(dst, &fdst->curr_frame); + ff_thread_release_ext_buffer(dst, &fdst->curr_frame); if (fsrc->curr_frame.f->data[0]) { if ((ret = ff_thread_ref_frame(&fdst->curr_frame, &fsrc->curr_frame)) < 0) return ret; @@ -1066,10 +1066,10 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx) av_freep(&s->fdec[i]); s->fdec_num = 0; - ff_thread_release_buffer(avctx, &s->curr_frame); + ff_thread_release_ext_buffer(avctx, &s->curr_frame); av_frame_free(&s->curr_frame.f); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); av_frame_free(&s->prev_frame.f); av_buffer_unref(&s->dsd_ref); @@ -1539,7 +1539,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, av_log(avctx, AV_LOG_ERROR, "Error reinitializing the DSD context\n"); return ret; } - ff_thread_release_buffer(avctx, &wc->curr_frame); + ff_thread_release_ext_buffer(avctx, &wc->curr_frame); } avctx->channels = new_channels; avctx->channel_layout = new_chmask; @@ -1547,12 +1547,14 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, avctx->sample_fmt = sample_fmt; avctx->bits_per_raw_sample = orig_bpp; - ff_thread_release_buffer(avctx, &wc->prev_frame); + ff_thread_release_ext_buffer(avctx, &wc->prev_frame); FFSWAP(ThreadFrame, wc->curr_frame, wc->prev_frame); /* get output buffer */ wc->curr_frame.f->nb_samples = s->samples; - if ((ret = ff_thread_get_buffer(avctx, &wc->curr_frame, AV_GET_BUFFER_FLAG_REF)) < 0) + ret = ff_thread_get_ext_buffer(avctx, &wc->curr_frame, + AV_GET_BUFFER_FLAG_REF); + if (ret < 0) return ret; wc->frame = wc->curr_frame.f; @@ -1676,7 +1678,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, } ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); if (s->modulation == MODULATION_DSD) avctx->execute2(avctx, dsd_channel, s->frame, NULL, avctx->channels); @@ -1693,7 +1695,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, error: if (s->frame) { ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); ff_thread_report_progress(&s->curr_frame, INT_MAX, 0); } From patchwork Mon Feb 7 00:58:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34155 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5362027iov; Sun, 6 Feb 2022 16:59:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJygvqkfMR6h0FsPrJ73qGIsNno/e66+SFVBclrFGmkndF5sE/flI8OPOIqx9UCyWi1xnfDt X-Received: by 2002:a05:6402:438a:: with SMTP id o10mr11506029edc.338.1644195553594; Sun, 06 Feb 2022 16:59:13 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b14si6945244edz.63.2022.02.06.16.59.13; Sun, 06 Feb 2022 16:59:13 -0800 (PST) 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=u0CgoXBN; 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 5A80D68B20C; Mon, 7 Feb 2022 02:58:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1E68568AFCF for ; Mon, 7 Feb 2022 02:58:39 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mKfkabJs2AJQTSor4gNlRgsHpsEhuYPwlrB8aRFGQ6EBKE9+prO0eA5AFmaAOfcXM6um3XzfsNBtEgFsNJv66M+5gjQL4ADKJShgFz2+A2TBKApcyP16UvGNfcRx8UskrGjjL/jU8DEXg3JCyrIbP8cNaTxUWdYEpdXAxV3fT7pXFMr6BDp8gssqjeKZKZggUDMUDpTxLSCog4TqZEGr5BJuO8z6rbHPGihXzsjzvIEq5UR3znQU+RSCdcjULKgFjie+ey8f1hkdtWK+UJlxZkx/IwJ5PkYhoF4w4ZBP0EyGT62L8k2K0THkxiSKOTI4deq3eDxPz2LKQy66a7EIYw== 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=/SSm2TvX7bHxoMDYfeVg7gXHCYPcnzR3cKSUhn3ymiI=; b=FVaf2i9/l4iGnCHCViiCtJlmPTLxYqLzKCEiPaKJjVFFswLbg7qKiw/5UUHKIzziODg2QVKCfhTwgur9x+XJz9xwWmX3A/KnUMJvmmWmoUdyL/ChIxaqzhGn8dX2fb85umm9rzDUMDk7Xy0iH1w4DDahgXGfgiBd7tJwWiiY1wYv+daZgPpWLY/+HbL6mdOG2wmHyczPdlQyznCHirR9IvKCYyTtUSrz8AbkFMpFihtI5pXGK3EBZwDENhfDVrkyBdIufu9LN9+WX1wy6uZiY+twUOvEqhzV/WitPqVtr5ANPWgzsG3yPgyJBDzLtdtOovqvnpVhzCJL7xx5YYifBg== 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=/SSm2TvX7bHxoMDYfeVg7gXHCYPcnzR3cKSUhn3ymiI=; b=u0CgoXBN3PAJMnDzw8G/uB0i3vKGlKuIzyc+KDRODjnYc9tb85mhEtuZ3i8lQ10Swkcugu6kN9S9LUzECdFPz49KluNPks28WYC9Z1oaX36jLLuNFSAu5NOx2Yv9TUSgVmB70V/VIw/eD3SwsdTV5xjx7g5G601KAWJ+MZLMFbZJdJP5vccrFZmE4FbszFG+jhLYJkGGTKTIZd1ayoF67PbdfCLadBVUbdWARRTcgLEU4A6G9EPOODXiVEIWtnc45063Ddzl+KNMmgDz5uYzsaJ47hrIwmnAKk23UwyePAGmRh+I0f1+4sPQMYnbl16q1tp5RBJ63JPiJPs4diPDZA== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:23 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:23 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:07 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [dzC6Itcv9XbSeulaPkOuXx0mWXZtq264] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f33c304a-618f-485a-8e00-08d9e9d4f0d5 X-MS-Exchange-SLBlob-MailProps: pt8ZUcDWjMV0jQdvSrGaP/BzI9aSmIaKK/QPz6bbFoEDJu5mr5zO89l93sEyUG8ugyDDFgLLkv+kF7MGGGV0pcr1PLuOpwOE1+I9WvMiXfWeqG9hWo7XEOOV3TWchKS/kPlk/YlisO7ChF0ATnS/FcjaQUatmPvOo+6P2F0yhPuwH+lC7b0IhFyNhq5Dcnq0X+9sjNxzRp49o/HXVRhATuF1FNbzwLVaV008O2kdyo1RFyawvbFABWlXh2ruLqXwB/6fhLN4JBG3S8tVg8/BmBqX+tTyLK92078S4m0NLuCPl0ZrHPM/B/PsaFpuGOlMoocshbcb8NOojOkQDy2ta9ay757xdu1SZPg5a1zjB6TCH38ySfLfcuR5Iy9Luw4BkpHN8nwgBzH5254kiXpbEsjVyeSrhtOUrQ3aiiBAQVDUwbYQ+9CJ2F0aApujQ/wGY12I2/5TXUlhxLqoq63OMhTcQ7FDeGVMN9+KfLqWcyJJfTSfiENKAdNppRpc64ixE7BiLpi/9Mt9YcvfZTZ+B7PKY1/bM95gJfXEvtLnQa/ZjTLUhKvh5UEMqX9KgNN2WqAtzY7c4+sf/oPHGsZ870Hm3JnQog0/3Fi6H+gsCZmWFf42Qx3I5nSkYJtDy6aM6qC7B/Gp+kP1wh5Tw9DjIjcRFnOiUz92eXh8Iq9fV5PIGUwYyBXAPBsOkLDqEA/S/Aj0PJ8XsuF/CYqN8rhQ5djW+JbBwcHH6pYqwYNl/pxRBP05tGXPPws+DBhPCLA8WM/I9q23Amefe3Xqt6tGUub62V+HVutoKzMbsv6yU2+dWz6xzQfXCB2Pradi5NUXDG2uDVkdybDCxWVFQuuEWOPubauOj94Iln8F63RYh0RTFHoy9aDmM5xV6EmJ99stRuXHdqWQD4KoWWjzWllLigwmCJuztQN7mcIqqT3sOATnDWgeiw4h+T7WXAhf4n2B X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0kAKNSe/RRnLq26p4cfKKWKTr1khefp8/xaTrnIn/1c87/2674uhvmTuZgHgXpVMa1+TnMtbxHgMCXB+a/tJFC7PdexbOt2s3sCKzR84+Mm2pKJTHlKmSWeBjXtYytklLZndzFAUk3Mpit9z08E9BdYfaSe7Vk5l4yZk0yvQmgXCkgfAMitx9PAClsjQqddfyNhsGVa8IjwJNjmnvMoyKgsq71ULGNWMN/JXrJESOWIbaNL5cdzuw9BaJWv6SZYjPJxeebtkBwz7GzL77EUyB+R6FDWfL4UiHukqVn4RwkYcQ9yxEYRd5Y7P8+ZsXtwr0LmCbu5VgwnqnOHLQb2IPymX2kk2CTeE18H9ro/FdU+KftS2rbg7meH6N/RpRQoh+9gvcddf4L+AVcXI7vID0s23fdToQtpDnlwAVFFuCnncdj+hh0MCRE+GodyRsY9OJg4P2QUue8w6WlBCo/9gX1hfq/fQcq0iUxVVPwrzGhuHqJAU5mKRmlUnZqMgPf3VxzmL8kAptYMfCTfmcEc/XqW8GJMQqHczv5KfxmTT3bX2QOqUf7ofmklgJmvVfiOx8h1LXXCdHoeRI8gtEdcNGDocBnWCD7xz8UCsHdDGIqWM+tXORktpGKfEIsOjJT3u X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7AHPmh4a+itSZuAu1O/vJsCwxZPtNkIAd2aZR0FY+8/3nmJgw7WmLx2phJOtlHcS0v+hz+hX2LPSIpxsxMYUy76JvYG4VQN5hPRoqcNSIcEHWY/mCaYSCCVc6ZxvFi37a+kNc318qu6HXotGrfIPyjj0k/8USkY/ByGa5Pl5BpN8EKCocbDdFNBowso4Eqxo7tieVK0+bLMnPqF7VwfPuGoIc0o5ln5/tBkE9J6xkJ+oSV5m/fzHHf97ZQNHrTES32kn20ZH5LXrIm/Gg5cfe9E50Glcewb44U6w/bBXt6fNYf1DHDN+p6CdJCbZfYsBoh25F5oCQYHc7T3DL36w3zKgutfiWvfLMh4Kb3SnUssRuBhY9UBa3G+bHtTgoGBokP9e3uX2qw+uIFG2YYgYsZkEfsjYOB8yV2bdkDBr0+8ypC09osgl56yw8qV2copYAy32bIJ2zyhBilkDekNJEn+eQlKTF4TRJz/AvphUScczAEGk/Ek5IhgrSjB3roeUtfqLfyOAl0UCTSlga12fRBDPZFy0oqgcyyMKcfglnvmrT5vFPxEFFT3JrTEChmKh/s0u66LfCtwXtqA+drsDhqabf/6ouLkPDEEwR5ikjogfKGYW5In8GkkBgki81lp1DWHVf3kaivGigga4zhGQycXTy4U+Q1T5LvdAVyOZf0EpBW7hsuX/zkwk7reRPdX8FWfHDnQ7LDeZ0QBLx+hryPug1HwuMT5OXyn3HbaG+YmqhdK7nHs3O6ZEmDPHTs675nXN3IzdQjLtf5/q61A1byCxafRRAVKDPJjQV9Mk/bHJxYwYkfy2yYQPHlDQdKkQvRfumcCeAtWS2RRNlV3QA3oZRjasZ+PBxHO4gMsi9D+PUVkdJ+Y2+HN7wwU8OO9d1prrqmWKCra6WipMUsbb3HoOb14C4lI3I77fwTfhAMtK75vCkN+Z0b7Tlq9Xl5nHz49VzQmiSQcOhqXUXWWF7A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f33c304a-618f-485a-8e00-08d9e9d4f0d5 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:23.5783 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 5/6] avcodec/thread: Don't use ThreadFrame when unnecessary 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: nOScIsQZP6Dx The majority of frame-threaded decoders (mainly the intra-only) need exactly one part of ThreadFrame: The AVFrame. They don't need the owners nor the progress, yet they had to use it because ff_thread_(get|release)_buffer() requires it. This commit changes this and makes these functions work with ordinary AVFrames; the decoders that need the extra fields for progress use ff_thread_(get|release)_ext_buffer() which work exactly as ff_thread_(get|release)_buffer() used to do. This also avoids some unnecessary allocations of progress AVBuffers, namely for H.264 and HEVC film grain frames: These frames are not used for synchronization and therefore don't need a ThreadFrame. Also move the ThreadFrame structure as well as ff_thread_ref_frame() to threadframe.h, the header for frame-threaded decoders with inter-frame dependencies. Signed-off-by: Andreas Rheinhardt --- In case anyone is wondering why ff_thread_get_ext_buffer() still checks for FF_CODEC_CAP_ALLOCATE_PROGRESS: It is due to weirdness in the WebP decoder. The WebP decoder (which has the AV_CODEC_CAP_FRAME_THREADS set, but not FF_CODEC_CAP_ALLOCATE_PROGRESS) directly uses the VP8 decoder's init, decode_frame and close function. According to the spec [1], this is only to be used with VP8 key frames, yet I don't see a check that enforces this. If the data would contain non-keyframes, it would probably (haven't tested it) lead to very broken results when using frame threading, because there is no synchronisation whatsoever between the underlying VP8 decode contexts. Always flushing the VP8 decoder after every frame should be enough to make it consistent (and error out in case there are non-keyframes). [1]: https://developers.google.com/speed/webp/docs/riff_container libavcodec/aic.c | 3 +- libavcodec/alac.c | 3 +- libavcodec/av1dec.c | 35 ++++++++-------- libavcodec/av1dec.h | 4 +- libavcodec/bitpacked_dec.c | 3 +- libavcodec/cfhd.c | 13 +++--- libavcodec/cllc.c | 7 ++-- libavcodec/cri.c | 3 +- libavcodec/dnxhddec.c | 3 +- libavcodec/dvdec.c | 22 +++++----- libavcodec/dxtory.c | 15 +++---- libavcodec/dxv.c | 11 +++-- libavcodec/dxva2_av1.c | 8 ++-- libavcodec/error_resilience.h | 2 +- libavcodec/exr.c | 3 +- libavcodec/ffv1.h | 2 +- libavcodec/ffv1dec.c | 1 + libavcodec/flacdec.c | 3 +- libavcodec/fraps.c | 3 +- libavcodec/h264_picture.c | 15 +++---- libavcodec/h264_slice.c | 4 +- libavcodec/h264dec.c | 1 + libavcodec/h264dec.h | 1 - libavcodec/hapdec.c | 14 +++---- libavcodec/hevc_refs.c | 2 +- libavcodec/hevcdec.c | 6 +-- libavcodec/hevcdec.h | 3 +- libavcodec/hqx.c | 4 +- libavcodec/huffyuvdec.c | 3 +- libavcodec/jpeg2000dec.c | 3 +- libavcodec/lagarith.c | 11 +++-- libavcodec/lcldec.c | 3 +- libavcodec/libopenjpegdec.c | 3 +- libavcodec/magicyuv.c | 3 +- libavcodec/mdec.c | 11 +++-- libavcodec/mpegpicture.h | 2 +- libavcodec/notchlc.c | 7 ++-- libavcodec/nvdec_av1.c | 6 +-- libavcodec/photocd.c | 3 +- libavcodec/pixlet.c | 9 ++-- libavcodec/proresdec2.c | 3 +- libavcodec/pthread_frame.c | 79 +++++++++++++++++++---------------- libavcodec/rv34.c | 1 + libavcodec/sheervideo.c | 3 +- libavcodec/takdec.c | 3 +- libavcodec/thread.h | 14 +------ libavcodec/threadframe.h | 12 +++++- libavcodec/tiff.c | 9 ++-- libavcodec/tta.c | 3 +- libavcodec/utils.c | 11 +++-- libavcodec/utvideodec.c | 76 ++++++++++++++++----------------- libavcodec/v210dec.c | 3 +- libavcodec/v410dec.c | 3 +- libavcodec/vaapi_av1.c | 44 +++++++++---------- libavcodec/vble.c | 3 +- libavcodec/vp8.h | 2 +- libavcodec/vp9shared.h | 2 +- libavcodec/webp.c | 3 +- libavcodec/ylc.c | 3 +- 59 files changed, 252 insertions(+), 283 deletions(-) diff --git a/libavcodec/aic.c b/libavcodec/aic.c index c95bdae1ed..552e7e9c10 100644 --- a/libavcodec/aic.c +++ b/libavcodec/aic.c @@ -391,7 +391,6 @@ static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, uint32_t off; int x, y, ret; int slice_size; - ThreadFrame frame = { .f = data }; ctx->frame = data; ctx->frame->pict_type = AV_PICTURE_TYPE_I; @@ -410,7 +409,7 @@ static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return ret; } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, ctx->frame, 0)) < 0) return ret; bytestream2_init(&gb, buf + AIC_HDR_SIZE, diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 67fc2a3e41..bac7543020 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -270,10 +270,9 @@ static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index, return AVERROR_INVALIDDATA; } if (!alac->nb_samples) { - ThreadFrame tframe = { .f = frame }; /* get output buffer */ frame->nb_samples = output_samples; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; } else if (output_samples != alac->nb_samples) { av_log(avctx, AV_LOG_ERROR, "sample count mismatch: %"PRIu32" != %d\n", diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 62d459cded..b354d8d03c 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -27,6 +27,7 @@ #include "hwconfig.h" #include "internal.h" #include "profiles.h" +#include "thread.h" /**< same with Div_Lut defined in spec 7.11.3.7 */ static const uint16_t div_lut[AV1_DIV_LUT_NUM] = { @@ -569,7 +570,7 @@ static int get_pixel_format(AVCodecContext *avctx) static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f) { - ff_thread_release_buffer(avctx, &f->tf); + ff_thread_release_buffer(avctx, f->f); av_buffer_unref(&f->hwaccel_priv_buf); f->hwaccel_picture_private = NULL; av_buffer_unref(&f->header_ref); @@ -591,10 +592,10 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s dst->raw_frame_header = src->raw_frame_header; - if (!src->tf.f->buf[0]) + if (!src->f->buf[0]) return 0; - ret = ff_thread_ref_frame(&dst->tf, &src->tf); + ret = av_frame_ref(dst->f, src->f); if (ret < 0) goto fail; @@ -637,10 +638,10 @@ static av_cold int av1_decode_free(AVCodecContext *avctx) for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++) { av1_frame_unref(avctx, &s->ref[i]); - av_frame_free(&s->ref[i].tf.f); + av_frame_free(&s->ref[i].f); } av1_frame_unref(avctx, &s->cur_frame); - av_frame_free(&s->cur_frame.tf.f); + av_frame_free(&s->cur_frame.f); av_buffer_unref(&s->seq_ref); av_buffer_unref(&s->header_ref); @@ -741,16 +742,16 @@ static av_cold int av1_decode_init(AVCodecContext *avctx) s->pix_fmt = AV_PIX_FMT_NONE; for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++) { - s->ref[i].tf.f = av_frame_alloc(); - if (!s->ref[i].tf.f) { + s->ref[i].f = av_frame_alloc(); + if (!s->ref[i].f) { av_log(avctx, AV_LOG_ERROR, "Failed to allocate reference frame buffer %d.\n", i); return AVERROR(ENOMEM); } } - s->cur_frame.tf.f = av_frame_alloc(); - if (!s->cur_frame.tf.f) { + s->cur_frame.f = av_frame_alloc(); + if (!s->cur_frame.f) { av_log(avctx, AV_LOG_ERROR, "Failed to allocate current frame buffer.\n"); return AVERROR(ENOMEM); @@ -803,10 +804,10 @@ static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f) return ret; } - if ((ret = ff_thread_get_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_get_buffer(avctx, f->f, AV_GET_BUFFER_FLAG_REF)) < 0) goto fail; - frame = f->tf.f; + frame = f->f; frame->key_frame = header->frame_type == AV1_FRAME_KEY; switch (header->frame_type) { @@ -905,7 +906,7 @@ static int set_output_frame(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt, int *got_frame) { AV1DecContext *s = avctx->priv_data; - const AVFrame *srcframe = s->cur_frame.tf.f; + const AVFrame *srcframe = s->cur_frame.f; int ret; // TODO: all layers @@ -1101,7 +1102,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, goto end; } - if (s->cur_frame.tf.f->buf[0]) { + if (s->cur_frame.f->buf[0]) { ret = set_output_frame(avctx, frame, pkt, got_frame); if (ret < 0) av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n"); @@ -1121,7 +1122,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, s->cur_frame.spatial_id = header->spatial_id; s->cur_frame.temporal_id = header->temporal_id; - if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { + if (avctx->hwaccel && s->cur_frame.f->buf[0]) { ret = avctx->hwaccel->start_frame(avctx, unit->data, unit->data_size); if (ret < 0) { @@ -1148,7 +1149,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, if (ret < 0) goto end; - if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { + if (avctx->hwaccel && s->cur_frame.f->buf[0]) { ret = avctx->hwaccel->decode_slice(avctx, raw_tile_group->tile_data.data, raw_tile_group->tile_data.data_size); @@ -1171,7 +1172,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, } if (raw_tile_group && (s->tile_num == raw_tile_group->tg_end + 1)) { - if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { + if (avctx->hwaccel && s->cur_frame.f->buf[0]) { ret = avctx->hwaccel->end_frame(avctx); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "HW accel end frame fail.\n"); @@ -1185,7 +1186,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, goto end; } - if (s->raw_frame_header->show_frame && s->cur_frame.tf.f->buf[0]) { + if (s->raw_frame_header->show_frame && s->cur_frame.f->buf[0]) { ret = set_output_frame(avctx, frame, pkt, got_frame); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Set output frame error\n"); diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index 4e140588b9..82c7084e99 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -24,14 +24,14 @@ #include #include "libavutil/buffer.h" +#include "libavutil/frame.h" #include "libavutil/pixfmt.h" #include "avcodec.h" #include "cbs.h" #include "cbs_av1.h" -#include "thread.h" typedef struct AV1Frame { - ThreadFrame tf; + AVFrame *f; AVBufferRef *hwaccel_priv_buf; void *hwaccel_picture_private; diff --git a/libavcodec/bitpacked_dec.c b/libavcodec/bitpacked_dec.c index 69fea9c366..fa554d99af 100644 --- a/libavcodec/bitpacked_dec.c +++ b/libavcodec/bitpacked_dec.c @@ -65,12 +65,11 @@ static int bitpacked_decode_yuv422p10(AVCodecContext *avctx, AVFrame *frame, { uint64_t frame_size = (uint64_t)avctx->width * (uint64_t)avctx->height * 20; uint64_t packet_size = (uint64_t)avpkt->size * 8; - ThreadFrame tframe = { .f = frame }; GetBitContext bc; uint16_t *y, *u, *v; int ret, i, j; - ret = ff_thread_get_buffer(avctx, &tframe, 0); + ret = ff_thread_get_buffer(avctx, frame, 0); if (ret < 0) return ret; diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c index ac7826250f..ff38106fac 100644 --- a/libavcodec/cfhd.c +++ b/libavcodec/cfhd.c @@ -378,8 +378,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, CFHDContext *s = avctx->priv_data; CFHDDSPContext *dsp = &s->dsp; GetByteContext gb; - ThreadFrame frame = { .f = data }; - AVFrame *pic = data; + AVFrame *const pic = data; int ret = 0, i, j, plane, got_buffer = 0; int16_t *coeff_data; @@ -681,10 +680,9 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, return AVERROR_INVALIDDATA; avctx->height = height; } - frame.f->width = - frame.f->height = 0; + pic->width = pic->height = 0; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; s->coded_width = 0; @@ -692,10 +690,9 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, s->coded_format = AV_PIX_FMT_NONE; got_buffer = 1; } else if (tag == FrameIndex && data == 1 && s->sample_type == 1 && s->frame_type == 2) { - frame.f->width = - frame.f->height = 0; + pic->width = pic->height = 0; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; s->coded_width = 0; s->coded_height = 0; diff --git a/libavcodec/cllc.c b/libavcodec/cllc.c index 41b3a4ef83..2ad5d77adc 100644 --- a/libavcodec/cllc.c +++ b/libavcodec/cllc.c @@ -360,7 +360,6 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data, { CLLCContext *ctx = avctx->priv_data; AVFrame *pic = data; - ThreadFrame frame = { .f = data }; uint8_t *src = avpkt->data; uint32_t info_tag, info_offset; int data_size; @@ -424,7 +423,7 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data, avctx->pix_fmt = AV_PIX_FMT_YUV422P; avctx->bits_per_raw_sample = 8; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; ret = decode_yuv_frame(ctx, &gb, pic); @@ -437,7 +436,7 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data, avctx->pix_fmt = AV_PIX_FMT_RGB24; avctx->bits_per_raw_sample = 8; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; ret = decode_rgb24_frame(ctx, &gb, pic); @@ -449,7 +448,7 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data, avctx->pix_fmt = AV_PIX_FMT_ARGB; avctx->bits_per_raw_sample = 8; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; ret = decode_argb_frame(ctx, &gb, pic); diff --git a/libavcodec/cri.c b/libavcodec/cri.c index dfea24d979..3b2c955dd8 100644 --- a/libavcodec/cri.c +++ b/libavcodec/cri.c @@ -174,7 +174,6 @@ static int cri_decode_frame(AVCodecContext *avctx, void *data, { CRIContext *s = avctx->priv_data; GetByteContext *gb = &s->gb; - ThreadFrame frame = { .f = data }; int ret, bps, hflip = 0, vflip = 0; AVFrameSideData *rotation; int compressed = 0; @@ -318,7 +317,7 @@ skip: if (!s->data || !s->data_size) return AVERROR_INVALIDDATA; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; avctx->bits_per_raw_sample = bps; diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 9ecd220e7f..78c7b72730 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -618,7 +618,6 @@ static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; DNXHDContext *ctx = avctx->priv_data; - ThreadFrame frame = { .f = data }; AVFrame *picture = data; int first_field = 1; int ret, i; @@ -650,7 +649,7 @@ decode_coding_unit: return ret; if (first_field) { - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0) return ret; picture->pict_type = AV_PICTURE_TYPE_I; picture->key_frame = 1; diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c index b72a67d01c..03249d6fa3 100644 --- a/libavcodec/dvdec.c +++ b/libavcodec/dvdec.c @@ -612,7 +612,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, uint8_t *buf = avpkt->data; int buf_size = avpkt->size; DVVideoContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; + AVFrame *const frame = data; const uint8_t *vsc_pack; int apt, is16_9, ret; const AVDVProfile *sys; @@ -633,9 +633,9 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, s->sys = sys; } - s->frame = frame.f; - frame.f->key_frame = 1; - frame.f->pict_type = AV_PICTURE_TYPE_I; + s->frame = frame; + frame->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; avctx->pix_fmt = s->sys->pix_fmt; avctx->framerate = av_inv_q(s->sys->time_base); @@ -652,20 +652,20 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, ff_set_sar(avctx, s->sys->sar[is16_9]); } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; /* Determine the codec's field order from the packet */ if ( *vsc_pack == dv_video_control ) { if (avctx->height == 720) { - frame.f->interlaced_frame = 0; - frame.f->top_field_first = 0; + frame->interlaced_frame = 0; + frame->top_field_first = 0; } else if (avctx->height == 1080) { - frame.f->interlaced_frame = 1; - frame.f->top_field_first = (vsc_pack[3] & 0x40) == 0x40; + frame->interlaced_frame = 1; + frame->top_field_first = (vsc_pack[3] & 0x40) == 0x40; } else { - frame.f->interlaced_frame = (vsc_pack[3] & 0x10) == 0x10; - frame.f->top_field_first = !(vsc_pack[3] & 0x40); + frame->interlaced_frame = (vsc_pack[3] & 0x10) == 0x10; + frame->top_field_first = !(vsc_pack[3] & 0x40); } } diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c index 914131e742..ff40f29b86 100644 --- a/libavcodec/dxtory.c +++ b/libavcodec/dxtory.c @@ -93,7 +93,6 @@ static int dxtory_decode_v1_rgb(AVCodecContext *avctx, AVFrame *pic, const uint8_t *src, int src_size, int id, int bpp, uint32_t vflipped) { - ThreadFrame frame = { .f = pic }; int h; uint8_t *dst; int ret; @@ -104,7 +103,7 @@ static int dxtory_decode_v1_rgb(AVCodecContext *avctx, AVFrame *pic, } avctx->pix_fmt = id; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; do_vflip(avctx, pic, vflipped); @@ -125,7 +124,6 @@ static int dxtory_decode_v1_410(AVCodecContext *avctx, AVFrame *pic, const uint8_t *src, int src_size, uint32_t vflipped) { - ThreadFrame frame = { .f = pic }; int h, w; uint8_t *Y1, *Y2, *Y3, *Y4, *U, *V; int height, width, hmargin, vmargin; @@ -138,7 +136,7 @@ static int dxtory_decode_v1_410(AVCodecContext *avctx, AVFrame *pic, } avctx->pix_fmt = AV_PIX_FMT_YUV410P; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; do_vflip(avctx, pic, vflipped); @@ -221,7 +219,6 @@ static int dxtory_decode_v1_420(AVCodecContext *avctx, AVFrame *pic, const uint8_t *src, int src_size, uint32_t vflipped) { - ThreadFrame frame = { .f = pic }; int h, w; uint8_t *Y1, *Y2, *U, *V; int height, width, hmargin, vmargin; @@ -234,7 +231,7 @@ static int dxtory_decode_v1_420(AVCodecContext *avctx, AVFrame *pic, } avctx->pix_fmt = AV_PIX_FMT_YUV420P; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; do_vflip(avctx, pic, vflipped); @@ -294,7 +291,6 @@ static int dxtory_decode_v1_444(AVCodecContext *avctx, AVFrame *pic, const uint8_t *src, int src_size, uint32_t vflipped) { - ThreadFrame frame = { .f = pic }; int h, w; uint8_t *Y, *U, *V; int ret; @@ -305,7 +301,7 @@ static int dxtory_decode_v1_444(AVCodecContext *avctx, AVFrame *pic, } avctx->pix_fmt = AV_PIX_FMT_YUV444P; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; do_vflip(avctx, pic, vflipped); @@ -430,7 +426,6 @@ static int dxtory_decode_v2(AVCodecContext *avctx, AVFrame *pic, enum AVPixelFormat fmt, uint32_t vflipped) { - ThreadFrame frame = { .f = pic }; GetByteContext gb, gb_check; GetBitContext gb2; int nslices, slice, line = 0; @@ -457,7 +452,7 @@ static int dxtory_decode_v2(AVCodecContext *avctx, AVFrame *pic, return AVERROR_INVALIDDATA; avctx->pix_fmt = fmt; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; do_vflip(avctx, pic, vflipped); diff --git a/libavcodec/dxv.c b/libavcodec/dxv.c index 5f17347913..e2c0cde85e 100644 --- a/libavcodec/dxv.c +++ b/libavcodec/dxv.c @@ -1042,7 +1042,7 @@ static int dxv_decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { DXVContext *ctx = avctx->priv_data; - ThreadFrame tframe; + AVFrame *const frame = data; GetByteContext *gbc = &ctx->gbc; int (*decompress_tex)(AVCodecContext *avctx); const char *msgcomp, *msgtext; @@ -1211,18 +1211,17 @@ static int dxv_decode(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - tframe.f = data; - ret = ff_thread_get_buffer(avctx, &tframe, 0); + ret = ff_thread_get_buffer(avctx, frame, 0); if (ret < 0) return ret; /* Now decompress the texture with the standard functions. */ avctx->execute2(avctx, decompress_texture_thread, - tframe.f, NULL, ctx->slice_count); + frame, NULL, ctx->slice_count); /* Frame is ready to be output. */ - tframe.f->pict_type = AV_PICTURE_TYPE_I; - tframe.f->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; + frame->key_frame = 1; *got_frame = 1; return avpkt->size; diff --git a/libavcodec/dxva2_av1.c b/libavcodec/dxva2_av1.c index 8a912bf6c1..7b4483f855 100644 --- a/libavcodec/dxva2_av1.c +++ b/libavcodec/dxva2_av1.c @@ -72,7 +72,7 @@ static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *c pp->max_width = seq->max_frame_width_minus_1 + 1; pp->max_height = seq->max_frame_height_minus_1 + 1; - pp->CurrPicTextureIndex = ff_dxva2_get_surface_index(avctx, ctx, h->cur_frame.tf.f); + pp->CurrPicTextureIndex = ff_dxva2_get_surface_index(avctx, ctx, h->cur_frame.f); pp->superres_denom = frame_header->use_superres ? frame_header->coded_denom + AV1_SUPERRES_DENOM_MIN : AV1_SUPERRES_NUM; pp->bitdepth = get_bit_depth_from_seq(seq); pp->seq_profile = seq->seq_profile; @@ -132,7 +132,7 @@ static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *c memset(pp->RefFrameMapTextureIndex, 0xFF, sizeof(pp->RefFrameMapTextureIndex)); for (i = 0; i < AV1_REFS_PER_FRAME; i++) { int8_t ref_idx = frame_header->ref_frame_idx[i]; - AVFrame *ref_frame = h->ref[ref_idx].tf.f; + AVFrame *ref_frame = h->ref[ref_idx].f; pp->frame_refs[i].width = ref_frame->width; pp->frame_refs[i].height = ref_frame->height; @@ -146,7 +146,7 @@ static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *c } } for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { - AVFrame *ref_frame = h->ref[i].tf.f; + AVFrame *ref_frame = h->ref[i].f; if (ref_frame->buf[0]) pp->RefFrameMapTextureIndex[i] = ff_dxva2_get_surface_index(avctx, ctx, ref_frame); } @@ -436,7 +436,7 @@ static int dxva2_av1_end_frame(AVCodecContext *avctx) if (ctx_pic->bitstream_size <= 0) return -1; - ret = ff_dxva2_common_end_frame(avctx, h->cur_frame.tf.f, + ret = ff_dxva2_common_end_frame(avctx, h->cur_frame.f, &ctx_pic->pp, sizeof(ctx_pic->pp), NULL, 0, commit_bitstream_and_slice_buffer); diff --git a/libavcodec/error_resilience.h b/libavcodec/error_resilience.h index 664a765659..bb770ff674 100644 --- a/libavcodec/error_resilience.h +++ b/libavcodec/error_resilience.h @@ -24,7 +24,7 @@ #include "avcodec.h" #include "me_cmp.h" -#include "thread.h" +#include "threadframe.h" ///< current MB is the first after a resync marker #define VP_START 1 diff --git a/libavcodec/exr.c b/libavcodec/exr.c index 0d5b3467d1..8b04fab951 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -2027,7 +2027,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, { EXRContext *s = avctx->priv_data; GetByteContext *gb = &s->gb; - ThreadFrame frame = { .f = data }; AVFrame *picture = data; uint8_t *ptr; @@ -2149,7 +2148,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, s->scan_lines_per_block; } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0) return ret; if (bytestream2_get_bytes_left(gb)/8 < nb_blocks) diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index 8ffe5ab433..b1585dbd03 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -38,7 +38,7 @@ #include "mathops.h" #include "put_bits.h" #include "rangecoder.h" -#include "thread.h" +#include "threadframe.h" #ifdef __INTEL_COMPILER #undef av_flatten diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 45ecf3152e..201630167d 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -37,6 +37,7 @@ #include "golomb.h" #include "mathops.h" #include "ffv1.h" +#include "thread.h" #include "threadframe.h" static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index 09051cc663..f224fa7621 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -559,7 +559,6 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { AVFrame *frame = data; - ThreadFrame tframe = { .f = data }; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; FLACContext *s = avctx->priv_data; @@ -618,7 +617,7 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data, /* get output buffer */ frame->nb_samples = s->blocksize; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded, diff --git a/libavcodec/fraps.c b/libavcodec/fraps.c index b3262a4b23..18e85eed41 100644 --- a/libavcodec/fraps.c +++ b/libavcodec/fraps.c @@ -140,7 +140,6 @@ static int decode_frame(AVCodecContext *avctx, FrapsContext * const s = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - ThreadFrame frame = { .f = data }; AVFrame * const f = data; uint32_t header; unsigned int version,header_size; @@ -227,7 +226,7 @@ static int decode_frame(AVCodecContext *avctx, : AVCOL_RANGE_JPEG; avctx->colorspace = version & 1 ? AVCOL_SPC_UNSPECIFIED : AVCOL_SPC_BT709; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, f, 0)) < 0) return ret; switch (version) { diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index c7f5b64b99..2661ff4698 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -30,18 +30,19 @@ #include "avcodec.h" #include "h264dec.h" #include "mpegutils.h" +#include "thread.h" #include "threadframe.h" void ff_h264_unref_picture(H264Context *h, H264Picture *pic) { - int off = offsetof(H264Picture, tf_grain) + sizeof(pic->tf_grain); + int off = offsetof(H264Picture, f_grain) + sizeof(pic->f_grain); int i; if (!pic->f || !pic->f->buf[0]) return; ff_thread_release_ext_buffer(h->avctx, &pic->tf); - ff_thread_release_buffer(h->avctx, &pic->tf_grain); + ff_thread_release_buffer(h->avctx, pic->f_grain); av_buffer_unref(&pic->hwaccel_priv_buf); av_buffer_unref(&pic->qscale_table_buf); @@ -102,9 +103,7 @@ int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src) goto fail; if (src->needs_fg) { - av_assert0(src->tf_grain.f == src->f_grain); - dst->tf_grain.f = dst->f_grain; - ret = ff_thread_ref_frame(&dst->tf_grain, &src->tf_grain); + ret = av_frame_ref(dst->f_grain, src->f_grain); if (ret < 0) goto fail; } @@ -161,10 +160,8 @@ int ff_h264_replace_picture(H264Context *h, H264Picture *dst, const H264Picture goto fail; if (src->needs_fg) { - av_assert0(src->tf_grain.f == src->f_grain); - dst->tf_grain.f = dst->f_grain; - ff_thread_release_buffer(h->avctx, &dst->tf_grain); - ret = ff_thread_ref_frame(&dst->tf_grain, &src->tf_grain); + ff_thread_release_buffer(h->avctx, dst->f_grain); + ret = av_frame_ref(dst->f_grain, src->f_grain); if (ret < 0) goto fail; } diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 32d2e090d5..110a41772a 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -45,6 +45,7 @@ #include "mathops.h" #include "mpegutils.h" #include "rectangle.h" +#include "thread.h" #include "threadframe.h" static const uint8_t field_scan[16+1] = { @@ -197,11 +198,10 @@ static int alloc_picture(H264Context *h, H264Picture *pic) goto fail; if (pic->needs_fg) { - pic->tf_grain.f = pic->f_grain; pic->f_grain->format = pic->f->format; pic->f_grain->width = pic->f->width; pic->f_grain->height = pic->f->height; - ret = ff_thread_get_buffer(h->avctx, &pic->tf_grain, 0); + ret = ff_thread_get_buffer(h->avctx, pic->f_grain, 0); if (ret < 0) goto fail; } diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 1d648f04b7..856fbca680 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -46,6 +46,7 @@ #include "mpegutils.h" #include "profiles.h" #include "rectangle.h" +#include "thread.h" #include "threadframe.h" const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 }; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index 8168c8e97b..f18adda2d1 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -109,7 +109,6 @@ typedef struct H264Picture { ThreadFrame tf; AVFrame *f_grain; - ThreadFrame tf_grain; AVBufferRef *qscale_table_buf; int8_t *qscale_table; diff --git a/libavcodec/hapdec.c b/libavcodec/hapdec.c index 45c44ad78d..9f8dadc43d 100644 --- a/libavcodec/hapdec.c +++ b/libavcodec/hapdec.c @@ -305,7 +305,7 @@ static int hap_decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { HapContext *ctx = avctx->priv_data; - ThreadFrame tframe; + AVFrame *const frame = data; int ret, i, t; int section_size; enum HapSectionType section_type; @@ -330,8 +330,7 @@ static int hap_decode(AVCodecContext *avctx, void *data, } /* Get the output frame ready to receive data */ - tframe.f = data; - ret = ff_thread_get_buffer(avctx, &tframe, 0); + ret = ff_thread_get_buffer(avctx, frame, 0); if (ret < 0) return ret; @@ -383,16 +382,15 @@ static int hap_decode(AVCodecContext *avctx, void *data, /* Use the decompress function on the texture, one block per thread */ if (t == 0){ - avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count); + avctx->execute2(avctx, decompress_texture_thread, frame, NULL, ctx->slice_count); } else{ - tframe.f = data; - avctx->execute2(avctx, decompress_texture2_thread, tframe.f, NULL, ctx->slice_count); + avctx->execute2(avctx, decompress_texture2_thread, frame, NULL, ctx->slice_count); } } /* Frame is ready to be output */ - tframe.f->pict_type = AV_PICTURE_TYPE_I; - tframe.f->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; + frame->key_frame = 1; *got_frame = 1; return avpkt->size; diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index 0dd456bb92..1eb5daf157 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -39,7 +39,7 @@ void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags) frame->flags &= ~flags; if (!frame->flags) { ff_thread_release_ext_buffer(s->avctx, &frame->tf); - ff_thread_release_buffer(s->avctx, &frame->tf_grain); + ff_thread_release_buffer(s->avctx, frame->frame_grain); frame->needs_fg = 0; av_buffer_unref(&frame->tab_mvf_buf); diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 6d86a5bfdb..fdff450a5e 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -45,6 +45,7 @@ #include "hevcdec.h" #include "hwconfig.h" #include "profiles.h" +#include "thread.h" #include "threadframe.h" const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; @@ -3026,7 +3027,7 @@ static int hevc_frame_start(HEVCContext *s) s->ref->frame_grain->format = s->ref->frame->format; s->ref->frame_grain->width = s->ref->frame->width; s->ref->frame_grain->height = s->ref->frame->height; - if ((ret = ff_thread_get_buffer(s->avctx, &s->ref->tf_grain, 0)) < 0) + if ((ret = ff_thread_get_buffer(s->avctx, s->ref->frame_grain, 0)) < 0) goto fail; } @@ -3533,7 +3534,7 @@ static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src) return ret; if (src->needs_fg) { - ret = ff_thread_ref_frame(&dst->tf_grain, &src->tf_grain); + ret = av_frame_ref(dst->frame_grain, src->frame_grain); if (ret < 0) return ret; dst->needs_fg = 1; @@ -3652,7 +3653,6 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) s->DPB[i].frame_grain = av_frame_alloc(); if (!s->DPB[i].frame_grain) goto fail; - s->DPB[i].tf_grain.f = s->DPB[i].frame_grain; } s->max_ra = INT_MAX; diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index 157bc6926f..bf390664d4 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -42,7 +42,7 @@ #include "hevcdsp.h" #include "h274.h" #include "internal.h" -#include "thread.h" +#include "threadframe.h" #include "videodsp.h" #define SHIFT_CTB_WPP 2 @@ -396,7 +396,6 @@ typedef struct HEVCFrame { AVFrame *frame; AVFrame *frame_grain; ThreadFrame tf; - ThreadFrame tf_grain; int needs_fg; /* 1 if grain needs to be applied by the decoder */ MvField *tab_mvf; RefPicList *refPicList; diff --git a/libavcodec/hqx.c b/libavcodec/hqx.c index 3a4db1b6c3..09310b69e8 100644 --- a/libavcodec/hqx.c +++ b/libavcodec/hqx.c @@ -404,7 +404,7 @@ static int hqx_decode_frame(AVCodecContext *avctx, void *data, int *got_picture_ptr, AVPacket *avpkt) { HQXContext *ctx = avctx->priv_data; - ThreadFrame frame = { .f = data }; + AVFrame *const frame = data; uint8_t *src = avpkt->data; uint32_t info_tag; int data_start; @@ -499,7 +499,7 @@ static int hqx_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - ret = ff_thread_get_buffer(avctx, &frame, 0); + ret = ff_thread_get_buffer(avctx, frame, 0); if (ret < 0) return ret; diff --git a/libavcodec/huffyuvdec.c b/libavcodec/huffyuvdec.c index 0abf73b21b..a5e0ef5818 100644 --- a/libavcodec/huffyuvdec.c +++ b/libavcodec/huffyuvdec.c @@ -1185,7 +1185,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, HYuvContext *s = avctx->priv_data; const int width = s->width; const int height = s->height; - ThreadFrame frame = { .f = data }; AVFrame *const p = data; int slice, table_size = 0, ret, nb_slices; unsigned slices_info_offset; @@ -1203,7 +1202,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer, (const uint32_t *) buf, buf_size / 4); - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; if (s->context) { diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index a7eb809f30..d96ec3a275 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -2476,7 +2476,6 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { Jpeg2000DecoderContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; AVFrame *picture = data; int ret; @@ -2517,7 +2516,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data, goto end; /* get picture buffer */ - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0) goto end; picture->pict_type = AV_PICTURE_TYPE_I; picture->key_frame = 1; diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index 7220648bc4..b8f330cf34 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -540,7 +540,6 @@ static int lag_decode_frame(AVCodecContext *avctx, const uint8_t *buf = avpkt->data; unsigned int buf_size = avpkt->size; LagarithContext *l = avctx->priv_data; - ThreadFrame frame = { .f = data }; AVFrame *const p = data; uint8_t frametype; uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9; @@ -569,7 +568,7 @@ static int lag_decode_frame(AVCodecContext *avctx, planes = 4; } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; if (frametype == FRAME_SOLID_RGBA) { @@ -593,7 +592,7 @@ static int lag_decode_frame(AVCodecContext *avctx, avctx->pix_fmt = AV_PIX_FMT_GBRAP; } - if ((ret = ff_thread_get_buffer(avctx, &frame,0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p,0)) < 0) return ret; for (i = 0; i < avctx->height; i++) { @@ -614,7 +613,7 @@ static int lag_decode_frame(AVCodecContext *avctx, if (frametype == FRAME_ARITH_RGB24 || frametype == FRAME_U_RGB24) avctx->pix_fmt = AV_PIX_FMT_GBRP; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; offs[0] = offset_bv; @@ -650,7 +649,7 @@ static int lag_decode_frame(AVCodecContext *avctx, case FRAME_ARITH_YUY2: avctx->pix_fmt = AV_PIX_FMT_YUV422P; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; if (offset_ry >= buf_size || @@ -678,7 +677,7 @@ static int lag_decode_frame(AVCodecContext *avctx, case FRAME_ARITH_YV12: avctx->pix_fmt = AV_PIX_FMT_YUV420P; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; if (offset_ry >= buf_size || diff --git a/libavcodec/lcldec.c b/libavcodec/lcldec.c index a47e3bd780..f3b7a8ac1b 100644 --- a/libavcodec/lcldec.c +++ b/libavcodec/lcldec.c @@ -158,7 +158,6 @@ static int zlib_decomp(AVCodecContext *avctx, const uint8_t *src, int src_len, i static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { AVFrame *frame = data; - ThreadFrame tframe = { .f = data }; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; LclDecContext * const c = avctx->priv_data; @@ -175,7 +174,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac unsigned int len = buf_size; int linesize, offset; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; outptr = frame->data[0]; // Output image pointer diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index 8982d21be4..c9496d886e 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -324,7 +324,6 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, uint8_t *buf = avpkt->data; int buf_size = avpkt->size; LibOpenJPEGContext *ctx = avctx->priv_data; - ThreadFrame frame = { .f = data }; AVFrame *picture = data; const AVPixFmtDescriptor *desc; int width, height, ret; @@ -417,7 +416,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, if (image->comps[i].prec > avctx->bits_per_raw_sample) avctx->bits_per_raw_sample = image->comps[i].prec; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0) goto done; ret = !opj_decode(dec, stream, image); diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c index 594196063b..46515780fc 100644 --- a/libavcodec/magicyuv.c +++ b/libavcodec/magicyuv.c @@ -431,7 +431,6 @@ static int magy_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { MagicYUVContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; AVFrame *p = data; GetByteContext gb; uint32_t first_offset, offset, next_offset, header_size, slice_width; @@ -641,7 +640,7 @@ static int magy_decode_frame(AVCodecContext *avctx, void *data, p->pict_type = AV_PICTURE_TYPE_I; p->key_frame = 1; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; s->buf = avpkt->data; diff --git a/libavcodec/mdec.c b/libavcodec/mdec.c index 007e7fada8..9f61256bc4 100644 --- a/libavcodec/mdec.c +++ b/libavcodec/mdec.c @@ -42,7 +42,6 @@ typedef struct MDECContext { BlockDSPContext bdsp; BswapDSPContext bbdsp; IDCTDSPContext idsp; - ThreadFrame frame; GetBitContext gb; ScanTable scantable; int version; @@ -174,13 +173,13 @@ static int decode_frame(AVCodecContext *avctx, MDECContext * const a = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - ThreadFrame frame = { .f = data }; + AVFrame *const frame = data; int ret; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; - frame.f->pict_type = AV_PICTURE_TYPE_I; - frame.f->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; + frame->key_frame = 1; av_fast_padded_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size); if (!a->bitstream_buffer) @@ -202,7 +201,7 @@ static int decode_frame(AVCodecContext *avctx, if ((ret = decode_mb(a, a->block)) < 0) return ret; - idct_put(a, frame.f, a->mb_x, a->mb_y); + idct_put(a, frame, a->mb_x, a->mb_y); } } diff --git a/libavcodec/mpegpicture.h b/libavcodec/mpegpicture.h index e1e9f8d7e0..c79693caba 100644 --- a/libavcodec/mpegpicture.h +++ b/libavcodec/mpegpicture.h @@ -27,7 +27,7 @@ #include "avcodec.h" #include "motion_est.h" -#include "thread.h" +#include "threadframe.h" #define MPEGVIDEO_MAX_PLANES 4 #define MAX_PICTURE_COUNT 36 diff --git a/libavcodec/notchlc.c b/libavcodec/notchlc.c index be28161995..9dd3bf95a0 100644 --- a/libavcodec/notchlc.c +++ b/libavcodec/notchlc.c @@ -146,7 +146,7 @@ static int lz4_decompress(AVCodecContext *avctx, return bytestream2_tell_p(pb); } -static int decode_blocks(AVCodecContext *avctx, AVFrame *p, ThreadFrame *frame, +static int decode_blocks(AVCodecContext *avctx, AVFrame *p, unsigned uncompressed_size) { NotchLCContext *s = avctx->priv_data; @@ -221,7 +221,7 @@ static int decode_blocks(AVCodecContext *avctx, AVFrame *p, ThreadFrame *frame, return AVERROR_INVALIDDATA; s->uv_count_offset = s->y_data_offset - s->a_data_offset; - if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; rgb = *gb; @@ -464,7 +464,6 @@ static int decode_frame(AVCodecContext *avctx, AVPacket *avpkt) { NotchLCContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; GetByteContext *gb = &s->gb; PutByteContext *pb = &s->pb; unsigned uncompressed_size; @@ -513,7 +512,7 @@ static int decode_frame(AVCodecContext *avctx, bytestream2_init(gb, s->uncompressed_buffer, uncompressed_size); } - ret = decode_blocks(avctx, p, &frame, uncompressed_size); + ret = decode_blocks(avctx, p, uncompressed_size); if (ret < 0) return ret; diff --git a/libavcodec/nvdec_av1.c b/libavcodec/nvdec_av1.c index 1ce846a60d..3bbcd76123 100644 --- a/libavcodec/nvdec_av1.c +++ b/libavcodec/nvdec_av1.c @@ -49,7 +49,7 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u CUVIDAV1PICPARAMS *ppc = &pp->CodecSpecific.av1; FrameDecodeData *fdd; NVDECFrame *cf; - AVFrame *cur_frame = s->cur_frame.tf.f; + AVFrame *cur_frame = s->cur_frame.f; unsigned char remap_lr_type[4] = { AV1_RESTORE_NONE, AV1_RESTORE_SWITCHABLE, AV1_RESTORE_WIENER, AV1_RESTORE_SGRPROJ }; @@ -233,7 +233,7 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u ppc->loop_filter_ref_deltas[i] = frame_header->loop_filter_ref_deltas[i]; /* Reference Frames */ - ppc->ref_frame_map[i] = ff_nvdec_get_ref_idx(s->ref[i].tf.f); + ppc->ref_frame_map[i] = ff_nvdec_get_ref_idx(s->ref[i].f); } if (frame_header->primary_ref_frame == AV1_PRIMARY_REF_NONE) { @@ -246,7 +246,7 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u for (i = 0; i < AV1_REFS_PER_FRAME; ++i) { /* Ref Frame List */ int8_t ref_idx = frame_header->ref_frame_idx[i]; - AVFrame *ref_frame = s->ref[ref_idx].tf.f; + AVFrame *ref_frame = s->ref[ref_idx].f; ppc->ref_frame[i].index = ppc->ref_frame_map[ref_idx]; ppc->ref_frame[i].width = ref_frame->width; diff --git a/libavcodec/photocd.c b/libavcodec/photocd.c index 50b465c1cd..23a8994ca3 100644 --- a/libavcodec/photocd.c +++ b/libavcodec/photocd.c @@ -293,7 +293,6 @@ static int photocd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { PhotoCDContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; const uint8_t *buf = avpkt->data; GetByteContext *gb = &s->gb; AVFrame *p = data; @@ -326,7 +325,7 @@ static int photocd_decode_frame(AVCodecContext *avctx, void *data, if (ret < 0) return ret; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; p->pict_type = AV_PICTURE_TYPE_I; diff --git a/libavcodec/pixlet.c b/libavcodec/pixlet.c index 5361bc42bf..a07690c6d0 100644 --- a/libavcodec/pixlet.c +++ b/libavcodec/pixlet.c @@ -606,7 +606,6 @@ static int pixlet_decode_frame(AVCodecContext *avctx, void *data, PixletContext *ctx = avctx->priv_data; int i, w, h, width, height, ret, version; AVFrame *p = data; - ThreadFrame frame = { .f = data }; uint32_t pktsize, depth; bytestream2_init(&ctx->gb, avpkt->data, avpkt->size); @@ -673,20 +672,20 @@ static int pixlet_decode_frame(AVCodecContext *avctx, void *data, p->key_frame = 1; p->color_range = AVCOL_RANGE_JPEG; - ret = ff_thread_get_buffer(avctx, &frame, 0); + ret = ff_thread_get_buffer(avctx, p, 0); if (ret < 0) return ret; for (i = 0; i < 3; i++) { - ret = decode_plane(avctx, i, avpkt, frame.f); + ret = decode_plane(avctx, i, avpkt, p); if (ret < 0) return ret; if (avctx->flags & AV_CODEC_FLAG_GRAY) break; } - postprocess_luma(avctx, frame.f, ctx->w, ctx->h, ctx->depth); - postprocess_chroma(frame.f, ctx->w >> 1, ctx->h >> 1, ctx->depth); + postprocess_luma(avctx, p, ctx->w, ctx->h, ctx->depth); + postprocess_chroma(p, ctx->w >> 1, ctx->h >> 1, ctx->depth); *got_frame = 1; diff --git a/libavcodec/proresdec2.c b/libavcodec/proresdec2.c index d2d881a3dd..3ab6666f74 100644 --- a/libavcodec/proresdec2.c +++ b/libavcodec/proresdec2.c @@ -779,7 +779,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { ProresContext *ctx = avctx->priv_data; - ThreadFrame tframe = { .f = data }; AVFrame *frame = data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; @@ -805,7 +804,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, buf += frame_hdr_size; buf_size -= frame_hdr_size; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; ff_thread_finish_setup(avctx); diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index f405622ca1..75b70a17ec 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -948,15 +948,13 @@ FF_ENABLE_DEPRECATION_WARNINGS return 1; } -static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int flags) +static int thread_get_buffer_internal(AVCodecContext *avctx, AVFrame *f, int flags) { PerThreadContext *p; int err; - f->owner[0] = f->owner[1] = avctx; - if (!(avctx->active_thread_type & FF_THREAD_FRAME)) - return ff_get_buffer(avctx, f->f, flags); + return ff_get_buffer(avctx, f, flags); p = avctx->internal->thread_ctx; FF_DISABLE_DEPRECATION_WARNINGS @@ -971,28 +969,16 @@ FF_ENABLE_DEPRECATION_WARNINGS return -1; } - if (avctx->codec->caps_internal & FF_CODEC_CAP_ALLOCATE_PROGRESS) { - atomic_int *progress; - f->progress = av_buffer_alloc(2 * sizeof(*progress)); - if (!f->progress) { - return AVERROR(ENOMEM); - } - progress = (atomic_int*)f->progress->data; - - atomic_init(&progress[0], -1); - atomic_init(&progress[1], -1); - } - pthread_mutex_lock(&p->parent->buffer_mutex); #if !FF_API_THREAD_SAFE_CALLBACKS err = ff_get_buffer(avctx, f->f, flags); #else FF_DISABLE_DEPRECATION_WARNINGS if (THREAD_SAFE_CALLBACKS(avctx)) { - err = ff_get_buffer(avctx, f->f, flags); + err = ff_get_buffer(avctx, f, flags); } else { pthread_mutex_lock(&p->progress_mutex); - p->requested_frame = f->f; + p->requested_frame = f; p->requested_flags = flags; atomic_store_explicit(&p->state, STATE_GET_BUFFER, memory_order_release); pthread_cond_broadcast(&p->progress_cond); @@ -1009,8 +995,6 @@ FF_DISABLE_DEPRECATION_WARNINGS ff_thread_finish_setup(avctx); FF_ENABLE_DEPRECATION_WARNINGS #endif - if (err) - av_buffer_unref(&f->progress); pthread_mutex_unlock(&p->parent->buffer_mutex); @@ -1049,7 +1033,7 @@ enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixe FF_ENABLE_DEPRECATION_WARNINGS #endif -int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags) { int ret = thread_get_buffer_internal(avctx, f, flags); if (ret < 0) @@ -1059,10 +1043,36 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) { - return ff_thread_get_buffer(avctx, f, flags); + int ret; + + f->owner[0] = f->owner[1] = avctx; + /* Hint: It is possible for this function to be called with codecs + * that don't support frame threading at all, namely in case + * a frame-threaded decoder shares code with codecs that are not. + * This currently affects non-MPEG-4 mpegvideo codecs and and VP7. + * The following check will always be true for them. */ + if (!(avctx->active_thread_type & FF_THREAD_FRAME)) + return ff_get_buffer(avctx, f->f, flags); + + if (avctx->codec->caps_internal & FF_CODEC_CAP_ALLOCATE_PROGRESS) { + atomic_int *progress; + f->progress = av_buffer_alloc(2 * sizeof(*progress)); + if (!f->progress) { + return AVERROR(ENOMEM); + } + progress = (atomic_int*)f->progress->data; + + atomic_init(&progress[0], -1); + atomic_init(&progress[1], -1); + } + + ret = ff_thread_get_buffer(avctx, f->f, flags); + if (ret) + av_buffer_unref(&f->progress); + return ret; } -void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) +void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f) { #if FF_API_THREAD_SAFE_CALLBACKS FF_DISABLE_DEPRECATION_WARNINGS @@ -1075,21 +1085,18 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif - if (!f->f) + if (!f) return; if (avctx->debug & FF_DEBUG_BUFFERS) av_log(avctx, AV_LOG_DEBUG, "thread_release_buffer called on pic %p\n", f); - av_buffer_unref(&f->progress); - f->owner[0] = f->owner[1] = NULL; - #if !FF_API_THREAD_SAFE_CALLBACKS av_frame_unref(f->f); #else // when the frame buffers are not allocated, just reset it to clean state - if (can_direct_free || !f->f->buf[0]) { - av_frame_unref(f->f); + if (can_direct_free || !f->buf[0]) { + av_frame_unref(f); return; } @@ -1113,7 +1120,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } dst = p->released_buffers[p->num_released_buffers]; - av_frame_move_ref(dst, f->f); + av_frame_move_ref(dst, f); p->num_released_buffers++; @@ -1124,15 +1131,17 @@ fail: // this leaks, but it is better than crashing if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Could not queue a frame for freeing, this will leak\n"); - memset(f->f->buf, 0, sizeof(f->f->buf)); - if (f->f->extended_buf) - memset(f->f->extended_buf, 0, f->f->nb_extended_buf * sizeof(*f->f->extended_buf)); - av_frame_unref(f->f); + memset(f->buf, 0, sizeof(f->buf)); + if (f->extended_buf) + memset(f->extended_buf, 0, f->nb_extended_buf * sizeof(*f->extended_buf)); + av_frame_unref(f); } #endif } void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) { - ff_thread_release_buffer(avctx, f); + av_buffer_unref(&f->progress); + f->owner[0] = f->owner[1] = NULL; + ff_thread_release_buffer(avctx, f->f); } diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index febd41f577..1a0ca6b520 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -41,6 +41,7 @@ #include "mpeg_er.h" #include "qpeldsp.h" #include "rectangle.h" +#include "thread.h" #include "threadframe.h" #include "rv34vlc.h" diff --git a/libavcodec/sheervideo.c b/libavcodec/sheervideo.c index fb5a39303e..8505d124c4 100644 --- a/libavcodec/sheervideo.c +++ b/libavcodec/sheervideo.c @@ -1810,7 +1810,6 @@ static int decode_frame(AVCodecContext *avctx, AVPacket *avpkt) { SheerVideoContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; const SheerTable *table; AVFrame *p = data; GetBitContext gb; @@ -1982,7 +1981,7 @@ static int decode_frame(AVCodecContext *avctx, p->pict_type = AV_PICTURE_TYPE_I; p->key_frame = 1; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0) diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c index 926dbf611e..19a3d75d2b 100644 --- a/libavcodec/takdec.c +++ b/libavcodec/takdec.c @@ -679,7 +679,6 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, { TAKDecContext *s = avctx->priv_data; AVFrame *frame = data; - ThreadFrame tframe = { .f = data }; GetBitContext *gb = &s->gb; int chan, i, ret, hsize; @@ -742,7 +741,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, : s->ti.frame_samples; frame->nb_samples = s->nb_samples; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; ff_thread_finish_setup(avctx); diff --git a/libavcodec/thread.h b/libavcodec/thread.h index 091dc8a35e..716301b29f 100644 --- a/libavcodec/thread.h +++ b/libavcodec/thread.h @@ -31,14 +31,6 @@ #include "avcodec.h" -typedef struct ThreadFrame { - AVFrame *f; - AVCodecContext *owner[2]; - // progress->data is an array of 2 ints holding progress for top/bottom - // fields - AVBufferRef *progress; -} ThreadFrame; - /** * Wait for decoding threads to finish and reset internal state. * Called by avcodec_flush_buffers(). @@ -92,7 +84,7 @@ enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixe * @param avctx The current context. * @param f The frame to write into. */ -int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); +int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags); /** * Wrapper around release_buffer() frame-for multithreaded codecs. @@ -105,9 +97,7 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); * @param avctx The current context. * @param f The picture being released. */ -void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f); - -int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src); +void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f); int ff_thread_init(AVCodecContext *s); int ff_slice_thread_execute_with_mainfunc(AVCodecContext *avctx, diff --git a/libavcodec/threadframe.h b/libavcodec/threadframe.h index be63e62435..dea4dadc6d 100644 --- a/libavcodec/threadframe.h +++ b/libavcodec/threadframe.h @@ -21,8 +21,16 @@ #ifndef AVCODEC_THREADFRAME_H #define AVCODEC_THREADFRAME_H +#include "libavutil/frame.h" #include "avcodec.h" -#include "thread.h" + +typedef struct ThreadFrame { + AVFrame *f; + AVCodecContext *owner[2]; + // progress->data is an array of 2 ints holding progress for top/bottom + // fields + AVBufferRef *progress; +} ThreadFrame; /** * Notify later decoding threads when part of their reference picture is ready. @@ -74,4 +82,6 @@ int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); */ void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f); +int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src); + #endif diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index fd85d104dc..923f85d07f 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -1016,7 +1016,7 @@ static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame, return avpkt->size; } -static int init_image(TiffContext *s, ThreadFrame *frame) +static int init_image(TiffContext *s, AVFrame *frame) { int ret; int create_gray_palette = 0; @@ -1177,11 +1177,11 @@ static int init_image(TiffContext *s, ThreadFrame *frame) return ret; if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) { if (!create_gray_palette) - memcpy(frame->f->data[1], s->palette, sizeof(s->palette)); + memcpy(frame->data[1], s->palette, sizeof(s->palette)); else { /* make default grayscale pal */ int i; - uint32_t *pal = (uint32_t *)frame->f->data[1]; + uint32_t *pal = (uint32_t *)frame->data[1]; for (i = 0; i < 1<bpp; i++) pal[i] = 0xFFU << 24 | i * 255 / ((1<bpp) - 1) * 0x010101; } @@ -1743,7 +1743,6 @@ static int decode_frame(AVCodecContext *avctx, { TiffContext *const s = avctx->priv_data; AVFrame *const p = data; - ThreadFrame frame = { .f = data }; unsigned off, last_off; int le, ret, plane, planes; int i, j, entries, stride; @@ -1894,7 +1893,7 @@ again: } /* now we have the data and may start decoding */ - if ((ret = init_image(s, &frame)) < 0) + if ((ret = init_image(s, p)) < 0) return ret; if (!s->is_tiled || has_strip_bits) { diff --git a/libavcodec/tta.c b/libavcodec/tta.c index 17b4ca9032..7ffae3d0ba 100644 --- a/libavcodec/tta.c +++ b/libavcodec/tta.c @@ -222,7 +222,6 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { AVFrame *frame = data; - ThreadFrame tframe = { .f = data }; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; TTAContext *s = avctx->priv_data; @@ -242,7 +241,7 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, /* get output buffer */ frame->nb_samples = framelen; - if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; // decode directly to output buffer for 24-bit sample format diff --git a/libavcodec/utils.c b/libavcodec/utils.c index bc16424f91..2561854c47 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -893,10 +893,9 @@ enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixe return ff_get_format(avctx, fmt); } -int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags) { - f->owner[0] = f->owner[1] = avctx; - return ff_get_buffer(avctx, f->f, flags); + return ff_get_buffer(avctx, f, flags); } int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) @@ -905,10 +904,10 @@ int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) return ff_get_buffer(avctx, f->f, flags); } -void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) +void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f) { - if (f->f) - av_frame_unref(f->f); + if (f) + av_frame_unref(f); } void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index b39d8a7948..a824112415 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -563,14 +563,14 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; UtvideoContext *c = avctx->priv_data; + AVFrame *const frame = data; int i, j; const uint8_t *plane_start[5]; int plane_size, max_slice_size = 0, slice_start, slice_end, slice_size; int ret; GetByteContext gb; - ThreadFrame frame = { .f = data }; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) return ret; /* parse plane structure to get frame flags and validate slice offsets */ @@ -709,80 +709,80 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, case AV_PIX_FMT_GBRP: case AV_PIX_FMT_GBRAP: for (i = 0; i < c->planes; i++) { - ret = decode_plane(c, i, frame.f->data[i], - frame.f->linesize[i], avctx->width, + ret = decode_plane(c, i, frame->data[i], + frame->linesize[i], avctx->width, avctx->height, plane_start[i], c->frame_pred == PRED_LEFT); if (ret) return ret; if (c->frame_pred == PRED_MEDIAN) { if (!c->interlaced) { - restore_median_planar(c, frame.f->data[i], - frame.f->linesize[i], avctx->width, + restore_median_planar(c, frame->data[i], + frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } else { - restore_median_planar_il(c, frame.f->data[i], - frame.f->linesize[i], + restore_median_planar_il(c, frame->data[i], + frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } } else if (c->frame_pred == PRED_GRADIENT) { if (!c->interlaced) { - restore_gradient_planar(c, frame.f->data[i], - frame.f->linesize[i], avctx->width, + restore_gradient_planar(c, frame->data[i], + frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } else { - restore_gradient_planar_il(c, frame.f->data[i], - frame.f->linesize[i], + restore_gradient_planar_il(c, frame->data[i], + frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } } } - c->utdsp.restore_rgb_planes(frame.f->data[2], frame.f->data[0], frame.f->data[1], - frame.f->linesize[2], frame.f->linesize[0], frame.f->linesize[1], + c->utdsp.restore_rgb_planes(frame->data[2], frame->data[0], frame->data[1], + frame->linesize[2], frame->linesize[0], frame->linesize[1], avctx->width, avctx->height); break; case AV_PIX_FMT_GBRAP10: case AV_PIX_FMT_GBRP10: for (i = 0; i < c->planes; i++) { - ret = decode_plane10(c, i, (uint16_t *)frame.f->data[i], - frame.f->linesize[i] / 2, avctx->width, + ret = decode_plane10(c, i, (uint16_t *)frame->data[i], + frame->linesize[i] / 2, avctx->width, avctx->height, plane_start[i], plane_start[i + 1] - 1024, c->frame_pred == PRED_LEFT); if (ret) return ret; } - c->utdsp.restore_rgb_planes10((uint16_t *)frame.f->data[2], (uint16_t *)frame.f->data[0], (uint16_t *)frame.f->data[1], - frame.f->linesize[2] / 2, frame.f->linesize[0] / 2, frame.f->linesize[1] / 2, + c->utdsp.restore_rgb_planes10((uint16_t *)frame->data[2], (uint16_t *)frame->data[0], (uint16_t *)frame->data[1], + frame->linesize[2] / 2, frame->linesize[0] / 2, frame->linesize[1] / 2, avctx->width, avctx->height); break; case AV_PIX_FMT_YUV420P: for (i = 0; i < 3; i++) { - ret = decode_plane(c, i, frame.f->data[i], frame.f->linesize[i], + ret = decode_plane(c, i, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height >> !!i, plane_start[i], c->frame_pred == PRED_LEFT); if (ret) return ret; if (c->frame_pred == PRED_MEDIAN) { if (!c->interlaced) { - restore_median_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height >> !!i, c->slices, !i); } else { - restore_median_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar_il(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height >> !!i, c->slices, !i); } } else if (c->frame_pred == PRED_GRADIENT) { if (!c->interlaced) { - restore_gradient_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height >> !!i, c->slices, !i); } else { - restore_gradient_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar_il(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height >> !!i, c->slices, !i); @@ -792,28 +792,28 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, break; case AV_PIX_FMT_YUV422P: for (i = 0; i < 3; i++) { - ret = decode_plane(c, i, frame.f->data[i], frame.f->linesize[i], + ret = decode_plane(c, i, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height, plane_start[i], c->frame_pred == PRED_LEFT); if (ret) return ret; if (c->frame_pred == PRED_MEDIAN) { if (!c->interlaced) { - restore_median_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height, c->slices, 0); } else { - restore_median_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar_il(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height, c->slices, 0); } } else if (c->frame_pred == PRED_GRADIENT) { if (!c->interlaced) { - restore_gradient_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height, c->slices, 0); } else { - restore_gradient_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar_il(c, frame->data[i], frame->linesize[i], avctx->width >> !!i, avctx->height, c->slices, 0); } @@ -822,28 +822,28 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, break; case AV_PIX_FMT_YUV444P: for (i = 0; i < 3; i++) { - ret = decode_plane(c, i, frame.f->data[i], frame.f->linesize[i], + ret = decode_plane(c, i, frame->data[i], frame->linesize[i], avctx->width, avctx->height, plane_start[i], c->frame_pred == PRED_LEFT); if (ret) return ret; if (c->frame_pred == PRED_MEDIAN) { if (!c->interlaced) { - restore_median_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar(c, frame->data[i], frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } else { - restore_median_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_median_planar_il(c, frame->data[i], frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } } else if (c->frame_pred == PRED_GRADIENT) { if (!c->interlaced) { - restore_gradient_planar(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar(c, frame->data[i], frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } else { - restore_gradient_planar_il(c, frame.f->data[i], frame.f->linesize[i], + restore_gradient_planar_il(c, frame->data[i], frame->linesize[i], avctx->width, avctx->height, c->slices, 0); } @@ -852,7 +852,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, break; case AV_PIX_FMT_YUV420P10: for (i = 0; i < 3; i++) { - ret = decode_plane10(c, i, (uint16_t *)frame.f->data[i], frame.f->linesize[i] / 2, + ret = decode_plane10(c, i, (uint16_t *)frame->data[i], frame->linesize[i] / 2, avctx->width >> !!i, avctx->height >> !!i, plane_start[i], plane_start[i + 1] - 1024, c->frame_pred == PRED_LEFT); if (ret) @@ -861,7 +861,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, break; case AV_PIX_FMT_YUV422P10: for (i = 0; i < 3; i++) { - ret = decode_plane10(c, i, (uint16_t *)frame.f->data[i], frame.f->linesize[i] / 2, + ret = decode_plane10(c, i, (uint16_t *)frame->data[i], frame->linesize[i] / 2, avctx->width >> !!i, avctx->height, plane_start[i], plane_start[i + 1] - 1024, c->frame_pred == PRED_LEFT); if (ret) @@ -870,9 +870,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, break; } - frame.f->key_frame = 1; - frame.f->pict_type = AV_PICTURE_TYPE_I; - frame.f->interlaced_frame = !!c->interlaced; + frame->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; + frame->interlaced_frame = !!c->interlaced; *got_frame = 1; diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c index 0c95728781..19dd4eeeec 100644 --- a/libavcodec/v210dec.c +++ b/libavcodec/v210dec.c @@ -142,7 +142,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, V210DecContext *s = avctx->priv_data; ThreadData td; int ret, stride, aligned_input; - ThreadFrame frame = { .f = data }; AVFrame *pic = data; const uint8_t *psrc = avpkt->data; @@ -177,7 +176,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, ff_v210dec_init(s); } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; pic->pict_type = AV_PICTURE_TYPE_I; diff --git a/libavcodec/v410dec.c b/libavcodec/v410dec.c index c23f84942d..ecf3ae2053 100644 --- a/libavcodec/v410dec.c +++ b/libavcodec/v410dec.c @@ -89,7 +89,6 @@ static int v410_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { ThreadData td; - ThreadFrame frame = { .f = data }; AVFrame *pic = data; uint8_t *src = avpkt->data; int ret; @@ -101,7 +100,7 @@ static int v410_decode_frame(AVCodecContext *avctx, void *data, return AVERROR(EINVAL); } - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; pic->key_frame = 1; diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index 5985493b8d..63374c31c9 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -18,14 +18,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/frame.h" #include "libavutil/pixdesc.h" #include "hwconfig.h" #include "vaapi_decode.h" #include "internal.h" #include "av1dec.h" +#include "thread.h" typedef struct VAAPIAV1FrameRef { - ThreadFrame frame; + AVFrame *frame; int valid; } VAAPIAV1FrameRef; @@ -40,13 +42,13 @@ typedef struct VAAPIAV1DecContext { * used to apply film grain and push to downstream. */ VAAPIAV1FrameRef ref_tab[AV1_NUM_REF_FRAMES]; - ThreadFrame tmp_frame; + AVFrame *tmp_frame; } VAAPIAV1DecContext; static VASurfaceID vaapi_av1_surface_id(AV1Frame *vf) { if (vf) - return ff_vaapi_get_surface_id(vf->tf.f); + return ff_vaapi_get_surface_id(vf->f); else return VA_INVALID_SURFACE; } @@ -73,16 +75,16 @@ static int vaapi_av1_decode_init(AVCodecContext *avctx) { VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; - ctx->tmp_frame.f = av_frame_alloc(); - if (!ctx->tmp_frame.f) { + ctx->tmp_frame = av_frame_alloc(); + if (!ctx->tmp_frame) { av_log(avctx, AV_LOG_ERROR, "Failed to allocate frame.\n"); return AVERROR(ENOMEM); } for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++) { - ctx->ref_tab[i].frame.f = av_frame_alloc(); - if (!ctx->ref_tab[i].frame.f) { + ctx->ref_tab[i].frame = av_frame_alloc(); + if (!ctx->ref_tab[i].frame) { av_log(avctx, AV_LOG_ERROR, "Failed to allocate reference table frame %d.\n", i); return AVERROR(ENOMEM); @@ -97,14 +99,14 @@ static int vaapi_av1_decode_uninit(AVCodecContext *avctx) { VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; - if (ctx->tmp_frame.f->buf[0]) - ff_thread_release_buffer(avctx, &ctx->tmp_frame); - av_frame_free(&ctx->tmp_frame.f); + if (ctx->tmp_frame->buf[0]) + ff_thread_release_buffer(avctx, ctx->tmp_frame); + av_frame_free(&ctx->tmp_frame); for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++) { - if (ctx->ref_tab[i].frame.f->buf[0]) - ff_thread_release_buffer(avctx, &ctx->ref_tab[i].frame); - av_frame_free(&ctx->ref_tab[i].frame.f); + if (ctx->ref_tab[i].frame->buf[0]) + ff_thread_release_buffer(avctx, ctx->ref_tab[i].frame); + av_frame_free(&ctx->ref_tab[i].frame); } return ff_vaapi_decode_uninit(avctx); @@ -135,12 +137,12 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, goto fail; if (apply_grain) { - if (ctx->tmp_frame.f->buf[0]) - ff_thread_release_buffer(avctx, &ctx->tmp_frame); - err = ff_thread_get_buffer(avctx, &ctx->tmp_frame, AV_GET_BUFFER_FLAG_REF); + if (ctx->tmp_frame->buf[0]) + ff_thread_release_buffer(avctx, ctx->tmp_frame); + err = ff_thread_get_buffer(avctx, ctx->tmp_frame, AV_GET_BUFFER_FLAG_REF); if (err < 0) goto fail; - pic->output_surface = ff_vaapi_get_surface_id(ctx->tmp_frame.f); + pic->output_surface = ff_vaapi_get_surface_id(ctx->tmp_frame); } else { pic->output_surface = vaapi_av1_surface_id(&s->cur_frame); } @@ -276,7 +278,7 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, pic_param.ref_frame_map[i] = VA_INVALID_ID; else pic_param.ref_frame_map[i] = ctx->ref_tab[i].valid ? - ff_vaapi_get_surface_id(ctx->ref_tab[i].frame.f) : + ff_vaapi_get_surface_id(ctx->ref_tab[i].frame) : vaapi_av1_surface_id(&s->ref[i]); } for (int i = 0; i < AV1_REFS_PER_FRAME; i++) { @@ -380,11 +382,11 @@ static int vaapi_av1_end_frame(AVCodecContext *avctx) for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) { if (header->refresh_frame_flags & (1 << i)) { - if (ctx->ref_tab[i].frame.f->buf[0]) - ff_thread_release_buffer(avctx, &ctx->ref_tab[i].frame); + if (ctx->ref_tab[i].frame->buf[0]) + ff_thread_release_buffer(avctx, ctx->ref_tab[i].frame); if (apply_grain) { - ret = ff_thread_ref_frame(&ctx->ref_tab[i].frame, &ctx->tmp_frame); + ret = av_frame_ref(ctx->ref_tab[i].frame, ctx->tmp_frame); if (ret < 0) return ret; ctx->ref_tab[i].valid = 1; diff --git a/libavcodec/vble.c b/libavcodec/vble.c index f1400959e0..bb542bef42 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -125,7 +125,6 @@ static int vble_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, int offset = 0; int width_uv = avctx->width / 2, height_uv = avctx->height / 2; int ret; - ThreadFrame frame = { .f = data }; if (avpkt->size < 4 || avpkt->size - 4 > INT_MAX/8) { av_log(avctx, AV_LOG_ERROR, "Invalid packet size\n"); @@ -133,7 +132,7 @@ static int vble_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, } /* Allocate buffer */ - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, pic, 0)) < 0) return ret; /* Set flags */ diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h index e6091dfe04..fc2662bf0d 100644 --- a/libavcodec/vp8.h +++ b/libavcodec/vp8.h @@ -33,7 +33,7 @@ #include "libavutil/thread.h" #include "h264pred.h" -#include "thread.h" +#include "threadframe.h" #include "vp56.h" #include "vp8dsp.h" diff --git a/libavcodec/vp9shared.h b/libavcodec/vp9shared.h index 54726df742..ebaa11d2c1 100644 --- a/libavcodec/vp9shared.h +++ b/libavcodec/vp9shared.h @@ -28,7 +28,7 @@ #include #include "vp9.h" -#include "thread.h" +#include "threadframe.h" #include "vp56.h" enum BlockPartition { diff --git a/libavcodec/webp.c b/libavcodec/webp.c index d5a81fd527..9e642e050a 100644 --- a/libavcodec/webp.c +++ b/libavcodec/webp.c @@ -568,8 +568,7 @@ static int decode_entropy_coded_image(WebPContext *s, enum ImageRole role, img->frame->height = h; if (role == IMAGE_ROLE_ARGB && !img->is_alpha_primary) { - ThreadFrame pt = { .f = img->frame }; - ret = ff_thread_get_buffer(s->avctx, &pt, 0); + ret = ff_thread_get_buffer(s->avctx, img->frame, 0); } else ret = av_frame_get_buffer(img->frame, 1); if (ret < 0) diff --git a/libavcodec/ylc.c b/libavcodec/ylc.c index 1c2b5000fe..cbe33fe174 100644 --- a/libavcodec/ylc.c +++ b/libavcodec/ylc.c @@ -285,7 +285,6 @@ static int decode_frame(AVCodecContext *avctx, int TL[4] = { 128, 128, 128, 128 }; int L[4] = { 128, 128, 128, 128 }; YLCContext *s = avctx->priv_data; - ThreadFrame frame = { .f = data }; const uint8_t *buf = avpkt->data; int ret, x, y, toffset, boffset; AVFrame * const p = data; @@ -307,7 +306,7 @@ static int decode_frame(AVCodecContext *avctx, if (toffset >= boffset || boffset >= avpkt->size) return AVERROR_INVALIDDATA; - if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) + if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) return ret; av_fast_malloc(&s->buffer, &s->buffer_size, From patchwork Mon Feb 7 00:58:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34154 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5361950iov; Sun, 6 Feb 2022 16:59:01 -0800 (PST) X-Google-Smtp-Source: ABdhPJwAYolEPPOaNRe5uWbtqqCJTDFD5O+zum5zcaccGuth5fyS482PyG7JqmnQDZ7qzEpQUZPi X-Received: by 2002:a17:907:216d:: with SMTP id rl13mr7757049ejb.193.1644195541093; Sun, 06 Feb 2022 16:59:01 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ho37si6376024ejc.905.2022.02.06.16.59.00; Sun, 06 Feb 2022 16:59:01 -0800 (PST) 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=kFthe3Vf; 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 71C8E68B205; Mon, 7 Feb 2022 02:58:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E695B68AFCF for ; Mon, 7 Feb 2022 02:58:33 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QVFUer3c3+8nDbZ5FV9aV7oHFIYycb4Lb/3UM5ZlU/foBIZ+QuqybjPynn762g0UjTOBBI0ctstXkJuVOVwlmWykOttQaNun3G1AR6lEFa36nO5xyZtcFBfI09cKeFTIWvNdIObpf9I1UoJur56hqkasvmNLCkNa4tiLIUL5qZrXOo3vTUv03tTHOn+9pMjxSHd9lQyIxwjmdH/mklLraA3bV0uFHtcsCVAtVwdE8n0AGtSwREq5aMW8CsfkIpRclWDqeIMoCT3I0pyfOsRj53FuUhq8oRcQsC0G18J5LWQptWz2am12v6zkOfm1DoRGjp3JVnYk/ECAOVMJ3M/sSA== 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=xtbqBmldd+8iu2T7Q4KIGTJ37bQgklF6ppl+5YSTbTg=; b=SdlGy1EkTVG1SJpRYw7ADctUNKoxrLFao96O0xqnt6gBm9JDXboF1OiEETmut+nJFJIPUtipHeXUTU7TxDke1dpydd7LneRYVcqQF9JQl0iZ31aWef0JusPnAyNZeJwY6OpchqvBOlCr4uKecyLth1BTbRvYoTV/+11L3P8U6ugPuZ4Yo5cHikGZoRNJq0jHZ11TAWLgWUOHOGLIjO85yLbsOTcGz4SqRZOMVxS1v4igAIdmb6YOICKpOh1YHtf1WDbISKAZEhyueTObwncxRDSVCHyJVhTCcVzy6fvtko2KFEw68g+5oJtD209Cy+Wt50yffC4Kk27km4ldDgkunw== 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=xtbqBmldd+8iu2T7Q4KIGTJ37bQgklF6ppl+5YSTbTg=; b=kFthe3VfGp9Q4LkQQgcZqVls0xh6WvYs6D/p76Rsk43Y3f7omrertFcw6QSsDRbfkBxbjPXv1RujpuuCo0EOguzLzckIvBUPCHHraNxoIVB1Ge5yBq02HvDtxEQM3uyvXefQWqRPSxbnFnh7O76KGcC0m3TOS5JwhnkP0F2kzreSuYdefkzSHkGnH7HMYxDBH0tAiSYAWLX+I+X2d3u7312Z5WglV5Uc/IM6YZSaaIQn4nFdoZxqsdvbrPgXrOTzSLfp/ieW4dxVuFXyB469uAtAw3MtVUalSX5/a7iE5omGralzmOEBVrAIcCm01M17p8sVtgef9euVXSPLK6uN3Q== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:24 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:24 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:08 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [JRmQ3OImtcPBQbinMD3OlsKCRsVW0sSz] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2ebedde1-86ab-4712-00d2-08d9e9d4f17f X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiSDApSgY9IItRoaJ3UYzLbjZYI+nQGc8Aqnjmjv6t+aigmwlQvpePJEpHZ+s1l1IbYLMhvbKzhOHiHjF/qBm2ClNPrOsiY99URh8V2Z3Cdh/LUY8w07BCgdg3SZ1/pB2Cxbl0rXpPRqGBXZgIaWt9vtmxtDDfEd4kXuqFhCkbngX3Z+pCaZrRThXj9GqU5EHIqmwHke6nU8rEKvmFmZwVLDdvJXutg1/TjSw4fofxgArgDZChid3/TxlBuc7no1FwxhS2e/5xMmx4kKRYtyc0ojW1Z9i4TimvVqTzHJFa46261zKqB+UNeqXfXXdevxOIqucRJcMw/W0D5qC6hVJpwaF/zTI1jG/+QIkJ4wpO3VFAX1fXrsx6wpk3eyWrv8c9h12XejelZfFCsIFaYYsCGVfJNEPzFdqMRxvjsggSByALlMqOBElmzSDxAS15l0uwKuK4fxQhcihbRSW0Dbn853iWAUBFuvHPqhGIGpGPYS5/nqWjyYPxahey2ZrUxXKpLZbkuE+u4uB9Kl/P900ObSv08SEDbreTMddzEzjpPT8j208DZdMWRG/f/rorNPozjQNWAmRPyjhAHbBMN1uJ/j1RHqKQURU/8ADpzP7fh392P2kCycRU4XSWPHghk6LZlo5P5pVXlsYl3eNRiaPocZCEadgDVij69GWw5a7hu4bfb7ybpm6z6WGJ0iF63Hqzuc8ovNSeroDDHZUY2Yl52r3fQpHo4uph0w2vsbuDzazQon4NHnTYmdSMjWA1EeBw4= X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: D+GIfqJTCjLPDflqUaeYPeld9U8IFRiSvvfk9dQzfDVq1r2nQNiTRW8VisVo2iK0oR9ZFTs7dmK8EUnBEwebGmszlFmte+lA0u74BMx613p1MWJhUL0h2xv56Y0MRhqrVj2CRzecIbhmiy6q03u9IXwtWbSil1o0xgrU/2rquygpKPqKhTkLudsHo9YJXkoD7AG6XqVG12dxa11FwuvGURcDUq2/IhkaLJp0umcVthYA/12asp6lu/YEO63X4ejXKRo420+avcuoqO7cqdTrAUUex7mSeEzk7lBn0iRYkV4P3LUtrBB9ncpytFlKYxsHIe+V3gc5YvwnCPxXpkXxglN4RgFNOyyzXtDGkEYvKKcGrTvXVvqPPNpgdJ86NUgzGeY8K670REJ9aUA7mr2MHd0OovItN8IviU4cFH1DsfuZgcctlHuooxis3+DU+7U20ZFo+hC+1fSFi4B/VRm6BCz2weHENQZLqNAHLrHrrm7la+8phvN5eV6ll7XYrIwoT6UK2zmfm7YhU3U4OT/JYXDvGeuZY/ASiAOTojZHYDfygK3D1JuuWYrVuzLYKPif9GLis+0xk2KcZ4xlYq95xw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hmDgY7atzDv1DXc2hnJWGPAp317mrO5dnjpwtMfD7KXWhh9OtSYeRILV/uGktpN6AHhSrO21j8uLFULnlt847DQifjbqvJiWtpWmTuecwGMFZIRO8su750ANVLeQDUlh8JWDuk6EJBDngrZ1sGVFfFw30qdjTga3W2UwBiYafjKZaGGiUKonSwPlEbC5y+O7HQQRfu7ZTQVGK7Z3B+f+/rvoS416LQQKxbax6QXQknNe2UJ+5LU9Ro+wY4x0IsfMrCq6sO3Rfyhhz+US2Ehtkr2v0Lzf+MgJvSAeC7cqfGMAtLRgWhdM7ykOgiC5ZRCsFLxaNCEQ2H107FTSEG4qy3Mttykza6NlDpBBSsNAoI1y+2Ots05qW53CCqO5RwO8S3+lNVb4BhVO1gzPxLWkKvwXRvobZf2fkrby4eX7D1lJ4GmR8jlWMgBU956Id2kj1LD3h/nHOWixzso82Y5gOfFuTbeL8GNdDIlnrZrylgfkWsvyYKod+QIQm1Qb/lForcKhl/948A+mx2xhRjuvnux/4aaZD2aPWZlXkd1zjOxyXz46tYENfBgZ7Z3kKBDM0CS4IQ2vHcT2yd5l45y0wip9yMwUgzNS7IIDozdMLSftuOkfL294obIqmyXXhrgr3kz4rmemjBDKb/4hJzh7J8BqG2ohlWPQoh5twHo+KOO8Tinb4R3YjD4MZ8ecUwpCC5IkwG1XYI/rEFwK6EX2EU8TnxT3oRd96LoQ8pFgenjnWsMmXfIRfHoSG8DZvQNbMdoTm/AtUskCYacAz1WCeXvIupUrHI5xTk64qv4zktbKC5skKRiSAsEEjlXCK0V4Mw7mLdSf0SkinTGItXoyzjbSzv6y9hyL82VOOa4/sAThBMPTOl6+aHovL7dYkuSE9nnefzIfviYg5EhttiiD+uYbG/oVWHWyoehFxl1asr9dS2TqfYcHn8kdyZZYg61qLPLWiiTJBFnJjuroLNEYZA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2ebedde1-86ab-4712-00d2-08d9e9d4f17f X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:24.5316 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 6/6] avcodec/pthread_frame: Properly unref frame in case of decoding failure 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: bQ6mjwWODmvH Use ff_thread_release_buffer() instead of av_frame_unref(), as the former handles the case of non-thread-safe callbacks properly. (This is possible now that ff_thread_release_buffer() no longer requires a ThreadFrame.) Signed-off-by: Andreas Rheinhardt --- libavcodec/pthread_frame.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 75b70a17ec..27ed0b2cc4 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -223,7 +223,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (avctx->codec->caps_internal & FF_CODEC_CAP_ALLOCATE_PROGRESS) av_log(avctx, AV_LOG_ERROR, "A frame threaded decoder did not " "free the frame on failure. This is a bug, please report it.\n"); - av_frame_unref(p->frame); + ff_thread_release_buffer(avctx, p->frame); } if (atomic_load(&p->state) == STATE_SETTING_UP)