| Index: media/base/yuv_convert_unittest.cc
|
| ===================================================================
|
| --- media/base/yuv_convert_unittest.cc (revision 16299)
|
| +++ media/base/yuv_convert_unittest.cc (working copy)
|
| @@ -18,8 +18,11 @@
|
| // yuvhalf -yv16 -skip 24 bali.yv16.1280_720.yuv bali.yv16.640_360.yuv
|
| // Size of raw image.
|
|
|
| +// Size of raw image.
|
| static const int kWidth = 640;
|
| static const int kHeight = 360;
|
| +static const int kScaledWidth = 1024;
|
| +static const int kScaledHeight = 768;
|
| static const int kBpp = 4;
|
|
|
| // Surface sizes.
|
| @@ -28,6 +31,15 @@
|
| static const size_t kRGBSize = kWidth * kHeight * kBpp;
|
| static const size_t kRGBSizeConverted = kWidth * kHeight * kBpp;
|
|
|
| +namespace {
|
| +// DJB2 hash
|
| +unsigned int hash(unsigned char *s, size_t len, unsigned int hash = 5381) {
|
| + while (len--)
|
| + hash = hash * 33 + *s++;
|
| + return hash;
|
| +}
|
| +}
|
| +
|
| TEST(YUVConvertTest, YV12) {
|
| // Allocate all surfaces.
|
| scoped_array<uint8> yuv_bytes(new uint8[kYUV12Size]);
|
| @@ -46,37 +58,27 @@
|
| reinterpret_cast<char*>(yuv_bytes.get()),
|
| static_cast<int>(kYUV12Size)));
|
|
|
| - // Read RGB reference data from file.
|
| - FilePath rgb_url;
|
| - EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &rgb_url));
|
| - rgb_url = rgb_url.Append(FILE_PATH_LITERAL("media"))
|
| - .Append(FILE_PATH_LITERAL("test"))
|
| - .Append(FILE_PATH_LITERAL("data"))
|
| - .Append(FILE_PATH_LITERAL("bali.yv12.640_360.rgb"));
|
| - EXPECT_EQ(static_cast<int>(kRGBSize),
|
| - file_util::ReadFile(rgb_url,
|
| - reinterpret_cast<char*>(rgb_bytes.get()),
|
| - static_cast<int>(kRGBSize)));
|
| -
|
| // Convert a frame of YUV to 32 bit ARGB.
|
| - media::ConvertYV12ToRGB32(yuv_bytes.get(), // Y
|
| - yuv_bytes.get() + kWidth * kHeight, // U
|
| - yuv_bytes.get() + kWidth * kHeight * 5 / 4, // V
|
| - rgb_converted_bytes.get(), // RGB output
|
| - kWidth, kHeight, // Dimensions
|
| - kWidth, // YStride
|
| - kWidth / 2, // UVStride
|
| - kWidth * kBpp); // RGBStride
|
| + media::ConvertYUVToRGB32(yuv_bytes.get(), // Y
|
| + yuv_bytes.get() + kWidth * kHeight, // U
|
| + yuv_bytes.get() + kWidth * kHeight * 5 / 4, // V
|
| + rgb_converted_bytes.get(), // RGB output
|
| + kWidth, kHeight, // Dimensions
|
| + kWidth, // YStride
|
| + kWidth / 2, // UVStride
|
| + kWidth * kBpp, // RGBStride
|
| + media::YV12);
|
|
|
| -// TODO(fbarchard): The reference image was converted with MMX.
|
| -// Non-MMX implementations do not match exactly. In the future,
|
| -// Mac and Linux will use MMX as well and the unittest will be
|
| -// activated automatically.
|
| + unsigned int rgb_hash = hash(rgb_converted_bytes.get(), kRGBSizeConverted);
|
| +
|
| + // To get this hash value, run once and examine the following EXPECT_EQ.
|
| + // Then plug new hash value into EXPECT_EQ statements.
|
| +
|
| + // TODO(fbarchard): Make reference code mimic MMX exactly
|
| #if USE_MMX
|
| - // Compare converted YUV to reference conversion file.
|
| - int rgb_diff = memcmp(rgb_converted_bytes.get(), rgb_bytes.get(), kRGBSize);
|
| -
|
| - EXPECT_EQ(0, rgb_diff);
|
| + EXPECT_EQ(2413171226u, rgb_hash);
|
| +#else
|
| + EXPECT_EQ(2936300063u, rgb_hash);
|
| #endif
|
| return; // This is here to allow you to put a break point on this line
|
| }
|
| @@ -99,37 +101,117 @@
|
| reinterpret_cast<char*>(yuv_bytes.get()),
|
| static_cast<int>(kYUV16Size)));
|
|
|
| - // Read RGB reference data from file.
|
| - FilePath rgb_url;
|
| - EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &rgb_url));
|
| - rgb_url = rgb_url.Append(FILE_PATH_LITERAL("media"))
|
| + // Convert a frame of YUV to 32 bit ARGB.
|
| + media::ConvertYUVToRGB32(yuv_bytes.get(), // Y
|
| + yuv_bytes.get() + kWidth * kHeight, // U
|
| + yuv_bytes.get() + kWidth * kHeight * 3 / 2, // V
|
| + rgb_converted_bytes.get(), // RGB output
|
| + kWidth, kHeight, // Dimensions
|
| + kWidth, // YStride
|
| + kWidth / 2, // UVStride
|
| + kWidth * kBpp, // RGBStride
|
| + media::YV16);
|
| +
|
| + unsigned int rgb_hash = hash(rgb_converted_bytes.get(), kRGBSizeConverted);
|
| +
|
| + // To get this hash value, run once and examine the following EXPECT_EQ.
|
| + // Then plug new hash value into EXPECT_EQ statements.
|
| +
|
| + // TODO(fbarchard): Make reference code mimic MMX exactly
|
| +#if USE_MMX
|
| + EXPECT_EQ(4222342047u, rgb_hash);
|
| +#else
|
| + EXPECT_EQ(106869773u, rgb_hash);
|
| +#endif
|
| + return; // This is here to allow you to put a break point on this line
|
| +}
|
| +
|
| +TEST(YuvScaleTest, Basic) {
|
| + // 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.yv16.640_360.rgb"));
|
| - EXPECT_EQ(static_cast<int>(kRGBSize),
|
| - file_util::ReadFile(rgb_url,
|
| - reinterpret_cast<char*>(rgb_bytes.get()),
|
| - static_cast<int>(kRGBSize)));
|
| + .Append(FILE_PATH_LITERAL("bali.yv12.640_360.yuv"));
|
| + const size_t size_of_yuv = kWidth * kHeight * 12 / 8; // 12 bpp.
|
| + 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),
|
| + static_cast<int>(size_of_yuv)));
|
|
|
| - // Convert a frame of YUV to 32 bit ARGB.
|
| - media::ConvertYV16ToRGB32(yuv_bytes.get(), // Y
|
| - yuv_bytes.get() + kWidth * kHeight, // U
|
| - yuv_bytes.get() + kWidth * kHeight * 3 / 2, // V
|
| - rgb_converted_bytes.get(), // RGB output
|
| - kWidth, kHeight, // Dimensions
|
| - kWidth, // YStride
|
| - kWidth / 2, // UVStride
|
| - kWidth * kBpp); // RGBStride
|
| + // Scale a frame of YUV to 32 bit ARGB.
|
| + const size_t size_of_rgb_scaled = kScaledWidth * kScaledHeight * kBpp;
|
| + uint8* rgb_scaled_bytes = new uint8[size_of_rgb_scaled];
|
|
|
| -// TODO(fbarchard): The reference image was converted with MMX.
|
| -// Non-MMX implementations do not match exactly. In the future,
|
| -// Mac and Linux will use MMX as well and the unittest will be
|
| -// activated automatically.
|
| + media::ScaleYUVToRGB32(yuv_bytes, // Y plane
|
| + yuv_bytes + kWidth * kHeight, // U plane
|
| + yuv_bytes + kWidth * kHeight * 5 / 4, // V plane
|
| + rgb_scaled_bytes, // Rgb output
|
| + kWidth, kHeight, // Dimensions
|
| + kScaledWidth, kScaledHeight, // Dimensions
|
| + kWidth, // YStride
|
| + kWidth / 2, // UvStride
|
| + kScaledWidth * kBpp, // RgbStride
|
| + media::YV12,
|
| + media::ROTATE_0);
|
| +
|
| + unsigned int rgb_hash = hash(rgb_scaled_bytes, size_of_rgb_scaled);
|
| +
|
| + // To get this hash value, run once and examine the following EXPECT_EQ.
|
| + // Then plug new hash value into EXPECT_EQ statements.
|
| +
|
| + // TODO(fbarchard): Make reference code mimic MMX exactly
|
| #if USE_MMX
|
| - // Compare converted YUV to reference conversion file.
|
| - int rgb_diff = memcmp(rgb_converted_bytes.get(), rgb_bytes.get(), kRGBSize);
|
| + EXPECT_EQ(4259656254u, rgb_hash);
|
| +#else
|
| + EXPECT_EQ(197274901u, rgb_hash);
|
| +#endif
|
| + return; // This is here to allow you to put a break point on this line
|
| +}
|
|
|
| - EXPECT_EQ(0, rgb_diff);
|
| +TEST(YV16ScaleTest, Basic) {
|
| + // Read YV16 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.yv16.640_360.yuv"));
|
| + const size_t size_of_yuv = kWidth * kHeight * 16 / 8; // 16 bpp.
|
| + 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),
|
| + 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;
|
| + uint8* rgb_scaled_bytes = new uint8[size_of_rgb_scaled];
|
| +
|
| + media::ScaleYUVToRGB32(yuv_bytes, // Y plane
|
| + yuv_bytes + kWidth * kHeight, // U plane
|
| + yuv_bytes + kWidth * kHeight * 3 / 2, // V plane
|
| + rgb_scaled_bytes, // Rgb output
|
| + kWidth, kHeight, // Dimensions
|
| + kScaledWidth, kScaledHeight, // Dimensions
|
| + kWidth, // YStride
|
| + kWidth / 2, // UvStride
|
| + kScaledWidth * kBpp, // RgbStride
|
| + media::YV16,
|
| + media::ROTATE_0);
|
| +
|
| + unsigned int rgb_hash = hash(rgb_scaled_bytes, size_of_rgb_scaled);
|
| +
|
| + // To get this hash value, run once and examine the following EXPECT_EQ.
|
| + // Then plug new hash value into EXPECT_EQ statements.
|
| +
|
| + // TODO(fbarchard): Make reference code mimic MMX exactly
|
| +#if USE_MMX
|
| + EXPECT_EQ(974965419u, rgb_hash);
|
| +#else
|
| + EXPECT_EQ(2946450771u, rgb_hash);
|
| #endif
|
| return;
|
| }
|
|
|