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

Side by Side Diff: media/base/yuv_convert_unittest.cc

Issue 17043007: Fix the WebRTC color bug. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unit test error on Android. Created 7 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/base_paths.h" 5 #include "base/base_paths.h"
6 #include "base/cpu.h" 6 #include "base/cpu.h"
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "media/base/djb2.h" 10 #include "media/base/djb2.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 yuv_bytes.get() + kSourceVOffset, 93 yuv_bytes.get() + kSourceVOffset,
94 rgb_converted_bytes.get(), // RGB output 94 rgb_converted_bytes.get(), // RGB output
95 kSourceWidth, kSourceHeight, // Dimensions 95 kSourceWidth, kSourceHeight, // Dimensions
96 kSourceWidth, // YStride 96 kSourceWidth, // YStride
97 kSourceWidth / 2, // UVStride 97 kSourceWidth / 2, // UVStride
98 kSourceWidth * kBpp, // RGBStride 98 kSourceWidth * kBpp, // RGBStride
99 media::YV12); 99 media::YV12);
100 100
101 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, 101 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted,
102 kDJB2HashSeed); 102 kDJB2HashSeed);
103 #if defined(OS_ANDROID)
104 EXPECT_EQ(815021082u, rgb_hash);
scherkus (not reviewing) 2013/06/19 19:49:50 what about writing and using a BGRA->RGBA swizzler
hkuang1 2013/06/19 23:21:11 Done. Wrote a helper function to convert BGRA->RGB
105 #else
103 EXPECT_EQ(2413171226u, rgb_hash); 106 EXPECT_EQ(2413171226u, rgb_hash);
107 #endif
104 } 108 }
105 109
106 TEST(YUVConvertTest, YV16) { 110 TEST(YUVConvertTest, YV16) {
107 // Allocate all surfaces. 111 // Allocate all surfaces.
108 scoped_ptr<uint8[]> yuv_bytes; 112 scoped_ptr<uint8[]> yuv_bytes;
109 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); 113 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]);
110 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); 114 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]);
111 115
112 // Read YUV reference data from file. 116 // Read YUV reference data from file.
113 ReadYV16Data(&yuv_bytes); 117 ReadYV16Data(&yuv_bytes);
114 118
115 // Convert a frame of YUV to 32 bit ARGB. 119 // Convert a frame of YUV to 32 bit ARGB.
116 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y 120 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y
117 yuv_bytes.get() + kSourceUOffset, // U 121 yuv_bytes.get() + kSourceUOffset, // U
118 yuv_bytes.get() + kSourceYSize * 3 / 2, // V 122 yuv_bytes.get() + kSourceYSize * 3 / 2, // V
119 rgb_converted_bytes.get(), // RGB output 123 rgb_converted_bytes.get(), // RGB output
120 kSourceWidth, kSourceHeight, // Dimensions 124 kSourceWidth, kSourceHeight, // Dimensions
121 kSourceWidth, // YStride 125 kSourceWidth, // YStride
122 kSourceWidth / 2, // UVStride 126 kSourceWidth / 2, // UVStride
123 kSourceWidth * kBpp, // RGBStride 127 kSourceWidth * kBpp, // RGBStride
124 media::YV16); 128 media::YV16);
125 129
126 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, 130 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted,
127 kDJB2HashSeed); 131 kDJB2HashSeed);
132 #if defined(OS_ANDROID)
133 EXPECT_EQ(3370743199u, rgb_hash);
134 #else
128 EXPECT_EQ(4222342047u, rgb_hash); 135 EXPECT_EQ(4222342047u, rgb_hash);
136 #endif
129 } 137 }
130 138
131 struct YUVScaleTestData { 139 struct YUVScaleTestData {
132 YUVScaleTestData(media::YUVType y, media::ScaleFilter s, uint32 r) 140 YUVScaleTestData(media::YUVType y, media::ScaleFilter s, uint32 r)
133 : yuv_type(y), 141 : yuv_type(y),
134 scale_filter(s), 142 scale_filter(s),
135 rgb_hash(r) { 143 rgb_hash(r) {
136 } 144 }
137 145
138 media::YUVType yuv_type; 146 media::YUVType yuv_type;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 kSourceWidth, kSourceHeight, // Dimensions 271 kSourceWidth, kSourceHeight, // Dimensions
264 3, 3, // Dimensions 272 3, 3, // Dimensions
265 kSourceWidth, // YStride 273 kSourceWidth, // YStride
266 kSourceWidth / 2, // UvStride 274 kSourceWidth / 2, // UvStride
267 kScaledWidth * kBpp, // RgbStride 275 kScaledWidth * kBpp, // RgbStride
268 GetParam().yuv_type, 276 GetParam().yuv_type,
269 media::ROTATE_0, 277 media::ROTATE_0,
270 GetParam().scale_filter); 278 GetParam().scale_filter);
271 } 279 }
272 280
281 #if defined(OS_ANDROID)
273 INSTANTIATE_TEST_CASE_P( 282 INSTANTIATE_TEST_CASE_P(
274 YUVScaleFormats, YUVScaleTest, 283 YUVScaleFormats, YUVScaleTest,
275 ::testing::Values( 284 ::testing::Values(
285 YUVScaleTestData(media::YV12, media::FILTER_NONE, 2593983416u),
286 YUVScaleTestData(media::YV16, media::FILTER_NONE, 246995851u),
287 YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 293331713u),
288 YUVScaleTestData(media::YV16, media::FILTER_BILINEAR, 123521758u)));
289 #else
290 INSTANTIATE_TEST_CASE_P(
291 YUVScaleFormats, YUVScaleTest,
292 ::testing::Values(
276 YUVScaleTestData(media::YV12, media::FILTER_NONE, 4136904952u), 293 YUVScaleTestData(media::YV12, media::FILTER_NONE, 4136904952u),
277 YUVScaleTestData(media::YV16, media::FILTER_NONE, 1501777547u), 294 YUVScaleTestData(media::YV16, media::FILTER_NONE, 1501777547u),
278 YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 3164274689u), 295 YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 3164274689u),
279 YUVScaleTestData(media::YV16, media::FILTER_BILINEAR, 3095878046u))); 296 YUVScaleTestData(media::YV16, media::FILTER_BILINEAR, 3095878046u)));
297 #endif
280 298
281 // This tests a known worst case YUV value, and for overflow. 299 // This tests a known worst case YUV value, and for overflow.
282 TEST(YUVConvertTest, Clamp) { 300 TEST(YUVConvertTest, Clamp) {
283 // Allocate all surfaces. 301 // Allocate all surfaces.
284 scoped_ptr<uint8[]> yuv_bytes(new uint8[1]); 302 scoped_ptr<uint8[]> yuv_bytes(new uint8[1]);
285 scoped_ptr<uint8[]> rgb_bytes(new uint8[1]); 303 scoped_ptr<uint8[]> rgb_bytes(new uint8[1]);
286 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[1]); 304 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[1]);
287 305
288 // Values that failed previously in bug report. 306 // Values that failed previously in bug report.
289 unsigned char y = 255u; 307 unsigned char y = 255u;
290 unsigned char u = 255u; 308 unsigned char u = 255u;
291 unsigned char v = 19u; 309 unsigned char v = 19u;
292 310
293 // Prefill extra large destination buffer to test for overflow. 311 // Prefill extra large destination buffer to test for overflow.
294 unsigned char rgb[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; 312 unsigned char rgb[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
295 unsigned char expected[8] = { 255, 255, 104, 255, 4, 5, 6, 7 }; 313 unsigned char expected[8] = { 255, 255, 104, 255, 4, 5, 6, 7 };
296 // Convert a frame of YUV to 32 bit ARGB. 314 // Convert a frame of YUV to 32 bit ARGB.
297 media::ConvertYUVToRGB32(&y, // Y 315 media::ConvertYUVToRGB32(&y, // Y
298 &u, // U 316 &u, // U
299 &v, // V 317 &v, // V
300 &rgb[0], // RGB output 318 &rgb[0], // RGB output
301 1, 1, // Dimensions 319 1, 1, // Dimensions
302 0, // YStride 320 0, // YStride
303 0, // UVStride 321 0, // UVStride
304 0, // RGBStride 322 0, // RGBStride
305 media::YV12); 323 media::YV12);
306 324
325 #if defined(OS_ANDROID)
326 unsigned char expectedAndroid[8] = { 104, 255, 255, 255, 4, 5, 6, 7 };
327 int expected_test = memcmp(rgb, expectedAndroid, sizeof(expected));
328 EXPECT_EQ(0, expected_test);
329 #else
307 int expected_test = memcmp(rgb, expected, sizeof(expected)); 330 int expected_test = memcmp(rgb, expected, sizeof(expected));
308 EXPECT_EQ(0, expected_test); 331 EXPECT_EQ(0, expected_test);
332 #endif
309 } 333 }
310 334
311 TEST(YUVConvertTest, RGB24ToYUV) { 335 TEST(YUVConvertTest, RGB24ToYUV) {
312 // Allocate all surfaces. 336 // Allocate all surfaces.
313 scoped_ptr<uint8[]> rgb_bytes; 337 scoped_ptr<uint8[]> rgb_bytes;
314 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); 338 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]);
315 339
316 // Read RGB24 reference data from file. 340 // Read RGB24 reference data from file.
317 ReadRGB24Data(&rgb_bytes); 341 ReadRGB24Data(&rgb_bytes);
318 342
319 // Convert to I420. 343 // Convert to I420.
320 media::ConvertRGB24ToYUV(rgb_bytes.get(), 344 media::ConvertRGB24ToYUV(rgb_bytes.get(),
321 yuv_converted_bytes.get(), 345 yuv_converted_bytes.get(),
322 yuv_converted_bytes.get() + kSourceUOffset, 346 yuv_converted_bytes.get() + kSourceUOffset,
323 yuv_converted_bytes.get() + kSourceVOffset, 347 yuv_converted_bytes.get() + kSourceVOffset,
324 kSourceWidth, kSourceHeight, // Dimensions 348 kSourceWidth, kSourceHeight, // Dimensions
325 kSourceWidth * 3, // RGBStride 349 kSourceWidth * 3, // RGBStride
326 kSourceWidth, // YStride 350 kSourceWidth, // YStride
327 kSourceWidth / 2); // UVStride 351 kSourceWidth / 2); // UVStride
328 352
329 uint32 rgb_hash = DJB2Hash(yuv_converted_bytes.get(), kYUV12Size, 353 uint32 rgb_hash = DJB2Hash(yuv_converted_bytes.get(), kYUV12Size,
330 kDJB2HashSeed); 354 kDJB2HashSeed);
355 #if defined(OS_ANDROID)
331 EXPECT_EQ(320824432u, rgb_hash); 356 EXPECT_EQ(320824432u, rgb_hash);
357 #else
358 EXPECT_EQ(320824432u, rgb_hash);
scherkus (not reviewing) 2013/06/19 19:49:50 these values are the same
hkuang1 2013/06/19 23:21:11 A mistake. Delete it.
359 #endif
332 } 360 }
333 361
334 TEST(YUVConvertTest, RGB32ToYUV) { 362 TEST(YUVConvertTest, RGB32ToYUV) {
335 // Allocate all surfaces. 363 // Allocate all surfaces.
336 scoped_ptr<uint8[]> yuv_bytes(new uint8[kYUV12Size]); 364 scoped_ptr<uint8[]> yuv_bytes(new uint8[kYUV12Size]);
337 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); 365 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]);
338 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); 366 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]);
339 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSize]); 367 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSize]);
340 368
341 // Read YUV reference data from file. 369 // Read YUV reference data from file.
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(), 964 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
937 rgb_bytes_converted.get(), 965 rgb_bytes_converted.get(),
938 kWidth * kBpp)); 966 kWidth * kBpp));
939 } 967 }
940 968
941 #endif // defined(ARCH_CPU_X86_64) 969 #endif // defined(ARCH_CPU_X86_64)
942 970
943 #endif // defined(ARCH_CPU_X86_FAMILY) 971 #endif // defined(ARCH_CPU_X86_FAMILY)
944 972
945 } // namespace media 973 } // namespace media
OLDNEW
« media/base/simd/convert_rgb_to_yuv_c.cc ('K') | « media/base/simd/convert_yuv_to_rgb_c.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698