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

Unified Diff: media/base/yuv_convert_unittest.cc

Issue 271443006: Fix crash and off-by-one error in MMX YUVA->ARGB conversion. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@yuv_tables
Patch Set: Make off-by-one fix 32-bit-friendly, fix Android unused stuff Created 6 years, 7 months 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
« no previous file with comments | « media/base/simd/convert_yuva_to_argb_mmx.inc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/yuv_convert_unittest.cc
diff --git a/media/base/yuv_convert_unittest.cc b/media/base/yuv_convert_unittest.cc
index 73deb1ff9192d3ef6df596f05c0bbb148d07a6e7..85d3693ec8605378bd8d4d5d19f45d53ded1649f 100644
--- a/media/base/yuv_convert_unittest.cc
+++ b/media/base/yuv_convert_unittest.cc
@@ -37,6 +37,11 @@ static const int kRGBSizeScaled = kScaledWidth * kScaledHeight * kBpp;
static const int kRGB24Size = kSourceYSize * 3;
static const int kRGBSizeConverted = kSourceYSize * kBpp;
+#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
+static const int kSourceAOffset = kSourceYSize * 12 / 8;
+static const int kYUVA12Size = kSourceYSize * 20 / 8;
+#endif
+
// Helper for reading test data into a scoped_ptr<uint8[]>.
static void ReadData(const base::FilePath::CharType* filename,
int expected_size,
@@ -69,6 +74,12 @@ static void ReadYV16Data(scoped_ptr<uint8[]>* data) {
ReadData(FILE_PATH_LITERAL("bali_640x360_P422.yuv"), kYUV16Size, data);
}
+#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
+static void ReadYV12AData(scoped_ptr<uint8[]>* data) {
+ ReadData(FILE_PATH_LITERAL("bali_640x360_P420_alpha.yuv"), kYUVA12Size, data);
+}
+#endif
+
static void ReadRGB24Data(scoped_ptr<uint8[]>* data) {
ReadData(FILE_PATH_LITERAL("bali_640x360_RGB24.rgb"), kRGB24Size, data);
}
@@ -517,6 +528,48 @@ TEST(YUVConvertTest, DownScaleYUVToRGB32WithRect) {
}
#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
+TEST(YUVConvertTest, YUVAtoARGB_MMX_MatchReference) {
+ // Allocate all surfaces.
+ scoped_ptr<uint8[]> yuv_bytes;
+ scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]);
+ scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]);
+ scoped_ptr<uint8[]> rgb_converted_bytes_ref(new uint8[kRGBSizeConverted]);
+
+ // Read YUV reference data from file.
+ ReadYV12AData(&yuv_bytes);
+
+ // Convert a frame of YUV to 32 bit ARGB using both C and MMX versions.
+ media::ConvertYUVAToARGB_C(yuv_bytes.get(),
+ yuv_bytes.get() + kSourceUOffset,
+ yuv_bytes.get() + kSourceVOffset,
+ yuv_bytes.get() + kSourceAOffset,
+ rgb_converted_bytes_ref.get(),
+ kSourceWidth,
+ kSourceHeight,
+ kSourceWidth,
+ kSourceWidth / 2,
+ kSourceWidth,
+ kSourceWidth * kBpp,
+ media::YV12);
+ media::ConvertYUVAToARGB_MMX(yuv_bytes.get(),
+ yuv_bytes.get() + kSourceUOffset,
+ yuv_bytes.get() + kSourceVOffset,
+ yuv_bytes.get() + kSourceAOffset,
+ rgb_converted_bytes.get(),
+ kSourceWidth,
+ kSourceHeight,
+ kSourceWidth,
+ kSourceWidth / 2,
+ kSourceWidth,
+ kSourceWidth * kBpp,
+ media::YV12);
+
+ EXPECT_EQ(0,
+ memcmp(rgb_converted_bytes.get(),
+ rgb_converted_bytes_ref.get(),
+ kRGBSizeConverted));
+}
+
TEST(YUVConvertTest, RGB32ToYUV_SSE2_MatchReference) {
base::CPU cpu;
if (!cpu.has_sse2()) {
« no previous file with comments | « media/base/simd/convert_yuva_to_argb_mmx.inc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698