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

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

Issue 2029273004: New static method I420Buffer::SetToBlack. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Add missing SetToBlack call. Created 4 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
« no previous file with comments | « webrtc/media/base/videoframe.cc ('k') | webrtc/media/engine/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 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2004 The WebRTC 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 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 rgb[g_pos] = (x % 63 + y % 63) + 96; 247 rgb[g_pos] = (x % 63 + y % 63) + 96;
248 rgb[b_pos] = ((y / 63) & 1) ? 224 : 32; 248 rgb[b_pos] = ((y / 63) & 1) ? 224 : 32;
249 ms->Write(rgb, bytes, NULL, NULL); 249 ms->Write(rgb, bytes, NULL, NULL);
250 } 250 }
251 } 251 }
252 return ms.release(); 252 return ms.release();
253 } 253 }
254 254
255 // Simple conversion routines to verify the optimized VideoFrame routines. 255 // Simple conversion routines to verify the optimized VideoFrame routines.
256 // Converts from the specified colorspace to I420. 256 // Converts from the specified colorspace to I420.
257 bool ConvertYuv422(const rtc::MemoryStream* ms, 257 std::unique_ptr<T> ConvertYuv422(const rtc::MemoryStream* ms,
258 uint32_t fourcc, 258 uint32_t fourcc,
259 uint32_t width, 259 uint32_t width,
260 uint32_t height, 260 uint32_t height) {
261 T* frame) {
262 int y1_pos, y2_pos, u_pos, v_pos; 261 int y1_pos, y2_pos, u_pos, v_pos;
263 if (!GetYuv422Packing(fourcc, &y1_pos, &y2_pos, &u_pos, &v_pos)) { 262 if (!GetYuv422Packing(fourcc, &y1_pos, &y2_pos, &u_pos, &v_pos)) {
264 return false; 263 return nullptr;
265 } 264 }
266 265
266 rtc::scoped_refptr<webrtc::I420Buffer> buffer(
267 new rtc::RefCountedObject<webrtc::I420Buffer>(width, height));
268
269 buffer->SetToBlack();
270
267 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer()); 271 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer());
268 int awidth = (width + 1) & ~1; 272 int awidth = (width + 1) & ~1;
269 frame->InitToBlack(width, height, 0); 273 int stride_y = buffer->StrideY();
270 int stride_y = frame->video_frame_buffer()->StrideY(); 274 int stride_u = buffer->StrideU();
271 int stride_u = frame->video_frame_buffer()->StrideU(); 275 int stride_v = buffer->StrideV();
272 int stride_v = frame->video_frame_buffer()->StrideV(); 276 uint8_t* plane_y = buffer->MutableDataY();
273 uint8_t* plane_y = frame->video_frame_buffer()->MutableDataY(); 277 uint8_t* plane_u = buffer->MutableDataU();
274 uint8_t* plane_u = frame->video_frame_buffer()->MutableDataU(); 278 uint8_t* plane_v = buffer->MutableDataV();
275 uint8_t* plane_v = frame->video_frame_buffer()->MutableDataV();
276 for (uint32_t y = 0; y < height; ++y) { 279 for (uint32_t y = 0; y < height; ++y) {
277 for (uint32_t x = 0; x < width; x += 2) { 280 for (uint32_t x = 0; x < width; x += 2) {
278 const uint8_t* quad1 = start + (y * awidth + x) * 2; 281 const uint8_t* quad1 = start + (y * awidth + x) * 2;
279 plane_y[stride_y * y + x] = quad1[y1_pos]; 282 plane_y[stride_y * y + x] = quad1[y1_pos];
280 if ((x + 1) < width) { 283 if ((x + 1) < width) {
281 plane_y[stride_y * y + x + 1] = quad1[y2_pos]; 284 plane_y[stride_y * y + x + 1] = quad1[y2_pos];
282 } 285 }
283 if ((y & 1) == 0) { 286 if ((y & 1) == 0) {
284 const uint8_t* quad2 = quad1 + awidth * 2; 287 const uint8_t* quad2 = quad1 + awidth * 2;
285 if ((y + 1) >= height) { 288 if ((y + 1) >= height) {
286 quad2 = quad1; 289 quad2 = quad1;
287 } 290 }
288 plane_u[stride_u * (y / 2) + x / 2] = 291 plane_u[stride_u * (y / 2) + x / 2] =
289 (quad1[u_pos] + quad2[u_pos] + 1) / 2; 292 (quad1[u_pos] + quad2[u_pos] + 1) / 2;
290 plane_v[stride_v * (y / 2) + x / 2] = 293 plane_v[stride_v * (y / 2) + x / 2] =
291 (quad1[v_pos] + quad2[v_pos] + 1) / 2; 294 (quad1[v_pos] + quad2[v_pos] + 1) / 2;
292 } 295 }
293 } 296 }
294 } 297 }
295 return true; 298 return std::unique_ptr<T>(new T(buffer, 0, webrtc::kVideoRotation_0));
296 } 299 }
297 300
298 // Convert RGB to 420. 301 // Convert RGB to 420.
299 // A negative height inverts the image. 302 // A negative height inverts the image.
300 bool ConvertRgb(const rtc::MemoryStream* ms, 303 std::unique_ptr<T> ConvertRgb(const rtc::MemoryStream* ms,
301 uint32_t fourcc, 304 uint32_t fourcc,
302 int32_t width, 305 int32_t width,
303 int32_t height, 306 int32_t height) {
304 T* frame) {
305 int r_pos, g_pos, b_pos, bytes; 307 int r_pos, g_pos, b_pos, bytes;
306 if (!GetRgbPacking(fourcc, &r_pos, &g_pos, &b_pos, &bytes)) { 308 if (!GetRgbPacking(fourcc, &r_pos, &g_pos, &b_pos, &bytes)) {
307 return false; 309 return nullptr;
308 } 310 }
309 int pitch = width * bytes; 311 int pitch = width * bytes;
310 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer()); 312 const uint8_t* start = reinterpret_cast<const uint8_t*>(ms->GetBuffer());
311 if (height < 0) { 313 if (height < 0) {
312 height = -height; 314 height = -height;
313 start = start + pitch * (height - 1); 315 start = start + pitch * (height - 1);
314 pitch = -pitch; 316 pitch = -pitch;
315 } 317 }
316 frame->InitToBlack(width, height, 0); 318 rtc::scoped_refptr<webrtc::I420Buffer> buffer(
317 int stride_y = frame->video_frame_buffer()->StrideY(); 319 new rtc::RefCountedObject<webrtc::I420Buffer>(width, height));
318 int stride_u = frame->video_frame_buffer()->StrideU(); 320
319 int stride_v = frame->video_frame_buffer()->StrideV(); 321 buffer->SetToBlack();
320 uint8_t* plane_y = frame->video_frame_buffer()->MutableDataY(); 322
321 uint8_t* plane_u = frame->video_frame_buffer()->MutableDataU(); 323 int stride_y = buffer->StrideY();
322 uint8_t* plane_v = frame->video_frame_buffer()->MutableDataV(); 324 int stride_u = buffer->StrideU();
325 int stride_v = buffer->StrideV();
326 uint8_t* plane_y = buffer->MutableDataY();
327 uint8_t* plane_u = buffer->MutableDataU();
328 uint8_t* plane_v = buffer->MutableDataV();
323 for (int32_t y = 0; y < height; y += 2) { 329 for (int32_t y = 0; y < height; y += 2) {
324 for (int32_t x = 0; x < width; x += 2) { 330 for (int32_t x = 0; x < width; x += 2) {
325 const uint8_t* rgb[4]; 331 const uint8_t* rgb[4];
326 uint8_t yuv[4][3]; 332 uint8_t yuv[4][3];
327 rgb[0] = start + y * pitch + x * bytes; 333 rgb[0] = start + y * pitch + x * bytes;
328 rgb[1] = rgb[0] + ((x + 1) < width ? bytes : 0); 334 rgb[1] = rgb[0] + ((x + 1) < width ? bytes : 0);
329 rgb[2] = rgb[0] + ((y + 1) < height ? pitch : 0); 335 rgb[2] = rgb[0] + ((y + 1) < height ? pitch : 0);
330 rgb[3] = rgb[2] + ((x + 1) < width ? bytes : 0); 336 rgb[3] = rgb[2] + ((x + 1) < width ? bytes : 0);
331 for (size_t i = 0; i < 4; ++i) { 337 for (size_t i = 0; i < 4; ++i) {
332 ConvertRgbPixel(rgb[i][r_pos], rgb[i][g_pos], rgb[i][b_pos], 338 ConvertRgbPixel(rgb[i][r_pos], rgb[i][g_pos], rgb[i][b_pos],
333 &yuv[i][0], &yuv[i][1], &yuv[i][2]); 339 &yuv[i][0], &yuv[i][1], &yuv[i][2]);
334 } 340 }
335 plane_y[stride_y * y + x] = yuv[0][0]; 341 plane_y[stride_y * y + x] = yuv[0][0];
336 if ((x + 1) < width) { 342 if ((x + 1) < width) {
337 plane_y[stride_y * y + x + 1] = yuv[1][0]; 343 plane_y[stride_y * y + x + 1] = yuv[1][0];
338 } 344 }
339 if ((y + 1) < height) { 345 if ((y + 1) < height) {
340 plane_y[stride_y * (y + 1) + x] = yuv[2][0]; 346 plane_y[stride_y * (y + 1) + x] = yuv[2][0];
341 if ((x + 1) < width) { 347 if ((x + 1) < width) {
342 plane_y[stride_y * (y + 1) + x + 1] = yuv[3][0]; 348 plane_y[stride_y * (y + 1) + x + 1] = yuv[3][0];
343 } 349 }
344 } 350 }
345 plane_u[stride_u * (y / 2) + x / 2] = 351 plane_u[stride_u * (y / 2) + x / 2] =
346 (yuv[0][1] + yuv[1][1] + yuv[2][1] + yuv[3][1] + 2) / 4; 352 (yuv[0][1] + yuv[1][1] + yuv[2][1] + yuv[3][1] + 2) / 4;
347 plane_v[stride_v * (y / 2) + x / 2] = 353 plane_v[stride_v * (y / 2) + x / 2] =
348 (yuv[0][2] + yuv[1][2] + yuv[2][2] + yuv[3][2] + 2) / 4; 354 (yuv[0][2] + yuv[1][2] + yuv[2][2] + yuv[3][2] + 2) / 4;
349 } 355 }
350 } 356 }
351 return true; 357 return std::unique_ptr<T>(new T(buffer, 0, webrtc::kVideoRotation_0));
352 } 358 }
353 359
354 // Simple and slow RGB->YUV conversion. From NTSC standard, c/o Wikipedia. 360 // Simple and slow RGB->YUV conversion. From NTSC standard, c/o Wikipedia.
355 void ConvertRgbPixel(uint8_t r, 361 void ConvertRgbPixel(uint8_t r,
356 uint8_t g, 362 uint8_t g,
357 uint8_t b, 363 uint8_t b,
358 uint8_t* y, 364 uint8_t* y,
359 uint8_t* u, 365 uint8_t* u,
360 uint8_t* v) { 366 uint8_t* v) {
361 *y = static_cast<int>(.257 * r + .504 * g + .098 * b) + 16; 367 *y = static_cast<int>(.257 * r + .504 * g + .098 * b) + 16;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 frame2.video_frame_buffer()->StrideU(), 505 frame2.video_frame_buffer()->StrideU(),
500 frame2.video_frame_buffer()->DataV() 506 frame2.video_frame_buffer()->DataV()
501 + vcrop * frame2.video_frame_buffer()->StrideV() / 2 507 + vcrop * frame2.video_frame_buffer()->StrideV() / 2
502 + hcrop / 2, 508 + hcrop / 2,
503 frame2.video_frame_buffer()->StrideV(), 509 frame2.video_frame_buffer()->StrideV(),
504 max_error); 510 max_error);
505 } 511 }
506 512
507 static bool IsBlack(const cricket::VideoFrame& frame) { 513 static bool IsBlack(const cricket::VideoFrame& frame) {
508 return !IsNull(frame) && 514 return !IsNull(frame) &&
509 *frame.video_frame_buffer()->DataY() == 16 && 515 *frame.video_frame_buffer()->DataY() <= 16 &&
510 *frame.video_frame_buffer()->DataU() == 128 && 516 *frame.video_frame_buffer()->DataU() == 128 &&
511 *frame.video_frame_buffer()->DataV() == 128; 517 *frame.video_frame_buffer()->DataV() == 128;
512 } 518 }
513 519
514 //////////////////////// 520 ////////////////////////
515 // Construction tests // 521 // Construction tests //
516 //////////////////////// 522 ////////////////////////
517 523
518 // Test constructing an image from a I420 buffer. 524 // Test constructing an image from a I420 buffer.
519 void ConstructI420() { 525 void ConstructI420() {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 yuy2, kWidth * 2, 612 yuy2, kWidth * 2,
607 kWidth, kHeight)); 613 kWidth, kHeight));
608 EXPECT_TRUE(LoadFrame(yuy2, buf_size, cricket::FOURCC_YUY2, 614 EXPECT_TRUE(LoadFrame(yuy2, buf_size, cricket::FOURCC_YUY2,
609 kWidth, kHeight, &frame2)); 615 kWidth, kHeight, &frame2));
610 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 616 EXPECT_TRUE(IsEqual(frame1, frame2, 0));
611 } 617 }
612 618
613 // Test constructing an image from a wide YUY2 buffer. 619 // Test constructing an image from a wide YUY2 buffer.
614 // Normal is 1280x720. Wide is 12800x72 620 // Normal is 1280x720. Wide is 12800x72
615 void ConstructYuy2Wide() { 621 void ConstructYuy2Wide() {
616 T frame1, frame2;
617 std::unique_ptr<rtc::MemoryStream> ms( 622 std::unique_ptr<rtc::MemoryStream> ms(
618 CreateYuv422Sample(cricket::FOURCC_YUY2, kWidth * 10, kHeight / 10)); 623 CreateYuv422Sample(cricket::FOURCC_YUY2, kWidth * 10, kHeight / 10));
619 ASSERT_TRUE(ms.get() != NULL); 624 ASSERT_TRUE(ms.get() != NULL);
620 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, 625 std::unique_ptr<T> frame1 = ConvertYuv422(ms.get(), cricket::FOURCC_YUY2,
621 kWidth * 10, kHeight / 10, 626 kWidth * 10, kHeight / 10);
622 &frame1)); 627 ASSERT_TRUE(frame1);
628 T frame2;
623 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2, 629 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2,
624 kWidth * 10, kHeight / 10, &frame2)); 630 kWidth * 10, kHeight / 10, &frame2));
625 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 631 EXPECT_TRUE(IsEqual(*frame1, frame2, 0));
626 } 632 }
627 633
628 // Test constructing an image from a UYVY buffer. 634 // Test constructing an image from a UYVY buffer.
629 void ConstructUyvy() { 635 void ConstructUyvy() {
630 T frame1, frame2;
631 std::unique_ptr<rtc::MemoryStream> ms( 636 std::unique_ptr<rtc::MemoryStream> ms(
632 CreateYuv422Sample(cricket::FOURCC_UYVY, kWidth, kHeight)); 637 CreateYuv422Sample(cricket::FOURCC_UYVY, kWidth, kHeight));
633 ASSERT_TRUE(ms.get() != NULL); 638 ASSERT_TRUE(ms.get() != NULL);
634 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_UYVY, kWidth, kHeight, 639 std::unique_ptr<T> frame1 = ConvertYuv422(ms.get(), cricket::FOURCC_UYVY,
635 &frame1)); 640 kWidth, kHeight);
641 T frame2;
636 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_UYVY, 642 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_UYVY,
637 kWidth, kHeight, &frame2)); 643 kWidth, kHeight, &frame2));
638 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 644 EXPECT_TRUE(IsEqual(*frame1, frame2, 0));
639 } 645 }
640 646
641 // Test constructing an image from a random buffer. 647 // Test constructing an image from a random buffer.
642 // We are merely verifying that the code succeeds and is free of crashes. 648 // We are merely verifying that the code succeeds and is free of crashes.
643 void ConstructM420() { 649 void ConstructM420() {
644 T frame; 650 T frame;
645 std::unique_ptr<rtc::MemoryStream> ms( 651 std::unique_ptr<rtc::MemoryStream> ms(
646 CreateYuvSample(kWidth, kHeight, 12)); 652 CreateYuvSample(kWidth, kHeight, 12));
647 ASSERT_TRUE(ms.get() != NULL); 653 ASSERT_TRUE(ms.get() != NULL);
648 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_M420, 654 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_M420,
(...skipping 14 matching lines...) Expand all
663 std::unique_ptr<rtc::MemoryStream> ms( 669 std::unique_ptr<rtc::MemoryStream> ms(
664 CreateYuvSample(kWidth, kHeight, 12)); 670 CreateYuvSample(kWidth, kHeight, 12));
665 ASSERT_TRUE(ms.get() != NULL); 671 ASSERT_TRUE(ms.get() != NULL);
666 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_NV12, 672 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_NV12,
667 kWidth, kHeight, &frame)); 673 kWidth, kHeight, &frame));
668 } 674 }
669 675
670 // Test constructing an image from a ABGR buffer 676 // Test constructing an image from a ABGR buffer
671 // Due to rounding, some pixels may differ slightly from the VideoFrame impl. 677 // Due to rounding, some pixels may differ slightly from the VideoFrame impl.
672 void ConstructABGR() { 678 void ConstructABGR() {
673 T frame1, frame2;
674 std::unique_ptr<rtc::MemoryStream> ms( 679 std::unique_ptr<rtc::MemoryStream> ms(
675 CreateRgbSample(cricket::FOURCC_ABGR, kWidth, kHeight)); 680 CreateRgbSample(cricket::FOURCC_ABGR, kWidth, kHeight));
676 ASSERT_TRUE(ms.get() != NULL); 681 ASSERT_TRUE(ms.get() != NULL);
677 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ABGR, kWidth, kHeight, 682 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ABGR,
678 &frame1)); 683 kWidth, kHeight);
684 ASSERT_TRUE(frame1);
685 T frame2;
679 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ABGR, 686 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ABGR,
680 kWidth, kHeight, &frame2)); 687 kWidth, kHeight, &frame2));
681 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 688 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
682 } 689 }
683 690
684 // Test constructing an image from a ARGB buffer 691 // Test constructing an image from a ARGB buffer
685 // Due to rounding, some pixels may differ slightly from the VideoFrame impl. 692 // Due to rounding, some pixels may differ slightly from the VideoFrame impl.
686 void ConstructARGB() { 693 void ConstructARGB() {
687 T frame1, frame2;
688 std::unique_ptr<rtc::MemoryStream> ms( 694 std::unique_ptr<rtc::MemoryStream> ms(
689 CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight)); 695 CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight));
690 ASSERT_TRUE(ms.get() != NULL); 696 ASSERT_TRUE(ms.get() != NULL);
691 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, 697 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB,
692 &frame1)); 698 kWidth, kHeight);
699 ASSERT_TRUE(frame1);
700 T frame2;
693 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, 701 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB,
694 kWidth, kHeight, &frame2)); 702 kWidth, kHeight, &frame2));
695 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 703 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
696 } 704 }
697 705
698 // Test constructing an image from a wide ARGB buffer 706 // Test constructing an image from a wide ARGB buffer
699 // Normal is 1280x720. Wide is 12800x72 707 // Normal is 1280x720. Wide is 12800x72
700 void ConstructARGBWide() { 708 void ConstructARGBWide() {
701 T frame1, frame2;
702 std::unique_ptr<rtc::MemoryStream> ms( 709 std::unique_ptr<rtc::MemoryStream> ms(
703 CreateRgbSample(cricket::FOURCC_ARGB, kWidth * 10, kHeight / 10)); 710 CreateRgbSample(cricket::FOURCC_ARGB, kWidth * 10, kHeight / 10));
704 ASSERT_TRUE(ms.get() != NULL); 711 ASSERT_TRUE(ms.get() != NULL);
705 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, 712 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB,
706 kWidth * 10, kHeight / 10, &frame1)); 713 kWidth * 10, kHeight / 10);
714 ASSERT_TRUE(frame1);
715 T frame2;
707 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, 716 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB,
708 kWidth * 10, kHeight / 10, &frame2)); 717 kWidth * 10, kHeight / 10, &frame2));
709 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 718 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
710 } 719 }
711 720
712 // Test constructing an image from an BGRA buffer. 721 // Test constructing an image from an BGRA buffer.
713 // Due to rounding, some pixels may differ slightly from the VideoFrame impl. 722 // Due to rounding, some pixels may differ slightly from the VideoFrame impl.
714 void ConstructBGRA() { 723 void ConstructBGRA() {
715 T frame1, frame2;
716 std::unique_ptr<rtc::MemoryStream> ms( 724 std::unique_ptr<rtc::MemoryStream> ms(
717 CreateRgbSample(cricket::FOURCC_BGRA, kWidth, kHeight)); 725 CreateRgbSample(cricket::FOURCC_BGRA, kWidth, kHeight));
718 ASSERT_TRUE(ms.get() != NULL); 726 ASSERT_TRUE(ms.get() != NULL);
719 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_BGRA, kWidth, kHeight, 727 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_BGRA,
720 &frame1)); 728 kWidth, kHeight);
729 ASSERT_TRUE(frame1);
730 T frame2;
721 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_BGRA, 731 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_BGRA,
722 kWidth, kHeight, &frame2)); 732 kWidth, kHeight, &frame2));
723 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 733 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
724 } 734 }
725 735
726 // Test constructing an image from a 24BG buffer. 736 // Test constructing an image from a 24BG buffer.
727 // Due to rounding, some pixels may differ slightly from the VideoFrame impl. 737 // Due to rounding, some pixels may differ slightly from the VideoFrame impl.
728 void Construct24BG() { 738 void Construct24BG() {
729 T frame1, frame2;
730 std::unique_ptr<rtc::MemoryStream> ms( 739 std::unique_ptr<rtc::MemoryStream> ms(
731 CreateRgbSample(cricket::FOURCC_24BG, kWidth, kHeight)); 740 CreateRgbSample(cricket::FOURCC_24BG, kWidth, kHeight));
732 ASSERT_TRUE(ms.get() != NULL); 741 ASSERT_TRUE(ms.get() != NULL);
733 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_24BG, kWidth, kHeight, 742 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_24BG,
734 &frame1)); 743 kWidth, kHeight);
744 ASSERT_TRUE(frame1);
745 T frame2;
735 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_24BG, 746 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_24BG,
736 kWidth, kHeight, &frame2)); 747 kWidth, kHeight, &frame2));
737 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 748 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
738 } 749 }
739 750
740 // Test constructing an image from a raw RGB buffer. 751 // Test constructing an image from a raw RGB buffer.
741 // Due to rounding, some pixels may differ slightly from the VideoFrame impl. 752 // Due to rounding, some pixels may differ slightly from the VideoFrame impl.
742 void ConstructRaw() { 753 void ConstructRaw() {
743 T frame1, frame2;
744 std::unique_ptr<rtc::MemoryStream> ms( 754 std::unique_ptr<rtc::MemoryStream> ms(
745 CreateRgbSample(cricket::FOURCC_RAW, kWidth, kHeight)); 755 CreateRgbSample(cricket::FOURCC_RAW, kWidth, kHeight));
746 ASSERT_TRUE(ms.get() != NULL); 756 ASSERT_TRUE(ms.get() != NULL);
747 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_RAW, kWidth, kHeight, 757 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_RAW,
748 &frame1)); 758 kWidth, kHeight);
759 ASSERT_TRUE(frame1);
760 T frame2;
749 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_RAW, 761 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_RAW,
750 kWidth, kHeight, &frame2)); 762 kWidth, kHeight, &frame2));
751 EXPECT_TRUE(IsEqual(frame1, frame2, 2)); 763 EXPECT_TRUE(IsEqual(*frame1, frame2, 2));
752 } 764 }
753 765
754 // Test constructing an image from a RGB565 buffer 766 // Test constructing an image from a RGB565 buffer
755 void ConstructRGB565() { 767 void ConstructRGB565() {
756 T frame1, frame2; 768 T frame1, frame2;
757 size_t out_size = kWidth * kHeight * 2; 769 size_t out_size = kWidth * kHeight * 2;
758 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); 770 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]);
759 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); 771 uint8_t* out = ALIGNP(outbuf.get(), kAlignment);
760 T frame; 772 T frame;
761 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 773 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 webrtc::kVideoRotation_180, &frame1)); \ 823 webrtc::kVideoRotation_180, &frame1)); \
812 size_t data_size; \ 824 size_t data_size; \
813 bool ret = ms->GetSize(&data_size); \ 825 bool ret = ms->GetSize(&data_size); \
814 EXPECT_TRUE(ret); \ 826 EXPECT_TRUE(ret); \
815 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \ 827 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \
816 kHeight, \ 828 kHeight, \
817 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \ 829 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \
818 data_size, 0, webrtc::kVideoRotation_0)); \ 830 data_size, 0, webrtc::kVideoRotation_0)); \
819 int width_rotate = frame1.width(); \ 831 int width_rotate = frame1.width(); \
820 int height_rotate = frame1.height(); \ 832 int height_rotate = frame1.height(); \
821 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ 833 frame3.InitToEmptyBuffer(width_rotate, height_rotate, 0); \
822 libyuv::I420Mirror(frame2.video_frame_buffer()->DataY(), \ 834 libyuv::I420Mirror(frame2.video_frame_buffer()->DataY(), \
823 frame2.video_frame_buffer()->StrideY(), \ 835 frame2.video_frame_buffer()->StrideY(), \
824 frame2.video_frame_buffer()->DataU(), \ 836 frame2.video_frame_buffer()->DataU(), \
825 frame2.video_frame_buffer()->StrideU(), \ 837 frame2.video_frame_buffer()->StrideU(), \
826 frame2.video_frame_buffer()->DataV(), \ 838 frame2.video_frame_buffer()->DataV(), \
827 frame2.video_frame_buffer()->StrideV(), \ 839 frame2.video_frame_buffer()->StrideV(), \
828 frame3.video_frame_buffer()->MutableDataY(), \ 840 frame3.video_frame_buffer()->MutableDataY(), \
829 frame3.video_frame_buffer()->StrideY(), \ 841 frame3.video_frame_buffer()->StrideY(), \
830 frame3.video_frame_buffer()->MutableDataU(), \ 842 frame3.video_frame_buffer()->MutableDataU(), \
831 frame3.video_frame_buffer()->StrideU(), \ 843 frame3.video_frame_buffer()->StrideU(), \
(...skipping 17 matching lines...) Expand all
849 &frame1)); \ 861 &frame1)); \
850 size_t data_size; \ 862 size_t data_size; \
851 bool ret = ms->GetSize(&data_size); \ 863 bool ret = ms->GetSize(&data_size); \
852 EXPECT_TRUE(ret); \ 864 EXPECT_TRUE(ret); \
853 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \ 865 EXPECT_TRUE(frame2.Init(cricket::FOURCC_##FOURCC, kWidth, kHeight, kWidth, \
854 kHeight, \ 866 kHeight, \
855 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \ 867 reinterpret_cast<uint8_t*>(ms->GetBuffer()), \
856 data_size, 0, webrtc::kVideoRotation_0)); \ 868 data_size, 0, webrtc::kVideoRotation_0)); \
857 int width_rotate = frame1.width(); \ 869 int width_rotate = frame1.width(); \
858 int height_rotate = frame1.height(); \ 870 int height_rotate = frame1.height(); \
859 EXPECT_TRUE(frame3.InitToBlack(width_rotate, height_rotate, 0)); \ 871 frame3.InitToEmptyBuffer(width_rotate, height_rotate, 0); \
860 libyuv::I420Rotate(frame2.video_frame_buffer()->DataY(), \ 872 libyuv::I420Rotate(frame2.video_frame_buffer()->DataY(), \
861 frame2.video_frame_buffer()->StrideY(), \ 873 frame2.video_frame_buffer()->StrideY(), \
862 frame2.video_frame_buffer()->DataU(), \ 874 frame2.video_frame_buffer()->DataU(), \
863 frame2.video_frame_buffer()->StrideU(), \ 875 frame2.video_frame_buffer()->StrideU(), \
864 frame2.video_frame_buffer()->DataV(), \ 876 frame2.video_frame_buffer()->DataV(), \
865 frame2.video_frame_buffer()->StrideV(), \ 877 frame2.video_frame_buffer()->StrideV(), \
866 frame3.video_frame_buffer()->MutableDataY(), \ 878 frame3.video_frame_buffer()->MutableDataY(), \
867 frame3.video_frame_buffer()->StrideY(), \ 879 frame3.video_frame_buffer()->StrideY(), \
868 frame3.video_frame_buffer()->MutableDataU(), \ 880 frame3.video_frame_buffer()->MutableDataU(), \
869 frame3.video_frame_buffer()->StrideU(), \ 881 frame3.video_frame_buffer()->StrideU(), \
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, kWidth, kHeight, 1085 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, kWidth, kHeight,
1074 &frame1)); 1086 &frame1));
1075 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2, kWidth, kHeight, 1087 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2, kWidth, kHeight,
1076 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0, 1088 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0,
1077 &frame2)); 1089 &frame2));
1078 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 0)); 1090 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 0));
1079 } 1091 }
1080 1092
1081 // Test constructing an image from an ARGB buffer with horizontal cropping. 1093 // Test constructing an image from an ARGB buffer with horizontal cropping.
1082 void ConstructARGBCropHorizontal() { 1094 void ConstructARGBCropHorizontal() {
1083 T frame1, frame2;
1084 std::unique_ptr<rtc::MemoryStream> ms( 1095 std::unique_ptr<rtc::MemoryStream> ms(
1085 CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight)); 1096 CreateRgbSample(cricket::FOURCC_ARGB, kWidth, kHeight));
1086 ASSERT_TRUE(ms.get() != NULL); 1097 ASSERT_TRUE(ms.get() != NULL);
1087 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, 1098 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB,
1088 &frame1)); 1099 kWidth, kHeight);
1100 ASSERT_TRUE(frame1);
1101 T frame2;
1089 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight, 1102 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, kWidth, kHeight,
1090 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0, 1103 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0,
1091 &frame2)); 1104 &frame2));
1092 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 2)); 1105 EXPECT_TRUE(IsEqualWithCrop(frame2, *frame1, kWidth / 8, 0, 2));
1093 } 1106 }
1094 1107
1095 // Test constructing an image from an I420 buffer, cropping top and bottom. 1108 // Test constructing an image from an I420 buffer, cropping top and bottom.
1096 void ConstructI420CropVertical() { 1109 void ConstructI420CropVertical() {
1097 T frame1, frame2; 1110 T frame1, frame2;
1098 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 1111 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
1099 ASSERT_TRUE(LoadFrame(kImageFilename, cricket::FOURCC_I420, kWidth, kHeight, 1112 ASSERT_TRUE(LoadFrame(kImageFilename, cricket::FOURCC_I420, kWidth, kHeight,
1100 kWidth, kHeight * 3 / 4, webrtc::kVideoRotation_0, 1113 kWidth, kHeight * 3 / 4, webrtc::kVideoRotation_0,
1101 &frame2)); 1114 &frame2));
1102 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, 0, kHeight / 8, 0)); 1115 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, 0, kHeight / 8, 0));
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 void ConstructCopyIsRef() { 1352 void ConstructCopyIsRef() {
1340 T frame1, frame2; 1353 T frame1, frame2;
1341 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 1354 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
1342 for (int i = 0; i < repeat_; ++i) { 1355 for (int i = 0; i < repeat_; ++i) {
1343 EXPECT_TRUE(frame2.Init(frame1)); 1356 EXPECT_TRUE(frame2.Init(frame1));
1344 } 1357 }
1345 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 1358 EXPECT_TRUE(IsEqual(frame1, frame2, 0));
1346 EXPECT_EQ(frame1.video_frame_buffer(), frame2.video_frame_buffer()); 1359 EXPECT_EQ(frame1.video_frame_buffer(), frame2.video_frame_buffer());
1347 } 1360 }
1348 1361
1349 // Test creating an empty image and initing it to black.
1350 void ConstructBlack() {
1351 T frame;
1352 for (int i = 0; i < repeat_; ++i) {
1353 EXPECT_TRUE(frame.InitToBlack(kWidth, kHeight, 0));
1354 }
1355 EXPECT_TRUE(IsSize(frame, kWidth, kHeight));
1356 EXPECT_TRUE(IsBlack(frame));
1357 }
1358
1359 // Test constructing an image from a YUY2 buffer with a range of sizes. 1362 // Test constructing an image from a YUY2 buffer with a range of sizes.
1360 // Only tests that conversion does not crash or corrupt heap. 1363 // Only tests that conversion does not crash or corrupt heap.
1361 void ConstructYuy2AllSizes() { 1364 void ConstructYuy2AllSizes() {
1362 T frame1, frame2; 1365 T frame1, frame2;
1363 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) { 1366 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) {
1364 for (int width = kMinWidthAll; width <= kMaxWidthAll; ++width) { 1367 for (int width = kMinWidthAll; width <= kMaxWidthAll; ++width) {
1365 std::unique_ptr<rtc::MemoryStream> ms( 1368 std::unique_ptr<rtc::MemoryStream> ms(
1366 CreateYuv422Sample(cricket::FOURCC_YUY2, width, height)); 1369 CreateYuv422Sample(cricket::FOURCC_YUY2, width, height));
1367 ASSERT_TRUE(ms.get() != NULL); 1370 ASSERT_TRUE(ms.get() != NULL);
1368 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, width, height, 1371 EXPECT_TRUE(ConvertYuv422(ms.get(), cricket::FOURCC_YUY2, width, height,
1369 &frame1)); 1372 &frame1));
1370 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2, 1373 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_YUY2,
1371 width, height, &frame2)); 1374 width, height, &frame2));
1372 EXPECT_TRUE(IsEqual(frame1, frame2, 0)); 1375 EXPECT_TRUE(IsEqual(frame1, frame2, 0));
1373 } 1376 }
1374 } 1377 }
1375 } 1378 }
1376 1379
1377 // Test constructing an image from a ARGB buffer with a range of sizes. 1380 // Test constructing an image from a ARGB buffer with a range of sizes.
1378 // Only tests that conversion does not crash or corrupt heap. 1381 // Only tests that conversion does not crash or corrupt heap.
1379 void ConstructARGBAllSizes() { 1382 void ConstructARGBAllSizes() {
1380 T frame1, frame2;
1381 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) { 1383 for (int height = kMinHeightAll; height <= kMaxHeightAll; ++height) {
1382 for (int width = kMinWidthAll; width <= kMaxWidthAll; ++width) { 1384 for (int width = kMinWidthAll; width <= kMaxWidthAll; ++width) {
1383 std::unique_ptr<rtc::MemoryStream> ms( 1385 std::unique_ptr<rtc::MemoryStream> ms(
1384 CreateRgbSample(cricket::FOURCC_ARGB, width, height)); 1386 CreateRgbSample(cricket::FOURCC_ARGB, width, height));
1385 ASSERT_TRUE(ms.get() != NULL); 1387 ASSERT_TRUE(ms.get() != NULL);
1386 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, width, height, 1388 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB,
1387 &frame1)); 1389 width, height);
1390 ASSERT_TRUE(frame1);
1391 T frame2;
1388 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, 1392 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB,
1389 width, height, &frame2)); 1393 width, height, &frame2));
1390 EXPECT_TRUE(IsEqual(frame1, frame2, 64)); 1394 EXPECT_TRUE(IsEqual(*frame1, frame2, 64));
1391 } 1395 }
1392 } 1396 }
1393 // Test a practical window size for screencasting usecase. 1397 // Test a practical window size for screencasting usecase.
1394 const int kOddWidth = 1228; 1398 const int kOddWidth = 1228;
1395 const int kOddHeight = 260; 1399 const int kOddHeight = 260;
1396 for (int j = 0; j < 2; ++j) { 1400 for (int j = 0; j < 2; ++j) {
1397 for (int i = 0; i < 2; ++i) { 1401 for (int i = 0; i < 2; ++i) {
1398 std::unique_ptr<rtc::MemoryStream> ms( 1402 std::unique_ptr<rtc::MemoryStream> ms(
1399 CreateRgbSample(cricket::FOURCC_ARGB, kOddWidth + i, kOddHeight + j)); 1403 CreateRgbSample(cricket::FOURCC_ARGB, kOddWidth + i, kOddHeight + j));
1400 ASSERT_TRUE(ms.get() != NULL); 1404 ASSERT_TRUE(ms.get() != NULL);
1401 EXPECT_TRUE(ConvertRgb(ms.get(), cricket::FOURCC_ARGB, 1405 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_ARGB,
1402 kOddWidth + i, kOddHeight + j, 1406 kOddWidth + i, kOddHeight + j);
1403 &frame1)); 1407 ASSERT_TRUE(frame1);
1408 T frame2;
1404 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB, 1409 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_ARGB,
1405 kOddWidth + i, kOddHeight + j, &frame2)); 1410 kOddWidth + i, kOddHeight + j, &frame2));
1406 EXPECT_TRUE(IsEqual(frame1, frame2, 64)); 1411 EXPECT_TRUE(IsEqual(*frame1, frame2, 64));
1407 } 1412 }
1408 } 1413 }
1409 } 1414 }
1410 1415
1411 ////////////////////// 1416 //////////////////////
1412 // Conversion tests // 1417 // Conversion tests //
1413 ////////////////////// 1418 //////////////////////
1414 1419
1415 enum ToFrom { TO, FROM }; 1420 enum ToFrom { TO, FROM };
1416 1421
(...skipping 29 matching lines...) Expand all
1446 out += (kHeight - 1) * stride; // Point to last row. 1451 out += (kHeight - 1) * stride; // Point to last row.
1447 stride = -stride; 1452 stride = -stride;
1448 } 1453 }
1449 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); 1454 ASSERT_TRUE(LoadFrameNoRepeat(&frame1));
1450 1455
1451 for (int i = 0; i < repeat_to; ++i) { 1456 for (int i = 0; i < repeat_to; ++i) {
1452 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc, 1457 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc,
1453 out, 1458 out,
1454 out_size, stride)); 1459 out_size, stride));
1455 } 1460 }
1456 EXPECT_TRUE(frame2.InitToBlack(kWidth, kHeight, 0)); 1461 frame2.InitToEmptyBuffer(kWidth, kHeight, 0);
1457 for (int i = 0; i < repeat_from; ++i) { 1462 for (int i = 0; i < repeat_from; ++i) {
1458 EXPECT_EQ(0, RGBToI420(out, stride, 1463 EXPECT_EQ(0, RGBToI420(out, stride,
1459 frame2.video_frame_buffer()->MutableDataY(), 1464 frame2.video_frame_buffer()->MutableDataY(),
1460 frame2.video_frame_buffer()->StrideY(), 1465 frame2.video_frame_buffer()->StrideY(),
1461 frame2.video_frame_buffer()->MutableDataU(), 1466 frame2.video_frame_buffer()->MutableDataU(),
1462 frame2.video_frame_buffer()->StrideU(), 1467 frame2.video_frame_buffer()->StrideU(),
1463 frame2.video_frame_buffer()->MutableDataV(), 1468 frame2.video_frame_buffer()->MutableDataV(),
1464 frame2.video_frame_buffer()->StrideV(), 1469 frame2.video_frame_buffer()->StrideV(),
1465 kWidth, kHeight)); 1470 kWidth, kHeight));
1466 } 1471 }
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 std::unique_ptr<const cricket::VideoFrame> target; 1806 std::unique_ptr<const cricket::VideoFrame> target;
1802 ASSERT_TRUE(LoadFrameNoRepeat(source.get())); 1807 ASSERT_TRUE(LoadFrameNoRepeat(source.get()));
1803 target.reset(source->Copy()); 1808 target.reset(source->Copy());
1804 EXPECT_TRUE(IsEqual(*source, *target, 0)); 1809 EXPECT_TRUE(IsEqual(*source, *target, 0));
1805 const T* const_source = source.get(); 1810 const T* const_source = source.get();
1806 EXPECT_EQ(const_source->video_frame_buffer(), target->video_frame_buffer()); 1811 EXPECT_EQ(const_source->video_frame_buffer(), target->video_frame_buffer());
1807 } 1812 }
1808 1813
1809 void StretchToFrame() { 1814 void StretchToFrame() {
1810 // Create the source frame as a black frame. 1815 // Create the source frame as a black frame.
1811 T source; 1816 rtc::scoped_refptr<webrtc::I420Buffer> buffer(
1812 EXPECT_TRUE(source.InitToBlack(kWidth * 2, kHeight * 2, 0)); 1817 new rtc::RefCountedObject<webrtc::I420Buffer>(kWidth * 2, kHeight * 2));
1818
1819 buffer->SetToBlack();
1820 T source(buffer, 0, webrtc::kVideoRotation_0);
1821
1813 EXPECT_TRUE(IsSize(source, kWidth * 2, kHeight * 2)); 1822 EXPECT_TRUE(IsSize(source, kWidth * 2, kHeight * 2));
1814 1823
1815 // Create the target frame by loading from a file. 1824 // Create the target frame by loading from a file.
1816 T target1; 1825 T target1;
1817 ASSERT_TRUE(LoadFrameNoRepeat(&target1)); 1826 ASSERT_TRUE(LoadFrameNoRepeat(&target1));
1818 EXPECT_FALSE(IsBlack(target1)); 1827 EXPECT_FALSE(IsBlack(target1));
1819 1828
1820 // Stretch and check if the stretched target is black. 1829 // Stretch and check if the stretched target is black.
1821 source.StretchToFrame(&target1, true, false); 1830 source.StretchToFrame(&target1, true, false);
1822 EXPECT_TRUE(IsBlack(target1)); 1831 EXPECT_TRUE(IsBlack(target1));
1823 1832
1824 // Crop and stretch and check if the stretched target is black. 1833 // Crop and stretch and check if the stretched target is black.
1825 T target2; 1834 T target2;
1826 ASSERT_TRUE(LoadFrameNoRepeat(&target2)); 1835 ASSERT_TRUE(LoadFrameNoRepeat(&target2));
1827 source.StretchToFrame(&target2, true, true); 1836 source.StretchToFrame(&target2, true, true);
1828 EXPECT_TRUE(IsBlack(target2)); 1837 EXPECT_TRUE(IsBlack(target2));
1829 EXPECT_EQ(source.GetTimeStamp(), target2.GetTimeStamp()); 1838 EXPECT_EQ(source.GetTimeStamp(), target2.GetTimeStamp());
1830 } 1839 }
1831 1840
1832 int repeat_; 1841 int repeat_;
1833 }; 1842 };
1834 1843
1835 #endif // WEBRTC_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_ 1844 #endif // WEBRTC_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_
OLDNEW
« no previous file with comments | « webrtc/media/base/videoframe.cc ('k') | webrtc/media/engine/webrtcvideoframe.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698