[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