From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 339B443FD7 for ; Mon, 23 Jan 2023 11:54:42 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A809568BD96; Mon, 23 Jan 2023 13:54:39 +0200 (EET) Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A953B68BC09 for ; Mon, 23 Jan 2023 13:54:32 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 38E162404F5 for ; Mon, 23 Jan 2023 12:54:32 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id mQMRK9p7jxDR for ; Mon, 23 Jan 2023 12:54:31 +0100 (CET) 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 31F1C2404EC for ; Mon, 23 Jan 2023 12:54:31 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 7E71E3A0344 for ; Mon, 23 Jan 2023 12:54:23 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Jan 2023 12:54:18 +0100 Message-Id: <20230123115418.16440-2-anton@khirnov.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20230123115418.16440-1-anton@khirnov.net> References: <20230123115418.16440-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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --- Now using floats for comparison --- libavfilter/Makefile | 3 +- tests/Makefile | 4 +- tests/fate-run.sh | 6 + tests/fate/filter-video.mak | 19 +++ tests/ref/fate/filter-spherical-barrel | Bin 0 -> 160 bytes tests/ref/fate/filter-spherical-c3x2 | Bin 0 -> 160 bytes tools/Makefile | 1 + tools/spherical_compare.c | 176 +++++++++++++++++++++++++ 8 files changed, 207 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 d4e38bd4e8..2ae174a381 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -626,7 +626,8 @@ SKIPHEADERS-$(CONFIG_OPENCL) += opencl.h SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_vpp.h SKIPHEADERS-$(CONFIG_VULKAN) += vulkan.h vulkan_filter.h -TOOLS = graph2dot +TOOLS = graph2dot \ + spherical_compare TESTPROGS = drawutils filtfmts formats integral TESTPROGS-$(CONFIG_DNN) += dnn-layer-avgpool dnn-layer-conv2d dnn-layer-dense \ dnn-layer-depth2space dnn-layer-mathbinary \ diff --git a/tests/Makefile b/tests/Makefile index 1d50e1d175..078d8aa3ce 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -259,7 +259,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) @@ -273,6 +274,7 @@ $(FATE_FFPROBE) $(FATE_FFMPEG_FFPROBE) $(FATE_SAMPLES_FFPROBE) $(FATE_SAMPLES_FF $(FATE_SAMPLES_FASTSTART): tools/qt-faststart$(EXESUF) $(FATE_SAMPLES_DUMP_DATA) $(FATE_SAMPLES_DUMP_DATA-yes): 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 61cc59acc0..41e6da5c5d 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -572,6 +572,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 63873a7a07..731d686cee 100644 --- a/tests/fate/filter-video.mak +++ b/tests/fate/filter-video.mak @@ -698,6 +698,25 @@ fate-filter-refcmp-blockdetect-yuv: CMD = cmp_metadata blockdetect yuv420p 0.015 FATE_FILTER_CMP_METADATA-$(CONFIG_BLURDETECT_FILTER) += fate-filter-refcmp-blurdetect-yuv fate-filter-refcmp-blurdetect-yuv: CMD = cmp_metadata blurdetect yuv420p 0.015 +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) + +$(FATE_SAMPLES_SPHERICAL_COMPARE): CMP = oneoff +$(FATE_SAMPLES_SPHERICAL_COMPARE): CMP_UNIT = f32 + +fate-filter-spherical: $(FATE_SAMPLES_SPHERICAL_COMPARE) + FATE_FILTER_CMP_METADATA-$(CONFIG_SITI_FILTER) += fate-filter-refcmp-siti-yuv fate-filter-refcmp-siti-yuv: CMD = cmp_metadata siti yuv420p 0.015 diff --git a/tests/ref/fate/filter-spherical-barrel b/tests/ref/fate/filter-spherical-barrel new file mode 100644 index 0000000000000000000000000000000000000000..11d36af7a1b26d4012a8ff5dd7973cb081a50af7 GIT binary patch literal 160 zcmZ2dP;1Y?&;ZBstrs1apo!UXVTuLqxPYOq&=ylnzV$qYx^?cDVu!z;!%!E~f6fsA Dpn5ON literal 0 HcmV?d00001 diff --git a/tests/ref/fate/filter-spherical-c3x2 b/tests/ref/fate/filter-spherical-c3x2 new file mode 100644 index 0000000000000000000000000000000000000000..c59584abd5b89baf7a7bc15f6c4aef1f30f91a9a GIT binary patch literal 160 zcmbO=Gt!=cp#hAS6x7>UP0KLjFFaQ7m literal 0 HcmV?d00001 diff --git a/tools/Makefile b/tools/Makefile index 4afa23342d..b8c88cd4d3 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 tools/decode_simple.o: | tools diff --git a/tools/spherical_compare.c b/tools/spherical_compare.c new file mode 100644 index 0000000000..59b1283a18 --- /dev/null +++ b/tools/spherical_compare.c @@ -0,0 +1,176 @@ +/* + * 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) { + static const char *keys[] = { + "lavfi.ssim360.Y", + "lavfi.ssim360.U", + "lavfi.ssim360.V", + "lavfi.ssim360.All", + "lavfi.ssim360.dB", + }; + + av_frame_unref(pd->frame); + 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(stderr, "frame %"PRIu64"\n", pd->nb_frames); + + for (int i = 0; i < FF_ARRAY_ELEMS(keys); i++) { + const AVDictionaryEntry *t = av_dict_get(pd->frame->metadata, keys[i], NULL, 0); + float val; + size_t written; + + if (!t) { + fprintf(stderr, "Metadata key '%s' not present in frame %"PRIu64"\n", + keys[i], pd->nb_frames); + return AVERROR(EINVAL); + } + fprintf(stderr, "%s=%s\n", t->key, t->value); + + val = strtof(t->value, NULL); + + written = fwrite(&val, sizeof(val), 1, stdout); + if (written != 1) { + fprintf(stderr, "Error writing to stdout\n"); + return AVERROR(EIO); + } + } + + pd->nb_frames++; + } + + 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; +} -- 2.35.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".