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]

Reply via email to