From 263243aadc3c30d548ffc36e6fdb0cc987511cc6 Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Fri, 5 Jan 2018 11:39:55 -0800 Subject: [PATCH] Add unittest for H010ToARGB conversion A sanity check that H010ToARGB is doing the correct math. The normal test only checks the C and ASM match, but they could both be wrong, or the common code could be wrong. This test checks a grey scale ramp matches expected results. Bug: libyuv:751 Test: LibYUVConvertTest.TestH420ToARGB and LibYUVConvertTest.TestH010ToARGB Change-Id: Ie8c2b91ac9993f41675c02d0dde9db72d0612450 Reviewed-on: https://chromium-review.googlesource.com/851474 Reviewed-by: Miguel Casas Reviewed-by: Frank Barchard --- unit_test/convert_test.cc | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/unit_test/convert_test.cc b/unit_test/convert_test.cc index c4e212e20..cbd1dc9b9 100644 --- a/unit_test/convert_test.cc +++ b/unit_test/convert_test.cc @@ -2085,4 +2085,74 @@ TEST_F(LibYUVConvertTest, ARGBToAR30Row_Opt) { TESTPLANAR16TOB(H010, 2, 2, AR30, 4, 4, 1, 2, AR30, 4) TESTPLANAR16TOB(H010, 2, 2, ARGB, 4, 4, 1, 2, ARGB, 4) +static int Clamp(int y) { + if (y < 0) { + y = 0; + } + if (y > 255) { + y = 255; + } + return y; +} + +TEST_F(LibYUVConvertTest, TestH420ToARGB) { + const int kSize = 256; + align_buffer_page_end(orig_yuv, kSize + kSize / 2 * 2); + align_buffer_page_end(argb_pixels, kSize * 4); + uint8* orig_y = orig_yuv; + uint8* orig_u = orig_y + kSize; + uint8* orig_v = orig_u + kSize / 2; + + // Test grey scale + for (int i = 0; i < kSize; ++i) { + orig_y[i] = i; + } + for (int i = 0; i < kSize / 2; ++i) { + orig_u[i] = 128; // 128 is 0. + orig_v[i] = 128; + } + + H420ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1); + + for (int i = 0; i < kSize; ++i) { + int expected_y = Clamp(static_cast((i - 16) * 1.164f)); + EXPECT_NEAR(argb_pixels[i * 4 + 0], expected_y, 1); + EXPECT_NEAR(argb_pixels[i * 4 + 1], expected_y, 1); + EXPECT_NEAR(argb_pixels[i * 4 + 2], expected_y, 1); + EXPECT_EQ(argb_pixels[i * 4 + 3], 255); + } + free_aligned_buffer_page_end(orig_yuv); + free_aligned_buffer_page_end(argb_pixels); +} + +TEST_F(LibYUVConvertTest, TestH010ToARGB) { + const int kSize = 1024; + align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2); + align_buffer_page_end(argb_pixels, kSize * 4); + uint16* orig_y = reinterpret_cast(orig_yuv); + uint16* orig_u = orig_y + kSize; + uint16* orig_v = orig_u + kSize / 2; + + // Test grey scale + for (int i = 0; i < kSize; ++i) { + orig_y[i] = i; + } + for (int i = 0; i < kSize / 2; ++i) { + orig_u[i] = 512; // 512 is 0. + orig_v[i] = 512; + } + + H010ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1); + + for (int i = 0; i < kSize; ++i) { + int expected_y = Clamp(static_cast((i - 64) * 1.164f / 4)); + EXPECT_NEAR(argb_pixels[i * 4 + 0], expected_y, 1); + EXPECT_NEAR(argb_pixels[i * 4 + 1], expected_y, 1); + EXPECT_NEAR(argb_pixels[i * 4 + 2], expected_y, 1); + EXPECT_EQ(argb_pixels[i * 4 + 3], 255); + } + free_aligned_buffer_page_end(orig_yuv); + free_aligned_buffer_page_end(argb_pixels); +} + } // namespace libyuv