[x265] [PATCH 2/3] testbench: Fix interpfilter harness short type input value range

Gerda Zsejke More gerdazsejke.more at arm.com
Wed Jul 9 11:48:42 UTC 2025


When performing vertical interpolation with short-type input, the
data originates from horizontal interpolation. Take this into
consideration when creating maximum and minimum value test inputs.
---
 source/test/ipfilterharness.cpp | 25 ++++++++++++++-----------
 source/test/ipfilterharness.h   | 15 ++++++++++++---
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/source/test/ipfilterharness.cpp b/source/test/ipfilterharness.cpp
index 1cc91d671..6131a3785 100644
--- a/source/test/ipfilterharness.cpp
+++ b/source/test/ipfilterharness.cpp
@@ -37,11 +37,14 @@ IPFilterHarness::IPFilterHarness()
     for (int i = 0; i < TEST_BUF_SIZE; i++)
     {
         pixel_test_buff[0][i] = rand() & PIXEL_MAX;
-        short_test_buff[0][i] = (rand() % (2 * SMAX)) - SMAX;
+        luma_short_test_buff[0][i] = (rand() % (LUMA_SMAX - LUMA_SMIN + 1)) + LUMA_SMIN;
+        chroma_short_test_buff[0][i] = (rand() % (CHROMA_SMAX - CHROMA_SMIN + 1)) + CHROMA_SMIN;
         pixel_test_buff[1][i] = PIXEL_MIN;
-        short_test_buff[1][i] = (int16_t)SMIN;
+        luma_short_test_buff[1][i] = LUMA_SMIN;
+        chroma_short_test_buff[1][i] = CHROMA_SMIN;
         pixel_test_buff[2][i] = PIXEL_MAX;
-        short_test_buff[2][i] = SMAX;
+        luma_short_test_buff[2][i] = LUMA_SMAX;
+        chroma_short_test_buff[2][i] = CHROMA_SMAX;
     }
 
     memset(IPF_C_output_p, 0xCD, TEST_BUF_SIZE * sizeof(pixel));
@@ -190,13 +193,13 @@ bool IPFilterHarness::check_IPFilterChroma_sp_primitive(filter_sp_t ref, filter_
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(chroma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_p,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, chroma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_p,
                     rand_dstStride,
@@ -225,13 +228,13 @@ bool IPFilterHarness::check_IPFilterChroma_ss_primitive(filter_ss_t ref, filter_
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(chroma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_s,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, chroma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_s,
                     rand_dstStride,
@@ -371,13 +374,13 @@ bool IPFilterHarness::check_IPFilterLuma_sp_primitive(filter_sp_t ref, filter_sp
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(luma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_p,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, luma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_p,
                     rand_dstStride,
@@ -406,13 +409,13 @@ bool IPFilterHarness::check_IPFilterLuma_ss_primitive(filter_ss_t ref, filter_ss
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(luma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_s,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, luma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_s,
                     rand_dstStride,
diff --git a/source/test/ipfilterharness.h b/source/test/ipfilterharness.h
index 49056fb8c..61111bb21 100644
--- a/source/test/ipfilterharness.h
+++ b/source/test/ipfilterharness.h
@@ -38,8 +38,16 @@ protected:
     enum { TEST_BUF_SIZE = 200 * 200 };
     enum { ITERS = 100 };
     enum { TEST_CASES = 3 };
-    enum { SMAX = 1 << 12 };
-    enum { SMIN = (unsigned)-1 << 12 };
+    enum { SHIFT = IF_FILTER_PREC - IF_INTERNAL_PREC + X265_DEPTH };
+    enum { OFFSET = -(IF_INTERNAL_OFFS << SHIFT) };
+    // The vertical interpolation short-type input relies on data from horizontal
+    // filtering. We calculate the maximum and minimum possible inputs by multiplying
+    // the pixel value by the sum of the positive filter coefficients and, respectively,
+    // by the sum of the negative filter coefficients.
+    enum { LUMA_SMAX = (80 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { LUMA_SMIN = (-24 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { CHROMA_SMAX = (74 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { CHROMA_SMIN = (-10 * PIXEL_MAX + OFFSET) >> SHIFT };
     ALIGN_VAR_64(pixel, pixel_buff[TEST_BUF_SIZE]);
     ALIGN_VAR_64(int16_t, short_buff[TEST_BUF_SIZE]);
     ALIGN_VAR_64(int16_t, IPF_vec_output_s[TEST_BUF_SIZE]);
@@ -48,7 +56,8 @@ protected:
     ALIGN_VAR_64(pixel,   IPF_C_output_p[TEST_BUF_SIZE]);
 
     ALIGN_VAR_64(pixel,   pixel_test_buff[TEST_CASES][TEST_BUF_SIZE]);
-    ALIGN_VAR_64(int16_t, short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
+    ALIGN_VAR_64(int16_t, chroma_short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
+    ALIGN_VAR_64(int16_t, luma_short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
 
     bool check_IPFilterChroma_primitive(filter_pp_t ref, filter_pp_t opt);
     bool check_IPFilterChroma_ps_primitive(filter_ps_t ref, filter_ps_t opt);
-- 
2.39.5 (Apple Git-154)

-------------- next part --------------
>From b328ca242f35d73f9c7c7b9de8fe2a8ac23df276 Mon Sep 17 00:00:00 2001
Message-Id: <b328ca242f35d73f9c7c7b9de8fe2a8ac23df276.1752060897.git.gerdazsejke.more at arm.com>
In-Reply-To: <cover.1752060897.git.gerdazsejke.more at arm.com>
References: <cover.1752060897.git.gerdazsejke.more at arm.com>
From: Gerda Zsejke More <gerdazsejke.more at arm.com>
Date: Sun, 29 Jun 2025 18:10:20 +0200
Subject: [PATCH 2/3] testbench: Fix interpfilter harness short type input
 value range

When performing vertical interpolation with short-type input, the
data originates from horizontal interpolation. Take this into
consideration when creating maximum and minimum value test inputs.
---
 source/test/ipfilterharness.cpp | 25 ++++++++++++++-----------
 source/test/ipfilterharness.h   | 15 ++++++++++++---
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/source/test/ipfilterharness.cpp b/source/test/ipfilterharness.cpp
index 1cc91d671..6131a3785 100644
--- a/source/test/ipfilterharness.cpp
+++ b/source/test/ipfilterharness.cpp
@@ -37,11 +37,14 @@ IPFilterHarness::IPFilterHarness()
     for (int i = 0; i < TEST_BUF_SIZE; i++)
     {
         pixel_test_buff[0][i] = rand() & PIXEL_MAX;
-        short_test_buff[0][i] = (rand() % (2 * SMAX)) - SMAX;
+        luma_short_test_buff[0][i] = (rand() % (LUMA_SMAX - LUMA_SMIN + 1)) + LUMA_SMIN;
+        chroma_short_test_buff[0][i] = (rand() % (CHROMA_SMAX - CHROMA_SMIN + 1)) + CHROMA_SMIN;
         pixel_test_buff[1][i] = PIXEL_MIN;
-        short_test_buff[1][i] = (int16_t)SMIN;
+        luma_short_test_buff[1][i] = LUMA_SMIN;
+        chroma_short_test_buff[1][i] = CHROMA_SMIN;
         pixel_test_buff[2][i] = PIXEL_MAX;
-        short_test_buff[2][i] = SMAX;
+        luma_short_test_buff[2][i] = LUMA_SMAX;
+        chroma_short_test_buff[2][i] = CHROMA_SMAX;
     }
 
     memset(IPF_C_output_p, 0xCD, TEST_BUF_SIZE * sizeof(pixel));
@@ -190,13 +193,13 @@ bool IPFilterHarness::check_IPFilterChroma_sp_primitive(filter_sp_t ref, filter_
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(chroma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_p,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, chroma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_p,
                     rand_dstStride,
@@ -225,13 +228,13 @@ bool IPFilterHarness::check_IPFilterChroma_ss_primitive(filter_ss_t ref, filter_
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(chroma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_s,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, chroma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_s,
                     rand_dstStride,
@@ -371,13 +374,13 @@ bool IPFilterHarness::check_IPFilterLuma_sp_primitive(filter_sp_t ref, filter_sp
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(luma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_p,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, luma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_p,
                     rand_dstStride,
@@ -406,13 +409,13 @@ bool IPFilterHarness::check_IPFilterLuma_ss_primitive(filter_ss_t ref, filter_ss
             rand_srcStride = rand() % 100;
             rand_dstStride = rand() % 100 + 64;
 
-            ref(short_test_buff[index] + 3 * rand_srcStride,
+            ref(luma_short_test_buff[index] + 3 * rand_srcStride,
                 rand_srcStride,
                 IPF_C_output_s,
                 rand_dstStride,
                 coeffIdx);
 
-            checked(opt, short_test_buff[index] + 3 * rand_srcStride,
+            checked(opt, luma_short_test_buff[index] + 3 * rand_srcStride,
                     rand_srcStride,
                     IPF_vec_output_s,
                     rand_dstStride,
diff --git a/source/test/ipfilterharness.h b/source/test/ipfilterharness.h
index 49056fb8c..61111bb21 100644
--- a/source/test/ipfilterharness.h
+++ b/source/test/ipfilterharness.h
@@ -38,8 +38,16 @@ protected:
     enum { TEST_BUF_SIZE = 200 * 200 };
     enum { ITERS = 100 };
     enum { TEST_CASES = 3 };
-    enum { SMAX = 1 << 12 };
-    enum { SMIN = (unsigned)-1 << 12 };
+    enum { SHIFT = IF_FILTER_PREC - IF_INTERNAL_PREC + X265_DEPTH };
+    enum { OFFSET = -(IF_INTERNAL_OFFS << SHIFT) };
+    // The vertical interpolation short-type input relies on data from horizontal
+    // filtering. We calculate the maximum and minimum possible inputs by multiplying
+    // the pixel value by the sum of the positive filter coefficients and, respectively,
+    // by the sum of the negative filter coefficients.
+    enum { LUMA_SMAX = (80 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { LUMA_SMIN = (-24 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { CHROMA_SMAX = (74 * PIXEL_MAX + OFFSET) >> SHIFT };
+    enum { CHROMA_SMIN = (-10 * PIXEL_MAX + OFFSET) >> SHIFT };
     ALIGN_VAR_64(pixel, pixel_buff[TEST_BUF_SIZE]);
     ALIGN_VAR_64(int16_t, short_buff[TEST_BUF_SIZE]);
     ALIGN_VAR_64(int16_t, IPF_vec_output_s[TEST_BUF_SIZE]);
@@ -48,7 +56,8 @@ protected:
     ALIGN_VAR_64(pixel,   IPF_C_output_p[TEST_BUF_SIZE]);
 
     ALIGN_VAR_64(pixel,   pixel_test_buff[TEST_CASES][TEST_BUF_SIZE]);
-    ALIGN_VAR_64(int16_t, short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
+    ALIGN_VAR_64(int16_t, chroma_short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
+    ALIGN_VAR_64(int16_t, luma_short_test_buff[TEST_CASES][TEST_BUF_SIZE]);
 
     bool check_IPFilterChroma_primitive(filter_pp_t ref, filter_pp_t opt);
     bool check_IPFilterChroma_ps_primitive(filter_ps_t ref, filter_ps_t opt);
-- 
2.39.5 (Apple Git-154)



More information about the x265-devel mailing list