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

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

Issue 88403004: Add plumbing for video pixel formats with JPEG color range. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix unit tests Created 7 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 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 98
99 // Convert a frame of YUV to 32 bit ARGB. 99 // Convert a frame of YUV to 32 bit ARGB.
100 media::ConvertYUVToRGB32(yuv_bytes.get(), 100 media::ConvertYUVToRGB32(yuv_bytes.get(),
101 yuv_bytes.get() + kSourceUOffset, 101 yuv_bytes.get() + kSourceUOffset,
102 yuv_bytes.get() + kSourceVOffset, 102 yuv_bytes.get() + kSourceVOffset,
103 rgb_converted_bytes.get(), // RGB output 103 rgb_converted_bytes.get(), // RGB output
104 kSourceWidth, kSourceHeight, // Dimensions 104 kSourceWidth, kSourceHeight, // Dimensions
105 kSourceWidth, // YStride 105 kSourceWidth, // YStride
106 kSourceWidth / 2, // UVStride 106 kSourceWidth / 2, // UVStride
107 kSourceWidth * kBpp, // RGBStride 107 kSourceWidth * kBpp, // RGBStride
108 media::YV12); 108 media::YV12,
109 media::YUV_RANGE_RESTRICTED);
109 110
110 #if defined(OS_ANDROID) 111 #if defined(OS_ANDROID)
111 SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted); 112 SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted);
112 #endif 113 #endif
113 114
114 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, 115 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted,
115 kDJB2HashSeed); 116 kDJB2HashSeed);
116 EXPECT_EQ(2413171226u, rgb_hash); 117 EXPECT_EQ(2413171226u, rgb_hash);
117 } 118 }
118 119
119 TEST(YUVConvertTest, YV16) { 120 TEST(YUVConvertTest, YV16) {
120 // Allocate all surfaces. 121 // Allocate all surfaces.
121 scoped_ptr<uint8[]> yuv_bytes; 122 scoped_ptr<uint8[]> yuv_bytes;
122 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); 123 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]);
123 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); 124 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]);
124 125
125 // Read YUV reference data from file. 126 // Read YUV reference data from file.
126 ReadYV16Data(&yuv_bytes); 127 ReadYV16Data(&yuv_bytes);
127 128
128 // Convert a frame of YUV to 32 bit ARGB. 129 // Convert a frame of YUV to 32 bit ARGB.
129 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y 130 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y
130 yuv_bytes.get() + kSourceUOffset, // U 131 yuv_bytes.get() + kSourceUOffset, // U
131 yuv_bytes.get() + kSourceYSize * 3 / 2, // V 132 yuv_bytes.get() + kSourceYSize * 3 / 2, // V
132 rgb_converted_bytes.get(), // RGB output 133 rgb_converted_bytes.get(), // RGB output
133 kSourceWidth, kSourceHeight, // Dimensions 134 kSourceWidth, kSourceHeight, // Dimensions
134 kSourceWidth, // YStride 135 kSourceWidth, // YStride
135 kSourceWidth / 2, // UVStride 136 kSourceWidth / 2, // UVStride
136 kSourceWidth * kBpp, // RGBStride 137 kSourceWidth * kBpp, // RGBStride
137 media::YV16); 138 media::YV16,
139 media::YUV_RANGE_RESTRICTED);
138 140
139 #if defined(OS_ANDROID) 141 #if defined(OS_ANDROID)
140 SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted); 142 SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted);
141 #endif 143 #endif
142 144
143 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, 145 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted,
144 kDJB2HashSeed); 146 kDJB2HashSeed);
145 EXPECT_EQ(4222342047u, rgb_hash); 147 EXPECT_EQ(4222342047u, rgb_hash);
146 } 148 }
147 149
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 media::ScaleYUVToRGB32(y_plane(), // Y 195 media::ScaleYUVToRGB32(y_plane(), // Y
194 u_plane(), // U 196 u_plane(), // U
195 v_plane(), // V 197 v_plane(), // V
196 rgb_bytes_.get(), // RGB output 198 rgb_bytes_.get(), // RGB output
197 kSourceWidth, kSourceHeight, // Dimensions 199 kSourceWidth, kSourceHeight, // Dimensions
198 kSourceWidth, kSourceHeight, // Dimensions 200 kSourceWidth, kSourceHeight, // Dimensions
199 kSourceWidth, // YStride 201 kSourceWidth, // YStride
200 kSourceWidth / 2, // UvStride 202 kSourceWidth / 2, // UvStride
201 kSourceWidth * kBpp, // RgbStride 203 kSourceWidth * kBpp, // RgbStride
202 GetParam().yuv_type, 204 GetParam().yuv_type,
205 media::YUV_RANGE_RESTRICTED,
203 media::ROTATE_0, 206 media::ROTATE_0,
204 GetParam().scale_filter); 207 GetParam().scale_filter);
205 208
206 uint32 yuv_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed); 209 uint32 yuv_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed);
207 210
208 media::ConvertYUVToRGB32(y_plane(), // Y 211 media::ConvertYUVToRGB32(y_plane(), // Y
209 u_plane(), // U 212 u_plane(), // U
210 v_plane(), // V 213 v_plane(), // V
211 rgb_bytes_.get(), // RGB output 214 rgb_bytes_.get(), // RGB output
212 kSourceWidth, kSourceHeight, // Dimensions 215 kSourceWidth, kSourceHeight, // Dimensions
213 kSourceWidth, // YStride 216 kSourceWidth, // YStride
214 kSourceWidth / 2, // UVStride 217 kSourceWidth / 2, // UVStride
215 kSourceWidth * kBpp, // RGBStride 218 kSourceWidth * kBpp, // RGBStride
216 GetParam().yuv_type); 219 GetParam().yuv_type,
220 media::YUV_RANGE_RESTRICTED);
217 221
218 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed); 222 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed);
219 223
220 EXPECT_EQ(yuv_hash, rgb_hash); 224 EXPECT_EQ(yuv_hash, rgb_hash);
221 } 225 }
222 226
223 TEST_P(YUVScaleTest, Normal) { 227 TEST_P(YUVScaleTest, Normal) {
224 media::ScaleYUVToRGB32(y_plane(), // Y 228 media::ScaleYUVToRGB32(y_plane(), // Y
225 u_plane(), // U 229 u_plane(), // U
226 v_plane(), // V 230 v_plane(), // V
227 rgb_bytes_.get(), // RGB output 231 rgb_bytes_.get(), // RGB output
228 kSourceWidth, kSourceHeight, // Dimensions 232 kSourceWidth, kSourceHeight, // Dimensions
229 kScaledWidth, kScaledHeight, // Dimensions 233 kScaledWidth, kScaledHeight, // Dimensions
230 kSourceWidth, // YStride 234 kSourceWidth, // YStride
231 kSourceWidth / 2, // UvStride 235 kSourceWidth / 2, // UvStride
232 kScaledWidth * kBpp, // RgbStride 236 kScaledWidth * kBpp, // RgbStride
233 GetParam().yuv_type, 237 GetParam().yuv_type,
238 media::YUV_RANGE_RESTRICTED,
234 media::ROTATE_0, 239 media::ROTATE_0,
235 GetParam().scale_filter); 240 GetParam().scale_filter);
236 241
237 #if defined(OS_ANDROID) 242 #if defined(OS_ANDROID)
238 SwapRedAndBlueChannels(rgb_bytes_.get(), kRGBSizeScaled); 243 SwapRedAndBlueChannels(rgb_bytes_.get(), kRGBSizeScaled);
239 #endif 244 #endif
240 245
241 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSizeScaled, kDJB2HashSeed); 246 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSizeScaled, kDJB2HashSeed);
242 EXPECT_EQ(GetParam().rgb_hash, rgb_hash); 247 EXPECT_EQ(GetParam().rgb_hash, rgb_hash);
243 } 248 }
244 249
245 TEST_P(YUVScaleTest, ZeroSourceSize) { 250 TEST_P(YUVScaleTest, ZeroSourceSize) {
246 media::ScaleYUVToRGB32(y_plane(), // Y 251 media::ScaleYUVToRGB32(y_plane(), // Y
247 u_plane(), // U 252 u_plane(), // U
248 v_plane(), // V 253 v_plane(), // V
249 rgb_bytes_.get(), // RGB output 254 rgb_bytes_.get(), // RGB output
250 0, 0, // Dimensions 255 0, 0, // Dimensions
251 kScaledWidth, kScaledHeight, // Dimensions 256 kScaledWidth, kScaledHeight, // Dimensions
252 kSourceWidth, // YStride 257 kSourceWidth, // YStride
253 kSourceWidth / 2, // UvStride 258 kSourceWidth / 2, // UvStride
254 kScaledWidth * kBpp, // RgbStride 259 kScaledWidth * kBpp, // RgbStride
255 GetParam().yuv_type, 260 GetParam().yuv_type,
261 media::YUV_RANGE_RESTRICTED,
256 media::ROTATE_0, 262 media::ROTATE_0,
257 GetParam().scale_filter); 263 GetParam().scale_filter);
258 264
259 // Testing for out-of-bound read/writes with AddressSanitizer. 265 // Testing for out-of-bound read/writes with AddressSanitizer.
260 } 266 }
261 267
262 TEST_P(YUVScaleTest, ZeroDestinationSize) { 268 TEST_P(YUVScaleTest, ZeroDestinationSize) {
263 media::ScaleYUVToRGB32(y_plane(), // Y 269 media::ScaleYUVToRGB32(y_plane(), // Y
264 u_plane(), // U 270 u_plane(), // U
265 v_plane(), // V 271 v_plane(), // V
266 rgb_bytes_.get(), // RGB output 272 rgb_bytes_.get(), // RGB output
267 kSourceWidth, kSourceHeight, // Dimensions 273 kSourceWidth, kSourceHeight, // Dimensions
268 0, 0, // Dimensions 274 0, 0, // Dimensions
269 kSourceWidth, // YStride 275 kSourceWidth, // YStride
270 kSourceWidth / 2, // UvStride 276 kSourceWidth / 2, // UvStride
271 kScaledWidth * kBpp, // RgbStride 277 kScaledWidth * kBpp, // RgbStride
272 GetParam().yuv_type, 278 GetParam().yuv_type,
279 media::YUV_RANGE_RESTRICTED,
273 media::ROTATE_0, 280 media::ROTATE_0,
274 GetParam().scale_filter); 281 GetParam().scale_filter);
275 282
276 // Testing for out-of-bound read/writes with AddressSanitizer. 283 // Testing for out-of-bound read/writes with AddressSanitizer.
277 } 284 }
278 285
279 TEST_P(YUVScaleTest, OddWidthAndHeightNotCrash) { 286 TEST_P(YUVScaleTest, OddWidthAndHeightNotCrash) {
280 media::ScaleYUVToRGB32(y_plane(), // Y 287 media::ScaleYUVToRGB32(y_plane(), // Y
281 u_plane(), // U 288 u_plane(), // U
282 v_plane(), // V 289 v_plane(), // V
283 rgb_bytes_.get(), // RGB output 290 rgb_bytes_.get(), // RGB output
284 kSourceWidth, kSourceHeight, // Dimensions 291 kSourceWidth, kSourceHeight, // Dimensions
285 3, 3, // Dimensions 292 3, 3, // Dimensions
286 kSourceWidth, // YStride 293 kSourceWidth, // YStride
287 kSourceWidth / 2, // UvStride 294 kSourceWidth / 2, // UvStride
288 kScaledWidth * kBpp, // RgbStride 295 kScaledWidth * kBpp, // RgbStride
289 GetParam().yuv_type, 296 GetParam().yuv_type,
297 media::YUV_RANGE_RESTRICTED,
290 media::ROTATE_0, 298 media::ROTATE_0,
291 GetParam().scale_filter); 299 GetParam().scale_filter);
292 } 300 }
293 301
294 INSTANTIATE_TEST_CASE_P( 302 INSTANTIATE_TEST_CASE_P(
295 YUVScaleFormats, YUVScaleTest, 303 YUVScaleFormats, YUVScaleTest,
296 ::testing::Values( 304 ::testing::Values(
297 YUVScaleTestData(media::YV12, media::FILTER_NONE, 4136904952u), 305 YUVScaleTestData(media::YV12, media::FILTER_NONE, 4136904952u),
298 YUVScaleTestData(media::YV16, media::FILTER_NONE, 1501777547u), 306 YUVScaleTestData(media::YV16, media::FILTER_NONE, 1501777547u),
299 YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 3164274689u), 307 YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 3164274689u),
(...skipping 16 matching lines...) Expand all
316 unsigned char expected[8] = { 255, 255, 104, 255, 4, 5, 6, 7 }; 324 unsigned char expected[8] = { 255, 255, 104, 255, 4, 5, 6, 7 };
317 // Convert a frame of YUV to 32 bit ARGB. 325 // Convert a frame of YUV to 32 bit ARGB.
318 media::ConvertYUVToRGB32(&y, // Y 326 media::ConvertYUVToRGB32(&y, // Y
319 &u, // U 327 &u, // U
320 &v, // V 328 &v, // V
321 &rgb[0], // RGB output 329 &rgb[0], // RGB output
322 1, 1, // Dimensions 330 1, 1, // Dimensions
323 0, // YStride 331 0, // YStride
324 0, // UVStride 332 0, // UVStride
325 0, // RGBStride 333 0, // RGBStride
326 media::YV12); 334 media::YV12,
335 media::YUV_RANGE_RESTRICTED);
327 336
328 #if defined(OS_ANDROID) 337 #if defined(OS_ANDROID)
329 SwapRedAndBlueChannels(rgb, kBpp); 338 SwapRedAndBlueChannels(rgb, kBpp);
330 #endif 339 #endif
331 340
332 int expected_test = memcmp(rgb, expected, sizeof(expected)); 341 int expected_test = memcmp(rgb, expected, sizeof(expected));
333 EXPECT_EQ(0, expected_test); 342 EXPECT_EQ(0, expected_test);
334 } 343 }
335 344
336 TEST(YUVConvertTest, RGB24ToYUV) { 345 TEST(YUVConvertTest, RGB24ToYUV) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 386
378 // Convert a frame of YUV to 32 bit ARGB. 387 // Convert a frame of YUV to 32 bit ARGB.
379 media::ConvertYUVToRGB32(yuv_bytes.get(), 388 media::ConvertYUVToRGB32(yuv_bytes.get(),
380 yuv_bytes.get() + kSourceUOffset, 389 yuv_bytes.get() + kSourceUOffset,
381 yuv_bytes.get() + kSourceVOffset, 390 yuv_bytes.get() + kSourceVOffset,
382 rgb_bytes.get(), // RGB output 391 rgb_bytes.get(), // RGB output
383 kSourceWidth, kSourceHeight, // Dimensions 392 kSourceWidth, kSourceHeight, // Dimensions
384 kSourceWidth, // YStride 393 kSourceWidth, // YStride
385 kSourceWidth / 2, // UVStride 394 kSourceWidth / 2, // UVStride
386 kSourceWidth * kBpp, // RGBStride 395 kSourceWidth * kBpp, // RGBStride
387 media::YV12); 396 media::YV12,
397 media::YUV_RANGE_RESTRICTED);
388 398
389 // Convert RGB32 to YV12. 399 // Convert RGB32 to YV12.
390 media::ConvertRGB32ToYUV(rgb_bytes.get(), 400 media::ConvertRGB32ToYUV(rgb_bytes.get(),
391 yuv_converted_bytes.get(), 401 yuv_converted_bytes.get(),
392 yuv_converted_bytes.get() + kSourceUOffset, 402 yuv_converted_bytes.get() + kSourceUOffset,
393 yuv_converted_bytes.get() + kSourceVOffset, 403 yuv_converted_bytes.get() + kSourceVOffset,
394 kSourceWidth, kSourceHeight, // Dimensions 404 kSourceWidth, kSourceHeight, // Dimensions
395 kSourceWidth * 4, // RGBStride 405 kSourceWidth * 4, // RGBStride
396 kSourceWidth, // YStride 406 kSourceWidth, // YStride
397 kSourceWidth / 2); // UVStride 407 kSourceWidth / 2); // UVStride
398 408
399 // Convert YV12 back to RGB32. 409 // Convert YV12 back to RGB32.
400 media::ConvertYUVToRGB32(yuv_converted_bytes.get(), 410 media::ConvertYUVToRGB32(yuv_converted_bytes.get(),
401 yuv_converted_bytes.get() + kSourceUOffset, 411 yuv_converted_bytes.get() + kSourceUOffset,
402 yuv_converted_bytes.get() + kSourceVOffset, 412 yuv_converted_bytes.get() + kSourceVOffset,
403 rgb_converted_bytes.get(), // RGB output 413 rgb_converted_bytes.get(), // RGB output
404 kSourceWidth, kSourceHeight, // Dimensions 414 kSourceWidth, kSourceHeight, // Dimensions
405 kSourceWidth, // YStride 415 kSourceWidth, // YStride
406 kSourceWidth / 2, // UVStride 416 kSourceWidth / 2, // UVStride
407 kSourceWidth * kBpp, // RGBStride 417 kSourceWidth * kBpp, // RGBStride
408 media::YV12); 418 media::YV12,
419 media::YUV_RANGE_RESTRICTED);
409 420
410 int error = 0; 421 int error = 0;
411 for (int i = 0; i < kRGBSize; ++i) { 422 for (int i = 0; i < kRGBSize; ++i) {
412 int diff = rgb_converted_bytes[i] - rgb_bytes[i]; 423 int diff = rgb_converted_bytes[i] - rgb_bytes[i];
413 if (diff < 0) 424 if (diff < 0)
414 diff = -diff; 425 diff = -diff;
415 error += diff; 426 error += diff;
416 } 427 }
417 428
418 // Make sure error is within bound. 429 // Make sure error is within bound.
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 // Convert a frame of YUV to 32 bit ARGB. 543 // Convert a frame of YUV to 32 bit ARGB.
533 media::ConvertYUVToRGB32( 544 media::ConvertYUVToRGB32(
534 yuv_bytes.get(), 545 yuv_bytes.get(),
535 yuv_bytes.get() + kSourceUOffset, 546 yuv_bytes.get() + kSourceUOffset,
536 yuv_bytes.get() + kSourceVOffset, 547 yuv_bytes.get() + kSourceVOffset,
537 rgb_bytes.get(), // RGB output 548 rgb_bytes.get(), // RGB output
538 kSourceWidth, kSourceHeight, // Dimensions 549 kSourceWidth, kSourceHeight, // Dimensions
539 kSourceWidth, // YStride 550 kSourceWidth, // YStride
540 kSourceWidth / 2, // UVStride 551 kSourceWidth / 2, // UVStride
541 kSourceWidth * kBpp, // RGBStride 552 kSourceWidth * kBpp, // RGBStride
542 media::YV12); 553 media::YV12,
554 media::YUV_RANGE_RESTRICTED);
543 555
544 // Convert RGB32 to YV12 with SSE2 version. 556 // Convert RGB32 to YV12 with SSE2 version.
545 media::ConvertRGB32ToYUV_SSE2( 557 media::ConvertRGB32ToYUV_SSE2(
546 rgb_bytes.get(), 558 rgb_bytes.get(),
547 yuv_converted_bytes.get(), 559 yuv_converted_bytes.get(),
548 yuv_converted_bytes.get() + kSourceUOffset, 560 yuv_converted_bytes.get() + kSourceUOffset,
549 yuv_converted_bytes.get() + kSourceVOffset, 561 yuv_converted_bytes.get() + kSourceVOffset,
550 kSourceWidth, kSourceHeight, // Dimensions 562 kSourceWidth, kSourceHeight, // Dimensions
551 kSourceWidth * 4, // RGBStride 563 kSourceWidth * 4, // RGBStride
552 kSourceWidth, // YStride 564 kSourceWidth, // YStride
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(), 973 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
962 rgb_bytes_converted.get(), 974 rgb_bytes_converted.get(),
963 kWidth * kBpp)); 975 kWidth * kBpp));
964 } 976 }
965 977
966 #endif // defined(ARCH_CPU_X86_64) 978 #endif // defined(ARCH_CPU_X86_64)
967 979
968 #endif // defined(ARCH_CPU_X86_FAMILY) 980 #endif // defined(ARCH_CPU_X86_FAMILY)
969 981
970 } // namespace media 982 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698