From cb6c9d6fd9c74e01a799402ee59c9c04ca561346 Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Thu, 27 Aug 2026 16:46:43 -0700 Subject: [PATCH] Remove LIBYUV_UNBIASED_DATA and make unbiased AR30 rounding default Remove the LIBYUV_UNBIASED_DATA macro and make the unbiased AR30 rounding bias adjustment (+24 / -24) default across all x86, ARM, and C implementations. Bug: 551985141 Test: libyuv_unittest --gtest_filter=*AR30*:*AB30* Change-Id: I4a9b964ceef1d08580789cbba8c94846053c9d68 TAG=agy CONV=15289919-ad91-40b2-9ed5-30c3117a5ba4 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8305516 Commit-Queue: Wan-Teh Chang Reviewed-by: Wan-Teh Chang --- BUILD.bazel | 1 - BUILD.gn | 1 - CMakeLists.txt | 2 -- docs/getting_started.md | 1 - include/libyuv/row_sve.h | 4 ---- include/libyuv/version.h | 2 +- source/row_common.cc | 7 ------- source/row_gcc.cc | 12 ------------ source/row_neon64.cc | 4 ---- source/row_win.cc | 8 -------- 10 files changed, 1 insertion(+), 41 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 98a0f1f74..d71502313 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -52,7 +52,6 @@ PLATFORM_COPTS = select({ "//conditions:default": [], }) + [ "-DLIBYUV_DISABLE_SME", - "-DLIBYUV_UNBIASED_DATA", "-DLIBYUV_USE_ABSL_FLAGS", "-DGOOGLE_COMMANDLINEFLAGS_FULL_API", ] diff --git a/BUILD.gn b/BUILD.gn index 9e2618c87..d3fbd33e2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -25,7 +25,6 @@ config("libyuv_config") { # Define CHROMIUM to tell cpu_id to avoid sandbox unsafe system calls. defines = [ "CHROMIUM" ] - defines += [ "LIBYUV_UNBIASED_DATA" ] if (libyuv_enable_rowwin) { defines += [ "LIBYUV_ENABLE_ROWWIN=1" ] } diff --git a/CMakeLists.txt b/CMakeLists.txt index abaa5e484..77e0527fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,8 +66,6 @@ list ( SORT ly_unittest_sources ) include_directories( BEFORE ${ly_inc_dir} ) -add_definitions(-DLIBYUV_UNBIASED_DATA) - if(MSVC) add_definitions ( -D_CRT_SECURE_NO_WARNINGS ) endif() diff --git a/docs/getting_started.md b/docs/getting_started.md index 287e35718..06160bb20 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -72,7 +72,6 @@ Additional commonly used compiler options can be passed to Bazel via `--copt`: bazel build -c opt --config=android_arm64 \ --copt=-DLIBYUV_UNLIMITED_DATA \ - --copt=-DLIBYUV_UNBIASED_DATA \ --copt=-DENABLE_ROW_TESTS \ //:libyuv_test diff --git a/include/libyuv/row_sve.h b/include/libyuv/row_sve.h index 328a6de6b..da14fe8ff 100644 --- a/include/libyuv/row_sve.h +++ b/include/libyuv/row_sve.h @@ -39,15 +39,11 @@ extern "C" { "ld1rh {z26.h}, p0/z, [%[kRGBCoeffBias], #4] \n" \ "ld1rh {z27.h}, p0/z, [%[kRGBCoeffBias], #6] \n" -#if defined(LIBYUV_UNBIASED_DATA) #define YUVTORGB_SVE_SETUP_AR30 \ YUVTORGB_SVE_SETUP \ "add z25.h, z25.h, #24 \n" \ "sub z26.h, z26.h, #24 \n" \ "add z27.h, z27.h, #24 \n" -#else -#define YUVTORGB_SVE_SETUP_AR30 YUVTORGB_SVE_SETUP -#endif #define READYUV444_SVE \ "ld1b {z0.h}, p1/z, [%[src_y]] \n" \ diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 5cb37ecf8..ad3471ccb 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1965 +#define LIBYUV_VERSION 1966 #endif // INCLUDE_LIBYUV_VERSION_H_ diff --git a/source/row_common.cc b/source/row_common.cc index 839e5c851..b5c1de28a 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -37,9 +37,6 @@ extern "C" { // LIBYUV_UNLIMITED_BT709 // LIBYUV_UNLIMITED_BT2020 -// This macro fixes the AR30 rounding bias offset (+24 / -24) for 10-bit YUV to RGB conversions: -// LIBYUV_UNBIASED_DATA - // llvm x86 is poor at ternary operator, so use branchless min/max. #define USE_BRANCHLESS 1 @@ -1788,7 +1785,6 @@ MAKEYUVCONSTANTS(V2020, YG, YB, UB, UG, VG, VR) int r16 = y1 + (vi * vr) #endif -#if defined(LIBYUV_UNBIASED_DATA) #if defined(__aarch64__) || defined(__arm__) || defined(__riscv) #define LOAD_YUV_CONSTANTS_AR30 \ int ub = yuvconstants->kUVCoeff[0]; \ @@ -1808,9 +1804,6 @@ MAKEYUVCONSTANTS(V2020, YG, YB, UB, UG, VG, VR) int yg = yuvconstants->kYToRgb[0]; \ int yb = yuvconstants->kYBiasToRgb[0] - 24 #endif -#else -#define LOAD_YUV_CONSTANTS_AR30 LOAD_YUV_CONSTANTS -#endif // C reference code that mimics the YUV assembly. // Reads 8 bit YUV and leaves result as 16 bit. diff --git a/source/row_gcc.cc b/source/row_gcc.cc index 8b90d894c..cf2473aa5 100644 --- a/source/row_gcc.cc +++ b/source/row_gcc.cc @@ -2639,17 +2639,12 @@ void ARGBToUVMatrixRow_AVX512BW(const uint8_t* src_argb, "movdqa 96(%[yuvconstants]),%%xmm11 \n" \ "movdqa 128(%[yuvconstants]),%%xmm12 \n" -#if defined(LIBYUV_UNBIASED_DATA) #define YUVTORGB_SETUP_AR30(yuvconstants) \ YUVTORGB_SETUP(yuvconstants) \ "pcmpeqb %%xmm0,%%xmm0 \n" \ "psrlw $14,%%xmm0 \n" \ "psllw $3,%%xmm0 \n" \ "psubw %%xmm0,%%xmm12 \n" -#else -#define YUVTORGB_SETUP_AR30(yuvconstants) \ - YUVTORGB_SETUP(yuvconstants) -#endif // Convert 8 pixels: 8 UV and 8 Y #define YUVTORGB16(yuvconstants) \ @@ -3722,7 +3717,6 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, "vmovups (%[dquadsplitperm]),%%zmm17 \n" \ "vmovups (%[unperm]),%%zmm18 \n" -#if defined(LIBYUV_UNBIASED_DATA) #define YUVTORGB_SETUP_AR30_AVX2(yuvconstants) \ YUVTORGB_SETUP_AVX2(yuvconstants) \ "vpcmpeqb %%ymm0,%%ymm0,%%ymm0 \n" \ @@ -3736,12 +3730,6 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, "vpsrlw $14,%%zmm0,%%zmm0 \n" \ "vpsllw $3,%%zmm0,%%zmm0 \n" \ "vpsubw %%zmm0,%%zmm12,%%zmm12 \n" -#else -#define YUVTORGB_SETUP_AR30_AVX2(yuvconstants) \ - YUVTORGB_SETUP_AVX2(yuvconstants) -#define YUVTORGB_SETUP_AR30_AVX512BW(yuvconstants) \ - YUVTORGB_SETUP_AVX512BW(yuvconstants) -#endif #define YUVTORGB16_AVX2(yuvconstants) \ "vpsubb %%ymm13,%%ymm3,%%ymm3 \n" \ diff --git a/source/row_neon64.cc b/source/row_neon64.cc index ff92df3fb..a73108239 100644 --- a/source/row_neon64.cc +++ b/source/row_neon64.cc @@ -149,16 +149,12 @@ static const uvec8 kNV21InterleavedTable = {1, 1, 5, 5, 9, 9, 13, 13, "ld4r {v28.16b, v29.16b, v30.16b, v31.16b}, [%[kUVCoeff]] \n" \ "ld4r {v24.8h, v25.8h, v26.8h, v27.8h}, [%[kRGBCoeffBias]] \n" -#if defined(LIBYUV_UNBIASED_DATA) #define YUVTORGB_SETUP_AR30 \ YUVTORGB_SETUP \ "movi v2.8h, #24 \n" \ "add v25.8h, v25.8h, v2.8h \n" \ "sub v26.8h, v26.8h, v2.8h \n" \ "add v27.8h, v27.8h, v2.8h \n" -#else -#define YUVTORGB_SETUP_AR30 YUVTORGB_SETUP -#endif // v16.8h: B // v17.8h: G diff --git a/source/row_win.cc b/source/row_win.cc index 125bb7ccb..ef1195f46 100644 --- a/source/row_win.cc +++ b/source/row_win.cc @@ -1516,13 +1516,9 @@ void I422ToAR30Row_AVX2(const uint8_t* src_y, __m256i ymm_kUVToG = _mm256_loadu_si256((const __m256i*)yuvconstants->kUVToG); __m256i ymm_kUVToR = _mm256_loadu_si256((const __m256i*)yuvconstants->kUVToR); __m256i ymm_kYToRgb = _mm256_loadu_si256((const __m256i*)yuvconstants->kYToRgb); -#if defined(LIBYUV_UNBIASED_DATA) __m256i ymm_kYBiasToRgb = _mm256_sub_epi16( _mm256_loadu_si256((const __m256i*)yuvconstants->kYBiasToRgb), _mm256_set1_epi16(24)); -#else - __m256i ymm_kYBiasToRgb = _mm256_loadu_si256((const __m256i*)yuvconstants->kYBiasToRgb); -#endif __m256i ymm_128 = _mm256_set1_epi8((char)0x80); __m256i ymm_3ff0 = _mm256_set1_epi16((short)0x3ff0); __m256i ymm_c000 = _mm256_set1_epi16((short)0xc000); @@ -2072,13 +2068,9 @@ void I422ToAR30Row_AVX512BW(const uint8_t* src_y, __m512i zmm_kUVToG = _mm512_broadcast_i32x4(_mm_loadu_si128((const __m128i*)yuvconstants->kUVToG)); __m512i zmm_kUVToR = _mm512_broadcast_i32x4(_mm_loadu_si128((const __m128i*)yuvconstants->kUVToR)); __m512i zmm_kYToRgb = _mm512_broadcast_i32x4(_mm_loadu_si128((const __m128i*)yuvconstants->kYToRgb)); -#if defined(LIBYUV_UNBIASED_DATA) __m512i zmm_kYBiasToRgb = _mm512_sub_epi16( _mm512_broadcast_i32x4(_mm_loadu_si128((const __m128i*)yuvconstants->kYBiasToRgb)), _mm512_set1_epi16(24)); -#else - __m512i zmm_kYBiasToRgb = _mm512_broadcast_i32x4(_mm_loadu_si128((const __m128i*)yuvconstants->kYBiasToRgb)); -#endif __m512i zmm_128 = _mm512_set1_epi8((char)0x80); __m512i zmm_3ff0 = _mm512_set1_epi16((short)0x3ff0); __m512i zmm_fc00 = _mm512_set1_epi16((short)0xfc00);