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

Side by Side Diff: talk/media/base/videoframe_unittest.h

Issue 1583223002: Revert of Delete remnants of non-square pixel support from cricket::VideoFrame. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 11 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
« no previous file with comments | « talk/media/base/videoframe.cc ('k') | talk/media/webrtc/webrtcvideoframe.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2004 Google Inc. 3 * Copyright 2004 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 uint32_t format, 145 uint32_t format,
146 int32_t width, 146 int32_t width,
147 int32_t height, 147 int32_t height,
148 int dw, 148 int dw,
149 int dh, 149 int dh,
150 webrtc::VideoRotation rotation, 150 webrtc::VideoRotation rotation,
151 T* frame) { 151 T* frame) {
152 bool ret = false; 152 bool ret = false;
153 for (int i = 0; i < repeat_; ++i) { 153 for (int i = 0; i < repeat_; ++i) {
154 ret = frame->Init(format, width, height, dw, dh, 154 ret = frame->Init(format, width, height, dw, dh,
155 sample, sample_size, 0, rotation); 155 sample, sample_size, 1, 1, 0, rotation);
156 } 156 }
157 return ret; 157 return ret;
158 } 158 }
159 159
160 rtc::MemoryStream* LoadSample(const std::string& filename) { 160 rtc::MemoryStream* LoadSample(const std::string& filename) {
161 rtc::Pathname path(cricket::GetTestFilePath(filename)); 161 rtc::Pathname path(cricket::GetTestFilePath(filename));
162 rtc::scoped_ptr<rtc::FileStream> fs( 162 rtc::scoped_ptr<rtc::FileStream> fs(
163 rtc::Filesystem::OpenFile(path, "rb")); 163 rtc::Filesystem::OpenFile(path, "rb"));
164 if (!fs.get()) { 164 if (!fs.get()) {
165 LOG(LS_ERROR) << "Could not open test file path: " << path.pathname() 165 LOG(LS_ERROR) << "Could not open test file path: " << path.pathname()
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 uint32_t width, 288 uint32_t width,
289 uint32_t height, 289 uint32_t height,
290 T* frame) { 290 T* frame) {
291 int y1_pos, y2_pos, u_pos, v_pos; 291 int y1_pos, y2_pos, u_pos, v_pos;
292 if (!GetYuv422Packing(fourcc, &y1_pos, &y2_pos, &u_pos, &v_pos)) { 292 if (!GetYuv422Packing(fourcc, &y1_pos, &y2_pos, &u_pos, &v_pos)) {
293 return false; 293 return false;
294 } 294 }
295 295
296 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer()); 296 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer());
297 int awidth = (width + 1) & ~1; 297 int awidth = (width + 1) & ~1;
298 frame->InitToBlack(width, height, 0); 298 frame->InitToBlack(width, height, 1, 1, 0);
299 int stride_y = frame->GetYPitch(); 299 int stride_y = frame->GetYPitch();
300 int stride_u = frame->GetUPitch(); 300 int stride_u = frame->GetUPitch();
301 int stride_v = frame->GetVPitch(); 301 int stride_v = frame->GetVPitch();
302 for (uint32_t y = 0; y < height; ++y) { 302 for (uint32_t y = 0; y < height; ++y) {
303 for (uint32_t x = 0; x < width; x += 2) { 303 for (uint32_t x = 0; x < width; x += 2) {
304 const uint8_t* quad1 = start + (y * awidth + x) * 2; 304 const uint8_t* quad1 = start + (y * awidth + x) * 2;
305 frame->GetYPlane()[stride_y * y + x] = quad1[y1_pos]; 305 frame->GetYPlane()[stride_y * y + x] = quad1[y1_pos];
306 if ((x + 1) < width) { 306 if ((x + 1) < width) {
307 frame->GetYPlane()[stride_y * y + x + 1] = quad1[y2_pos]; 307 frame->GetYPlane()[stride_y * y + x + 1] = quad1[y2_pos];
308 } 308 }
(...skipping 23 matching lines...) Expand all
332 if (!GetRgbPacking(fourcc, &r_pos, &g_pos, &b_pos, &bytes)) { 332 if (!GetRgbPacking(fourcc, &r_pos, &g_pos, &b_pos, &bytes)) {
333 return false; 333 return false;
334 } 334 }
335 int pitch = width * bytes; 335 int pitch = width * bytes;
336 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer()); 336 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer());
337 if (height < 0) { 337 if (height < 0) {
338 height = -height; 338 height = -height;
339 start = start + pitch * (height - 1); 339 start = start + pitch * (height - 1);
340 pitch = -pitch; 340 pitch = -pitch;
341 } 341 }
342 frame->InitToBlack(width, height, 0); 342 frame->InitToBlack(width, height, 1, 1, 0);
343 int stride_y = frame->GetYPitch(); 343 int stride_y = frame->GetYPitch();
344 int stride_u = frame->GetUPitch(); 344 int stride_u = frame->GetUPitch();
345 int stride_v = frame->GetVPitch(); 345 int stride_v = frame->GetVPitch();
346 for (int32_t y = 0; y < height; y += 2) { 346 for (int32_t y = 0; y < height; y += 2) {
347 for (int32_t x = 0; x < width; x += 2) { 347 for (int32_t x = 0; x < width; x += 2) {
348 const uint8_t* rgb[4]; 348 const uint8_t* rgb[4];
349 uint8_t yuv[4][3]; 349 uint8_t yuv[4][3];
350 rgb[0] = start + y * pitch + x * bytes; 350 rgb[0] = start + y * pitch + x * bytes;
351 rgb[1] = rgb[0] + ((x + 1) < width ? bytes : 0); 351 rgb[1] = rgb[0] + ((x + 1) < width ? bytes : 0);
352 rgb[2] = rgb[0] + ((y + 1) < height ? pitch : 0); 352 rgb[2] = rgb[0] + ((y + 1) < height ? pitch : 0);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 } 458 }
459 r1 += pitch1; 459 r1 += pitch1;
460 r2 += pitch2; 460 r2 += pitch2;
461 } 461 }
462 return true; 462 return true;
463 } 463 }
464 464
465 static bool IsEqual(const cricket::VideoFrame& frame, 465 static bool IsEqual(const cricket::VideoFrame& frame,
466 size_t width, 466 size_t width,
467 size_t height, 467 size_t height,
468 size_t pixel_width,
469 size_t pixel_height,
468 int64_t time_stamp, 470 int64_t time_stamp,
469 const uint8_t* y, 471 const uint8_t* y,
470 uint32_t ypitch, 472 uint32_t ypitch,
471 const uint8_t* u, 473 const uint8_t* u,
472 uint32_t upitch, 474 uint32_t upitch,
473 const uint8_t* v, 475 const uint8_t* v,
474 uint32_t vpitch, 476 uint32_t vpitch,
475 int max_error) { 477 int max_error) {
476 return IsSize(frame, static_cast<uint32_t>(width), 478 return IsSize(frame, static_cast<uint32_t>(width),
477 static_cast<uint32_t>(height)) && 479 static_cast<uint32_t>(height)) &&
480 frame.GetPixelWidth() == pixel_width &&
481 frame.GetPixelHeight() == pixel_height &&
478 frame.GetTimeStamp() == time_stamp && 482 frame.GetTimeStamp() == time_stamp &&
479 IsPlaneEqual("y", frame.GetYPlane(), frame.GetYPitch(), y, ypitch, 483 IsPlaneEqual("y", frame.GetYPlane(), frame.GetYPitch(), y, ypitch,
480 static_cast<uint32_t>(width), 484 static_cast<uint32_t>(width),
481 static_cast<uint32_t>(height), max_error) && 485 static_cast<uint32_t>(height), max_error) &&
482 IsPlaneEqual("u", frame.GetUPlane(), frame.GetUPitch(), u, upitch, 486 IsPlaneEqual("u", frame.GetUPlane(), frame.GetUPitch(), u, upitch,
483 static_cast<uint32_t>((width + 1) / 2), 487 static_cast<uint32_t>((width + 1) / 2),
484 static_cast<uint32_t>((height + 1) / 2), max_error) && 488 static_cast<uint32_t>((height + 1) / 2), max_error) &&
485 IsPlaneEqual("v", frame.GetVPlane(), frame.GetVPitch(), v, vpitch, 489 IsPlaneEqual("v", frame.GetVPlane(), frame.GetVPitch(), v, vpitch,
486 static_cast<uint32_t>((width + 1) / 2), 490 static_cast<uint32_t>((width + 1) / 2),
487 static_cast<uint32_t>((height + 1) / 2), max_error); 491 static_cast<uint32_t>((height + 1) / 2), max_error);
488 } 492 }
489 493
490 static bool IsEqual(const cricket::VideoFrame& frame1, 494 static bool IsEqual(const cricket::VideoFrame& frame1,
491 const cricket::VideoFrame& frame2, 495 const cricket::VideoFrame& frame2,
492 int max_error) { 496 int max_error) {
493 return IsEqual(frame1, 497 return IsEqual(frame1,
494 frame2.GetWidth(), frame2.GetHeight(), 498 frame2.GetWidth(), frame2.GetHeight(),
499 frame2.GetPixelWidth(), frame2.GetPixelHeight(),
495 frame2.GetTimeStamp(), 500 frame2.GetTimeStamp(),
496 frame2.GetYPlane(), frame2.GetYPitch(), 501 frame2.GetYPlane(), frame2.GetYPitch(),
497 frame2.GetUPlane(), frame2.GetUPitch(), 502 frame2.GetUPlane(), frame2.GetUPitch(),
498 frame2.GetVPlane(), frame2.GetVPitch(), 503 frame2.GetVPlane(), frame2.GetVPitch(),
499 max_error); 504 max_error);
500 } 505 }
501 506
502 static bool IsEqualWithCrop(const cricket::VideoFrame& frame1, 507 static bool IsEqualWithCrop(const cricket::VideoFrame& frame1,
503 const cricket::VideoFrame& frame2, 508 const cricket::VideoFrame& frame2,
504 int hcrop, int vcrop, int max_error) { 509 int hcrop, int vcrop, int max_error) {
505 return frame1.GetWidth() <= frame2.GetWidth() && 510 return frame1.GetWidth() <= frame2.GetWidth() &&
506 frame1.GetHeight() <= frame2.GetHeight() && 511 frame1.GetHeight() <= frame2.GetHeight() &&
507 IsEqual(frame1, 512 IsEqual(frame1,
508 frame2.GetWidth() - hcrop * 2, 513 frame2.GetWidth() - hcrop * 2,
509 frame2.GetHeight() - vcrop * 2, 514 frame2.GetHeight() - vcrop * 2,
515 frame2.GetPixelWidth(), frame2.GetPixelHeight(),
510 frame2.GetTimeStamp(), 516 frame2.GetTimeStamp(),
511 frame2.GetYPlane() + vcrop * frame2.GetYPitch() 517 frame2.GetYPlane() + vcrop * frame2.GetYPitch()
512 + hcrop, 518 + hcrop,
513 frame2.GetYPitch(), 519 frame2.GetYPitch(),
514 frame2.GetUPlane() + vcrop * frame2.GetUPitch() / 2 520 frame2.GetUPlane() + vcrop * frame2.GetUPitch() / 2
515 + hcrop / 2, 521 + hcrop / 2,
516 frame2.GetUPitch(), 522 frame2.GetUPitch(),
517 frame2.GetVPlane() + vcrop * frame2.GetVPitch() / 2 523 frame2.GetVPlane() + vcrop * frame2.GetVPitch() / 2
518 + hcrop / 2, 524 + hcrop / 2,
519 frame2.GetVPitch(), 525 frame2.GetVPitch(),
(...skipping 16 matching lines...) Expand all
536 T frame; 542 T frame;
537 EXPECT_TRUE(IsNull(frame)); 543 EXPECT_TRUE(IsNull(frame));
538 rtc::scoped_ptr<rtc::MemoryStream> ms( 544 rtc::scoped_ptr<rtc::MemoryStream> ms(
539 CreateYuvSample(kWidth, kHeight, 12)); 545 CreateYuvSample(kWidth, kHeight, 12));
540 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_I420, 546 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_I420,
541 kWidth, kHeight, &frame)); 547 kWidth, kHeight, &frame));
542 548
543 const uint8_t* y = reinterpret_cast<uint8_t*>(ms.get()->GetBuffer()); 549 const uint8_t* y = reinterpret_cast<uint8_t*>(ms.get()->GetBuffer());
544 const uint8_t* u = y + kWidth * kHeight; 550 const uint8_t* u = y + kWidth * kHeight;
545 const uint8_t* v = u + kWidth * kHeight / 4; 551 const uint8_t* v = u + kWidth * kHeight / 4;
546 EXPECT_TRUE(IsEqual(frame, kWidth, kHeight, 0, y, kWidth, u, 552 EXPECT_TRUE(IsEqual(frame, kWidth, kHeight, 1, 1, 0, y, kWidth, u,
547 kWidth / 2, v, kWidth / 2, 0)); 553 kWidth / 2, v, kWidth / 2, 0));
548 } 554 }
549 555
550 // Test constructing an image from a YV12 buffer. 556 // Test constructing an image from a YV12 buffer.
551 void ConstructYV12() { 557 void ConstructYV12() {
552 T frame; 558 T frame;
553 rtc::scoped_ptr<rtc::MemoryStream> ms( 559 rtc::scoped_ptr<rtc::MemoryStream> ms(
554 CreateYuvSample(kWidth, kHeight, 12)); 560 CreateYuvSample(kWidth, kHeight, 12));
555 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YV12, 561 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YV12,
556 kWidth, kHeight, &frame)); 562 kWidth, kHeight, &frame));
557 563
558 const uint8_t* y = reinterpret_cast<uint8_t*>(ms.get()->GetBuffer()); 564 const uint8_t* y = reinterpret_cast<uint8_t*>(ms.get()->GetBuffer());
559 const uint8_t* v = y + kWidth * kHeight; 565 const uint8_t* v = y + kWidth * kHeight;
560 const uint8_t* u = v + kWidth * kHeight / 4; 566 const uint8_t* u = v + kWidth * kHeight / 4;
561 EXPECT_TRUE(IsEqual(frame, kWidth, kHeight, 0, y, kWidth, u, 567 EXPECT_TRUE(IsEqual(frame, kWidth, kHeight, 1, 1, 0, y, kWidth, u,
562 kWidth / 2, v, kWidth / 2, 0)); 568 kWidth / 2, v, kWidth / 2, 0));
563 } 569 }
564 570
565 // Test constructing an image from a I422 buffer. 571 // Test constructing an image from a I422 buffer.
566 void ConstructI422() { 572 void ConstructI422() {
567 T frame1, frame2; 573 T frame1, frame2;
568 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 574 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
569 size_t buf_size = kWidth * kHeight * 2; 575 size_t buf_size = kWidth * kHeight * 2;
570 rtc::scoped_ptr<uint8_t[]> buf(new uint8_t[buf_size + kAlignment]); 576 rtc::scoped_ptr<uint8_t[]> buf(new uint8_t[buf_size + kAlignment]);
571 uint8_t* y = ALIGNP(buf.get(), kAlignment); 577 uint8_t* y = ALIGNP(buf.get(), kAlignment);
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 ASSERT_TRUE(ms.get() != NULL); \ 821 ASSERT_TRUE(ms.get() != NULL); \
816 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, \ 822 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, \
817 -kHeight, kWidth, kHeight, \ 823 -kHeight, kWidth, kHeight, \
818 webrtc::kVideoRotation_180, &frame1)); \ 824 webrtc::kVideoRotation_180, &frame1)); \
819 size_t data_size; \ 825 size_t data_size; \
820 bool ret = ms->GetSize(&data_size); \ 826 bool ret = ms->GetSize(&data_size); \
821 EXPECT_TRUE(ret); \ 827 EXPECT_TRUE(ret); \
822 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \ 828 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \
823 kHeight, \ 829 kHeight, \
824 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \ 830 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \
825 data_size, 0, webrtc::kVideoRotation_0)); \ 831 data_size, 1, 1, 0, webrtc::kVideoRotation_0)); \
826 int width_rotate = static_cast<int>(frame1.GetWidth()); \ 832 int width_rotate = static_cast<int>(frame1.GetWidth()); \
827 int height_rotate = static_cast<int>(frame1.GetHeight()); \ 833 int height_rotate = static_cast<int>(frame1.GetHeight()); \
828 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ 834 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 1, 1, 0)); \
829 libyuv::I420Mirror( \ 835 libyuv::I420Mirror( \
830 frame2.GetYPlane(), frame2.GetYPitch(), frame2.GetUPlane(), \ 836 frame2.GetYPlane(), frame2.GetYPitch(), frame2.GetUPlane(), \
831 frame2.GetUPitch(), frame2.GetVPlane(), frame2.GetVPitch(), \ 837 frame2.GetUPitch(), frame2.GetVPlane(), frame2.GetVPitch(), \
832 frame3.GetYPlane(), frame3.GetYPitch(), frame3.GetUPlane(), \ 838 frame3.GetYPlane(), frame3.GetYPitch(), frame3.GetUPlane(), \
833 frame3.GetUPitch(), frame3.GetVPlane(), frame3.GetVPitch(), kWidth, \ 839 frame3.GetUPitch(), frame3.GetVPlane(), frame3.GetVPitch(), kWidth, \
834 kHeight); \ 840 kHeight); \
835 EXPECT_TRUE(IsEqual(frame1, frame3, 0)); \ 841 EXPECT_TRUE(IsEqual(frame1, frame3, 0)); \
836 } 842 }
837 843
838 TEST_MIRROR(I420, 420) 844 TEST_MIRROR(I420, 420)
839 845
840 // Macro to help test different rotations 846 // Macro to help test different rotations
841 #define TEST_ROTATE(FOURCC, BPP, ROTATE) \ 847 #define TEST_ROTATE(FOURCC, BPP, ROTATE) \
842 void Construct##FOURCC##Rotate##ROTATE() { \ 848 void Construct##FOURCC##Rotate##ROTATE() { \
843 T frame1, frame2, frame3; \ 849 T frame1, frame2, frame3; \
844 rtc::scoped_ptr<rtc::MemoryStream> ms( \ 850 rtc::scoped_ptr<rtc::MemoryStream> ms( \
845 CreateYuvSample(kWidth, kHeight, BPP)); \ 851 CreateYuvSample(kWidth, kHeight, BPP)); \
846 ASSERT_TRUE(ms.get() != NULL); \ 852 ASSERT_TRUE(ms.get() != NULL); \
847 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, kHeight, \ 853 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, kHeight, \
848 kWidth, kHeight, webrtc::kVideoRotation_##ROTATE, \ 854 kWidth, kHeight, webrtc::kVideoRotation_##ROTATE, \
849 &frame1)); \ 855 &frame1)); \
850 size_t data_size; \ 856 size_t data_size; \
851 bool ret = ms->GetSize(&data_size); \ 857 bool ret = ms->GetSize(&data_size); \
852 EXPECT_TRUE(ret); \ 858 EXPECT_TRUE(ret); \
853 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \ 859 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \
854 kHeight, \ 860 kHeight, \
855 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \ 861 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \
856 data_size, 0, webrtc::kVideoRotation_0)); \ 862 data_size, 1, 1, 0, webrtc::kVideoRotation_0)); \
857 int width_rotate = static_cast<int>(frame1.GetWidth()); \ 863 int width_rotate = static_cast<int>(frame1.GetWidth()); \
858 int height_rotate = static_cast<int>(frame1.GetHeight()); \ 864 int height_rotate = static_cast<int>(frame1.GetHeight()); \
859 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ 865 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 1, 1, 0)); \
860 libyuv::I420Rotate( \ 866 libyuv::I420Rotate( \
861 frame2.GetYPlane(), frame2.GetYPitch(), frame2.GetUPlane(), \ 867 frame2.GetYPlane(), frame2.GetYPitch(), frame2.GetUPlane(), \
862 frame2.GetUPitch(), frame2.GetVPlane(), frame2.GetVPitch(), \ 868 frame2.GetUPitch(), frame2.GetVPlane(), frame2.GetVPitch(), \
863 frame3.GetYPlane(), frame3.GetYPitch(), frame3.GetUPlane(), \ 869 frame3.GetYPlane(), frame3.GetYPitch(), frame3.GetUPlane(), \
864 frame3.GetUPitch(), frame3.GetVPlane(), frame3.GetVPitch(), kWidth, \ 870 frame3.GetUPitch(), frame3.GetVPlane(), frame3.GetVPitch(), kWidth, \
865 kHeight, libyuv::kRotate##ROTATE); \ 871 kHeight, libyuv::kRotate##ROTATE); \
866 EXPECT_TRUE(IsEqual(frame1, frame3, 0)); \ 872 EXPECT_TRUE(IsEqual(frame1, frame3, 0)); \
867 } 873 }
868 874
869 // Test constructing an image with rotation. 875 // Test constructing an image with rotation.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 kWidth, kHeight, webrtc::kVideoRotation_270, 961 kWidth, kHeight, webrtc::kVideoRotation_270,
956 &frame2)); 962 &frame2));
957 } 963 }
958 964
959 // Test 1 pixel edge case image I420 buffer. 965 // Test 1 pixel edge case image I420 buffer.
960 void ConstructI4201Pixel() { 966 void ConstructI4201Pixel() {
961 T frame; 967 T frame;
962 uint8_t pixel[3] = {1, 2, 3}; 968 uint8_t pixel[3] = {1, 2, 3};
963 for (int i = 0; i < repeat_; ++i) { 969 for (int i = 0; i < repeat_; ++i) {
964 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 1, 1, 1, 1, pixel, 970 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 1, 1, 1, 1, pixel,
965 sizeof(pixel), 0, webrtc::kVideoRotation_0)); 971 sizeof(pixel), 1, 1, 0, webrtc::kVideoRotation_0));
966 } 972 }
967 const uint8_t* y = pixel; 973 const uint8_t* y = pixel;
968 const uint8_t* u = y + 1; 974 const uint8_t* u = y + 1;
969 const uint8_t* v = u + 1; 975 const uint8_t* v = u + 1;
970 EXPECT_TRUE(IsEqual(frame, 1, 1, 0, y, 1, u, 1, v, 1, 0)); 976 EXPECT_TRUE(IsEqual(frame, 1, 1, 1, 1, 0, y, 1, u, 1, v, 1, 0));
971 } 977 }
972 978
973 // Test 5 pixel edge case image. 979 // Test 5 pixel edge case image.
974 void ConstructI4205Pixel() { 980 void ConstructI4205Pixel() {
975 T frame; 981 T frame;
976 uint8_t pixels5x5[5 * 5 + ((5 + 1) / 2 * (5 + 1) / 2) * 2]; 982 uint8_t pixels5x5[5 * 5 + ((5 + 1) / 2 * (5 + 1) / 2) * 2];
977 memset(pixels5x5, 1, 5 * 5 + ((5 + 1) / 2 * (5 + 1) / 2) * 2); 983 memset(pixels5x5, 1, 5 * 5 + ((5 + 1) / 2 * (5 + 1) / 2) * 2);
978 for (int i = 0; i < repeat_; ++i) { 984 for (int i = 0; i < repeat_; ++i) {
979 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 5, 5, 5, 5, pixels5x5, 985 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 5, 5, 5, 5, pixels5x5,
980 sizeof(pixels5x5), 0, 986 sizeof(pixels5x5), 1, 1, 0,
981 webrtc::kVideoRotation_0)); 987 webrtc::kVideoRotation_0));
982 } 988 }
983 EXPECT_EQ(5u, frame.GetWidth()); 989 EXPECT_EQ(5u, frame.GetWidth());
984 EXPECT_EQ(5u, frame.GetHeight()); 990 EXPECT_EQ(5u, frame.GetHeight());
985 EXPECT_EQ(5, frame.GetYPitch()); 991 EXPECT_EQ(5, frame.GetYPitch());
986 EXPECT_EQ(3, frame.GetUPitch()); 992 EXPECT_EQ(3, frame.GetUPitch());
987 EXPECT_EQ(3, frame.GetVPitch()); 993 EXPECT_EQ(3, frame.GetVPitch());
988 } 994 }
989 995
990 // Test 1 pixel edge case image ARGB buffer. 996 // Test 1 pixel edge case image ARGB buffer.
991 void ConstructARGB1Pixel() { 997 void ConstructARGB1Pixel() {
992 T frame; 998 T frame;
993 uint8_t pixel[4] = {64, 128, 192, 255}; 999 uint8_t pixel[4] = {64, 128, 192, 255};
994 for (int i = 0; i < repeat_; ++i) { 1000 for (int i = 0; i < repeat_; ++i) {
995 EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 1, 1, 1, 1, pixel, 1001 EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 1, 1, 1, 1, pixel,
996 sizeof(pixel), 0, 1002 sizeof(pixel), 1, 1, 0,
997 webrtc::kVideoRotation_0)); 1003 webrtc::kVideoRotation_0));
998 } 1004 }
999 // Convert back to ARGB. 1005 // Convert back to ARGB.
1000 size_t out_size = 4; 1006 size_t out_size = 4;
1001 rtc::scoped_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); 1007 rtc::scoped_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]);
1002 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); 1008 uint8_t* out = ALIGNP(outbuf.get(), kAlignment);
1003 1009
1004 EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, 1010 EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB,
1005 out, 1011 out,
1006 out_size, // buffer size 1012 out_size, // buffer size
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 1342 EXPECT_TRUE(IsEqual(frame1, frame2, 0));
1337 EXPECT_EQ(frame1.GetYPlane(), frame2.GetYPlane()); 1343 EXPECT_EQ(frame1.GetYPlane(), frame2.GetYPlane());
1338 EXPECT_EQ(frame1.GetUPlane(), frame2.GetUPlane()); 1344 EXPECT_EQ(frame1.GetUPlane(), frame2.GetUPlane());
1339 EXPECT_EQ(frame1.GetVPlane(), frame2.GetVPlane()); 1345 EXPECT_EQ(frame1.GetVPlane(), frame2.GetVPlane());
1340 } 1346 }
1341 1347
1342 // Test creating an empty image and initing it to black. 1348 // Test creating an empty image and initing it to black.
1343 void ConstructBlack() { 1349 void ConstructBlack() {
1344 T frame; 1350 T frame;
1345 for (int i = 0; i < repeat_; ++i) { 1351 for (int i = 0; i < repeat_; ++i) {
1346 EXPECT_TRUE(frame.InitToBlack(kWidth, kHeight, 0)); 1352 EXPECT_TRUE(frame.InitToBlack(kWidth, kHeight, 1, 1, 0));
1347 } 1353 }
1348 EXPECT_TRUE(IsSize(frame, kWidth, kHeight)); 1354 EXPECT_TRUE(IsSize(frame, kWidth, kHeight));
1349 EXPECT_TRUE(IsBlack(frame)); 1355 EXPECT_TRUE(IsBlack(frame));
1350 } 1356 }
1351 1357
1352 // Test constructing an image from a YUY2 buffer with a range of sizes. 1358 // Test constructing an image from a YUY2 buffer with a range of sizes.
1353 // Only tests that conversion does not crash or corrupt heap. 1359 // Only tests that conversion does not crash or corrupt heap.
1354 void ConstructYuy2AllSizes() { 1360 void ConstructYuy2AllSizes() {
1355 T frame1, frame2; 1361 T frame1, frame2;
1356 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) { 1362 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 } 1408 }
1403 1409
1404 // Tests re-initing an existing image. 1410 // Tests re-initing an existing image.
1405 void Reset(webrtc::VideoRotation rotation, bool apply_rotation) { 1411 void Reset(webrtc::VideoRotation rotation, bool apply_rotation) {
1406 T frame1, frame2; 1412 T frame1, frame2;
1407 rtc::scoped_ptr<rtc::MemoryStream> ms( 1413 rtc::scoped_ptr<rtc::MemoryStream> ms(
1408 LoadSample(kImageFilename)); 1414 LoadSample(kImageFilename));
1409 ASSERT_TRUE(ms.get() != NULL); 1415 ASSERT_TRUE(ms.get() != NULL);
1410 size_t data_size; 1416 size_t data_size;
1411 ms->GetSize(&data_size); 1417 ms->GetSize(&data_size);
1412 EXPECT_TRUE(frame1.InitToBlack(kWidth, kHeight, 0)); 1418 EXPECT_TRUE(frame1.InitToBlack(kWidth, kHeight, 1, 1, 0));
1413 EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 0)); 1419 EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 1, 1, 0));
1414 EXPECT_TRUE(IsBlack(frame1)); 1420 EXPECT_TRUE(IsBlack(frame1));
1415 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 1421 EXPECT_TRUE(IsEqual(frame1, frame2, 0));
1416 EXPECT_TRUE(frame1.Reset(cricket::FOURCC_I420, kWidth, kHeight, kWidth, 1422 EXPECT_TRUE(frame1.Reset(cricket::FOURCC_I420, kWidth, kHeight, kWidth,
1417 kHeight, 1423 kHeight,
1418 reinterpret_cast<uint8_t*>(ms->GetBuffer()), 1424 reinterpret_cast<uint8_t*>(ms->GetBuffer()),
1419 data_size, 0, rotation, apply_rotation)); 1425 data_size, 1, 1, 0, rotation, apply_rotation));
1420 if (apply_rotation) 1426 if (apply_rotation)
1421 EXPECT_EQ(webrtc::kVideoRotation_0, frame1.GetVideoRotation()); 1427 EXPECT_EQ(webrtc::kVideoRotation_0, frame1.GetVideoRotation());
1422 else 1428 else
1423 EXPECT_EQ(rotation, frame1.GetVideoRotation()); 1429 EXPECT_EQ(rotation, frame1.GetVideoRotation());
1424 1430
1425 // Swapp width and height if the frame is rotated 90 or 270 degrees. 1431 // Swapp width and height if the frame is rotated 90 or 270 degrees.
1426 if (apply_rotation && (rotation == webrtc::kVideoRotation_90 1432 if (apply_rotation && (rotation == webrtc::kVideoRotation_90
1427 || rotation == webrtc::kVideoRotation_270)) { 1433 || rotation == webrtc::kVideoRotation_270)) {
1428 EXPECT_TRUE(kHeight == frame1.GetWidth()); 1434 EXPECT_TRUE(kHeight == frame1.GetWidth());
1429 EXPECT_TRUE(kWidth == frame1.GetHeight()); 1435 EXPECT_TRUE(kWidth == frame1.GetHeight());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 out += (kHeight - 1) * stride; // Point to last row. 1487 out += (kHeight - 1) * stride; // Point to last row.
1482 stride = -stride; 1488 stride = -stride;
1483 } 1489 }
1484 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 1490 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
1485 1491
1486 for (int i = 0; i < repeat_to; ++i) { 1492 for (int i = 0; i < repeat_to; ++i) {
1487 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc, 1493 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc,
1488 out, 1494 out,
1489 out_size, stride)); 1495 out_size, stride));
1490 } 1496 }
1491 EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 0)); 1497 EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 1, 1, 0));
1492 for (int i = 0; i < repeat_from; ++i) { 1498 for (int i = 0; i < repeat_from; ++i) {
1493 EXPECT_EQ(0, RGBToI420(out, stride, 1499 EXPECT_EQ(0, RGBToI420(out, stride,
1494 frame2.GetYPlane(), frame2.GetYPitch(), 1500 frame2.GetYPlane(), frame2.GetYPitch(),
1495 frame2.GetUPlane(), frame2.GetUPitch(), 1501 frame2.GetUPlane(), frame2.GetUPitch(),
1496 frame2.GetVPlane(), frame2.GetVPitch(), 1502 frame2.GetVPlane(), frame2.GetVPitch(),
1497 kWidth, kHeight)); 1503 kWidth, kHeight));
1498 } 1504 }
1499 if (rowpad) { 1505 if (rowpad) {
1500 EXPECT_EQ(0, outtop[kWidth * bpp]); // Ensure stride skipped end of row. 1506 EXPECT_EQ(0, outtop[kWidth * bpp]); // Ensure stride skipped end of row.
1501 EXPECT_NE(0, outtop[astride]); // Ensure pixel at start of 2nd row. 1507 EXPECT_NE(0, outtop[astride]); // Ensure pixel at start of 2nd row.
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 EXPECT_EQ(0, memcmp(ms2.GetBuffer(), ms->GetBuffer(), out_size)); 1908 EXPECT_EQ(0, memcmp(ms2.GetBuffer(), ms->GetBuffer(), out_size));
1903 } 1909 }
1904 1910
1905 void CopyToBuffer1Pixel() { 1911 void CopyToBuffer1Pixel() {
1906 size_t out_size = 3; 1912 size_t out_size = 3;
1907 rtc::scoped_ptr<uint8_t[]> out(new uint8_t[out_size + 1]); 1913 rtc::scoped_ptr<uint8_t[]> out(new uint8_t[out_size + 1]);
1908 memset(out.get(), 0xfb, out_size + 1); // Fill buffer 1914 memset(out.get(), 0xfb, out_size + 1); // Fill buffer
1909 uint8_t pixel[3] = {1, 2, 3}; 1915 uint8_t pixel[3] = {1, 2, 3};
1910 T frame; 1916 T frame;
1911 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 1, 1, 1, 1, pixel, 1917 EXPECT_TRUE(frame.Init(cricket::FOURCC_I420, 1, 1, 1, 1, pixel,
1912 sizeof(pixel), 0, 1918 sizeof(pixel), 1, 1, 0,
1913 webrtc::kVideoRotation_0)); 1919 webrtc::kVideoRotation_0));
1914 for (int i = 0; i < repeat_; ++i) { 1920 for (int i = 0; i < repeat_; ++i) {
1915 EXPECT_EQ(out_size, frame.CopyToBuffer(out.get(), out_size)); 1921 EXPECT_EQ(out_size, frame.CopyToBuffer(out.get(), out_size));
1916 } 1922 }
1917 EXPECT_EQ(1, out.get()[0]); // Check Y. Should be 1. 1923 EXPECT_EQ(1, out.get()[0]); // Check Y. Should be 1.
1918 EXPECT_EQ(2, out.get()[1]); // Check U. Should be 2. 1924 EXPECT_EQ(2, out.get()[1]); // Check U. Should be 2.
1919 EXPECT_EQ(3, out.get()[2]); // Check V. Should be 3. 1925 EXPECT_EQ(3, out.get()[2]); // Check V. Should be 3.
1920 EXPECT_EQ(0xfb, out.get()[3]); // Check sentinel is still intact. 1926 EXPECT_EQ(0xfb, out.get()[3]); // Check sentinel is still intact.
1921 } 1927 }
1922 1928
1923 void StretchToFrame() { 1929 void StretchToFrame() {
1924 // Create the source frame as a black frame. 1930 // Create the source frame as a black frame.
1925 T source; 1931 T source;
1926 EXPECT_TRUE(source.InitToBlack(kWidth * 2, kHeight * 2, 0)); 1932 EXPECT_TRUE(source.InitToBlack(kWidth * 2, kHeight * 2, 1, 1, 0));
1927 EXPECT_TRUE(IsSize(source, kWidth * 2, kHeight * 2)); 1933 EXPECT_TRUE(IsSize(source, kWidth * 2, kHeight * 2));
1928 1934
1929 // Create the target frame by loading from a file. 1935 // Create the target frame by loading from a file.
1930 T target1; 1936 T target1;
1931 ASSERT_TRUE(LoadFrameNoRepeat(&target1)); 1937 ASSERT_TRUE(LoadFrameNoRepeat(&target1));
1932 EXPECT_FALSE(IsBlack(target1)); 1938 EXPECT_FALSE(IsBlack(target1));
1933 1939
1934 // Stretch and check if the stretched target is black. 1940 // Stretch and check if the stretched target is black.
1935 source.StretchToFrame(&target1, true, false); 1941 source.StretchToFrame(&target1, true, false);
1936 EXPECT_TRUE(IsBlack(target1)); 1942 EXPECT_TRUE(IsBlack(target1));
1937 1943
1938 // Crop and stretch and check if the stretched target is black. 1944 // Crop and stretch and check if the stretched target is black.
1939 T target2; 1945 T target2;
1940 ASSERT_TRUE(LoadFrameNoRepeat(&target2)); 1946 ASSERT_TRUE(LoadFrameNoRepeat(&target2));
1941 source.StretchToFrame(&target2, true, true); 1947 source.StretchToFrame(&target2, true, true);
1942 EXPECT_TRUE(IsBlack(target2)); 1948 EXPECT_TRUE(IsBlack(target2));
1943 EXPECT_EQ(source.GetTimeStamp(), target2.GetTimeStamp()); 1949 EXPECT_EQ(source.GetTimeStamp(), target2.GetTimeStamp());
1944 } 1950 }
1945 1951
1946 int repeat_; 1952 int repeat_;
1947 }; 1953 };
1948 1954
1949 #endif // TALK_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_ 1955 #endif // TALK_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_
OLDNEW
« no previous file with comments | « talk/media/base/videoframe.cc ('k') | talk/media/webrtc/webrtcvideoframe.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698