From patchwork Fri Mar 25 18:52:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Avison X-Patchwork-Id: 34984 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1432319uaj; Fri, 25 Mar 2022 11:53:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyYEezwZPsWKh3fYuB+wItp0iew7v7EU4kiP8xhP4O1njUMVWK/pilY7nBne9ShcPWkxLXh X-Received: by 2002:a17:906:1384:b0:6df:c7d0:9131 with SMTP id f4-20020a170906138400b006dfc7d09131mr12981481ejc.134.1648234436571; Fri, 25 Mar 2022 11:53:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648234436; cv=none; d=google.com; s=arc-20160816; b=adYu9xbWCiXvaG9hVn9401iBUszULRZ0dMI3K8srbYIzUEuIIkywLKphsu+TFeFFq+ eccpUqiLBN39ERKVAVbV8gpMHeeaOxRyuDB20+/Wi5esV6bmzy5RXYBkRK2vaHxVlgJV m1VNjAEYWjUlIIplY1LZzn6cIYRolF2LKANhUCzlPQYtiQjAasgxtdevWshs6Fnf8SPW h066oPKQSg7onE/jfV299o8SzZ3h/QNTAPK0mycL3OKAjdXLq309WfgHC7IEYOnvglVM Ve4TE7lyXVnxos3UabdWgjOJtXWv+Dds84y9L2Lye2Q1ic0UTZQwQuh6l31KQC2vnnAE ZQtQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc: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=GJOA2ylyM1zyKRLyxV3Sf73rXdvnJkTBURhww+XUo/A=; b=kJchXjHBZtGK3jeceO7bTe+8k3mdN00cqgx/MbQ0lU6aDqXiDYfuL/OExfYJiSVNYE xgIPFnlfb+fjIt6ntyWoVK5WckHM8iQ5FXn216sx5fcWG31hfr3c9ymF3tqAOhs4W8FF NMI2bEm/gvF1IFR/BPS7cy7Welpptc8VZfkugu3kVU1YKAd3w2xCSyR9uBbRVe2FZdy3 cw73s5HppxAXk/wDL4lKz77KhKcTqzbwSDHa6rgvN3GRstEug08w+H+n0s84HYTnbSpY 1PoTZVD6UFCHYq06xGiUJENLiE2X+glZpK4b+6wchhXC9QPLdsAX0vV6jReBbohrhmc+ rjgQ== 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 f2-20020a170906494200b006e0003920c7si3541788ejt.406.2022.03.25.11.53.56; Fri, 25 Mar 2022 11:53: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 2B98C68B20E; Fri, 25 Mar 2022 20:53:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from outmail148108.authsmtp.net (unknown [62.13.148.108]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D635968A6F6 for ; Fri, 25 Mar 2022 20:53:37 +0200 (EET) Received: from punt18.authsmtp.com (punt18.authsmtp.com [62.13.128.225]) by punt15.authsmtp.com. (8.15.2/8.15.2) with ESMTP id 22PIrb1W014555 for ; Fri, 25 Mar 2022 18:53:37 GMT (envelope-from bavison@riscosopen.org) Received: from mail-c233.authsmtp.com (mail-c233.authsmtp.com [62.13.128.233]) by punt18.authsmtp.com. (8.15.2/8.15.2) with ESMTP id 22PIrbIt032735; Fri, 25 Mar 2022 18:53:37 GMT (envelope-from bavison@riscosopen.org) Received: from rpi2021 (237.63.9.51.dyn.plus.net [51.9.63.237]) (authenticated bits=0) by mail.authsmtp.com (8.15.2/8.15.2) with ESMTPSA id 22PIrYuw046391 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 25 Mar 2022 18:53:34 GMT (envelope-from bavison@riscosopen.org) Received: by rpi2021 (sSMTP sendmail emulation); Fri, 25 Mar 2022 18:53:34 +0000 From: Ben Avison To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 18:52:48 +0000 Message-Id: <20220325185257.513933-2-bavison@riscosopen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220325185257.513933-1-bavison@riscosopen.org> References: <20220317185819.466470-1-bavison@riscosopen.org> <20220325185257.513933-1-bavison@riscosopen.org> MIME-Version: 1.0 X-Server-Quench: e02beac6-ac6c-11ec-a0f2-84349711df28 X-AuthReport-Spam: If SPAM / abuse - report it at: http://www.authsmtp.com/abuse X-AuthRoute: OCd1YggXA1ZfRRob ESQCJDVBUg4iPRpU DBlFKhFVNl8UURhQ KkJXbgASJgdBAnRQ QXkJW1ZWQFx5U2Z2 YQlUIwBcfENQWQZ0 UktOXVBXFgB3AFID BH5nEHA3MAVCfn15 ZAhjWHReXAovdUQv Fx8HE3BXNmEzdWEe BRNFJgMCch5CehxB Y1d+VSdbY21JDRoR IyQTd2hoemwHHWxe QgwGLlsJRBRDNzIw Dw4JRDk0BQUEQWA3 KBs+YlIRFkIWOUYz N1RpV1McLxIIQhFT BF1WaAAA X-Authentic-SMTP: 61633632303230.1021:7600 X-AuthFastPath: 0 (Was 255) X-AuthVirus-Status: No virus detected - but ensure you scan with your own anti-virus system. Subject: [FFmpeg-devel] [PATCH 01/10] checkasm: Add vc1dsp in-loop deblocking filter tests X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Ben Avison Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P2370U6cTPqE Note that the benchmarking results for these functions are highly dependent upon the input data. Therefore, each function is benchmarked twice, corresponding to the best and worst case complexity of the reference C implementation. The performance of a real stream decode will fall somewhere between these two extremes. Signed-off-by: Ben Avison --- tests/checkasm/Makefile | 1 + tests/checkasm/checkasm.c | 3 ++ tests/checkasm/checkasm.h | 1 + tests/checkasm/vc1dsp.c | 94 +++++++++++++++++++++++++++++++++++++++ tests/fate/checkasm.mak | 1 + 5 files changed, 100 insertions(+) create mode 100644 tests/checkasm/vc1dsp.c diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile index f768b1144e..7133a6ee66 100644 --- a/tests/checkasm/Makefile +++ b/tests/checkasm/Makefile @@ -11,6 +11,7 @@ AVCODECOBJS-$(CONFIG_H264PRED) += h264pred.o AVCODECOBJS-$(CONFIG_H264QPEL) += h264qpel.o AVCODECOBJS-$(CONFIG_LLVIDDSP) += llviddsp.o AVCODECOBJS-$(CONFIG_LLVIDENCDSP) += llviddspenc.o +AVCODECOBJS-$(CONFIG_VC1DSP) += vc1dsp.o AVCODECOBJS-$(CONFIG_VP8DSP) += vp8dsp.o AVCODECOBJS-$(CONFIG_VIDEODSP) += videodsp.o diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index 748d6a9f3a..c2efd81b6d 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -147,6 +147,9 @@ static const struct { #if CONFIG_V210_ENCODER { "v210enc", checkasm_check_v210enc }, #endif + #if CONFIG_VC1DSP + { "vc1dsp", checkasm_check_vc1dsp }, + #endif #if CONFIG_VP8DSP { "vp8dsp", checkasm_check_vp8dsp }, #endif diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index c3192d8c23..52ab18a5b1 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -78,6 +78,7 @@ void checkasm_check_sw_scale(void); void checkasm_check_utvideodsp(void); void checkasm_check_v210dec(void); void checkasm_check_v210enc(void); +void checkasm_check_vc1dsp(void); void checkasm_check_vf_eq(void); void checkasm_check_vf_gblur(void); void checkasm_check_vf_hflip(void); diff --git a/tests/checkasm/vc1dsp.c b/tests/checkasm/vc1dsp.c new file mode 100644 index 0000000000..db916d08f9 --- /dev/null +++ b/tests/checkasm/vc1dsp.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2022 Ben Avison + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 "checkasm.h" + +#include "libavcodec/vc1dsp.h" + +#include "libavutil/common.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/mem_internal.h" + +#define RANDOMIZE_BUFFER8_MID_WEIGHTED(name, size) \ + do { \ + uint8_t *p##0 = name##0, *p##1 = name##1; \ + int i = (size); \ + while (i-- > 0) { \ + int x = 0x80 | (rnd() & 0x7F); \ + x >>= rnd() % 9; \ + if (rnd() & 1) \ + x = -x; \ + *p##1++ = *p##0++ = 0x80 + x; \ + } \ + } while (0) + +#define CHECK_LOOP_FILTER(func) \ + do { \ + if (check_func(h.func, "vc1dsp." #func)) { \ + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, int, int); \ + for (int count = 1000; count > 0; --count) { \ + int pq = rnd() % 31 + 1; \ + RANDOMIZE_BUFFER8_MID_WEIGHTED(filter_buf, 24 * 24); \ + call_ref(filter_buf0 + 4 * 24 + 4, 24, pq); \ + call_new(filter_buf1 + 4 * 24 + 4, 24, pq); \ + if (memcmp(filter_buf0, filter_buf1, 24 * 24)) \ + fail(); \ + } \ + } \ + for (int j = 0; j < 24; ++j) \ + for (int i = 0; i < 24; ++i) \ + filter_buf1[24*j + i] = 0x60 + 0x40 * (i >= 4 && j >= 4); \ + if (check_func(h.func, "vc1dsp." #func "_bestcase")) { \ + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, int, int); \ + bench_new(filter_buf1 + 4 * 24 + 4, 24, 1); \ + (void) checked_call; \ + } \ + if (check_func(h.func, "vc1dsp." #func "_worstcase")) { \ + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, int, int); \ + bench_new(filter_buf1 + 4 * 24 + 4, 24, 31); \ + (void) checked_call; \ + } \ + } while (0) + +void checkasm_check_vc1dsp(void) +{ + /* Deblocking filter buffers are big enough to hold a 16x16 block, + * plus 4 rows/columns above/left to hold filter inputs (depending on + * whether v or h neighbouring block edge) plus 4 rows/columns + * right/below to catch write overflows */ + LOCAL_ALIGNED_4(uint8_t, filter_buf0, [24 * 24]); + LOCAL_ALIGNED_4(uint8_t, filter_buf1, [24 * 24]); + + VC1DSPContext h; + + ff_vc1dsp_init(&h); + + CHECK_LOOP_FILTER(vc1_v_loop_filter4); + CHECK_LOOP_FILTER(vc1_h_loop_filter4); + CHECK_LOOP_FILTER(vc1_v_loop_filter8); + CHECK_LOOP_FILTER(vc1_h_loop_filter8); + CHECK_LOOP_FILTER(vc1_v_loop_filter16); + CHECK_LOOP_FILTER(vc1_h_loop_filter16); + + report("loop_filter"); +} diff --git a/tests/fate/checkasm.mak b/tests/fate/checkasm.mak index 6db8f09d12..99e6bb13c4 100644 --- a/tests/fate/checkasm.mak +++ b/tests/fate/checkasm.mak @@ -32,6 +32,7 @@ FATE_CHECKASM = fate-checkasm-aacpsdsp \ fate-checkasm-utvideodsp \ fate-checkasm-v210dec \ fate-checkasm-v210enc \ + fate-checkasm-vc1dsp \ fate-checkasm-vf_blend \ fate-checkasm-vf_colorspace \ fate-checkasm-vf_eq \