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

Side by Side Diff: cc/output/renderer_pixeltest.cc

Issue 222563002: Remove redundant I420-to-YV12 conversion in MediaStreamVideoTrack. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Allow I420 as acceptable default YUV format in ppapi tests. Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | cc/resources/video_resource_updater.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop/message_loop.h" 5 #include "base/message_loop/message_loop.h"
6 #include "cc/layers/append_quads_data.h" 6 #include "cc/layers/append_quads_data.h"
7 #include "cc/output/gl_renderer.h" 7 #include "cc/output/gl_renderer.h"
8 #include "cc/quads/draw_quad.h" 8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/picture_draw_quad.h" 9 #include "cc/quads/picture_draw_quad.h"
10 #include "cc/quads/texture_draw_quad.h" 10 #include "cc/quads/texture_draw_quad.h"
11 #include "cc/resources/video_resource_updater.h"
11 #include "cc/test/fake_picture_pile_impl.h" 12 #include "cc/test/fake_picture_pile_impl.h"
12 #include "cc/test/pixel_test.h" 13 #include "cc/test/pixel_test.h"
13 #include "gpu/GLES2/gl2extchromium.h" 14 #include "gpu/GLES2/gl2extchromium.h"
14 #include "gpu/command_buffer/client/gles2_interface.h" 15 #include "gpu/command_buffer/client/gles2_interface.h"
16 #include "media/base/video_frame.h"
15 #include "third_party/skia/include/core/SkBitmapDevice.h" 17 #include "third_party/skia/include/core/SkBitmapDevice.h"
16 #include "third_party/skia/include/core/SkImageFilter.h" 18 #include "third_party/skia/include/core/SkImageFilter.h"
17 #include "third_party/skia/include/core/SkMatrix.h" 19 #include "third_party/skia/include/core/SkMatrix.h"
18 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" 20 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
19 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" 21 #include "third_party/skia/include/effects/SkColorMatrixFilter.h"
20 #include "ui/gfx/rect_conversions.h" 22 #include "ui/gfx/rect_conversions.h"
21 23
22 using gpu::gles2::GLES2Interface; 24 using gpu::gles2::GLES2Interface;
23 25
24 namespace cc { 26 namespace cc {
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 &pass_list, 399 &pass_list,
398 PixelTest::NoOffscreenContext, 400 PixelTest::NoOffscreenContext,
399 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 401 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
400 FuzzyPixelOffByOneComparator(true))); 402 FuzzyPixelOffByOneComparator(true)));
401 } 403 }
402 404
403 class VideoGLRendererPixelTest : public GLRendererPixelTest { 405 class VideoGLRendererPixelTest : public GLRendererPixelTest {
404 protected: 406 protected:
405 scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad( 407 scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad(
406 SharedQuadState* shared_state, 408 SharedQuadState* shared_state,
407 bool with_alpha, 409 media::VideoFrame::Format format,
408 bool is_transparent, 410 bool is_transparent,
409 const gfx::RectF& tex_coord_rect) { 411 const gfx::RectF& tex_coord_rect) {
412 const bool with_alpha = (format == media::VideoFrame::YV12A);
410 const gfx::Rect rect(this->device_viewport_size_); 413 const gfx::Rect rect(this->device_viewport_size_);
411 const gfx::Rect uv_rect(
412 0, 0, (rect.width() + 1) / 2, (rect.height() + 1) / 2);
413 const gfx::Rect opaque_rect(0, 0, 0, 0); 414 const gfx::Rect opaque_rect(0, 0, 0, 0);
414 415
415 ResourceProvider::ResourceId y_resource = 416 scoped_refptr<media::VideoFrame> video_frame =
416 resource_provider_->CreateResource(rect.size(), 417 media::VideoFrame::CreateFrame(
417 GL_CLAMP_TO_EDGE, 418 format, rect.size(), rect, rect.size(), base::TimeDelta());
418 ResourceProvider::TextureUsageAny,
419 LUMINANCE_8);
420 ResourceProvider::ResourceId u_resource =
421 resource_provider_->CreateResource(uv_rect.size(),
422 GL_CLAMP_TO_EDGE,
423 ResourceProvider::TextureUsageAny,
424 LUMINANCE_8);
425 ResourceProvider::ResourceId v_resource =
426 resource_provider_->CreateResource(uv_rect.size(),
427 GL_CLAMP_TO_EDGE,
428 ResourceProvider::TextureUsageAny,
429 LUMINANCE_8);
430 ResourceProvider::ResourceId a_resource = 0;
431 if (with_alpha) {
432 a_resource = resource_provider_->CreateResource(
433 this->device_viewport_size_,
434 GL_CLAMP_TO_EDGE,
435 ResourceProvider::TextureUsageAny,
436 LUMINANCE_8);
437 }
438 419
439 const int y_plane_size = rect.size().GetArea();
440 const int uv_plane_size = uv_rect.size().GetArea();
441 scoped_ptr<uint8_t[]> y_plane(new uint8_t[y_plane_size]);
442 scoped_ptr<uint8_t[]> u_plane(new uint8_t[uv_plane_size]);
443 scoped_ptr<uint8_t[]> v_plane(new uint8_t[uv_plane_size]);
444 scoped_ptr<uint8_t[]> a_plane;
445 if (with_alpha)
446 a_plane.reset(new uint8_t[y_plane_size]);
447 // YUV values representing a striped pattern, for validating texture 420 // YUV values representing a striped pattern, for validating texture
448 // coordinates for sampling. 421 // coordinates for sampling.
449 uint8_t y_value = 0; 422 uint8_t y_value = 0;
450 uint8_t u_value = 0; 423 uint8_t u_value = 0;
451 uint8_t v_value = 0; 424 uint8_t v_value = 0;
452 for (int i = 0; i < y_plane_size; ++i) 425 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
453 y_plane.get()[i] = (y_value += 1); 426 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
454 for (int i = 0; i < uv_plane_size; ++i) { 427 video_frame->stride(media::VideoFrame::kYPlane) * i;
455 u_plane.get()[i] = (u_value += 3); 428 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
456 v_plane.get()[i] = (v_value += 5); 429 ++j) {
430 y_row[j] = (y_value += 1);
431 }
432 }
433 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
434 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
435 video_frame->stride(media::VideoFrame::kUPlane) * i;
436 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
437 video_frame->stride(media::VideoFrame::kVPlane) * i;
438 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
439 ++j) {
440 u_row[j] = (u_value += 3);
441 v_row[j] = (v_value += 5);
442 }
457 } 443 }
458 if (with_alpha) 444 if (with_alpha)
459 memset(a_plane.get(), is_transparent ? 0 : 128, y_plane_size); 445 memset(video_frame->data(media::VideoFrame::kAPlane),
446 is_transparent ? 0 : 128,
447 video_frame->stride(media::VideoFrame::kAPlane) *
448 video_frame->rows(media::VideoFrame::kAPlane));
460 449
461 resource_provider_->SetPixels( 450 VideoFrameExternalResources resources =
462 y_resource, y_plane.get(), rect, rect, gfx::Vector2d()); 451 video_resource_updater_->CreateExternalResourcesFromVideoFrame(
463 resource_provider_->SetPixels( 452 video_frame);
464 u_resource, u_plane.get(), uv_rect, uv_rect, gfx::Vector2d()); 453
465 resource_provider_->SetPixels( 454 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
466 v_resource, v_plane.get(), uv_rect, uv_rect, gfx::Vector2d()); 455 EXPECT_EQ(media::VideoFrame::NumPlanes(format), resources.mailboxes.size());
456 EXPECT_EQ(media::VideoFrame::NumPlanes(format),
457 resources.release_callbacks.size());
458
459 ResourceProvider::ResourceId y_resource =
460 resource_provider_->CreateResourceFromTextureMailbox(
461 resources.mailboxes[media::VideoFrame::kYPlane],
462 SingleReleaseCallback::Create(
463 resources.release_callbacks[media::VideoFrame::kYPlane]));
464 ResourceProvider::ResourceId u_resource =
465 resource_provider_->CreateResourceFromTextureMailbox(
466 resources.mailboxes[media::VideoFrame::kUPlane],
467 SingleReleaseCallback::Create(
468 resources.release_callbacks[media::VideoFrame::kUPlane]));
469 ResourceProvider::ResourceId v_resource =
470 resource_provider_->CreateResourceFromTextureMailbox(
471 resources.mailboxes[media::VideoFrame::kVPlane],
472 SingleReleaseCallback::Create(
473 resources.release_callbacks[media::VideoFrame::kVPlane]));
474 ResourceProvider::ResourceId a_resource = 0;
467 if (with_alpha) { 475 if (with_alpha) {
468 resource_provider_->SetPixels(a_resource, a_plane.get(), rect, rect, 476 a_resource = resource_provider_->CreateResourceFromTextureMailbox(
469 gfx::Vector2d()); 477 resources.mailboxes[media::VideoFrame::kAPlane],
478 SingleReleaseCallback::Create(
479 resources.release_callbacks[media::VideoFrame::kAPlane]));
470 } 480 }
471 481
472 scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create(); 482 scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create();
473 yuv_quad->SetNew(shared_state, 483 yuv_quad->SetNew(shared_state,
474 rect, 484 rect,
475 opaque_rect, 485 opaque_rect,
476 rect, 486 rect,
477 tex_coord_rect, 487 tex_coord_rect,
478 y_resource, 488 y_resource,
479 u_resource, 489 u_resource,
480 v_resource, 490 v_resource,
481 a_resource); 491 a_resource);
482 return yuv_quad.Pass(); 492 return yuv_quad.Pass();
483 } 493 }
494
495 virtual void SetUp() OVERRIDE {
496 GLRendererPixelTest::SetUp();
497 video_resource_updater_.reset(new VideoResourceUpdater(
498 output_surface_->context_provider().get(), resource_provider_.get()));
499 }
500
501 private:
502 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
484 }; 503 };
485 504
486 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { 505 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
487 gfx::Rect rect(this->device_viewport_size_); 506 gfx::Rect rect(this->device_viewport_size_);
488 507
489 RenderPass::Id id(1, 1); 508 RenderPass::Id id(1, 1);
490 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 509 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
491 510
492 scoped_ptr<SharedQuadState> shared_state = 511 scoped_ptr<SharedQuadState> shared_state =
493 CreateTestSharedQuadState(gfx::Transform(), rect); 512 CreateTestSharedQuadState(gfx::Transform(), rect);
494 513
495 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( 514 scoped_ptr<YUVVideoDrawQuad> yuv_quad =
496 shared_state.get(), false, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); 515 CreateTestYUVVideoDrawQuad(shared_state.get(),
516 media::VideoFrame::YV12,
517 false,
518 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
497 519
498 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); 520 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
499 521
500 RenderPassList pass_list; 522 RenderPassList pass_list;
501 pass_list.push_back(pass.Pass()); 523 pass_list.push_back(pass.Pass());
502 524
503 EXPECT_TRUE( 525 EXPECT_TRUE(
504 this->RunPixelTest(&pass_list, 526 this->RunPixelTest(&pass_list,
505 PixelTest::NoOffscreenContext, 527 PixelTest::NoOffscreenContext,
506 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), 528 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
507 FuzzyPixelOffByOneComparator(true))); 529 FuzzyPixelOffByOneComparator(true)));
508 } 530 }
509 531
510 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { 532 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
511 gfx::Rect rect(this->device_viewport_size_); 533 gfx::Rect rect(this->device_viewport_size_);
512 534
513 RenderPass::Id id(1, 1); 535 RenderPass::Id id(1, 1);
514 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 536 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
515 537
516 scoped_ptr<SharedQuadState> shared_state = 538 scoped_ptr<SharedQuadState> shared_state =
517 CreateTestSharedQuadState(gfx::Transform(), rect); 539 CreateTestSharedQuadState(gfx::Transform(), rect);
518 540
519 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( 541 // Intentionally sets frame format to I420 for testing coverage.
520 shared_state.get(), false, false, gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f)); 542 scoped_ptr<YUVVideoDrawQuad> yuv_quad =
543 CreateTestYUVVideoDrawQuad(shared_state.get(),
544 media::VideoFrame::I420,
545 false,
546 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f));
521 547
522 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); 548 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
523 549
524 RenderPassList pass_list; 550 RenderPassList pass_list;
525 pass_list.push_back(pass.Pass()); 551 pass_list.push_back(pass.Pass());
526 552
527 EXPECT_TRUE(this->RunPixelTest( 553 EXPECT_TRUE(this->RunPixelTest(
528 &pass_list, 554 &pass_list,
529 PixelTest::NoOffscreenContext, 555 PixelTest::NoOffscreenContext,
530 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), 556 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
531 FuzzyPixelOffByOneComparator(true))); 557 FuzzyPixelOffByOneComparator(true)));
532 } 558 }
533 559
534 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { 560 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
535 gfx::Rect rect(this->device_viewport_size_); 561 gfx::Rect rect(this->device_viewport_size_);
536 562
537 RenderPass::Id id(1, 1); 563 RenderPass::Id id(1, 1);
538 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 564 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
539 565
540 scoped_ptr<SharedQuadState> shared_state = 566 scoped_ptr<SharedQuadState> shared_state =
541 CreateTestSharedQuadState(gfx::Transform(), rect); 567 CreateTestSharedQuadState(gfx::Transform(), rect);
542 568
543 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( 569 scoped_ptr<YUVVideoDrawQuad> yuv_quad =
544 shared_state.get(), true, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); 570 CreateTestYUVVideoDrawQuad(shared_state.get(),
571 media::VideoFrame::YV12A,
572 false,
573 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
545 574
546 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); 575 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
547 576
548 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 577 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
549 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false); 578 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false);
550 579
551 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 580 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
552 581
553 RenderPassList pass_list; 582 RenderPassList pass_list;
554 pass_list.push_back(pass.Pass()); 583 pass_list.push_back(pass.Pass());
555 584
556 EXPECT_TRUE(this->RunPixelTest( 585 EXPECT_TRUE(this->RunPixelTest(
557 &pass_list, 586 &pass_list,
558 PixelTest::NoOffscreenContext, 587 PixelTest::NoOffscreenContext,
559 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), 588 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
560 FuzzyPixelOffByOneComparator(true))); 589 FuzzyPixelOffByOneComparator(true)));
561 } 590 }
562 591
563 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { 592 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
564 gfx::Rect rect(this->device_viewport_size_); 593 gfx::Rect rect(this->device_viewport_size_);
565 594
566 RenderPass::Id id(1, 1); 595 RenderPass::Id id(1, 1);
567 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 596 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
568 597
569 scoped_ptr<SharedQuadState> shared_state = 598 scoped_ptr<SharedQuadState> shared_state =
570 CreateTestSharedQuadState(gfx::Transform(), rect); 599 CreateTestSharedQuadState(gfx::Transform(), rect);
571 600
572 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( 601 scoped_ptr<YUVVideoDrawQuad> yuv_quad =
573 shared_state.get(), true, true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); 602 CreateTestYUVVideoDrawQuad(shared_state.get(),
603 media::VideoFrame::YV12A,
604 true,
605 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
574 606
575 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); 607 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
576 608
577 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 609 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
578 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorBLACK, false); 610 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorBLACK, false);
579 611
580 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 612 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
581 613
582 RenderPassList pass_list; 614 RenderPassList pass_list;
583 pass_list.push_back(pass.Pass()); 615 pass_list.push_back(pass.Pass());
(...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after
2098 &pass_list, 2130 &pass_list,
2099 PixelTest::NoOffscreenContext, 2131 PixelTest::NoOffscreenContext,
2100 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")), 2132 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2101 FuzzyPixelOffByOneComparator(true))); 2133 FuzzyPixelOffByOneComparator(true)));
2102 } 2134 }
2103 2135
2104 #endif // !defined(OS_ANDROID) 2136 #endif // !defined(OS_ANDROID)
2105 2137
2106 } // namespace 2138 } // namespace
2107 } // namespace cc 2139 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/resources/video_resource_updater.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698