| 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()) {
|
|
|