From patchwork Tue Sep 19 19:57:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43846 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a886:b0:149:dfde:5c0a with SMTP id ca6csp189097pzb; Tue, 19 Sep 2023 13:03:37 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEebN47QyyKtHyYWrshVc7Wms6BmC0lOl5Bu17jPl701OuFSmtKN0YFgDNDoTEJdCXoRxg4 X-Received: by 2002:aa7:c995:0:b0:530:74ed:fc8a with SMTP id c21-20020aa7c995000000b0053074edfc8amr340842edt.41.1695153817531; Tue, 19 Sep 2023 13:03:37 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y3-20020a50e603000000b0052a17658cb0si11595163edm.677.2023.09.19.13.03.37; Tue, 19 Sep 2023 13:03:37 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=UN71z5dX; 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 8014968C919; Tue, 19 Sep 2023 22:59:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2098.outbound.protection.outlook.com [40.92.91.98]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AAAF568C919 for ; Tue, 19 Sep 2023 22:59:36 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dDvBY4V9+6DAJjA1pf/GPWdWF0X94beTAvpTy9L7gc4+Z23qUmXHp/j8PI83kz3G6TZp3ub1OE8eUdEhkA1i95FDAhIiuHYTwPQXa2eGwojwx9cJ4CUPaUqPf0fs9dylPXvVEp6jBks6c/Dm6dtBxJRgVTsuOs9JJko10DHxd/V39PceuKDmczNBCZ2CC0dVxToLZXXSdvL76OswFPqeU2gBeBXIlomdHtR7q6W+i0QHK3qB2AD5flGy3FQ2syKLwR2BXA7GoXmxqlq3U4ADg1ag6VxPuuDQbt+SsZ9UuoeIiCCH2t/2VZFNdbRBgW445d8HuRSaJtDury24BxZnHA== 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=XCG+0qTYbUcBadOcBhSe8rz9xvldkMpllWHpTg0cNX4=; b=lALVbqCWYE1oHAmzVqXXnwQgXJUaF9qKM4rmCFSEXLf+bJ0osm3gHkoSAV735M1+IWQ4ye0Z6i1NN6syICrvn9jcTGlANxZvrDydFV9bs+BPloNeC+AbrNMfvdu8O3dUfy2xcWvZk8B65tXzZiYp+XsztldKI0JeJWmjmO0VAn2P2rWdNnPHPsBYjC0LlJOv6X6Z2D4/lp3KWAB2O7dAHgbhBJhadphNFxBhIpMsodT+HJrPMNQDVVxC2hWu09FOFxHvMjnEP9wgPKukhbET5tDn85uN15VLbiiXtkmbNvY8kNQHIU9ULlX4t3r4j5kRZFym3YsROBC/UZ4XiAOQng== 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=XCG+0qTYbUcBadOcBhSe8rz9xvldkMpllWHpTg0cNX4=; b=UN71z5dXoG0s2LTqTWv/oRt3DhhSLEZ11X+/btIjkFLOykFp5+L/6ft7I7WLavm6VzZZnfsWQNQYFKKuAlMBHCjY6emaLahVPVEiJj32UJsTKpVwT32hyjtwEGajxWRXrUHV1VatYYZTKvLoO1nBQCkvWuGfrrWoHXWUhKHpCtnLddhxnvPteSlJTVXf6eAeYsvmmhLr+wlMzPhITXpwO4dGMugY5T9n8mWdATL8xn23EiiiRWFps/TCIIA5qyvjNiAA7789RfubfFHplGUPD85g9+Xh3Jb5BMSpAcAtEzKjZK34ZwtTV31Z16+RMYJm9k7jczEyTIPBTdRfPUlNYg== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0295.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:32a::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.27; Tue, 19 Sep 2023 19:59:35 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6792.026; Tue, 19 Sep 2023 19:59:35 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Sep 2023 21:57:33 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [7ihbt65gFiiHvgYvvtFcN9vVf2BZ1Gmm] X-ClientProxiedBy: ZR0P278CA0086.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::19) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230919195734.1005750-41-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0295:EE_ X-MS-Office365-Filtering-Correlation-Id: de09965a-aa50-46bc-76a8-08dbb94af257 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: aHd8P6bLfibhPZVE6k/0rzc+ZoaohG4rskCIDQswk8oxMUZTIx202y6J8njAE7B3pDKsKWarFS614Pp7Ah1B7EzsH/Q8FZV2evWBR1NV5u4Uygwn+mzXrmhxejMDEDkGndQy6sIl6H//NOUE+AV6msi56M5Dnj783FfOfWV+zUIkMYP5PMvAX0OGn5H9szHL9wXhD+Ursr52hu1bMKZiF1DuTMArjZqyNpXXSYJp3McDi58otVTd/4Pf0+8rJHZNJq3+ru4VwEabEQh68SSpBrUBBwQr1jKvFjDuwCooxnvrkKCoT8k4c8BLtBUfCyKx2U/RPr96hQfdWXnIiaO3lx3qdxr5ICMKSS7ozZttqODGNwRzHobKM6K0RfdMBT40Vwc+nUvzY6mK+7JPPcMOC44lwr8CveFMXqfJNt6KEaRmufAhAcaATQEvwxOx6JoEGTYch3qrLF10iaBryzyAwsKGwTdjT/846YTVcICiomV5rmc933PYA9olXjv23iUKdyPuTZtzizDnfEFBePqX5h6WO0LUBKTFkmawuA8E5mWETd3jTU7XwdxTgBQktIonHwOw1bVhPCUKCPOQV6OOwvd8X1QTglcEfa+yJ5dZHgyri5zZJgtq2XI27hte5YPp X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 20FtpT3juxa4U5xr3PhprY+52zOpwEmnC1lAn3xgzZV3UPh8vG0vEAZkJVdYq/Fvh6c81I3Gg27YhIMz0j19TJW9eBsn+kj/tvcjW57nU1bdxgUx8/4R6KlfbZOlU2YZ3pL6SeLu6RHfAfGBe1eFIfZSFQkXQ7vg8sm7jaXuBeKHhGGtf9Gtddt/cIf8lCfRXF4j0lpbghLCZof2tKy855ZtqpaZlpd8U4lN0TRcTRR76jdwWwNgYTXXYs5lAINH8jScdJadcv5h+qrhteU50jO2l6eYAJWQSf1dVfj3VpHFBoQ7jTrXypakuGt+7o9j7TOJcr5KVojjrTKTG8ToaWbwx9ylutlKF9C9mk6L/IkeaosfPdeH7YDDIm74DYykoxECVx+Q9Twb2ug2tns2W7FrKGh8TkH2qZf0eh5n/NN2yKY0px/h9jTBgr0NAROd8N+AQBtHTYJ25YDL1Wn1AEE1owvUKH/n7a/Cj8tf4GPnkuwYhaUk16OhGaYLHMKsKskginJqf3nYRKoSzyDT1pvTFATgPWNCOGfR2HS6COO4B+pQ6p8bUPP9SebnJN1P2xybmPSqhbMoZqMWYvAqtyT+CnBi9FK3axw8yEcGlelU2IJHXh/s9Gqq1deuie7obctB+qBtvBylTvuZcZ0xaVh42W1KxnL3FTbgkhfiSbT+Pdb9+3gS8r0IbLq7raAfv+c8KYdeV9WyZ75fg5KkAaS5q2hHRiXWB4Wb4yZgQdmtM8Q2DohzLjCM+o2KNwwfwg7bF6fB1uKfVVIixIb9Zyrb3XCIA4NCiAjeLEwArY10MA9sIAtYqKnuYEW0n13ptWBy1YdhxrVIyCbXyZRJAK2ro7Aj34g8GSteiugNDd20y7Jb/Et6eilfdU/Y962e91UFU4vmPOouRsEdB0xQBAeqT1MKPsjxUG+su/K6cqDizTlJv328/WvbWVfV8BqfqfKrQ615OMVFO2Nzokoc4P0ZygLDXD/6Th08sIQodf3OXxrZD8bWBHFt40lHfjUe2R1HgFSRMfVDrS2qYfqk1Gwoauk9kcJomCTZMsbXli46M1tEczq8vmHdJCpdHAqUDzHRODGOf2CgP/Y3hrfHwl+mAG+qMKhPN/nmbMbAKT2NZyvgoSvVWlLUuW9RzxbCKFMcbaLV1ziJOtxYz/rVL59i9oOp9FXXoQe5mzubiPGCaSouP7xAeXoyMFxd6PDTZ/qxdVvvDbX97muTKUP0nAvhO8Jm64FsWa+Stch+JOmM+4bmqrcNq+CGAGdDSpK6 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: de09965a-aa50-46bc-76a8-08dbb94af257 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2023 19:59:35.0104 (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: AM8P250MB0295 Subject: [FFmpeg-devel] [PATCH 41/42] avcodec/pngdec: Switch to ProgressFrames 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: M2ab4fJ7BVfs Avoids implicit av_frame_ref() and therefore allocations and error checks. It also avoids explicitly allocating the AVFrames (done implicitly when getting the buffer). Signed-off-by: Andreas Rheinhardt --- libavcodec/pngdec.c | 64 +++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index c011ca386e..8576ccb3b1 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -40,8 +40,8 @@ #include "apng.h" #include "png.h" #include "pngdsp.h" +#include "progressframe.h" #include "thread.h" -#include "threadframe.h" #include "zlib_wrapper.h" #include @@ -61,8 +61,8 @@ typedef struct PNGDecContext { AVCodecContext *avctx; GetByteContext gb; - ThreadFrame last_picture; - ThreadFrame picture; + ProgressFrame last_picture; + ProgressFrame picture; AVDictionary *frame_metadata; @@ -815,7 +815,7 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, s->bpp += byte_depth; } - ff_thread_release_ext_buffer(avctx, &s->picture); + ff_thread_progress_unref(avctx, &s->picture); if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) { /* We only need a buffer for the current picture. */ ret = ff_thread_get_buffer(avctx, p, 0); @@ -824,8 +824,8 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, } else if (s->dispose_op == APNG_DISPOSE_OP_BACKGROUND) { /* We need a buffer for the current picture as well as * a buffer for the reference to retain. */ - ret = ff_thread_get_ext_buffer(avctx, &s->picture, - AV_GET_BUFFER_FLAG_REF); + ret = ff_thread_progress_get_buffer(avctx, &s->picture, + AV_GET_BUFFER_FLAG_REF); if (ret < 0) return ret; ret = ff_thread_get_buffer(avctx, p, 0); @@ -833,8 +833,9 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, return ret; } else { /* The picture output this time and the reference to retain coincide. */ - if ((ret = ff_thread_get_ext_buffer(avctx, &s->picture, - AV_GET_BUFFER_FLAG_REF)) < 0) + ret = ff_thread_progress_get_buffer(avctx, &s->picture, + AV_GET_BUFFER_FLAG_REF); + if (ret < 0) return ret; ret = av_frame_ref(p, s->picture.f); if (ret < 0) @@ -1195,7 +1196,7 @@ static void handle_p_frame_png(PNGDecContext *s, AVFrame *p) ls = FFMIN(ls, s->width * s->bpp); - ff_thread_await_progress(&s->last_picture, INT_MAX, 0); + ff_thread_progress_await(&s->last_picture, INT_MAX); for (j = 0; j < s->height; j++) { for (i = 0; i < ls; i++) pd[i] += pd_last[i]; @@ -1227,7 +1228,7 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, return AVERROR_PATCHWELCOME; } - ff_thread_await_progress(&s->last_picture, INT_MAX, 0); + ff_thread_progress_await(&s->last_picture, INT_MAX); // copy unchanged rectangles from the last frame for (y = 0; y < s->y_offset; y++) @@ -1594,7 +1595,7 @@ exit_loop: } /* handle P-frames only if a predecessor frame is available */ - if (s->last_picture.f->data[0]) { + if (s->last_picture.f) { if ( !(avpkt->flags & AV_PKT_FLAG_KEY) && avctx->codec_tag != AV_RL32("MPNG") && s->last_picture.f->width == p->width && s->last_picture.f->height== p->height @@ -1611,12 +1612,11 @@ exit_loop: if (CONFIG_APNG_DECODER && s->dispose_op == APNG_DISPOSE_OP_BACKGROUND) apng_reset_background(s, p); - ff_thread_report_progress(&s->picture, INT_MAX, 0); - - return 0; - + ret = 0; fail: - ff_thread_report_progress(&s->picture, INT_MAX, 0); + if (s->picture.f) + ff_thread_progress_report(&s->picture, INT_MAX); + return ret; } @@ -1703,8 +1703,8 @@ static int decode_frame_png(AVCodecContext *avctx, AVFrame *p, goto the_end; if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { - ff_thread_release_ext_buffer(avctx, &s->last_picture); - FFSWAP(ThreadFrame, s->picture, s->last_picture); + ff_thread_progress_unref(avctx, &s->last_picture); + FFSWAP(ProgressFrame, s->picture, s->last_picture); } *got_frame = 1; @@ -1756,10 +1756,10 @@ static int decode_frame_apng(AVCodecContext *avctx, AVFrame *p, if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) { - ff_thread_release_ext_buffer(avctx, &s->picture); + ff_thread_progress_unref(avctx, &s->picture); } else { - ff_thread_release_ext_buffer(avctx, &s->last_picture); - FFSWAP(ThreadFrame, s->picture, s->last_picture); + ff_thread_progress_unref(avctx, &s->last_picture); + FFSWAP(ProgressFrame, s->picture, s->last_picture); } } @@ -1773,8 +1773,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { PNGDecContext *psrc = src->priv_data; PNGDecContext *pdst = dst->priv_data; - ThreadFrame *src_frame = NULL; - int ret; + const ProgressFrame *src_frame; if (dst == src) return 0; @@ -1799,12 +1798,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_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) - return ret; - } + ff_thread_progress_replace(dst, &pdst->last_picture, src_frame); return 0; } @@ -1817,10 +1811,6 @@ static av_cold int png_dec_init(AVCodecContext *avctx) avctx->color_range = AVCOL_RANGE_JPEG; s->avctx = avctx; - s->last_picture.f = av_frame_alloc(); - s->picture.f = av_frame_alloc(); - if (!s->last_picture.f || !s->picture.f) - return AVERROR(ENOMEM); ff_pngdsp_init(&s->dsp); @@ -1831,10 +1821,8 @@ static av_cold int png_dec_end(AVCodecContext *avctx) { PNGDecContext *s = avctx->priv_data; - ff_thread_release_ext_buffer(avctx, &s->last_picture); - av_frame_free(&s->last_picture.f); - ff_thread_release_ext_buffer(avctx, &s->picture); - av_frame_free(&s->picture.f); + ff_thread_progress_unref(avctx, &s->last_picture); + ff_thread_progress_unref(avctx, &s->picture); av_freep(&s->buffer); s->buffer_size = 0; av_freep(&s->last_row); @@ -1862,6 +1850,7 @@ const FFCodec ff_apng_decoder = { UPDATE_THREAD_CONTEXT(update_thread_context), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | + FF_CODEC_CAP_USES_PROGRESSFRAMES | FF_CODEC_CAP_ICC_PROFILES, }; #endif @@ -1880,6 +1869,7 @@ const FFCodec ff_png_decoder = { .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_CLEANUP | + FF_CODEC_CAP_USES_PROGRESSFRAMES | FF_CODEC_CAP_ICC_PROFILES, }; #endif