Commit 263243aa authored by Frank Barchard's avatar Frank Barchard Committed by Frank Barchard

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/851474Reviewed-by: 's avatarMiguel Casas <mcasas@chromium.org>
Reviewed-by: 's avatarFrank Barchard <fbarchard@chromium.org>
parent a6465859
......@@ -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<int>((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<uint16*>(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<int>((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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment