PR #25527 opened by ashveikin URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25527 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25527.patch
This patch adds checkasm test for cfhd. >From e2aa72e3f222055854109bcf05693d91f0a0c8f8 Mon Sep 17 00:00:00 2001 From: Aleksander Shveikin <[email protected]> Date: Tue, 27 Oct 2026 16:01:37 +0200 Subject: [PATCH] tests/checkasm: add test for cfhd Signed-off-by: Aleksander Shveikin <[email protected]> --- tests/checkasm/Makefile | 1 + tests/checkasm/cfhddsp.c | 159 ++++++++++++++++++++++++++++++++++++++ tests/checkasm/checkasm.c | 3 + tests/checkasm/checkasm.h | 1 + tests/fate/checkasm.mak | 1 + 5 files changed, 165 insertions(+) create mode 100644 tests/checkasm/cfhddsp.c diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile index e465c580a2e..952aee8ee77 100644 --- a/tests/checkasm/Makefile +++ b/tests/checkasm/Makefile @@ -38,6 +38,7 @@ AVCODECOBJS-$(CONFIG_ALAC_DECODER) += alacdsp.o AVCODECOBJS-$(CONFIG_APV_DECODER) += apv_dsp.o AVCODECOBJS-$(CONFIG_BITPACKED_DECODER) += bitpackeddec.o AVCODECOBJS-$(CONFIG_CAVS_DECODER) += cavsdsp.o +AVCODECOBJS-$(CONFIG_CFHD_DECODER) += cfhddsp.o AVCODECOBJS-$(CONFIG_DCA_DECODER) += dcadsp.o synth_filter.o AVCODECOBJS-$(CONFIG_DIRAC_DECODER) += diracdsp.o AVCODECOBJS-$(CONFIG_EXR_DECODER) += exrdsp.o diff --git a/tests/checkasm/cfhddsp.c b/tests/checkasm/cfhddsp.c new file mode 100644 index 00000000000..b455df2ac8c --- /dev/null +++ b/tests/checkasm/cfhddsp.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2026 Aleksander Shveikin <[email protected]> + * + * 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 <string.h> + +#include "checkasm.h" +#include "libavcodec/cfhddsp.h" +#include "libavutil/mem_internal.h" + +static const int depth[] = { 10, 12 }; +static const int width[] = { 16, 63, 64 }; + +#define WIDTH_MAX 64 +#define HEIGHT 16 +#define PADDING 16 // x86 asm may write up to 16 * int16_t past the last row + +#define randomize_buffers(low, high, dst0, dst1, in_size, out_size, mask) \ + do { \ + for (int i = 0; i < (in_size); i++) { \ + low[i] = rnd() & (mask); \ + high[i] = rnd() & (mask); \ + } \ + for (int i = 0; i < (out_size); i++) \ + dst0[i] = (int16_t)rnd(); \ + memcpy(dst1, dst0, (out_size) * sizeof(*dst0)); \ + } while (0) + +static void check_horiz_filter(void) +{ + CFHDDSPContext c; + + // depth/bayer don't change the horiz_filter pointer for asm + ff_cfhddsp_init(&c, 10, 0); + + LOCAL_ALIGNED_16(int16_t, low, [WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, high, [WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst0, [2 * WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst1, [2 * WIDTH_MAX * HEIGHT + PADDING]); + + randomize_buffers(low, high, dst0, dst1, + HEIGHT * WIDTH_MAX, 2 * HEIGHT * WIDTH_MAX + PADDING, + (1 << 12) - 1); + + declare_func(void, int16_t *output, ptrdiff_t ostride, + const int16_t *low, ptrdiff_t lstride, + const int16_t *high, ptrdiff_t hstride, + int width, int height); + + for (int i = 0; i < FF_ARRAY_ELEMS(width); i++) { + int w = width[i]; + if (check_func(c.horiz_filter, "horiz_filter_%d", w)) { + call_ref(dst0, w, low, w, high, w, w, HEIGHT); + call_new(dst1, w, low, w, high, w, w, HEIGHT); + checkasm_check(int16_t, dst0, 2 * w * sizeof(int16_t), + dst1, 2 * w * sizeof(int16_t), + 2 * w * HEIGHT, 1, "dst"); + if (w == WIDTH_MAX) + bench_new(dst1, w, low, w, high, w, w, HEIGHT); + } + } +} + +static void check_vert_filter(void) +{ + CFHDDSPContext c; + + ff_cfhddsp_init(&c, 10, 0); + + LOCAL_ALIGNED_16(int16_t, low, [WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, high, [WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst0, [2 * WIDTH_MAX * HEIGHT + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst1, [2 * WIDTH_MAX * HEIGHT + PADDING]); + + randomize_buffers(low, high, dst0, dst1, + HEIGHT * WIDTH_MAX, 2 * HEIGHT * WIDTH_MAX + PADDING, + (1 << 12) - 1); + + declare_func(void, int16_t *output, ptrdiff_t ostride, + const int16_t *low, ptrdiff_t lstride, + const int16_t *high, ptrdiff_t hstride, + int width, int height); + + for (int i = 0; i < FF_ARRAY_ELEMS(width); i++) { + int w = width[i]; + if (check_func(c.vert_filter, "vert_filter_%d", w)) { + call_ref(dst0, WIDTH_MAX, low, w, high, w, w, HEIGHT); + call_new(dst1, WIDTH_MAX, low, w, high, w, w, HEIGHT); + checkasm_check(int16_t, dst0, WIDTH_MAX * sizeof(int16_t), + dst1, WIDTH_MAX * sizeof(int16_t), + w, 2 * HEIGHT, "dst"); + if (w == WIDTH_MAX) + bench_new(dst1, WIDTH_MAX, low, w, high, w, w, HEIGHT); + } + } +} + +static void check_horiz_filter_clip(void) +{ + CFHDDSPContext c; + + LOCAL_ALIGNED_16(int16_t, low, [WIDTH_MAX + PADDING]); + LOCAL_ALIGNED_16(int16_t, high, [WIDTH_MAX + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst0, [2 * WIDTH_MAX + PADDING]); + LOCAL_ALIGNED_16(int16_t, dst1, [2 * WIDTH_MAX + PADDING]); + + declare_func(void, int16_t *output, const int16_t *low, + const int16_t *high, int width, int clip); + + for (int i = 0; i < FF_ARRAY_ELEMS(depth); i++) { + int d = depth[i]; + const int mask = (1 << d) - 1; + + ff_cfhddsp_init(&c, d, 0); + + for (int j = 0; j < FF_ARRAY_ELEMS(width); j++) { + int w = width[j]; + if (check_func(c.horiz_filter_clip, "horiz_filter_clip%d_%d", d, w)) { + randomize_buffers(low, high, dst0, dst1, + w, 2 * w + PADDING, mask); + call_ref(dst0, low, high, w, d); + call_new(dst1, low, high, w, d); + checkasm_check(int16_t, dst0, 2 * w * sizeof(int16_t), + dst1, 2 * w * sizeof(int16_t), + 2 * w, 1, "dst"); + if (w == WIDTH_MAX) + bench_new(dst1, low, high, w, d); + } + } + } +} + +void checkasm_check_cfhddsp(void) +{ + check_horiz_filter(); + report("horiz_filter"); + + check_vert_filter(); + report("vert_filter"); + + check_horiz_filter_clip(); + report("horiz_filter_clip"); +} diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index 6a5c2c23fb7..0b7e3c4d95f 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -90,6 +90,9 @@ static const CheckasmTest tests[] = { #if CONFIG_CAVS_DECODER { "cavsdsp", checkasm_check_cavsdsp }, #endif + #if CONFIG_CFHD_DECODER + { "cfhddsp", checkasm_check_cfhddsp }, + #endif #if CONFIG_DCA_DECODER { "dcadsp", checkasm_check_dcadsp }, { "synth_filter", checkasm_check_synth_filter }, diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index f713fe36da8..c07c8a2e777 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -46,6 +46,7 @@ void checkasm_check_blend(void); void checkasm_check_blockdsp(void); void checkasm_check_bswapdsp(void); void checkasm_check_cavsdsp(void); +void checkasm_check_cfhddsp(void); void checkasm_check_colordetect(void); void checkasm_check_colorspace(void); void checkasm_check_crc(void); diff --git a/tests/fate/checkasm.mak b/tests/fate/checkasm.mak index 4da6f6a3a3f..6b8eb636052 100644 --- a/tests/fate/checkasm.mak +++ b/tests/fate/checkasm.mak @@ -13,6 +13,7 @@ FATE_CHECKASM = fate-checkasm-aacencdsp \ fate-checkasm-blockdsp \ fate-checkasm-bswapdsp \ fate-checkasm-cavsdsp \ + fate-checkasm-cfhddsp \ fate-checkasm-crc \ fate-checkasm-dcadsp \ fate-checkasm-diracdsp \ -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
