| 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 |