From patchwork Sun Aug 8 17:29:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29361 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206466ioh; Sun, 8 Aug 2021 10:30:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzVBAg7oRGUZt7BMFQEq9OSVQF6RexYRgh0CqajTofm0i2yBmLN7MsohmkFUH+XMGQt1Dqy X-Received: by 2002:a17:906:404:: with SMTP id d4mr18952194eja.449.1628443807468; Sun, 08 Aug 2021 10:30:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443807; cv=none; d=google.com; s=arc-20160816; b=qVd/WKHM+MTTVdQx+rKDfQJr4voCyH9aqkRAXyKE0OZ1excvMKJNyi5NBCL2JbWbQP 4PppXJAZGHyp/n5VBbq6jxLYdzYKiMvE+gOt3JDWBVgu9JRltSCsQWG4aa2aqwnBmdzY 663qOtmqEZWOFB4QXw7UH+boepvbYB2qn2lmRkHMqyrn31S7ha8k/gfk5bvzomdLKxcd JZpP21YfhLHGJb09GxbHiLm+fI/OFMqeakeBoi6w7ujIIHn516M0RNvLjR7c1uWJE0db 9qTo8wLmF+vb+xqNEkkg8g08fgWwUX2ywzNlHnlP0zpgYVR0gv2kYtyII5uUnafq2yxE czog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :delivered-to; bh=TwdRw7CN+82UUwVNT38YcfDDR/KYiMQqnfnxmA9Rpec=; b=JTn6h4Xyx7HNZYsKdJ/X6JqyDAVq9ePzyBUSXnmbxfrwbQHYp3xonhzwh24QRc3a3n wfe/VPmKasX2PP05X7zk7AsUIawyMABsUuWJfYqkDLjaoUUYfjMbkn+G9U5cY+cYkm0I Vfmr4JvhvpX8c9I1teIl1wT15zoXewEpkWtjTXyiODDfgDD0rfj/tlfkU6FSNmmLdj05 OIsPfVrWtLf/8sHhTQFZ8n1nO9a68SmxFzw/XZPYN3XXt6z46ZEYTFIbMbik6LlJwdSZ nNxcprjRfIomwT8NBuWfZFroM33uS/Frr3j/uMD33EGXPQZ0ptYqQrE772F3H3y093nm NOvQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j18si15193200edw.279.2021.08.08.10.30.07; Sun, 08 Aug 2021 10:30:07 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5758E68A037; Sun, 8 Aug 2021 20:29:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B598C680839 for ; Sun, 8 Aug 2021 20:29:47 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 0D5C22404B2 for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id W-aYQ5G2hjHl for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 0BCA1240692 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2D2633A0BA4; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:32 +0200 Message-Id: <20210808172941.18238-1-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/10] ffmpeg: reset the dict iterator before use 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +SRYsMLWuxsG --- fftools/ffmpeg_filter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 49076f13ee..b252ee4138 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -971,6 +971,7 @@ int configure_filtergraph(FilterGraph *fg) fg->graph->nb_threads = filter_nbthreads; args[0] = 0; + e = NULL; while ((e = av_dict_get(ost->sws_dict, "", e, AV_DICT_IGNORE_SUFFIX))) { av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value); @@ -984,6 +985,7 @@ int configure_filtergraph(FilterGraph *fg) } args[0] = 0; + e = NULL; while ((e = av_dict_get(ost->swr_opts, "", e, AV_DICT_IGNORE_SUFFIX))) { av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value); From patchwork Sun Aug 8 17:29:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29352 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206370ioh; Sun, 8 Aug 2021 10:29:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSOJELa9rFZfrtg0g+dvixfj9MloHUZ6X7R50b5/7w9D36eltlHCJY2u4Gu3KPmt0GhlCl X-Received: by 2002:a17:906:14c8:: with SMTP id y8mr19011294ejc.475.1628443797625; Sun, 08 Aug 2021 10:29:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443797; cv=none; d=google.com; s=arc-20160816; b=aHMFlZkuUQxUxBirQ//9funYBOD2LLQa/GvV78MyK/pmcyVtVY7Eem4EA/fOP8fh6X o8dIDpNtgeQkzY7VkxFEsPkdIACEKKlIZWZxvV0VZ9yYqNtxBnHS36IyRTK5vxSth6fb voZMFWYdTT1E8kz4p8u76uA7e+aZpIRgvxy+YjJfiyI0cuG3gA9w40IffSdYMU/EPjJv Qn2yhh3ffd0CS53j3Lq2iIREz1P2Cs/7sOiNF+bwwgsZoBbDBT5iu1zMOi+bEwohTs43 h4TF5QjaWCNY1i29xrsjqcW8NOm3jnhfWb091EbtBWuj8C59N2BVOnt7qlK3UehvyYl4 GAFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=989Lo0p378kQJcrYiU5GGt7wvnJ/qbrfkIwCoR4i614=; b=hwxYvStrElSftOPbFhi7/CpPsBoZPrP0asqTioC7Zh67igabAJ6AwtoV/O2hbby4ho CY6nVHav1acaZkvtLxnNS0HqqjRfQqezhh+2RjEqNSeDDIIEcSxGqVCrtiW6GNmL6xHT Exc7+OvvIe8uMqYp8cH93Vy32J85x8BF/Z1lA0M8IH1EJVKVhujLJIRtfPiV6T8Nr3OK 4VIU+HndAvEt14JRJOXf3B8IYj0cdvlhVsUin69h4WNq2n2U7AbfuOhES1keki2tHwbf koUra0j1a4mZJiAu0IO8aWZ7siz1mJ2sQdPvpgVVUVHaWVAn/UbLEtOZOpZg2OrdsngY Frzw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 18si9396659ejy.624.2021.08.08.10.29.57; Sun, 08 Aug 2021 10:29:57 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 585F4689953; Sun, 8 Aug 2021 20:29:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 93B6068052C for ; Sun, 8 Aug 2021 20:29:47 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9CD7824069B for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id jpxp00MFD8R8 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 043622404B2 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2F3663A0185; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:33 +0200 Message-Id: <20210808172941.18238-2-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/10] ffmpeg_filter: do not override -filter_threads with -threads 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CkyzLNECP0x6 When both -filter_threads and -threads are specified, the latter takes effect. Since -threads is an encoder option and -filter_threads is a filter option, it makes sense for the -filter_threads to take precedence. --- fftools/ffmpeg_filter.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index b252ee4138..2b1b06268b 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -969,6 +969,11 @@ int configure_filtergraph(FilterGraph *fg) AVDictionaryEntry *e = NULL; fg->graph->nb_threads = filter_nbthreads; + if (!fg->graph->nb_threads) { + e = av_dict_get(ost->encoder_opts, "threads", NULL, 0); + if (e) + av_opt_set(fg->graph, "threads", e->value, 0); + } args[0] = 0; e = NULL; @@ -1001,10 +1006,6 @@ int configure_filtergraph(FilterGraph *fg) } if (strlen(args)) args[strlen(args) - 1] = '\0'; - - e = av_dict_get(ost->encoder_opts, "threads", NULL, 0); - if (e) - av_opt_set(fg->graph, "threads", e->value, 0); } else { fg->graph->nb_threads = filter_complex_nbthreads; } From patchwork Sun Aug 8 17:29:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29353 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206678ioh; Sun, 8 Aug 2021 10:30:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZATQ6N2on/eBWz+WWqKVBoWE2lcAut7dl8f2l9H8YvmTkEAF6MOwOfhqo7eD17f/r3MrB X-Received: by 2002:a17:906:38ce:: with SMTP id r14mr18792722ejd.268.1628443826493; Sun, 08 Aug 2021 10:30:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443826; cv=none; d=google.com; s=arc-20160816; b=jZZ3THa672AznVST20GZaCeGOgBINEA/xkveo0Q4/MmxhdnXsJ0kEjBKbljCLQGbOO O5GFYWxmvh2nGCIXEyxTqkqms1NbR+XlywrCk/3LVoUf2eIZOHvIcKIiwKfx8t0sWoit Hoe8znJaojWQ06lrrdLPQCdZUdRmbMCc4DLJQZN7plODsYJpdDH0cwVy1WgtBezKkF3Q 7Zcd4QV1CR6bJIG1+eTyMrw88Okoyc1tDO+XorJG21dIiHb2AHqZ3AXiIW6XLj/8f3l5 BTgvuW/k9Yde7Z1dqXqfq4jz4E4udou5I6zGk2jwFZjjJYof87Z/UHFpdmyYRsAK66fn HLbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=dpgjFls4xuIvKwPqHc4n3NGDqad5TlrDCXhoCcYZ51c=; b=aZJTcZtN8Z4gV2UE7/if0ZMk3Qld9oekR5FTQ81N4AVamzL1fFMIkvofu/xCQG0vjr uGYGHh9/hvomJeNrTCZXDsByzvDxRlY3vMd7s3QVY0vRHPCm2CmzZx683nQGz9Cku9Vp VuGAfdiAm8DgQlkKwJ3DiCTFH/ZZb38x03ymqi1ZPzeHccLXyN8Kl014f9g8G3xvR/y5 l90QSDeB7FWfPcKOxXcrz7gV8anAh6qOWar6yK3oblj4YbwTFkd1W/7r+xkfjxjLw0QB lJ2m4QkrUY8iWzoXzGX37vnW4I+0KV3Fee53c9r8/E13u6EfL4QGRrxdPQpGDU1nBJzJ as0g== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n9si14231913ejj.544.2021.08.08.10.30.26; Sun, 08 Aug 2021 10:30:26 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 51E1A68A457; Sun, 8 Aug 2021 20:29:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 610D4680839 for ; Sun, 8 Aug 2021 20:29:48 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id A2CAD240693 for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id AfmKcMf8j10d for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 06FCA2404C8 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 323D33A0BBE; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:34 +0200 Message-Id: <20210808172941.18238-3-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/10] FATE: allow multithreaded filtering 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: pR2jiglUdpSy --- tests/fate-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fate-run.sh b/tests/fate-run.sh index cd16f5fcff..bc1efa22d7 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -279,7 +279,7 @@ echov(){ echo "$@" >&3 } -AVCONV_OPTS="-nostdin -nostats -noauto_conversion_filters -y -cpuflags $cpuflags" +AVCONV_OPTS="-nostdin -nostats -noauto_conversion_filters -y -cpuflags $cpuflags -filter_threads $threads" COMMON_OPTS="-flags +bitexact -idct simple -sws_flags +accurate_rnd+bitexact -fflags +bitexact" DEC_OPTS="$COMMON_OPTS -threads $threads" ENC_OPTS="$COMMON_OPTS -threads 1 -dct fastint" From patchwork Sun Aug 8 17:29:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29360 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206569ioh; Sun, 8 Aug 2021 10:30:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyqTt6FF2fpYHjfqiRLeZHiGJcBoUqSPC9xI3lTSgynzXf8Uqc+FjfUq65ZX+umO7fV5CIK X-Received: by 2002:a05:6402:19a:: with SMTP id r26mr24729118edv.230.1628443816745; Sun, 08 Aug 2021 10:30:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443816; cv=none; d=google.com; s=arc-20160816; b=Px8ZJzwtmqgc1Oh4rASACxzShfEgQx717ltG7FyJnSVRMQFRZ81SFZ2kmu1cBbNmoD bmsCs350Vugf13w279p3NGnZrElnOtdtlt0zpaSXZfvTkYMBBNaoNgzvs3UabWqLH2jW vmHhy+eqYyk9vn87NhIlvYP9qGXhS/WiPRG0m9sVqyKprXq0MQSjWNwpOtAukg4CldeS NNE9BWdGbEgWQ0Yf5w+KN75WmGFmzMBPBnNVf2niPVla4zCZ9tDlJNyjJOQRyPnSpazS 4d8bFon5i1pEmB+0Dc7e13rgQ98gm7KKiYUe06/7TqrsVP3vvjMJaMnHDW9XvPSSJizq Fhcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=h3vy8v48yLIdzZMc6dufCh6JUToKrAgERxAX/DOT70w=; b=v4F7YmHYnu1pCwRx6X5KczOaMTbNd+GNy6Heisn9dC0B6QNpzThPSLnVBX+jNPBjlB 0ObDCwDuPEF//+fJ/VkmyeQaRxyt9r3JecFlzq9Rbycb67y9BCmlbE+l0D6+NEj4wZ4p 6MSVs8ZE4Dvs3TrHESNEwgB3m+eUekpO1H3xFoPQO+qL5qBAHZlMURccP9swQKDS2eH7 UTFD915apzRGYL5S6sH4WZsTRL9sjR6wTx08fd7gOrGRmoFTlAkpXzPC4EIwAlSfovzc 3eiS985MQqZMsKZgwfduWCyCHPKmIqG/r8dUXluXgFUcZOzwrpbZnqax0zLtqvg37nvN l1aA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r21si16515275ejo.665.2021.08.08.10.30.16; Sun, 08 Aug 2021 10:30:16 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 55A736883DD; Sun, 8 Aug 2021 20:29:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2BEE8680839 for ; Sun, 8 Aug 2021 20:29:48 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 71A01240692 for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 2VkCpVx4yuQo for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 10DBC240693 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 3853E3A0C14; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:35 +0200 Message-Id: <20210808172941.18238-4-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/10] fate/pixfmt: test xyz12le 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: djtKKBJboq/y --- tests/fate/pixfmt.mak | 1 + tests/ref/pixfmt/xyz12le | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 tests/ref/pixfmt/xyz12le diff --git a/tests/fate/pixfmt.mak b/tests/fate/pixfmt.mak index 46fd888ac9..715a4763d4 100644 --- a/tests/fate/pixfmt.mak +++ b/tests/fate/pixfmt.mak @@ -6,6 +6,7 @@ FATE_PIXFMT-$(CONFIG_SCALE_FILTER) = bgr24 \ rgb32 \ rgb555 \ rgb565 \ + xyz12le \ yuv410p \ yuv411p \ yuv420p \ diff --git a/tests/ref/pixfmt/xyz12le b/tests/ref/pixfmt/xyz12le new file mode 100644 index 0000000000..f725ce1bd4 --- /dev/null +++ b/tests/ref/pixfmt/xyz12le @@ -0,0 +1,2 @@ +a5a4f73b21d5e2b07789f41d84265d9a *tests/data/pixfmt/xyz12le.yuv +304128 tests/data/pixfmt/xyz12le.yuv From patchwork Sun Aug 8 17:29:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29354 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206772ioh; Sun, 8 Aug 2021 10:30:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzRQWvHUBx9Lky69J/oOTfNJZOWGqxDrdxKm/J6wVEvisuUUbqL/xj96+q0lyhMAa36en10 X-Received: by 2002:a05:6402:603:: with SMTP id n3mr24680856edv.61.1628443836485; Sun, 08 Aug 2021 10:30:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443836; cv=none; d=google.com; s=arc-20160816; b=qdjvGl1uMp3aOWNfZiSa3BQke8z/8HyApFDg523aV746tEtq54gRxyAWmzvG9t+aa1 p/AJu1Kkc/bX1FETz32ocTF1Gs6YqoWE4tt0VdI9WVIA0/CbHTu3cNSlNM/6dBgc5uEy sRM/qkukwwgiweg31IBFjpERd251mrId5A07Vy1VpFdKN6WoE9iwJPREBfJ0ZzLOoXo1 6UyB8vXquvKSAbW3EXDlOzh4C6t+onziJcEv0E8fXshsF3zsgcWNFV5r7iYP0XKwPHAo jGOjvWrRTswOE+mIb2HEn98rQCACLb9CsU/TgfWRA8k89QC+CH/A4AY5YFzAYW/yvt5H JRmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=3V55QQZ8OioypXk761xNzLQv+OPQru/vYH/NzBsssuo=; b=uVILE+RMFk0qOiJLGyXWEIjxPf2zCgVgmm35thYK0eZ640SH/5JkLCHvDEiTQSnjj3 Zxp8b7yVSOcWdzMdfxn8d6p6tKUQvRKBc8SZQ2vN2cBwiNx0zmdNGCEhrbjKuwdTb8jE PEWo7xmaFdxR6z6ItPMrUy3Di0nMILymM2/csPqQVNbKr0MLCuNZmvHkCidmLemaaHpz 7jXZ+UOESDentT4XT2ogB8atJl4lk7NuKcJw3rKyhRk/NFuehGMrE01ruVnsifV3qbmK CxQxFK9Ay70ny9LD9GRDHl9GOCUseuOdxxvUdrB+ExkKgmgEBaZkI8Y6X38xf88HF9DI jW8w== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v8si14994558edt.425.2021.08.08.10.30.36; Sun, 08 Aug 2021 10:30:36 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5CF8268A473; Sun, 8 Aug 2021 20:29:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 96CA56883DD for ; Sun, 8 Aug 2021 20:29:48 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id E5BE52404C8 for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id eFJQFUK_K1pP for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 20B4C240694 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 3C8C73A0E99; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:36 +0200 Message-Id: <20210808172941.18238-5-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/10] lavfi/vf_scale: remove the nb_slices option 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Df/2O/2tVPqG It was intended for debugging only and has been superseded by the standalone tool for testing sliced scaling. --- libavfilter/vf_scale.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index aa855b894a..7e70665cdd 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -148,8 +148,6 @@ typedef struct ScaleContext { int force_original_aspect_ratio; int force_divisible_by; - int nb_slices; - int eval_mode; ///< expression evaluation mode } ScaleContext; @@ -793,17 +791,6 @@ scale: ret = scale_slice(scale, out, in, scale->isws[0], 0, (link->h+1)/2, 2, 0); if (ret >= 0) ret = scale_slice(scale, out, in, scale->isws[1], 0, link->h /2, 2, 1); - } else if (scale->nb_slices) { - int i, slice_h, slice_start, slice_end = 0; - const int nb_slices = FFMIN(scale->nb_slices, link->h); - for (i = 0; i < nb_slices; i++) { - slice_start = slice_end; - slice_end = (link->h * (i+1)) / nb_slices; - slice_h = slice_end - slice_start; - ret = scale_slice(scale, out, in, scale->sws, slice_start, slice_h, 1, 0); - if (ret < 0) - break; - } } else { ret = scale_slice(scale, out, in, scale->sws, 0, link->h, 1, 0); } @@ -935,7 +922,6 @@ static const AVOption scale_options[] = { { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS }, { "param0", "Scaler param 0", OFFSET(param[0]), AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT }, INT_MIN, INT_MAX, FLAGS }, { "param1", "Scaler param 1", OFFSET(param[1]), AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT }, INT_MIN, INT_MAX, FLAGS }, - { "nb_slices", "set the number of slices (debug purpose only)", OFFSET(nb_slices), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" }, { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" }, { "frame", "eval expressions during initialization and per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" }, From patchwork Sun Aug 8 17:29:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29358 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206851ioh; Sun, 8 Aug 2021 10:30:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUysti59cUill51OXy7ZXeZOGyEZDvaMyhRYx/uuJX7I5GfaHWhRtBrx3wgAJW9ttGz6Sg X-Received: by 2002:a17:906:6009:: with SMTP id o9mr19279318ejj.266.1628443846111; Sun, 08 Aug 2021 10:30:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443846; cv=none; d=google.com; s=arc-20160816; b=c8VAyPPEd/JPbM8ypMhbXR9oflY1obraURzmBhELxi2566LTI5LglKLTVxoGgoS/tb aNIYVKhZ/yeiaW0YyMdZ25SfHRDowd9iPxrIzvKs4sPeh/hLE+mWNhWMKV0knUgBvJRZ rgrCCzufoWP1Jkx6uHOgWLuw9HCb4vBRJo3/fYR0NkecD6N2ypDZCvPbkB5Ik6QToqG/ h9hG11Wt8bk0doj5gIokUEuQVE9fwfqURNsFCmQC3g47lX0Fr0mqiJ2iJKd/+s9h0tQd RAUclDuHil5ahk5spohVJ2XnuPx5HGOtYjYiLKS2QtpKr+PRfp/qydileyGWqfs4cDYv 25wQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=wglmNKaLvJ2sCeNHpB3jRZQZumgwlMxMWBMmFpmhOYM=; b=Qz/yLxRl2ItLqexl82nfDuBs63TJRT4GPxk23TGhU3TQhelBHdDohMzjht/0Ocf/bA EPtVbueeDb8Q36pS9CvqtmslDy4voDvQ8IpppUWA+YPcSVWIKeDMSOZupnGXgWs7Cgup LQrolWErEaCgDi44VCam5WcNoWkMMYAHh+N5mpySsTWKjQYrYNfpzhZk7PxI4Wg3T4pr go1OVbbnH6PLr7AoGTe/9jTePEEXJJmQ1zKCdEvsBCUbU+Odr1R67O/VdL2I+c707/Ev 6Ra02XI/W/1XyIKSdnC/M/OBlFM6rV9oQbKdzPOUIo0+S33wz6rGbnD9m9sTatDGc9Gp IXYA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g24si4197167edj.498.2021.08.08.10.30.45; Sun, 08 Aug 2021 10:30:46 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 58DA168A4C3; Sun, 8 Aug 2021 20:29:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DF2BF689A81 for ; Sun, 8 Aug 2021 20:29:52 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 111A3240694 for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id GtVk9t2H9ejW for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 55AD5240695 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 409DE3A0F56; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:37 +0200 Message-Id: <20210808172941.18238-6-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/10] lavu/slicethread: return ENOSYS rather than EINVAL in the dummy func 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bwLjdrZaYw6q EINVAL is the wrong error code here, since the arguments passed to the function are valid. The error is that the function is not implemented in the build, which corresponds to ENOSYS. --- libavutil/slicethread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavutil/slicethread.c b/libavutil/slicethread.c index f928a5cf00..867ce32238 100644 --- a/libavutil/slicethread.c +++ b/libavutil/slicethread.c @@ -240,7 +240,7 @@ int avpriv_slicethread_create(AVSliceThread **pctx, void *priv, int nb_threads) { *pctx = NULL; - return AVERROR(EINVAL); + return AVERROR(ENOSYS); } void avpriv_slicethread_execute(AVSliceThread *ctx, int nb_jobs, int execute_main) From patchwork Sun Aug 8 17:29:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29355 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2207130ioh; Sun, 8 Aug 2021 10:31:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyegidC8NrzxGbISnsoFedUJz9k8hcUDzJ5Qqk63+S5MuDAN2FXtsgwP8ryFZuO31fYnGh/ X-Received: by 2002:a05:6402:1ad9:: with SMTP id ba25mr24547815edb.255.1628443875099; Sun, 08 Aug 2021 10:31:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443875; cv=none; d=google.com; s=arc-20160816; b=AW/gRlp/V/lN0Jz4uOigknpDj4xkf9qSr0PDzfHseEjHebRe8qChRtf7WHdt8gkJ6C uy2qbfE9t9C+d0zkETZNm+c9w2vPxeEN5jqTJADTPTUpb6CtjsJrRRLsX9Z3kwfF7hre /WGe6bl1py/bv8UjuWXEiztCtJIOv4T9VgNOFFwutLsO1RYxnFfwT47CCVcSHpsIp4op /6WyEqCdFdlb7L2OEhlCXXvCynf8tCG8KvnklY3Q4W/Q3F8Wc+5S8Oa0hUYXAW3MFLbJ 7xPP+gULFz+saRnxQqP3kRELteaUJbMc3Yvio+/5vZV1uHG18G/r7imfMZqFsgqyI26S nHKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=jIa2esf9DgQoNf6z3N0TIJoeAqNMtX4whtzo3nGSDTc=; b=qPRLaqZJVO88DE6730H4B3jOT9mYC9KuHrXp222Uplw4sbm69phBKCJKV3Pb+DsbqU GutR59h2wdUZTELmcVeworYAZArTEFL66GS9gdNiyYp4DuBgAImKdSNH+cvrzvkWYcPo VrTeEyne0cVvW/X922AqEQ/qahTAXM4/AFyks8rUQMG8ebW+M2bEJ/50fKcW+uLFnurk KVHeinXpY3JqMp4hPDm3j321qeQHx6JlUC0zNd8DdYQEplD6v9iL4SabXRJsqS9mGcJo JbgwMtMu5/piv0PanxXkgcDRuzHt6hU6mYCfKeZX9hzEb/M/gozhPt95yv+7hWEH5vbD DJBA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w17si14971493ejv.123.2021.08.08.10.31.14; Sun, 08 Aug 2021 10:31:15 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5C5E468A4EC; Sun, 8 Aug 2021 20:30:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 09A8268A473 for ; Sun, 8 Aug 2021 20:29:53 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 3414D240698 for ; Sun, 8 Aug 2021 19:29:49 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id A-SWdRtby0Qy for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 57AE9240697 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 45A9F3A103B; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:38 +0200 Message-Id: <20210808172941.18238-7-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/10] sws: add a new scaling API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: o+ooCRuAqoUe --- libswscale/swscale.c | 280 ++++++++++++++++++++++++++-------- libswscale/swscale.h | 80 ++++++++++ libswscale/swscale_internal.h | 19 +++ libswscale/utils.c | 70 +++++++++ 4 files changed, 386 insertions(+), 63 deletions(-) diff --git a/libswscale/swscale.c b/libswscale/swscale.c index 61dfcb4dff..b4c15d6ada 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -236,13 +236,16 @@ static void lumRangeFromJpeg16_c(int16_t *_dst, int width) av_log(c, AV_LOG_DEBUG, __VA_ARGS__) static int swscale(SwsContext *c, const uint8_t *src[], - int srcStride[], int srcSliceY, - int srcSliceH, uint8_t *dst[], int dstStride[]) + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[], + int dstSliceY, int dstSliceH) { + const int scale_dst = dstSliceY > 0 || dstSliceH < c->dstH; + /* load a few things into local vars to make the code more readable? * and faster */ const int dstW = c->dstW; - const int dstH = c->dstH; + int dstH = c->dstH; const enum AVPixelFormat dstFormat = c->dstFormat; const int flags = c->flags; @@ -331,10 +334,15 @@ static int swscale(SwsContext *c, const uint8_t *src[], } } - /* Note the user might start scaling the picture in the middle so this - * will not get executed. This is not really intended but works - * currently, so people might do it. */ - if (srcSliceY == 0) { + if (scale_dst) { + dstY = dstSliceY; + dstH = dstY + dstSliceH; + lastInLumBuf = -1; + lastInChrBuf = -1; + } else if (srcSliceY == 0) { + /* Note the user might start scaling the picture in the middle so this + * will not get executed. This is not really intended but works + * currently, so people might do it. */ dstY = 0; lastInLumBuf = -1; lastInChrBuf = -1; @@ -352,8 +360,8 @@ static int swscale(SwsContext *c, const uint8_t *src[], srcSliceY, srcSliceH, chrSrcSliceY, chrSrcSliceH, 1); ff_init_slice_from_src(vout_slice, (uint8_t**)dst, dstStride, c->dstW, - dstY, dstH, dstY >> c->chrDstVSubSample, - AV_CEIL_RSHIFT(dstH, c->chrDstVSubSample), 0); + dstY, dstSliceH, dstY >> c->chrDstVSubSample, + AV_CEIL_RSHIFT(dstSliceH, c->chrDstVSubSample), scale_dst); if (srcSliceY == 0) { hout_slice->plane[0].sliceY = lastInLumBuf + 1; hout_slice->plane[1].sliceY = lastInChrBuf + 1; @@ -373,7 +381,7 @@ static int swscale(SwsContext *c, const uint8_t *src[], // First line needed as input const int firstLumSrcY = FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]); - const int firstLumSrcY2 = FFMAX(1 - vLumFilterSize, vLumFilterPos[FFMIN(dstY | ((1 << c->chrDstVSubSample) - 1), dstH - 1)]); + const int firstLumSrcY2 = FFMAX(1 - vLumFilterSize, vLumFilterPos[FFMIN(dstY | ((1 << c->chrDstVSubSample) - 1), c->dstH - 1)]); // First line needed as input const int firstChrSrcY = FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]); @@ -477,7 +485,7 @@ static int swscale(SwsContext *c, const uint8_t *src[], c->chrDither8 = ff_dither_8x8_128[chrDstY & 7]; c->lumDither8 = ff_dither_8x8_128[dstY & 7]; } - if (dstY >= dstH - 2) { + if (dstY >= c->dstH - 2) { /* hmm looks like we can't use MMX here without overwriting * this array's tail */ ff_sws_init_output_funcs(c, &yuv2plane1, &yuv2planeX, &yuv2nv12cX, @@ -491,21 +499,22 @@ static int swscale(SwsContext *c, const uint8_t *src[], desc[i].process(c, &desc[i], dstY, 1); } if (isPlanar(dstFormat) && isALPHA(dstFormat) && !needAlpha) { + int offset = lastDstY - dstSliceY; int length = dstW; int height = dstY - lastDstY; if (is16BPS(dstFormat) || isNBPS(dstFormat)) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat); - fillPlane16(dst[3], dstStride[3], length, height, lastDstY, + fillPlane16(dst[3], dstStride[3], length, height, offset, 1, desc->comp[3].depth, isBE(dstFormat)); } else if (is32BPS(dstFormat)) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat); - fillPlane32(dst[3], dstStride[3], length, height, lastDstY, + fillPlane32(dst[3], dstStride[3], length, height, offset, 1, desc->comp[3].depth, isBE(dstFormat), desc->flags & AV_PIX_FMT_FLAG_FLOAT); } else - fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255); + fillPlane(dst[3], dstStride[3], length, height, offset, 255); } #if HAVE_MMXEXT_INLINE @@ -809,33 +818,42 @@ static void update_palette(SwsContext *c, const uint32_t *pal) } } +static int scale_internal(SwsContext *c, + const uint8_t * const srcSlice[], const int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *const dstSlice[], const int dstStride[], + int dstSliceY, int dstSliceH); + static int scale_gamma(SwsContext *c, const uint8_t * const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, - uint8_t * const dst[], const int dstStride[]) + uint8_t * const dstSlice[], const int dstStride[], + int dstSliceY, int dstSliceH) { - int ret = sws_scale(c->cascaded_context[0], - srcSlice, srcStride, srcSliceY, srcSliceH, - c->cascaded_tmp, c->cascaded_tmpStride); + int ret = scale_internal(c->cascaded_context[0], + srcSlice, srcStride, srcSliceY, srcSliceH, + c->cascaded_tmp, c->cascaded_tmpStride, 0, c->srcH); if (ret < 0) return ret; if (c->cascaded_context[2]) - ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, - c->cascaded_tmpStride, srcSliceY, srcSliceH, c->cascaded1_tmp, - c->cascaded1_tmpStride); + ret = scale_internal(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, + c->cascaded_tmpStride, srcSliceY, srcSliceH, + c->cascaded1_tmp, c->cascaded1_tmpStride, 0, c->dstH); else - ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, - c->cascaded_tmpStride, srcSliceY, srcSliceH, dst, dstStride); + ret = scale_internal(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, + c->cascaded_tmpStride, srcSliceY, srcSliceH, + dstSlice, dstStride, dstSliceY, dstSliceH); if (ret < 0) return ret; if (c->cascaded_context[2]) { - ret = sws_scale(c->cascaded_context[2], (const uint8_t * const *)c->cascaded1_tmp, - c->cascaded1_tmpStride, c->cascaded_context[1]->dstY - ret, - c->cascaded_context[1]->dstY, dst, dstStride); + ret = scale_internal(c->cascaded_context[2], (const uint8_t * const *)c->cascaded1_tmp, + c->cascaded1_tmpStride, c->cascaded_context[1]->dstY - ret, + c->cascaded_context[1]->dstY, + dstSlice, dstStride, dstSliceY, dstSliceH); } return ret; } @@ -843,56 +861,64 @@ static int scale_gamma(SwsContext *c, static int scale_cascaded(SwsContext *c, const uint8_t * const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, - uint8_t * const dst[], const int dstStride[]) + uint8_t * const dstSlice[], const int dstStride[], + int dstSliceY, int dstSliceH) { - int ret = sws_scale(c->cascaded_context[0], - srcSlice, srcStride, srcSliceY, srcSliceH, - c->cascaded_tmp, c->cascaded_tmpStride); + int ret = scale_internal(c->cascaded_context[0], + srcSlice, srcStride, srcSliceY, srcSliceH, + c->cascaded_tmp, c->cascaded_tmpStride, + 0, c->cascaded_context[0]->dstH); if (ret < 0) return ret; - ret = sws_scale(c->cascaded_context[1], - (const uint8_t * const * )c->cascaded_tmp, c->cascaded_tmpStride, - 0, c->cascaded_context[0]->dstH, dst, dstStride); + ret = scale_internal(c->cascaded_context[1], + (const uint8_t * const * )c->cascaded_tmp, c->cascaded_tmpStride, + 0, c->cascaded_context[0]->dstH, + dstSlice, dstStride, dstSliceY, dstSliceH); return ret; } -/** - * swscale wrapper, so we don't need to export the SwsContext. - * Assumes planar YUV to be in YUV order instead of YVU. - */ -int attribute_align_arg sws_scale(struct SwsContext *c, - const uint8_t * const srcSlice[], - const int srcStride[], int srcSliceY, - int srcSliceH, uint8_t *const dst[], - const int dstStride[]) +static int scale_internal(SwsContext *c, + const uint8_t * const srcSlice[], const int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *const dstSlice[], const int dstStride[], + int dstSliceY, int dstSliceH) { - const int frame_start = !c->sliceDir; + const int scale_dst = dstSliceY > 0 || dstSliceH < c->dstH; + const int frame_start = scale_dst || !c->sliceDir; int i, ret; const uint8_t *src2[4]; uint8_t *dst2[4]; - int macro_height = isBayer(c->srcFormat) ? 2 : (1 << c->chrSrcVSubSample); + int macro_height_src = isBayer(c->srcFormat) ? 2 : (1 << c->chrSrcVSubSample); + int macro_height_dst = isBayer(c->dstFormat) ? 2 : (1 << c->chrDstVSubSample); // copy strides, so they can safely be modified int srcStride2[4]; int dstStride2[4]; int srcSliceY_internal = srcSliceY; - if (!srcStride || !dstStride || !dst || !srcSlice) { + if (!srcStride || !dstStride || !dstSlice || !srcSlice) { av_log(c, AV_LOG_ERROR, "One of the input parameters to sws_scale() is NULL, please check the calling code\n"); return AVERROR(EINVAL); } - if ((srcSliceY & (macro_height-1)) || - ((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->srcH) || + if ((srcSliceY & (macro_height_src - 1)) || + ((srcSliceH & (macro_height_src - 1)) && srcSliceY + srcSliceH != c->srcH) || srcSliceY + srcSliceH > c->srcH) { av_log(c, AV_LOG_ERROR, "Slice parameters %d, %d are invalid\n", srcSliceY, srcSliceH); return AVERROR(EINVAL); } + if ((dstSliceY & (macro_height_dst - 1)) || + ((dstSliceH & (macro_height_dst - 1)) && dstSliceY + dstSliceH != c->dstH) || + dstSliceY + dstSliceH > c->dstH) { + av_log(c, AV_LOG_ERROR, "Slice parameters %d, %d are invalid\n", dstSliceY, dstSliceH); + return AVERROR(EINVAL); + } + if (!check_image_pointers(srcSlice, c->srcFormat, srcStride)) { av_log(c, AV_LOG_ERROR, "bad src image pointers\n"); return AVERROR(EINVAL); } - if (!check_image_pointers((const uint8_t* const*)dst, c->dstFormat, dstStride)) { + if (!check_image_pointers((const uint8_t* const*)dstSlice, c->dstFormat, dstStride)) { av_log(c, AV_LOG_ERROR, "bad dst image pointers\n"); return AVERROR(EINVAL); } @@ -902,10 +928,12 @@ int attribute_align_arg sws_scale(struct SwsContext *c, return 0; if (c->gamma_flag && c->cascaded_context[0]) - return scale_gamma(c, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride); + return scale_gamma(c, srcSlice, srcStride, srcSliceY, srcSliceH, + dstSlice, dstStride, dstSliceY, dstSliceH); if (c->cascaded_context[0] && srcSliceY == 0 && srcSliceH == c->cascaded_context[0]->srcH) - return scale_cascaded(c, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride); + return scale_cascaded(c, srcSlice, srcStride, srcSliceY, srcSliceH, + dstSlice, dstStride, dstSliceY, dstSliceH); if (!srcSliceY && (c->flags & SWS_BITEXACT) && c->dither == SWS_DITHER_ED && c->dither_error[0]) for (i = 0; i < 4; i++) @@ -915,18 +943,19 @@ int attribute_align_arg sws_scale(struct SwsContext *c, update_palette(c, (const uint32_t *)srcSlice[1]); memcpy(src2, srcSlice, sizeof(src2)); - memcpy(dst2, dst, sizeof(dst2)); + memcpy(dst2, dstSlice, sizeof(dst2)); memcpy(srcStride2, srcStride, sizeof(srcStride2)); memcpy(dstStride2, dstStride, sizeof(dstStride2)); - if (frame_start) { + if (frame_start && !scale_dst) { if (srcSliceY != 0 && srcSliceY + srcSliceH != c->srcH) { av_log(c, AV_LOG_ERROR, "Slices start in the middle!\n"); return AVERROR(EINVAL); } c->sliceDir = (srcSliceY == 0) ? 1 : -1; - } + } else if (scale_dst) + c->sliceDir = 1; if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) { uint8_t *base; @@ -985,26 +1014,151 @@ int attribute_align_arg sws_scale(struct SwsContext *c, reset_ptr(src2, c->srcFormat); reset_ptr((void*)dst2, c->dstFormat); - if (c->convert_unscaled) - ret = c->convert_unscaled(c, src2, srcStride2, srcSliceY_internal, srcSliceH, + if (c->convert_unscaled) { + int offset = srcSliceY_internal; + int slice_h = srcSliceH; + + // for dst slice scaling, offset the src pointers to match the dst slice + if (scale_dst) { + av_assert0(offset == 0); + for (i = 0; i < 4 && src2[i]; i++) { + if (!src2[i] || (i > 0 && usePal(c->srcFormat))) + break; + src2[i] += (dstSliceY >> ((i == 1 || i == 2) ? c->chrSrcVSubSample : 0)) * srcStride2[i]; + } + offset = 0; + slice_h = dstSliceH; + } + + ret = c->convert_unscaled(c, src2, srcStride2, offset, slice_h, dst2, dstStride2); - else - ret = swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2); + } else { + ret = swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, + dst2, dstStride2, dstSliceY, dstSliceH); + } if (c->dstXYZ && !(c->srcXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) { - int dstY = c->dstY ? c->dstY : srcSliceY + srcSliceH; - uint16_t *dst16 = (uint16_t*)(dst2[0] + (dstY - ret) * dstStride2[0]); - av_assert0(dstY >= ret); - av_assert0(ret >= 0); - av_assert0(c->dstH >= dstY); + uint16_t *dst16; + + if (scale_dst) { + dst16 = (uint16_t *)dst2[0]; + } else { + int dstY = c->dstY ? c->dstY : srcSliceY + srcSliceH; + + av_assert0(dstY >= ret); + av_assert0(ret >= 0); + av_assert0(c->dstH >= dstY); + dst16 = (uint16_t*)(dst2[0] + (dstY - ret) * dstStride2[0]); + } /* replace on the same data */ rgb48Toxyz12(c, dst16, dst16, dstStride2[0]/2, ret); } /* reset slice direction at end of frame */ - if (srcSliceY_internal + srcSliceH == c->srcH) + if ((srcSliceY_internal + srcSliceH == c->srcH) || scale_dst) c->sliceDir = 0; return ret; } + +void sws_frame_end(struct SwsContext *c) +{ + av_frame_unref(c->frame_src); + av_frame_unref(c->frame_dst); + c->src_ranges.nb_ranges = 0; +} + +int sws_frame_start(struct SwsContext *c, AVFrame *dst, const AVFrame *src) +{ + int ret, allocated = 0; + + ret = av_frame_ref(c->frame_src, src); + if (ret < 0) + return ret; + + if (!dst->buf[0]) { + dst->width = c->dstW; + dst->height = c->dstH; + dst->format = c->dstFormat; + + ret = av_frame_get_buffer(dst, 0); + if (ret < 0) + return ret; + allocated = 1; + } + + ret = av_frame_ref(c->frame_dst, dst); + if (ret < 0) { + if (allocated) + av_frame_unref(dst); + + return ret; + } + + return 0; +} + +int sws_send_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height) +{ + int ret; + + ret = ff_range_add(&c->src_ranges, slice_start, slice_height); + if (ret < 0) + return ret; + + return 0; +} + +int sws_receive_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height) +{ + uint8_t *dst[4]; + + /* wait until complete input has been received */ + if (!(c->src_ranges.nb_ranges == 1 && + c->src_ranges.ranges[0].start == 0 && + c->src_ranges.ranges[0].len == c->srcH)) + return AVERROR(EAGAIN); + + for (int i = 0; i < FF_ARRAY_ELEMS(dst) && c->frame_dst->data[i]; i++) { + dst[i] = c->frame_dst->data[i] + + c->frame_dst->linesize[i] * (slice_start >> c->chrDstVSubSample); + } + + return scale_internal(c, (const uint8_t * const *)c->frame_src->data, + c->frame_src->linesize, 0, c->srcH, + dst, c->frame_dst->linesize, slice_start, slice_height); +} + +int sws_scale_frame(struct SwsContext *c, AVFrame *dst, const AVFrame *src) +{ + int ret; + + ret = sws_frame_start(c, dst, src); + if (ret < 0) + return ret; + + ret = sws_send_slice(c, 0, src->height); + if (ret >= 0) + ret = sws_receive_slice(c, 0, dst->height); + + sws_frame_end(c); + + return ret; +} + +/** + * swscale wrapper, so we don't need to export the SwsContext. + * Assumes planar YUV to be in YUV order instead of YVU. + */ +int attribute_align_arg sws_scale(struct SwsContext *c, + const uint8_t * const srcSlice[], + const int srcStride[], int srcSliceY, + int srcSliceH, uint8_t *const dst[], + const int dstStride[]) +{ + return scale_internal(c, srcSlice, srcStride, srcSliceY, srcSliceH, + dst, dstStride, 0, c->dstH); +} diff --git a/libswscale/swscale.h b/libswscale/swscale.h index 50d6d46553..6fb0ad1521 100644 --- a/libswscale/swscale.h +++ b/libswscale/swscale.h @@ -30,6 +30,7 @@ #include #include "libavutil/avutil.h" +#include "libavutil/frame.h" #include "libavutil/log.h" #include "libavutil/pixfmt.h" #include "version.h" @@ -218,6 +219,85 @@ int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[]); +/** + * Scale source data from src and write the output to dst. + * + * This is merely a convenience wrapper around + * - sws_frame_start() + * - sws_send_slice(0, src->height) + * - sws_receive_slice(0, dst->height) + * - sws_frame_end() + * + * @param dst The destination frame. See documentation for sws_frame_start() for + * more details. + * @param src The source frame. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int sws_scale_frame(struct SwsContext *c, AVFrame *dst, const AVFrame *src); + +/** + * Initialize the scaling process for a given pair of source/destination frames. + * Must be called before any calls to sws_send_slice() and sws_receive_slice(). + * + * This function will retain references to src and dst. + * + * @param dst The destination frame. + * + * The data buffers may either be already allocated by the caller or + * left clear, in which case they will be allocated by the scaler. + * The latter may have performance advantages - e.g. in certain cases + * some output planes may be references to input planes, rather than + * copies. + * + * Output data will be written into this frame in successful + * sws_receive_slice() calls. + * @param src The source frame. The data buffers must be allocated, but the + * frame data does not have to be ready at this point. Data + * availability is then signalled by sws_send_slice(). + * @return 0 on success, a negative AVERROR code on failure + * + * @see sws_frame_end() + */ +int sws_frame_start(struct SwsContext *c, AVFrame *dst, const AVFrame *src); + +/** + * Finish the scaling process for a pair of source/destination frames previously + * submitted with sws_frame_start(). Must be called after all sws_send_slice() + * and sws_receive_slice() calls are done, before any new sws_frame_start() + * calls. + */ +void sws_frame_end(struct SwsContext *c); + +/** + * Indicate that a horizontal slice of input data is available in the source + * frame previously provided to sws_frame_start(). The slices may be provided in + * any order, but may not overlap. For vertically subsampled pixel formats, the + * slices must be aligned according to subsampling. + * + * @param slice_start first row of the slice + * @param slice_height number of rows in the slice + * + * @return a non-negative number on success, a negative AVERROR code on failure. + */ +int sws_send_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height); + +/** + * Request a horizontal slice of the output data to be written into the frame + * previously provided to sws_frame_start(). + * + * @param slice_start first row of the slice + * @param slice_height number of rows in the slice + * + * @return a non-negative number if the data was successfully written into the output + * AVERROR(EAGAIN) if more input data needs to be provided before the + * output can be produced + * another negative AVERROR code on other kinds of scaling failure + */ +int sws_receive_slice(struct SwsContext *c, unsigned int slice_start, + unsigned int slice_height); + /** * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 673407636a..c1098d6026 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -27,6 +27,7 @@ #include "libavutil/avassert.h" #include "libavutil/avutil.h" #include "libavutil/common.h" +#include "libavutil/frame.h" #include "libavutil/intreadwrite.h" #include "libavutil/log.h" #include "libavutil/mem_internal.h" @@ -80,6 +81,19 @@ typedef enum SwsAlphaBlend { SWS_ALPHA_BLEND_NB, } SwsAlphaBlend; +typedef struct Range { + unsigned int start; + unsigned int len; +} Range; + +typedef struct RangeList { + Range *ranges; + unsigned int nb_ranges; + int ranges_allocated; +} RangeList; + +int ff_range_add(RangeList *r, unsigned int start, unsigned int len); + typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[]); @@ -313,6 +327,11 @@ typedef struct SwsContext { int sliceDir; ///< Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top). double param[2]; ///< Input parameters for scaling algorithms that need them. + AVFrame *frame_src; + AVFrame *frame_dst; + + RangeList src_ranges; + /* The cascaded_* fields allow spliting a scaler task into multiple * sequential steps, this is for example used to limit the maximum * downscaling factor that needs to be supported in one scaler. diff --git a/libswscale/utils.c b/libswscale/utils.c index 176fc6fd63..55e0d42daa 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -1424,6 +1424,11 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, if (!FF_ALLOCZ_TYPED_ARRAY(c->formatConvBuffer, FFALIGN(srcW * 2 + 78, 16) * 2)) goto nomem; + c->frame_src = av_frame_alloc(); + c->frame_dst = av_frame_alloc(); + if (!c->frame_src || !c->frame_dst) + goto nomem; + c->srcBpc = desc_src->comp[0].depth; if (c->srcBpc < 8) c->srcBpc = 8; @@ -2250,6 +2255,11 @@ void sws_freeContext(SwsContext *c) for (i = 0; i < 4; i++) av_freep(&c->dither_error[i]); + av_frame_free(&c->frame_src); + av_frame_free(&c->frame_dst); + + av_freep(&c->src_ranges.ranges); + av_freep(&c->vLumFilter); av_freep(&c->vChrFilter); av_freep(&c->hLumFilter); @@ -2364,3 +2374,63 @@ struct SwsContext *sws_getCachedContext(struct SwsContext *context, int srcW, } return context; } + +int ff_range_add(RangeList *rl, unsigned int start, unsigned int len) +{ + Range *tmp; + unsigned int idx; + + /* find the first existing range after the new one */ + for (idx = 0; idx < rl->nb_ranges; idx++) + if (rl->ranges[idx].start > start) + break; + + /* check for overlap */ + if (idx > 0) { + Range *prev = &rl->ranges[idx - 1]; + if (prev->start + prev->len > start) + return AVERROR(EINVAL); + } + if (idx < rl->nb_ranges) { + Range *next = &rl->ranges[idx]; + if (start + len > next->start) + return AVERROR(EINVAL); + } + + tmp = av_fast_realloc(rl->ranges, &rl->ranges_allocated, + (rl->nb_ranges + 1) * sizeof(*rl->ranges)); + if (!tmp) + return AVERROR(ENOMEM); + rl->ranges = tmp; + + memmove(rl->ranges + idx + 1, rl->ranges + idx, + sizeof(*rl->ranges) * (rl->nb_ranges - idx)); + rl->ranges[idx].start = start; + rl->ranges[idx].len = len; + rl->nb_ranges++; + + /* merge ranges */ + if (idx > 0) { + Range *prev = &rl->ranges[idx - 1]; + Range *cur = &rl->ranges[idx]; + if (prev->start + prev->len == cur->start) { + prev->len += cur->len; + memmove(rl->ranges + idx - 1, rl->ranges + idx, + sizeof(*rl->ranges) * (rl->nb_ranges - idx)); + rl->nb_ranges--; + idx--; + } + } + if (idx < rl->nb_ranges - 1) { + Range *cur = &rl->ranges[idx]; + Range *next = &rl->ranges[idx + 1]; + if (cur->start + cur->len == next->start) { + cur->len += next->len; + memmove(rl->ranges + idx, rl->ranges + idx + 1, + sizeof(*rl->ranges) * (rl->nb_ranges - idx - 1)); + rl->nb_ranges--; + } + } + + return 0; +} From patchwork Sun Aug 8 17:29:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29357 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2207035ioh; Sun, 8 Aug 2021 10:31:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw0VUj+F11pgmuMWdwgCpISVNLlcMnxdMDfrLMOjX+ztmw+rPUsFLCKIHE44M37+MCCk/xD X-Received: by 2002:a17:906:c9cb:: with SMTP id hk11mr18590621ejb.544.1628443865498; Sun, 08 Aug 2021 10:31:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443865; cv=none; d=google.com; s=arc-20160816; b=C9Hz1ebUxJRS56zBWH0UObKvj3sVq21V+z30gPJWUN61cwv7cHkg+q9312buLqJktg tVdKhJqa5ee4F4m9pSmI+cXAKjbcEVmjX+QWB0K55WVtokrZToFo41MFhXfrZ8zkTqmP 8HfvTUoqFC8H3wOc3cLhQ+QT++vXdr2n1hGsmPLr2x41hgDLajmbswEc9LgHbuCSnR/b 7zmIcvqKlMGHR1lHoBfpU4ckNNlRD8n2x51qAEMNWsIt6QxFgJJK5d43Aldgv/OqfhTB p57ATdWXvPPPfljRYjj0hm20O/BjcZbDexA7v0PYDHvkG+7WzfP6IIVaY3//BI+xYHZ7 +mtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=dTybKsgHqWshw2XvDxmVLQsD7Sr4LCv22Ucc4dxxCc8=; b=r/3jvYq2SOX6q8ZtjcTj8bPRq4EdVey9MzqtLvUHwURpDUlXpC39pGG5TbwWoqgMGH KCJ46M1oAwWVYogIm5rAJo/UkT+7Ogf/vgyA60NT+obPbBmQZcHEIl3LfIFtnisJO2GL OglRm0uKMsyfsNGyTUSgkIrIxM4RneG0bFBXxD1UqrJoGkP5ez3fbSz5UaQmgUlsfmnJ uHp7Fh9lUawE7j/1dxaotvpgQvYXZnnuzR8lcGBvLyiWySgb4jygwawFoPDZg5c5uDt4 w5XRy3s3b79FYfX+1W9G67SxZ25COg4Fuhq0slYIzlyjeiSDGBfrlSwgfdu7FAsH+ti+ 7Oog== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q6si16114950edj.487.2021.08.08.10.31.05; Sun, 08 Aug 2021 10:31:05 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 64F9968A46C; Sun, 8 Aug 2021 20:30:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 02A4B68A46C for ; Sun, 8 Aug 2021 20:29:53 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id DAF74240699 for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id dTffBEkh0_GO for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 593E0240698 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 49B493A1098; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:39 +0200 Message-Id: <20210808172941.18238-8-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/10] lavfi/vf_scale: convert to the frame-based sws API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: PQyNmJyqeubd --- libavfilter/vf_scale.c | 73 ++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 7e70665cdd..b62fb37d4b 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -619,29 +619,54 @@ static int request_frame_ref(AVFilterLink *outlink) return ff_request_frame(outlink->src->inputs[1]); } -static int scale_slice(ScaleContext *scale, AVFrame *out_buf, AVFrame *cur_pic, struct SwsContext *sws, int y, int h, int mul, int field) +static void frame_offset(AVFrame *frame, int dir, int is_pal) { - const uint8_t *in[4]; - uint8_t *out[4]; - int in_stride[4],out_stride[4]; - int i; - - for (i=0; i<4; i++) { - int vsub= ((i+1)&2) ? scale->vsub : 0; - ptrdiff_t in_offset = ((y>>vsub)+field) * cur_pic->linesize[i]; - ptrdiff_t out_offset = field * out_buf->linesize[i]; - in_stride[i] = cur_pic->linesize[i] * mul; - out_stride[i] = out_buf->linesize[i] * mul; - in[i] = FF_PTR_ADD(cur_pic->data[i], in_offset); - out[i] = FF_PTR_ADD(out_buf->data[i], out_offset); - } - if (scale->input_is_pal) - in[1] = cur_pic->data[1]; - if (scale->output_is_pal) - out[1] = out_buf->data[1]; + for (int i = 0; i < 4 && frame->data[i]; i++) { + if (i == 1 && is_pal) + break; + frame->data[i] += frame->linesize[i] * dir; + } +} + +static int scale_field(ScaleContext *scale, AVFrame *dst, AVFrame *src, + int field) +{ + int orig_h_src = src->height; + int orig_h_dst = dst->height; + int ret; + + // offset the data pointers for the bottom field + if (field) { + frame_offset(src, 1, scale->input_is_pal); + frame_offset(dst, 1, scale->output_is_pal); + } + + // take every second line + for (int i = 0; i < 4; i++) { + src->linesize[i] *= 2; + dst->linesize[i] *= 2; + } + src->height /= 2; + dst->height /= 2; - return sws_scale(sws, in, in_stride, y/mul, h, - out,out_stride); + ret = sws_scale_frame(scale->isws[field], dst, src); + if (ret < 0) + return ret; + + // undo the changes we made above + for (int i = 0; i < 4; i++) { + src->linesize[i] /= 2; + dst->linesize[i] /= 2; + } + src->height = orig_h_src; + dst->height = orig_h_dst; + + if (field) { + frame_offset(src, -1, scale->input_is_pal); + frame_offset(dst, -1, scale->output_is_pal); + } + + return 0; } static int scale_frame(AVFilterLink *link, AVFrame *in, AVFrame **frame_out) @@ -788,11 +813,11 @@ scale: INT_MAX); if (scale->interlaced>0 || (scale->interlaced<0 && in->interlaced_frame)) { - ret = scale_slice(scale, out, in, scale->isws[0], 0, (link->h+1)/2, 2, 0); + ret = scale_field(scale, out, in, 0); if (ret >= 0) - ret = scale_slice(scale, out, in, scale->isws[1], 0, link->h /2, 2, 1); + ret = scale_field(scale, out, in, 1); } else { - ret = scale_slice(scale, out, in, scale->sws, 0, link->h, 1, 0); + ret = sws_scale_frame(scale->sws, out, in); } av_frame_free(&in); From patchwork Sun Aug 8 17:29:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29356 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2207220ioh; Sun, 8 Aug 2021 10:31:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxIKXQL56TsVjZearuNzxqX+21dGoypcPKCRegTlphKLF7zM8DIF27Ptqe9TmN1KVXF/Sta X-Received: by 2002:a17:907:1691:: with SMTP id hc17mr19301394ejc.522.1628443885008; Sun, 08 Aug 2021 10:31:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443885; cv=none; d=google.com; s=arc-20160816; b=wkzC/uGcpV6vdAIoz5IhG4LlOEUCAr5aD/Ge0RJvdNUgupV/O+PAU+oo4wRGT4cvfg Q0vy1P9DqKHvnJ4AgfVor25jeUKmyZd5esY1lmUFAZdj+37mKCiQPUPuskFBONMYbU8A adZnjmmRqRuWsuXynRr3zrpMZDv+eQdwE8H1+7Ru2Ee192LjXwfhKa2/RjJBF6khIPyx cTx0wNHRo137rTvwdEOszw5bwcFXnkfOIcOWIsiIiGcsILOw+36r+0LCm+mBSxtk7E45 QYsC6qr2Ni8qCxbFg3CkHAsqEHz7tDSGWEXPbMs6fvP1N0ClWOUzdh75Wd6JC4F0YR+O Jp4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=/CopudM5B4tNCujIcjVWdAZlvi4xOsOtW/E/HSqoUKI=; b=LVGQegXM1WOE0N3ghqGOimVCiYvG7y/3+YH6noZXTXY2Ryc11ZSuY8kh8xPTPtSCqL OFJ3VJ1RbXqNrL+yBhwB4K/pHNjbbNGS19lGOUIzUpoRlhw+eZtQWvBGBsQrXV42zoxf Xx2zHof6l9DzkMLGlpbwsdqQTagPhmHPt0TrElG+MEa3WEFo7XVwhd98zJrybnkZ0Y/h To5izZgzAmPD+sBLhKKdKVxngWYSiXUakW84waNM7RbKUkmQuMzke+PYLDiQFYgdOMiH PF2ZWDKsvWI2HAd6abYEvGUu7fXgQVury2ZHfAnINnSEE/TljMcHCIqSpbvQvEr2qebq ft/g== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e12si14225245ejk.703.2021.08.08.10.31.24; Sun, 08 Aug 2021 10:31:24 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3596368A507; Sun, 8 Aug 2021 20:30:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6221768A480 for ; Sun, 8 Aug 2021 20:29:53 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 759BD240697 for ; Sun, 8 Aug 2021 19:29:49 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id eCIEgYXtrwSZ for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 6182324069A for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4E6A43A10FB; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:40 +0200 Message-Id: <20210808172941.18238-9-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/10] sws: implement slice 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: D9ZlW1UIM59P --- libswscale/options.c | 3 ++ libswscale/swscale.c | 56 ++++++++++++++++++++++++ libswscale/swscale_internal.h | 14 ++++++ libswscale/utils.c | 82 +++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+) diff --git a/libswscale/options.c b/libswscale/options.c index 7eb2752543..4b71a23e37 100644 --- a/libswscale/options.c +++ b/libswscale/options.c @@ -81,6 +81,9 @@ static const AVOption swscale_options[] = { { "uniform_color", "blend onto a uniform color", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_ALPHA_BLEND_UNIFORM},INT_MIN, INT_MAX, VE, "alphablend" }, { "checkerboard", "blend onto a checkerboard", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_ALPHA_BLEND_CHECKERBOARD},INT_MIN, INT_MAX, VE, "alphablend" }, + { "threads", "number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, VE, "threads" }, + { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = VE, "threads" }, + { NULL } }; diff --git a/libswscale/swscale.c b/libswscale/swscale.c index b4c15d6ada..cec7d07812 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -1122,6 +1122,27 @@ int sws_receive_slice(struct SwsContext *c, unsigned int slice_start, c->src_ranges.ranges[0].len == c->srcH)) return AVERROR(EAGAIN); + if (c->slicethread) { + int nb_jobs = c->slice_ctx[0]->dither == SWS_DITHER_ED ? 1 : c->nb_slice_ctx; + int ret = 0; + + c->dst_slice_start = slice_start; + c->dst_slice_height = slice_height; + + avpriv_slicethread_execute(c->slicethread, nb_jobs, 0); + + for (int i = 0; i < c->nb_slice_ctx; i++) { + if (c->slice_err[i] < 0) { + ret = c->slice_err[i]; + break; + } + } + + memset(c->slice_err, 0, c->nb_slice_ctx * sizeof(*c->slice_err)); + + return ret; + } + for (int i = 0; i < FF_ARRAY_ELEMS(dst) && c->frame_dst->data[i]; i++) { dst[i] = c->frame_dst->data[i] + c->frame_dst->linesize[i] * (slice_start >> c->chrDstVSubSample); @@ -1159,6 +1180,41 @@ int attribute_align_arg sws_scale(struct SwsContext *c, int srcSliceH, uint8_t *const dst[], const int dstStride[]) { + if (c->nb_slice_ctx) + c = c->slice_ctx[0]; + return scale_internal(c, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride, 0, c->dstH); } + +void ff_sws_slice_worker(void *priv, int jobnr, int threadnr, + int nb_jobs, int nb_threads) +{ + SwsContext *parent = priv; + SwsContext *c = parent->slice_ctx[threadnr]; + + const int slice_height = FFALIGN(FFMAX((parent->dst_slice_height + nb_jobs - 1) / nb_jobs, 1), + 1 << c->chrDstVSubSample); + const int slice_start = jobnr * slice_height; + const int slice_end = FFMIN((jobnr + 1) * slice_height, parent->dst_slice_height); + int err = 0; + + if (slice_end > slice_start) { + uint8_t *dst[4] = { NULL }; + + for (int i = 0; i < FF_ARRAY_ELEMS(dst) && parent->frame_dst->data[i]; i++) { + const int vshift = (i == 1 || i == 2) ? c->chrDstVSubSample : 0; + const ptrdiff_t offset = parent->frame_dst->linesize[i] * + ((slice_start + parent->dst_slice_start) >> vshift); + + dst[i] = parent->frame_dst->data[i] + offset; + } + + err = scale_internal(c, (const uint8_t * const *)parent->frame_src->data, + parent->frame_src->linesize, 0, c->srcH, + dst, parent->frame_dst->linesize, + parent->dst_slice_start + slice_start, slice_end - slice_start); + } + + parent->slice_err[threadnr] = err; +} diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index c1098d6026..6ca44b710e 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -33,6 +33,7 @@ #include "libavutil/mem_internal.h" #include "libavutil/pixfmt.h" #include "libavutil/pixdesc.h" +#include "libavutil/slicethread.h" #include "libavutil/ppc/util_altivec.h" #define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long @@ -300,6 +301,15 @@ typedef struct SwsContext { */ const AVClass *av_class; + AVSliceThread *slicethread; + struct SwsContext **slice_ctx; + int *slice_err; + int nb_slice_ctx; + + // values passed to current sws_receive_slice() call + unsigned int dst_slice_start; + unsigned int dst_slice_height; + /** * Note that src, dst, srcStride, dstStride will be copied in the * sws_scale() wrapper so they can be freely modified here. @@ -325,6 +335,7 @@ typedef struct SwsContext { int chrDstVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination image. int vChrDrop; ///< Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user. int sliceDir; ///< Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top). + int nb_threads; ///< Number of threads used for scaling double param[2]; ///< Input parameters for scaling algorithms that need them. AVFrame *frame_src; @@ -1080,6 +1091,9 @@ void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn yuv2interleavedX_fn yuv2nv12cX, yuv2packed1_fn yuv2packed1, yuv2packed2_fn yuv2packed2, yuv2packedX_fn yuv2packedX, yuv2anyX_fn yuv2anyX, int use_mmx); +void ff_sws_slice_worker(void *priv, int jobnr, int threadnr, + int nb_jobs, int nb_threads); + //number of extra lines to process #define MAX_LINES_AHEAD 4 diff --git a/libswscale/utils.c b/libswscale/utils.c index 55e0d42daa..7a0c5a5f17 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -49,6 +49,7 @@ #include "libavutil/mathematics.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" +#include "libavutil/slicethread.h" #include "libavutil/thread.h" #include "libavutil/aarch64/cpu.h" #include "libavutil/ppc/cpu.h" @@ -871,6 +872,18 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], const AVPixFmtDescriptor *desc_src; int need_reinit = 0; + if (c->nb_slice_ctx) { + for (int i = 0; i < c->nb_slice_ctx; i++) { + int ret = sws_setColorspaceDetails(c->slice_ctx[i], inv_table, + srcRange, table, dstRange, + brightness, contrast, saturation); + if (ret < 0) + return ret; + } + + return 0; + } + handle_formats(c); desc_dst = av_pix_fmt_desc_get(c->dstFormat); desc_src = av_pix_fmt_desc_get(c->srcFormat); @@ -1005,6 +1018,12 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, if (!c ) return -1; + if (c->nb_slice_ctx) { + return sws_getColorspaceDetails(c->slice_ctx[0], inv_table, srcRange, + table, dstRange, brightness, contrast, + saturation); + } + *inv_table = c->srcColorspaceTable; *table = c->dstColorspaceTable; *srcRange = range_override_needed(c->srcFormat) ? 1 : c->srcRange; @@ -1170,6 +1189,55 @@ static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt) } } +static int context_init_threaded(SwsContext *c, + SwsFilter *src_filter, SwsFilter *dst_filter) +{ + int ret; + + ret = avpriv_slicethread_create(&c->slicethread, (void*)c, + ff_sws_slice_worker, NULL, c->nb_threads); + if (ret == AVERROR(ENOSYS)) { + c->nb_threads = 1; + return 0; + } else if (ret < 0) + return ret; + + c->nb_threads = ret; + + c->slice_ctx = av_mallocz_array(c->nb_threads, sizeof(*c->slice_ctx)); + c->slice_err = av_mallocz_array(c->nb_threads, sizeof(*c->slice_err)); + if (!c->slice_ctx || !c->slice_err) + return AVERROR(ENOMEM); + + for (int i = 0; i < c->nb_threads; i++) { + c->slice_ctx[i] = sws_alloc_context(); + if (!c->slice_ctx[i]) + return AVERROR(ENOMEM); + + ret = av_opt_copy((void*)c->slice_ctx[i], (void*)c); + if (ret < 0) + return ret; + + c->slice_ctx[i]->nb_threads = 1; + + ret = sws_init_context(c->slice_ctx[i], src_filter, dst_filter); + if (ret < 0) + return ret; + + c->nb_slice_ctx++; + + if (c->slice_ctx[i]->dither == SWS_DITHER_ED) + break; + } + + c->frame_src = av_frame_alloc(); + c->frame_dst = av_frame_alloc(); + if (!c->frame_src || !c->frame_dst) + return AVERROR(ENOMEM); + + return 0; +} + av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter) { @@ -1192,6 +1260,13 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, static const float float_mult = 1.0f / 255.0f; static AVOnce rgb2rgb_once = AV_ONCE_INIT; + if (c->nb_threads != 1) { + ret = context_init_threaded(c, srcFilter, dstFilter); + if (ret < 0 || c->nb_threads > 1) + return ret; + // threading disabled in this build, init as single-threaded + } + cpu_flags = av_get_cpu_flags(); flags = c->flags; emms_c(); @@ -2252,6 +2327,13 @@ void sws_freeContext(SwsContext *c) if (!c) return; + for (i = 0; i < c->nb_slice_ctx; i++) + sws_freeContext(c->slice_ctx[i]); + av_freep(&c->slice_ctx); + av_freep(&c->slice_err); + + avpriv_slicethread_free(&c->slicethread); + for (i = 0; i < 4; i++) av_freep(&c->dither_error[i]); From patchwork Sun Aug 8 17:29:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29359 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2206947ioh; Sun, 8 Aug 2021 10:30:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxiO2FBT6aY+40DU2J9e7CJXvbtrZgNdPcoxCrTvIzYFvagCPWBRNfpdppdHEYqwNyUJKJs X-Received: by 2002:a17:906:504:: with SMTP id j4mr18586594eja.245.1628443856662; Sun, 08 Aug 2021 10:30:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628443856; cv=none; d=google.com; s=arc-20160816; b=MIhO7fGx7Ykr3I8H3rRaOJDmeioZlTkD2lmKw+/PfxFz41cNJmIbRmcBUPvtoFWez3 KNhxlkm+Uot9txlK2uDIlqV63JyxzqCHU6yK0YmgrzPgNkX70crFg/cgVso+wzTJTUuE zrUQF411YcK6lRbflOaIGe8FW8VmK1rckpE4Wxm5Ct/2eLDgyt+vuWo9SQUGHWw8CCAj XnmjAcG2Qx1EvrfjhZfhD569DDOP3xjPpJYMV1z3sgFy43+LHWmdumKGfDL+1txC/7sS ScSqPmbpQzKt8kwSG13RPLbZ11mOgFZyqqciFs/YYI50k1zVk1yEMOQ11RAzt2pm7w+r tVBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=UM4oJukJ1CP0iqOeokW34EeWb6RbZpvbWQd8SPVxXA4=; b=OXCVMrfhCCGzqdvdKCwMPcQedGtO6iFWz+EGt5sBzR9j53VmGzpmU7D3eIK1gmTmqu nVXG8yYBSQ0J9cUkdjYDrO3auD8e2KLTCIcEcLmKMVRgotQI6vyxpb7bSX73M+4C8wLs eFmnVKJPxW0k+5/aGt+sxhNmTupF1jMS5zTOnIJ/VyRIIerveR3N2loHjPdE5VPHjIOy 5y7PFgjFZvytVA5NT5k1o47/C3sjmWAn96pqo6RUiFWRQdbxy0QwOYLXcJCjihCQJhqz JryaO/hA/m1WSuZaOkVyC6GcLbAsU9CfRGRvC2Yk3ImFDLhoAM2d21JUqVJRRGw/43ye XaMg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ho38si15365506ejc.727.2021.08.08.10.30.56; Sun, 08 Aug 2021 10:30:56 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 50AE268A33F; Sun, 8 Aug 2021 20:30:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E73D468A46B for ; Sun, 8 Aug 2021 20:29:52 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 4A0F9240695 for ; Sun, 8 Aug 2021 19:29:48 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id YXy_nx8ograd for ; Sun, 8 Aug 2021 19:29:47 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 5B1B7240699 for ; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 524383A1124; Sun, 8 Aug 2021 19:29:46 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Aug 2021 19:29:41 +0200 Message-Id: <20210808172941.18238-10-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210808172941.18238-1-anton@khirnov.net> References: <20210808172941.18238-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/10] lavfi/vf_scale: pass the thread count to the scaler 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bpSOfgWS9RE3 --- libavfilter/vf_scale.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index b62fb37d4b..14e202bf77 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -542,6 +542,7 @@ static int config_props(AVFilterLink *outlink) av_opt_set_int(*s, "sws_flags", scale->flags, 0); av_opt_set_int(*s, "param0", scale->param[0], 0); av_opt_set_int(*s, "param1", scale->param[1], 0); + av_opt_set_int(*s, "threads", ff_filter_get_nb_threads(ctx), 0); if (scale->in_range != AVCOL_RANGE_UNSPECIFIED) av_opt_set_int(*s, "src_range", scale->in_range == AVCOL_RANGE_JPEG, 0);