From patchwork Mon Aug 9 10:29:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 29377 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp2736204ioh; Mon, 9 Aug 2021 03:29:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx+qS2+NgdPMEDu7PgybBFU0HkRf8D3Meg5B0MvESt4gjYVn/gjpFnacQujECR+39y/Cebu X-Received: by 2002:a17:907:1c08:: with SMTP id nc8mr22484678ejc.514.1628504981200; Mon, 09 Aug 2021 03:29:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628504981; cv=none; d=google.com; s=arc-20160816; b=o5ljy+J3ZeHJqCwgKB7w3vht+EZwrUtBI9b8xkNpdb+cSei8U8nv48E/RJxpLgcM+i SZ8FFqYyFI7YcSVLwuLSd22wGcI5B7okJpstv3B1NyQPPo5shaxDKJmXDV2g0RMcrxI1 u+8BEM308M8Pg4oZO1CuNzhCNyC23zQVMZ0wf/6Hpm+oyP9LP25Ty0e9XPt8guPl0SOF 6f30j6wvcBds5cjrtUEanC8jUmbTABQM4hNEEbAHv6ilRJ6rRzp/iMgrTgqsQ8SnUeh1 m31KVE3LBlfws8eLyYa63evJc9XOj9iA4MsdwOwCZhTh67ot35tbEVesL0V/mXO0aSIp tNKg== 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=4zf3cgYGGtpXlbWXuVMMs1jeaZQaCd9IgGwrQacoIwA=; b=MxU3TrC1C1iQnxPPNLKaRyKIZRXdpA4InNP0c6o05o4546PdqkHG4HejxYw9s+JcJU lmgG4UFRs2kDA7oAlbCvH5nbwx3/u7RvuIUawlX0nIzmkcwJx/2giEPfEUJscC0eNz/u bsqrBVyxEUiFXbGqs9v+a+EjnxtOW4kzz6+caoKiCBP0A0DipJ7rCmniWKRt4Fdq/FG4 2sosV/CpUBQ0qP06w35PbMxRwtmSGmmW5IUVr5LX3siiwOgaSAw8hsJYWxsQ6yh2+afy mTYW8qUVQsLGj6UKK519yRT8gmtur8Emp8UOXRo1RwJdbty1wKzX/8HLDMsH/FzjgVS3 i1kw== 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 r7si3129792ejz.374.2021.08.09.03.29.40; Mon, 09 Aug 2021 03:29:41 -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 8BDB668A0F1; Mon, 9 Aug 2021 13:29:36 +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 3E9D16897E8 for ; Mon, 9 Aug 2021 13:29:29 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id ED181240692 for ; Mon, 9 Aug 2021 12:29:28 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id GimjAADnzJSL for ; Mon, 9 Aug 2021 12:29:27 +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 B99EB2404C8 for ; Mon, 9 Aug 2021 12:29:27 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 88F853A0F56; Mon, 9 Aug 2021 12:29:27 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Mon, 9 Aug 2021 12:29:19 +0200 Message-Id: <20210809102919.387-2-anton@khirnov.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210809102919.387-1-anton@khirnov.net> References: <20210809102919.387-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] FATE: add tests for v360/ssim360 filters 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: pwmvLhU08A3r --- libavfilter/Makefile | 3 +- tests/Makefile | 4 +- tests/fate-run.sh | 6 + tests/fate/filter-video.mak | 14 ++ tests/ref/fate/filter-spherical-barrel | 192 +++++++++++++++++++++++++ tests/ref/fate/filter-spherical-c3x2 | 192 +++++++++++++++++++++++++ tools/Makefile | 1 + tools/spherical_compare.c | 148 +++++++++++++++++++ 8 files changed, 558 insertions(+), 2 deletions(-) create mode 100644 tests/ref/fate/filter-spherical-barrel create mode 100644 tests/ref/fate/filter-spherical-c3x2 create mode 100644 tools/spherical_compare.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index b0348ccfa3..27dd0c4b47 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -559,7 +559,8 @@ SKIPHEADERS-$(CONFIG_VULKAN) += vulkan.h OBJS-$(CONFIG_LIBGLSLANG) += glslang.o -TOOLS = graph2dot +TOOLS = graph2dot \ + spherical_compare TESTPROGS = drawutils filtfmts formats integral TOOLS-$(CONFIG_LIBZMQ) += zmqsend diff --git a/tests/Makefile b/tests/Makefile index e42e66d81b..aba31b59d0 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -208,7 +208,8 @@ FATE_EXTERN-$(CONFIG_FFMPEG) += $(FATE_SAMPLES_AVCONV) $(FATE_SAMPLES_FFMPEG) FATE_EXTERN-$(CONFIG_FFPROBE) += $(FATE_SAMPLES_FFPROBE) FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_SAMPLES_FFMPEG_FFPROBE-yes) FATE_EXTERN-$(call ALLYES, FFMPEG FFPROBE) += $(FATE_SAMPLES_FFMPEG_FFPROBE) -FATE_EXTERN += $(FATE_EXTERN-yes) $(FATE_SAMPLES_FASTSTART) +FATE_EXTERN += $(FATE_EXTERN-yes) $(FATE_SAMPLES_FASTSTART) \ + $(FATE_SAMPLES_SPHERICAL_COMPARE) FATE += $(FATE-yes) @@ -222,6 +223,7 @@ $(FATE_FFPROBE) $(FATE_FFMPEG_FFPROBE) $(FATE_SAMPLES_FFPROBE) $(FATE_SAMPLES_FF $(FATE_SAMPLES_FASTSTART): tools/qt-faststart$(EXESUF) $(FATE_SAMPLES_DUMP_DATA): tools/venc_data_dump$(EXESUF) $(FATE_SAMPLES_SCALE_SLICE): tools/scale_slice_test$(EXESUF) +$(FATE_SAMPLES_SPHERICAL_COMPARE): tools/spherical_compare$(EXESUF) ifdef SAMPLES FATE += $(FATE_EXTERN) diff --git a/tests/fate-run.sh b/tests/fate-run.sh index cd16f5fcff..afdbb4d2ec 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -507,6 +507,12 @@ venc_data(){ run tools/venc_data_dump${EXECSUF} ${file} ${stream} ${frames} ${threads} ${thread_type} } +spherical_compare(){ + file=$1 + filterchain=$2 + run tools/spherical_compare${EXECSUF} ${file} ${filterchain} +} + null(){ : } diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak index 16f24a8422..a28c3f7aec 100644 --- a/tests/fate/filter-video.mak +++ b/tests/fate/filter-video.mak @@ -845,6 +845,20 @@ FATE_FILTER_SAMPLES-$(call ALLYES, MOV_DEMUXER H264_DECODER AAC_FIXED_DECODER PC fate-filter-meta-4560-rotate0: tests/data/file4560-override2rotate0.mov fate-filter-meta-4560-rotate0: CMD = framecrc -auto_conversion_filters -flags +bitexact -c:a aac_fixed -i $(TARGET_PATH)/tests/data/file4560-override2rotate0.mov +SPHERICAL_DEPS = MATROSKA_DEMUXER VP8_DECODER V360_FILTER SSIM360_FILTER +SPHERICAL_SAMPLE = $(TARGET_SAMPLES)/spherical/Worlds_First_Live_360_Rocket_Launch-_Orbital_ATK_CRS-7_cut.mkv + +FATE_FILTER_SPHERICAL += fate-filter-spherical-c3x2 +fate-filter-spherical-c3x2: CMD = spherical_compare $(SPHERICAL_SAMPLE) \ + "split[in][ref];[in]v360=input=e:output=c3x2[main];[main][ref]ssim360=main_projection=c3x2:ref_projection=e" + +FATE_FILTER_SPHERICAL += fate-filter-spherical-barrel +fate-filter-spherical-barrel: CMD = spherical_compare $(SPHERICAL_SAMPLE) \ + "split[in][ref];[in]v360=input=e:output=barrel[main];[main][ref]ssim360=main_projection=barrel:ref_projection=e" + +FATE_SAMPLES_SPHERICAL_COMPARE-$(call ALLYES, $(SPHERICAL_DEPS)) += $(FATE_FILTER_SPHERICAL) +FATE_SAMPLES_SPHERICAL_COMPARE += $(FATE_SAMPLES_SPHERICAL_COMPARE-yes) + REFCMP_DEPS = FFMPEG LAVFI_INDEV TESTSRC2_FILTER AVGBLUR_FILTER METADATA_FILTER FATE_FILTER-$(call ALLYES, $(REFCMP_DEPS) PSNR_FILTER) += fate-filter-refcmp-psnr-rgb diff --git a/tests/ref/fate/filter-spherical-barrel b/tests/ref/fate/filter-spherical-barrel new file mode 100644 index 0000000000..a2ff075a26 --- /dev/null +++ b/tests/ref/fate/filter-spherical-barrel @@ -0,0 +1,192 @@ +frame 0 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=25.19 +frame 1 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=25.04 +frame 2 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.95 +frame 3 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.88 +frame 4 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.80 +frame 5 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.75 +frame 6 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.70 +frame 7 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.63 +frame 8 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.58 +frame 9 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.54 +frame 10 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.51 +frame 11 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.49 +frame 12 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.46 +frame 13 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.42 +frame 14 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.41 +frame 15 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.39 +frame 16 +lavfi.ssim360.Y=0.97 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.33 +frame 17 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.30 +frame 18 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.27 +frame 19 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.25 +frame 20 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.22 +frame 21 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.19 +frame 22 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.16 +frame 23 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.14 +frame 24 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.08 +frame 25 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.02 +frame 26 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=24.01 +frame 27 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=23.98 +frame 28 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=23.96 +frame 29 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=23.95 +frame 30 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=23.93 +frame 31 +lavfi.ssim360.Y=0.96 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=1.00 +lavfi.ssim360.dB=23.91 diff --git a/tests/ref/fate/filter-spherical-c3x2 b/tests/ref/fate/filter-spherical-c3x2 new file mode 100644 index 0000000000..7c3b269f40 --- /dev/null +++ b/tests/ref/fate/filter-spherical-c3x2 @@ -0,0 +1,192 @@ +frame 0 +lavfi.ssim360.Y=0.84 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.99 +lavfi.ssim360.dB=18.61 +frame 1 +lavfi.ssim360.Y=0.84 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=18.21 +frame 2 +lavfi.ssim360.Y=0.84 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=18.03 +frame 3 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.90 +frame 4 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.72 +frame 5 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.62 +frame 6 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.52 +frame 7 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.36 +frame 8 +lavfi.ssim360.Y=0.83 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.32 +frame 9 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.21 +frame 10 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.16 +frame 11 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.09 +frame 12 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=1.00 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=17.04 +frame 13 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.96 +frame 14 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.95 +frame 15 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.88 +frame 16 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.81 +frame 17 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.77 +frame 18 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.69 +frame 19 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.68 +frame 20 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.65 +frame 21 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.59 +frame 22 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.56 +frame 23 +lavfi.ssim360.Y=0.82 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.53 +frame 24 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.51 +frame 25 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.47 +frame 26 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.45 +frame 27 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.40 +frame 28 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.34 +frame 29 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.31 +frame 30 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.24 +frame 31 +lavfi.ssim360.Y=0.81 +lavfi.ssim360.U=0.99 +lavfi.ssim360.V=1.00 +lavfi.ssim360.All=0.98 +lavfi.ssim360.dB=16.20 diff --git a/tools/Makefile b/tools/Makefile index f4d1327b9f..3cd252d712 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -19,6 +19,7 @@ tools/target_io_dem_fuzzer.o: tools/target_dem_fuzzer.c tools/venc_data_dump$(EXESUF): tools/decode_simple.o tools/scale_slice_test$(EXESUF): tools/decode_simple.o +tools/spherical_compare$(EXESUF): tools/decode_simple.o OUTDIRS += tools diff --git a/tools/spherical_compare.c b/tools/spherical_compare.c new file mode 100644 index 0000000000..bcd7858636 --- /dev/null +++ b/tools/spherical_compare.c @@ -0,0 +1,148 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#include "decode_simple.h" + +#include "libavutil/avassert.h" +#include "libavutil/avstring.h" +#include "libavutil/common.h" +#include "libavutil/dict.h" +#include "libavutil/error.h" +#include "libavutil/pixdesc.h" + +#include "libavformat/avformat.h" + +#include "libavcodec/avcodec.h" + +#include "libavfilter/avfilter.h" +#include "libavfilter/buffersink.h" +#include "libavfilter/buffersrc.h" + +typedef struct PrivData { + const char *filterchain; + AVFilterGraph *fg; + AVFilterContext *src; + AVFilterContext *sink; + AVFrame *frame; + + uint64_t nb_frames; +} PrivData; + +static int process_frame(DecodeContext *dc, AVFrame *frame) +{ + PrivData *pd = dc->opaque; + int ret; + + if (!pd->fg) { + AVFilterInOut *inputs, *outputs; + char filterchain[1024]; + + if (!frame) + return 0; + + snprintf(filterchain, sizeof(filterchain), + "buffer@src=width=%d:height=%d:pix_fmt=%s:time_base=%d/%d," + "%s,buffersink@sink", + frame->width, frame->height, + av_get_pix_fmt_name(frame->format), + dc->stream->time_base.num, dc->stream->time_base.den, + pd->filterchain); + + pd->fg = avfilter_graph_alloc(); + if (!pd->fg) + return AVERROR(ENOMEM); + + ret = avfilter_graph_parse2(pd->fg, filterchain, &inputs, &outputs); + if (ret < 0) + return ret; + + av_assert0(!inputs && !outputs); + + pd->src = avfilter_graph_get_filter(pd->fg, "buffer@src"); + pd->sink = avfilter_graph_get_filter(pd->fg, "buffersink@sink"); + av_assert0(pd->src && pd->sink); + + ret = avfilter_graph_config(pd->fg, pd->fg); + if (ret < 0) + return ret; + + pd->frame = av_frame_alloc(); + if (!pd->frame) + return AVERROR(ENOMEM); + } + + ret = av_buffersrc_write_frame(pd->src, frame); + if (ret < 0) + return ret; + + while (ret >= 0) { + AVDictionaryEntry *t = NULL; + + ret = av_buffersink_get_frame(pd->sink, pd->frame); + if ((frame && ret == AVERROR(EAGAIN)) || + (!frame && ret == AVERROR_EOF)) + return 0; + else if (ret < 0) + return ret; + + fprintf(stdout, "frame %"PRIu64"\n", pd->nb_frames++); + while ((t = av_dict_get(pd->frame->metadata, "lavfi.ssim360", t, AV_DICT_IGNORE_SUFFIX))) + fprintf(stdout, "%s=%s\n", t->key, t->value); + } + + return 0; +} + +int main(int argc, char **argv) +{ + PrivData pd; + DecodeContext dc; + + const char *filename, *fc; + int ret = 0; + + if (argc <= 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 0; + } + + filename = argv[1]; + fc = argv[2]; + + memset(&pd, 0, sizeof(pd)); + pd.filterchain = fc; + + ret = ds_open(&dc, filename, 0); + if (ret < 0) + goto finish; + + dc.process_frame = process_frame; + dc.opaque = &pd; + + ret = ds_run(&dc); + +finish: + avfilter_graph_free(&pd.fg); + av_frame_free(&pd.frame); + ds_free(&dc); + return ret; +}