Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(928)

Unified Diff: media/base/yuv_convert_unittest.cc

Issue 8954003: Revised sub-rectangle scaling for use in Chromoting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Replace bounds-check on loop with a DCHECK. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/yuv_convert_unittest.cc
diff --git a/media/base/yuv_convert_unittest.cc b/media/base/yuv_convert_unittest.cc
index 9db998b3e6f828ee1d37aa4b57a7c032b33e72d2..acc90be526c1999009a3b8d3ecb7fcb52eac0bf5 100644
--- a/media/base/yuv_convert_unittest.cc
+++ b/media/base/yuv_convert_unittest.cc
@@ -379,6 +379,121 @@ TEST(YUVConvertTest, YUY2ToYUV) {
EXPECT_EQ(666823187u, yuy_hash);
}
+
+TEST(YUVConvertTest, ScaleWithQuarterRect) {
+ // Read YUV reference data from file.
+ FilePath yuv_url;
+ EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &yuv_url));
+ yuv_url = yuv_url.Append(FILE_PATH_LITERAL("media"))
+ .Append(FILE_PATH_LITERAL("test"))
+ .Append(FILE_PATH_LITERAL("data"))
+ .Append(FILE_PATH_LITERAL("bali_640x360_P420.yuv"));
+ const size_t size_of_yuv = kSourceYSize * 12 / 8; // 12 bpp.
+ scoped_array<uint8> yuv_bytes(new uint8[size_of_yuv]);
+ EXPECT_EQ(static_cast<int>(size_of_yuv),
+ file_util::ReadFile(yuv_url,
+ reinterpret_cast<char*>(yuv_bytes.get()),
+ static_cast<int>(size_of_yuv)));
+
+ // Scale a frame of YUV to 32 bit ARGB.
+ const size_t size_of_rgb_scaled = kScaledWidth * kScaledHeight * kBpp;
+ scoped_array<uint8> rgb_source_bytes(new uint8[size_of_rgb_scaled]);
+
+ media::ScaleYUVToRGB32WithRect(
+ yuv_bytes.get(), // Y
+ yuv_bytes.get() + kSourceYSize, // U
+ yuv_bytes.get() + kSourceYSize * 5 / 4, // V
+ rgb_source_bytes.get(), // Rgb output
+ kSourceWidth, kSourceHeight, // Dimensions
+ kScaledWidth, kScaledHeight, // Dimensions
+ 0, 0, kScaledWidth, kScaledHeight, // Dest rect
+ kSourceWidth, // YStride
+ kSourceWidth / 2, // UvStride
+ kScaledWidth * kBpp); // RgbStride
+
+ uint32 rgb_hash_full_rect = DJB2Hash(rgb_source_bytes.get(),
+ size_of_rgb_scaled,
+ kDJB2HashSeed);
+
+ // Scale only a partial rectangle.
+ media::ScaleYUVToRGB32WithRect(
+ yuv_bytes.get(), // Y
+ yuv_bytes.get() + kSourceYSize, // U
+ yuv_bytes.get() + kSourceYSize * 5 / 4, // V
+ rgb_source_bytes.get(), // Rgb output
+ kSourceWidth, kSourceHeight, // Dimensions
+ kScaledWidth, kScaledHeight, // Dimensions
+ kScaledWidth / 4, // Dest rect
+ kScaledHeight / 4,
+ (kScaledWidth * 3) / 4,
+ (kScaledHeight * 3) / 4,
+ kSourceWidth, // YStride
+ kSourceWidth / 2, // UvStride
+ kScaledWidth * kBpp); // RgbStride
+
+ uint32 rgb_hash_quarter_rect = DJB2Hash(rgb_source_bytes.get(),
+ size_of_rgb_scaled,
+ kDJB2HashSeed);
+ EXPECT_EQ(rgb_hash_full_rect, rgb_hash_quarter_rect);
+}
+
+TEST(YUVConvertTest, ScaleWithTinyRect) {
+ // Read YUV reference data from file.
+ FilePath yuv_url;
+ EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &yuv_url));
+ yuv_url = yuv_url.Append(FILE_PATH_LITERAL("media"))
+ .Append(FILE_PATH_LITERAL("test"))
+ .Append(FILE_PATH_LITERAL("data"))
+ .Append(FILE_PATH_LITERAL("bali_640x360_P420.yuv"));
+ const size_t size_of_yuv = kSourceYSize * 12 / 8; // 12 bpp.
+ scoped_array<uint8> yuv_bytes(new uint8[size_of_yuv]);
+ EXPECT_EQ(static_cast<int>(size_of_yuv),
+ file_util::ReadFile(yuv_url,
+ reinterpret_cast<char*>(yuv_bytes.get()),
+ static_cast<int>(size_of_yuv)));
+
+ // Scale a frame of YUV to 32 bit ARGB.
+ const size_t size_of_rgb_scaled = kScaledWidth * kScaledHeight * kBpp;
+ scoped_array<uint8> rgb_source_bytes(new uint8[size_of_rgb_scaled]);
+
+ media::ScaleYUVToRGB32WithRect(
+ yuv_bytes.get(), // Y
+ yuv_bytes.get() + kSourceYSize, // U
+ yuv_bytes.get() + kSourceYSize * 5 / 4, // V
+ rgb_source_bytes.get(), // Rgb output
+ kSourceWidth, kSourceHeight, // Dimensions
+ kScaledWidth, kScaledHeight, // Dimensions
+ 0, 0, kScaledWidth, kScaledHeight, // Dest rect
+ kSourceWidth, // YStride
+ kSourceWidth / 2, // UvStride
+ kScaledWidth * kBpp); // RgbStride
+
+ uint32 rgb_hash_full_rect = DJB2Hash(rgb_source_bytes.get(),
+ size_of_rgb_scaled,
+ kDJB2HashSeed);
+
+ // Scale only one pixel in the middle
+ media::ScaleYUVToRGB32WithRect(
+ yuv_bytes.get(), // Y
+ yuv_bytes.get() + kSourceYSize, // U
+ yuv_bytes.get() + kSourceYSize * 5 / 4, // V
+ rgb_source_bytes.get(), // Rgb output
+ kSourceWidth, kSourceHeight, // Dimensions
+ kScaledWidth, kScaledHeight, // Dimensions
+ kScaledWidth / 4, // Dest rect
+ kScaledHeight / 4,
+ kScaledWidth / 4 + 1,
+ kScaledHeight / 4 + 1,
+ kSourceWidth, // YStride
+ kSourceWidth / 2, // UvStride
+ kScaledWidth * kBpp); // RgbStride
+
+ uint32 rgb_hash_tiny_rect = DJB2Hash(rgb_source_bytes.get(),
+ size_of_rgb_scaled,
+ kDJB2HashSeed);
+ EXPECT_EQ(rgb_hash_full_rect, rgb_hash_tiny_rect);
+}
+
#if !defined(ARCH_CPU_ARM_FAMILY)
TEST(YUVConvertTest, RGB32ToYUV_SSE2_MatchReference) {
if (!media::hasSSE2()) {

Powered by Google App Engine
This is Rietveld 408576698