OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2015 The LibYuv Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 19 matching lines...) Expand all Loading... |
30 #define ERROR_J420 4 | 30 #define ERROR_J420 4 |
31 #else | 31 #else |
32 #define ERROR_R 1 | 32 #define ERROR_R 1 |
33 #define ERROR_G 1 | 33 #define ERROR_G 1 |
34 #define ERROR_B 3 | 34 #define ERROR_B 3 |
35 #define ERROR_FULL 5 | 35 #define ERROR_FULL 5 |
36 #define ERROR_J420 3 | 36 #define ERROR_J420 3 |
37 #endif | 37 #endif |
38 | 38 |
39 #define TESTCS(TESTNAME, YUVTOARGB, ARGBTOYUV, HS1, HS, HN, DIFF) \ | 39 #define TESTCS(TESTNAME, YUVTOARGB, ARGBTOYUV, HS1, HS, HN, DIFF) \ |
40 TEST_F(LibYUVConvertTest, TESTNAME) { \ | 40 TEST_F(LibYUVColorTest, TESTNAME) { \ |
41 const int kPixels = benchmark_width_ * benchmark_height_; \ | 41 const int kPixels = benchmark_width_ * benchmark_height_; \ |
42 const int kHalfPixels = ((benchmark_width_ + 1) / 2) * \ | 42 const int kHalfPixels = ((benchmark_width_ + 1) / 2) * \ |
43 ((benchmark_height_ + HS1) / HS); \ | 43 ((benchmark_height_ + HS1) / HS); \ |
44 align_buffer_64(orig_y, kPixels); \ | 44 align_buffer_64(orig_y, kPixels); \ |
45 align_buffer_64(orig_u, kHalfPixels); \ | 45 align_buffer_64(orig_u, kHalfPixels); \ |
46 align_buffer_64(orig_v, kHalfPixels); \ | 46 align_buffer_64(orig_v, kHalfPixels); \ |
47 align_buffer_64(orig_pixels, kPixels * 4); \ | 47 align_buffer_64(orig_pixels, kPixels * 4); \ |
48 align_buffer_64(temp_y, kPixels); \ | 48 align_buffer_64(temp_y, kPixels); \ |
49 align_buffer_64(temp_u, kHalfPixels); \ | 49 align_buffer_64(temp_u, kHalfPixels); \ |
50 align_buffer_64(temp_v, kHalfPixels); \ | 50 align_buffer_64(temp_v, kHalfPixels); \ |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 #elif defined(CLAMPMETHOD_MASK) | 305 #elif defined(CLAMPMETHOD_MASK) |
306 static int RoundToByte(float f) { | 306 static int RoundToByte(float f) { |
307 int i = ROUND(f); | 307 int i = ROUND(f); |
308 i = ((-(i) >> 31) & (i)); // clamp to 0. | 308 i = ((-(i) >> 31) & (i)); // clamp to 0. |
309 return (((255 - (i)) >> 31) | (i)) & 255; // clamp to 255. | 309 return (((255 - (i)) >> 31) | (i)) & 255; // clamp to 255. |
310 } | 310 } |
311 #endif | 311 #endif |
312 | 312 |
313 #define RANDOM256(s) ((s & 1) ? ((s >> 1) ^ 0xb8) : (s >> 1)) | 313 #define RANDOM256(s) ((s & 1) ? ((s >> 1) ^ 0xb8) : (s >> 1)) |
314 | 314 |
315 TEST_F(LibYUVConvertTest, TestRoundToByte) { | 315 TEST_F(LibYUVColorTest, TestRoundToByte) { |
316 int allb = 0; | 316 int allb = 0; |
317 int count = benchmark_width_ * benchmark_height_; | 317 int count = benchmark_width_ * benchmark_height_; |
318 for (int i = 0; i < benchmark_iterations_; ++i) { | 318 for (int i = 0; i < benchmark_iterations_; ++i) { |
319 float f = (fastrand() & 255) * 3.14f - 260.f; | 319 float f = (fastrand() & 255) * 3.14f - 260.f; |
320 for (int j = 0; j < count; ++j) { | 320 for (int j = 0; j < count; ++j) { |
321 int b = RoundToByte(f); | 321 int b = RoundToByte(f); |
322 f += 0.91f; | 322 f += 0.91f; |
323 allb |= b; | 323 allb |= b; |
324 } | 324 } |
325 } | 325 } |
326 EXPECT_GE(allb, 0); | 326 EXPECT_GE(allb, 0); |
327 EXPECT_LE(allb, 255); | 327 EXPECT_LE(allb, 255); |
328 } | 328 } |
329 | 329 |
330 static void YUVToRGBReference(int y, int u, int v, int* r, int* g, int* b) { | 330 static void YUVToRGBReference(int y, int u, int v, int* r, int* g, int* b) { |
331 *r = RoundToByte((y - 16) * 1.164 - (v - 128) * -1.596); | 331 *r = RoundToByte((y - 16) * 1.164 - (v - 128) * -1.596); |
332 *g = RoundToByte((y - 16) * 1.164 - (u - 128) * 0.391 - (v - 128) * 0.813); | 332 *g = RoundToByte((y - 16) * 1.164 - (u - 128) * 0.391 - (v - 128) * 0.813); |
333 *b = RoundToByte((y - 16) * 1.164 - (u - 128) * -2.018); | 333 *b = RoundToByte((y - 16) * 1.164 - (u - 128) * -2.018); |
334 } | 334 } |
335 | 335 |
336 static void YUVJToRGBReference(int y, int u, int v, int* r, int* g, int* b) { | 336 static void YUVJToRGBReference(int y, int u, int v, int* r, int* g, int* b) { |
337 *r = RoundToByte(y - (v - 128) * -1.40200); | 337 *r = RoundToByte(y - (v - 128) * -1.40200); |
338 *g = RoundToByte(y - (u - 128) * 0.34414 - (v - 128) * 0.71414); | 338 *g = RoundToByte(y - (u - 128) * 0.34414 - (v - 128) * 0.71414); |
339 *b = RoundToByte(y - (u - 128) * -1.77200); | 339 *b = RoundToByte(y - (u - 128) * -1.77200); |
340 } | 340 } |
341 | 341 |
342 TEST_F(LibYUVConvertTest, TestYUV) { | 342 TEST_F(LibYUVColorTest, TestYUV) { |
343 int r0, g0, b0, r1, g1, b1; | 343 int r0, g0, b0, r1, g1, b1; |
344 | 344 |
345 // cyan (less red) | 345 // cyan (less red) |
346 YUVToRGBReference(240, 255, 0, &r0, &g0, &b0); | 346 YUVToRGBReference(240, 255, 0, &r0, &g0, &b0); |
347 EXPECT_EQ(56, r0); | 347 EXPECT_EQ(56, r0); |
348 EXPECT_EQ(255, g0); | 348 EXPECT_EQ(255, g0); |
349 EXPECT_EQ(255, b0); | 349 EXPECT_EQ(255, b0); |
350 | 350 |
351 YUVToRGB(240, 255, 0, &r1, &g1, &b1); | 351 YUVToRGB(240, 255, 0, &r1, &g1, &b1); |
352 EXPECT_EQ(57, r1); | 352 EXPECT_EQ(57, r1); |
(...skipping 25 matching lines...) Expand all Loading... |
378 EXPECT_NEAR(b0, b1, ERROR_B); | 378 EXPECT_NEAR(b0, b1, ERROR_B); |
379 | 379 |
380 YUVToRGBReference(i, 0, 255, &r0, &g0, &b0); | 380 YUVToRGBReference(i, 0, 255, &r0, &g0, &b0); |
381 YUVToRGB(i, 0, 255, &r1, &g1, &b1); | 381 YUVToRGB(i, 0, 255, &r1, &g1, &b1); |
382 EXPECT_NEAR(r0, r1, ERROR_R); | 382 EXPECT_NEAR(r0, r1, ERROR_R); |
383 EXPECT_NEAR(g0, g1, ERROR_G); | 383 EXPECT_NEAR(g0, g1, ERROR_G); |
384 EXPECT_NEAR(b0, b1, ERROR_B); | 384 EXPECT_NEAR(b0, b1, ERROR_B); |
385 } | 385 } |
386 } | 386 } |
387 | 387 |
388 TEST_F(LibYUVConvertTest, TestGreyYUV) { | 388 TEST_F(LibYUVColorTest, TestGreyYUV) { |
389 int r0, g0, b0, r1, g1, b1, r2, g2, b2; | 389 int r0, g0, b0, r1, g1, b1, r2, g2, b2; |
390 | 390 |
391 // black | 391 // black |
392 YUVToRGBReference(16, 128, 128, &r0, &g0, &b0); | 392 YUVToRGBReference(16, 128, 128, &r0, &g0, &b0); |
393 EXPECT_EQ(0, r0); | 393 EXPECT_EQ(0, r0); |
394 EXPECT_EQ(0, g0); | 394 EXPECT_EQ(0, g0); |
395 EXPECT_EQ(0, b0); | 395 EXPECT_EQ(0, b0); |
396 | 396 |
397 YUVToRGB(16, 128, 128, &r1, &g1, &b1); | 397 YUVToRGB(16, 128, 128, &r1, &g1, &b1); |
398 EXPECT_EQ(0, r1); | 398 EXPECT_EQ(0, r1); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 } | 457 } |
458 printf("\nblue"); | 458 printf("\nblue"); |
459 for (i = 0; i < 256; ++i) { | 459 for (i = 0; i < 256; ++i) { |
460 if (rh[i] || gh[i] || bh[i]) { | 460 if (rh[i] || gh[i] || bh[i]) { |
461 printf("\t%8d", bh[i]); | 461 printf("\t%8d", bh[i]); |
462 } | 462 } |
463 } | 463 } |
464 printf("\n"); | 464 printf("\n"); |
465 } | 465 } |
466 | 466 |
467 TEST_F(LibYUVConvertTest, TestFullYUV) { | 467 TEST_F(LibYUVColorTest, TestFullYUV) { |
468 int rh[256] = { 0, }, gh[256] = { 0, }, bh[256] = { 0, }; | 468 int rh[256] = { 0, }, gh[256] = { 0, }, bh[256] = { 0, }; |
469 for (int u = 0; u < 256; ++u) { | 469 for (int u = 0; u < 256; ++u) { |
470 for (int v = 0; v < 256; ++v) { | 470 for (int v = 0; v < 256; ++v) { |
471 for (int y2 = 0; y2 < 256; ++y2) { | 471 for (int y2 = 0; y2 < 256; ++y2) { |
472 int r0, g0, b0, r1, g1, b1; | 472 int r0, g0, b0, r1, g1, b1; |
473 int y = RANDOM256(y2); | 473 int y = RANDOM256(y2); |
474 YUVToRGBReference(y, u, v, &r0, &g0, &b0); | 474 YUVToRGBReference(y, u, v, &r0, &g0, &b0); |
475 YUVToRGB(y, u, v, &r1, &g1, &b1); | 475 YUVToRGB(y, u, v, &r1, &g1, &b1); |
476 EXPECT_NEAR(r0, r1, ERROR_R); | 476 EXPECT_NEAR(r0, r1, ERROR_R); |
477 EXPECT_NEAR(g0, g1, ERROR_G); | 477 EXPECT_NEAR(g0, g1, ERROR_G); |
478 EXPECT_NEAR(b0, b1, ERROR_B); | 478 EXPECT_NEAR(b0, b1, ERROR_B); |
479 ++rh[r1 - r0 + 128]; | 479 ++rh[r1 - r0 + 128]; |
480 ++gh[g1 - g0 + 128]; | 480 ++gh[g1 - g0 + 128]; |
481 ++bh[b1 - b0 + 128]; | 481 ++bh[b1 - b0 + 128]; |
482 } | 482 } |
483 } | 483 } |
484 } | 484 } |
485 PrintHistogram(rh, gh, bh); | 485 PrintHistogram(rh, gh, bh); |
486 } | 486 } |
487 | 487 |
488 TEST_F(LibYUVConvertTest, TestFullYUVJ) { | 488 TEST_F(LibYUVColorTest, TestFullYUVJ) { |
489 int rh[256] = { 0, }, gh[256] = { 0, }, bh[256] = { 0, }; | 489 int rh[256] = { 0, }, gh[256] = { 0, }, bh[256] = { 0, }; |
490 for (int u = 0; u < 256; ++u) { | 490 for (int u = 0; u < 256; ++u) { |
491 for (int v = 0; v < 256; ++v) { | 491 for (int v = 0; v < 256; ++v) { |
492 for (int y2 = 0; y2 < 256; ++y2) { | 492 for (int y2 = 0; y2 < 256; ++y2) { |
493 int r0, g0, b0, r1, g1, b1; | 493 int r0, g0, b0, r1, g1, b1; |
494 int y = RANDOM256(y2); | 494 int y = RANDOM256(y2); |
495 YUVJToRGBReference(y, u, v, &r0, &g0, &b0); | 495 YUVJToRGBReference(y, u, v, &r0, &g0, &b0); |
496 YUVJToRGB(y, u, v, &r1, &g1, &b1); | 496 YUVJToRGB(y, u, v, &r1, &g1, &b1); |
497 EXPECT_NEAR(r0, r1, 1); | 497 EXPECT_NEAR(r0, r1, 1); |
498 EXPECT_NEAR(g0, g1, 1); | 498 EXPECT_NEAR(g0, g1, 1); |
499 EXPECT_NEAR(b0, b1, 1); | 499 EXPECT_NEAR(b0, b1, 1); |
500 ++rh[r1 - r0 + 128]; | 500 ++rh[r1 - r0 + 128]; |
501 ++gh[g1 - g0 + 128]; | 501 ++gh[g1 - g0 + 128]; |
502 ++bh[b1 - b0 + 128]; | 502 ++bh[b1 - b0 + 128]; |
503 } | 503 } |
504 } | 504 } |
505 } | 505 } |
506 PrintHistogram(rh, gh, bh); | 506 PrintHistogram(rh, gh, bh); |
507 } | 507 } |
508 | 508 |
509 TEST_F(LibYUVConvertTest, TestGreyYUVJ) { | 509 TEST_F(LibYUVColorTest, TestGreyYUVJ) { |
510 int r0, g0, b0, r1, g1, b1, r2, g2, b2; | 510 int r0, g0, b0, r1, g1, b1, r2, g2, b2; |
511 | 511 |
512 // black | 512 // black |
513 YUVJToRGBReference(0, 128, 128, &r0, &g0, &b0); | 513 YUVJToRGBReference(0, 128, 128, &r0, &g0, &b0); |
514 EXPECT_EQ(0, r0); | 514 EXPECT_EQ(0, r0); |
515 EXPECT_EQ(0, g0); | 515 EXPECT_EQ(0, g0); |
516 EXPECT_EQ(0, b0); | 516 EXPECT_EQ(0, b0); |
517 | 517 |
518 YUVJToRGB(0, 128, 128, &r1, &g1, &b1); | 518 YUVJToRGB(0, 128, 128, &r1, &g1, &b1); |
519 EXPECT_EQ(0, r1); | 519 EXPECT_EQ(0, r1); |
(...skipping 29 matching lines...) Expand all Loading... |
549 EXPECT_EQ(r0, r1); | 549 EXPECT_EQ(r0, r1); |
550 EXPECT_EQ(g0, g1); | 550 EXPECT_EQ(g0, g1); |
551 EXPECT_EQ(b0, b1); | 551 EXPECT_EQ(b0, b1); |
552 EXPECT_EQ(r0, r2); | 552 EXPECT_EQ(r0, r2); |
553 EXPECT_EQ(g0, g2); | 553 EXPECT_EQ(g0, g2); |
554 EXPECT_EQ(b0, b2); | 554 EXPECT_EQ(b0, b2); |
555 } | 555 } |
556 } | 556 } |
557 | 557 |
558 } // namespace libyuv | 558 } // namespace libyuv |
OLD | NEW |