reformat_libyuv: use RAWToI444/RAWToJ444 if available (#2598)
These are available since libyuv 1902 and 1903.
Bug: b:345259429
diff --git a/src/reformat_libyuv.c b/src/reformat_libyuv.c
index cfd7e29..800b4b6 100644
--- a/src/reformat_libyuv.c
+++ b/src/reformat_libyuv.c
@@ -80,6 +80,13 @@
// These defines are used to create a NULL reference to libyuv functions that
// did not exist prior to a particular version of libyuv.
// Versions prior to 1755 are considered too old and not used (see CMakeLists.txt).
+#if LIBYUV_VERSION < 1902
+// RAWToJ444 was added in libyuv version 1902.
+// See https://chromium-review.googlesource.com/c/libyuv/libyuv/+/6207845.
+// NEON was added afterward, but the version was not increased.
+// See https://chromium-review.googlesource.com/c/libyuv/libyuv/+/6220890
+#define RAWToJ444 NULL
+#endif
#if LIBYUV_VERSION < 1844
// I444ToRGB24Matrix() and I422ToRGB24MatrixFilter() were added in libyuv version 1844.
//
@@ -217,6 +224,12 @@
height); \
}
+#if LIBYUV_VERSION < 1903
+// AVIF_RGB_FORMAT_RGB
+// RAWToI444 was added in libyuv version 1903.
+// https://chromium-review.googlesource.com/c/libyuv/libyuv/+/6223658
+AVIF_DEFINE_CONVERSION(RAWToI444, RAWToARGB, ARGBToI444, AVIF_PIXEL_FORMAT_YUV444)
+#endif
#if LIBYUV_VERSION < 1840
// AVIF_RGB_FORMAT_RGBA
AVIF_DEFINE_CONVERSION(ABGRToJ422, ABGRToARGB, ARGBToJ422, AVIF_PIXEL_FORMAT_YUV422)
@@ -226,7 +239,6 @@
// These are not yet implemented in libyuv so they cannot be guarded by a version check.
// The "avif" prefix avoids any redefinition if they are available in libyuv one day.
// AVIF_RGB_FORMAT_RGB
-AVIF_DEFINE_CONVERSION(avifRAWToI444, RAWToARGB, ARGBToI444, AVIF_PIXEL_FORMAT_YUV444)
AVIF_DEFINE_CONVERSION(avifRAWToI422, RAWToARGB, ARGBToI422, AVIF_PIXEL_FORMAT_YUV422)
AVIF_DEFINE_CONVERSION(avifRAWToJ422, RAWToARGB, ARGBToJ422, AVIF_PIXEL_FORMAT_YUV422)
// AVIF_RGB_FORMAT_RGBA
@@ -323,7 +335,7 @@
// AVIF_RANGE_LIMITED
{
// { NONE, YUV444, YUV422, YUV420, YUV400 } // AVIF_RGB_FORMAT_
- { NULL, avifRAWToI444, avifRAWToI422, RAWToI420, NULL }, // RGB
+ { NULL, RAWToI444, avifRAWToI422, RAWToI420, NULL }, // RGB
{ NULL, avifABGRToI444, avifABGRToI422, ABGRToI420, NULL }, // RGBA
{ NULL, avifBGRAToI444, avifBGRAToI422, BGRAToI420, NULL }, // ARGB
{ NULL, avifRGB24ToI444, avifRGB24ToI422, RGB24ToI420, NULL }, // BGR
@@ -334,7 +346,7 @@
// AVIF_RANGE_FULL
{
// { NONE, YUV444, YUV422, YUV420, YUV400 } // AVIF_RGB_FORMAT_
- { NULL, NULL, avifRAWToJ422, RAWToJ420, NULL }, // RGB
+ { NULL, RAWToJ444, avifRAWToJ422, RAWToJ420, NULL }, // RGB
{ NULL, NULL, ABGRToJ422, ABGRToJ420, NULL }, // RGBA
{ NULL, NULL, avifBGRAToJ422, avifBGRAToJ420, NULL }, // ARGB
{ NULL, NULL, avifRGB24ToJ422, RGB24ToJ420, NULL }, // BGR
diff --git a/tests/gtest/avifgainmaptest.cc b/tests/gtest/avifgainmaptest.cc
index c076528..8abd226 100644
--- a/tests/gtest/avifgainmaptest.cc
+++ b/tests/gtest/avifgainmaptest.cc
@@ -1097,7 +1097,7 @@
/*out_depth=*/8,
/*out_transfer=*/AVIF_TRANSFER_CHARACTERISTICS_SRGB,
/*out_rgb_format=*/AVIF_RGB_FORMAT_RGB,
- /*reference=*/"seine_sdr_gainmap_srgb.avif", /*min_psnr=*/60.0f,
+ /*reference=*/"seine_sdr_gainmap_srgb.avif", /*min_psnr=*/53.5f,
/*max_psnr=*/80.0f),
// Same as above, outputting to RGBA.
@@ -1221,7 +1221,7 @@
/*out_depth=*/image->depth,
/*out_transfer_characteristics=*/image->transferCharacteristics,
AVIF_RGB_FORMAT_RGB, /*reference_image=*/image.get(),
- /*min_psnr=*/60, /*max_psnr=*/100);
+ /*min_psnr=*/53.5, /*max_psnr=*/100);
}
}
@@ -1410,7 +1410,7 @@
/*image2_name=*/"seine_hdr_gainmap_srgb.avif",
/*downscaling=*/1, /*gain_map_depth=*/10,
/*gain_map_format=*/AVIF_PIXEL_FORMAT_YUV444,
- /*min_psnr=*/55.0f, /*max_psnr=*/80.0f),
+ /*min_psnr=*/53.25f, /*max_psnr=*/80.0f),
// 8 bit gain map, expect a slightly lower PSNR.
std::make_tuple(/*image1_name=*/"seine_sdr_gainmap_srgb.avif",
/*image2_name=*/"seine_hdr_gainmap_srgb.avif",
@@ -1459,7 +1459,7 @@
/*image2_name=*/"colors_hdr_rec2020.avif",
/*downscaling=*/1, /*gain_map_depth=*/10,
/*gain_map_format=*/AVIF_PIXEL_FORMAT_YUV444,
- /*min_psnr=*/55.0f, /*max_psnr=*/100.0f),
+ /*min_psnr=*/52.5f, /*max_psnr=*/100.0f),
// The PSNR is very high because there are essentially the same image,
// simply expresed in different colorspaces.
std::make_tuple(/*image1_name=*/"colors_hdr_rec2020.avif",
@@ -1472,7 +1472,7 @@
/*image2_name=*/"colors_wcg_hdr_rec2020.avif",
/*downscaling=*/1, /*gain_map_depth=*/10,
/*gain_map_format=*/AVIF_PIXEL_FORMAT_YUV444,
- /*min_psnr=*/55.0f, /*max_psnr=*/80.0f)));
+ /*min_psnr=*/52.5f, /*max_psnr=*/80.0f)));
TEST(GainMapTest, CreateGainMapConstantFactor) {
// Used only to initialize rgb images.