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

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

Issue 2121043002: 16 bpp video stream capture, render and WebGL usage - Realsense R200 & SR300 support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tests: cc, skcanvas_video_renderer, wrtcrecorder... Fake capture supports Y16. Created 4 years, 2 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
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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "cc/output/gl_renderer.h" 10 #include "cc/output/gl_renderer.h"
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 bits_per_channel = 10; 279 bits_per_channel = 10;
280 } 280 }
281 281
282 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 282 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
283 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 283 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
284 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 284 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
285 color_space, video_color_space, 0.0f, 1.0f, 285 color_space, video_color_space, 0.0f, 1.0f,
286 bits_per_channel); 286 bits_per_channel);
287 } 287 }
288 288
289 void CreateTestY16VideoDrawQuad_FromVideoFrame(
290 const SharedQuadState* shared_state,
291 scoped_refptr<media::VideoFrame> video_frame,
292 const gfx::RectF& tex_coord_rect,
293 RenderPass* render_pass,
294 VideoResourceUpdater* video_resource_updater,
295 const gfx::Rect& rect,
296 const gfx::Rect& visible_rect,
297 ResourceProvider* resource_provider) {
298 const gfx::Rect opaque_rect(0, 0, 0, 0);
299
300 VideoFrameExternalResources resources =
301 video_resource_updater->CreateExternalResourcesFromVideoFrame(
302 video_frame);
303
304 EXPECT_EQ(VideoFrameExternalResources::Y_RESOURCE, resources.type);
305 EXPECT_EQ(1u, resources.mailboxes.size());
306 EXPECT_EQ(1u, resources.release_callbacks.size());
307
308 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox(
309 resources.mailboxes[0],
310 SingleReleaseCallbackImpl::Create(resources.release_callbacks[0]));
311
312 YVideoDrawQuad* y_video_quad =
313 render_pass->CreateAndAppendDrawQuad<YVideoDrawQuad>();
314 y_video_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
315 y_resource, tex_coord_rect.origin(),
316 tex_coord_rect.bottom_right());
317 }
318
289 // Upshift video frame to 10 bit. 319 // Upshift video frame to 10 bit.
290 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( 320 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame(
291 media::VideoFrame* video_frame) { 321 media::VideoFrame* video_frame) {
292 media::VideoPixelFormat format; 322 media::VideoPixelFormat format;
293 switch (video_frame->format()) { 323 switch (video_frame->format()) {
294 case media::PIXEL_FORMAT_I420: 324 case media::PIXEL_FORMAT_I420:
295 case media::PIXEL_FORMAT_YV12: 325 case media::PIXEL_FORMAT_YV12:
296 format = media::PIXEL_FORMAT_YUV420P10; 326 format = media::PIXEL_FORMAT_YUV420P10;
297 break; 327 break;
298 case media::PIXEL_FORMAT_YV16: 328 case media::PIXEL_FORMAT_YV16:
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 tex_coord_rect.height() * uv_tex_size.height()); 565 tex_coord_rect.height() * uv_tex_size.height());
536 566
537 YUVVideoDrawQuad* yuv_quad = 567 YUVVideoDrawQuad* yuv_quad =
538 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); 568 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
539 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 569 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
540 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 570 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
541 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 571 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
542 color_space, video_color_space, 0.0f, 1.0f, 8); 572 color_space, video_color_space, 0.0f, 1.0f, 8);
543 } 573 }
544 574
575 void CreateTestY16VideoDrawQuad_TwoColor(
576 const SharedQuadState* shared_state,
577 const gfx::RectF& tex_coord_rect,
578 uint8_t g_foreground,
579 uint8_t g_background,
580 RenderPass* render_pass,
581 VideoResourceUpdater* video_resource_updater,
582 const gfx::Rect& rect,
583 const gfx::Rect& visible_rect,
584 const gfx::Rect& foreground_rect,
585 ResourceProvider* resource_provider) {
586 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
587 static_cast<unsigned char*>(
588 base::AlignedAlloc(rect.size().GetArea() * 2,
589 media::VideoFrame::kFrameAddressAlignment)));
590 scoped_refptr<media::VideoFrame> video_frame =
591 media::VideoFrame::WrapExternalData(
592 media::PIXEL_FORMAT_Y16, rect.size(), foreground_rect,
593 foreground_rect.size(), memory.get(), rect.size().GetArea() * 2,
594 base::TimeDelta());
595 DCHECK_EQ(video_frame->rows(0) % 2, 0);
596 DCHECK_EQ(video_frame->stride(0) % 2, 0);
597
598 for (int j = 0; j < video_frame->rows(0); ++j) {
599 uint8_t* row = video_frame->data(0) + j * video_frame->stride(0);
600 if (j < foreground_rect.y() || j >= foreground_rect.bottom()) {
601 for (int i = 0; i < video_frame->stride(0) / 2; ++i) {
602 *row++ = i & 0xFF; // Fill R with anything. It is not rendered.
603 *row++ = g_background;
604 }
605 } else {
606 for (int i = 0;
607 i < std::min(video_frame->stride(0) / 2, foreground_rect.x()); ++i) {
608 *row++ = i & 0xFF;
609 *row++ = g_background;
610 }
611 for (int i = foreground_rect.x();
612 i < std::min(video_frame->stride(0) / 2, foreground_rect.right());
613 ++i) {
614 *row++ = i & 0xFF;
615 *row++ = g_foreground;
616 }
617 for (int i = foreground_rect.right(); i < video_frame->stride(0) / 2;
618 ++i) {
619 *row++ = i & 0xFF;
620 *row++ = g_background;
621 }
622 }
623 }
624
625 CreateTestY16VideoDrawQuad_FromVideoFrame(
626 shared_state, video_frame, tex_coord_rect, render_pass,
627 video_resource_updater, rect, visible_rect, resource_provider);
628 }
629
545 typedef ::testing::Types<GLRenderer, 630 typedef ::testing::Types<GLRenderer,
546 SoftwareRenderer, 631 SoftwareRenderer,
547 GLRendererWithExpandedViewport, 632 GLRendererWithExpandedViewport,
548 SoftwareRendererWithExpandedViewport> RendererTypes; 633 SoftwareRendererWithExpandedViewport> RendererTypes;
549 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 634 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
550 635
551 template <typename RendererType> 636 template <typename RendererType>
552 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; 637 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {};
553 638
554 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> 639 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport>
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png"); 804 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png");
720 } 805 }
721 template <> 806 template <>
722 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() { 807 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() {
723 return FILE_PATH_LITERAL("intersecting_blue_green.png"); 808 return FILE_PATH_LITERAL("intersecting_blue_green.png");
724 } 809 }
725 template <> 810 template <>
726 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() { 811 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() {
727 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"); 812 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png");
728 } 813 }
814 template <>
815 const base::FilePath::CharType* IntersectingQuadImage<YVideoDrawQuad>() {
816 return FILE_PATH_LITERAL("intersecting_light_dark_squares_video.png");
817 }
729 818
730 template <typename TypeParam> 819 template <typename TypeParam>
731 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> { 820 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
732 protected: 821 protected:
733 void SetupQuadStateAndRenderPass() { 822 void SetupQuadStateAndRenderPass() {
734 // This sets up a pair of draw quads. They are both rotated 823 // This sets up a pair of draw quads. They are both rotated
735 // relative to the root plane, they are also rotated relative to each other. 824 // relative to the root plane, they are also rotated relative to each other.
736 // The intersect in the middle at a non-perpendicular angle so that any 825 // The intersect in the middle at a non-perpendicular angle so that any
737 // errors are hopefully magnified. 826 // errors are hopefully magnified.
738 // The quads should intersect correctly, as in the front quad should only 827 // The quads should intersect correctly, as in the front quad should only
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 1069 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(),
981 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, 1070 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128,
982 this->render_pass_.get(), this->video_resource_updater2_.get(), 1071 this->render_pass_.get(), this->video_resource_updater2_.get(),
983 this->resource_provider_.get()); 1072 this->resource_provider_.get());
984 1073
985 SCOPED_TRACE("IntersectingVideoQuads"); 1074 SCOPED_TRACE("IntersectingVideoQuads");
986 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( 1075 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
987 FuzzyPixelOffByOneComparator(false)); 1076 FuzzyPixelOffByOneComparator(false));
988 } 1077 }
989 1078
1079 TYPED_TEST(IntersectingQuadGLPixelTest, YVideoQuads) {
aleksandar.stojiljkovic 2016/09/30 14:26:32 cc pixel test: Intersecting (and two color renderi
1080 this->SetupQuadStateAndRenderPass();
1081 gfx::Rect inner_rect(
1082 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF),
1083 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF),
1084 (this->quad_rect_.width() / 2) & ~0xF,
1085 (this->quad_rect_.height() / 2) & ~0xF);
1086
1087 CreateTestY16VideoDrawQuad_TwoColor(
1088 this->front_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 18, 0,
1089 this->render_pass_.get(), this->video_resource_updater_.get(),
1090 this->quad_rect_, this->quad_rect_, inner_rect,
1091 this->resource_provider_.get());
1092
1093 CreateTestY16VideoDrawQuad_TwoColor(
1094 this->back_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 0, 182,
1095 this->render_pass_.get(), this->video_resource_updater2_.get(),
1096 this->quad_rect_, this->quad_rect_, inner_rect,
1097 this->resource_provider_.get());
1098
1099 SCOPED_TRACE("IntersectingVideoQuads");
1100 this->template AppendBackgroundAndRunTest<YVideoDrawQuad>(
1101 FuzzyPixelOffByOneComparator(false));
1102 }
1103
990 // TODO(skaslev): The software renderer does not support non-premultplied alpha. 1104 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
991 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { 1105 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
992 gfx::Rect rect(this->device_viewport_size_); 1106 gfx::Rect rect(this->device_viewport_size_);
993 1107
994 RenderPassId id(1, 1); 1108 RenderPassId id(1, 1);
995 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1109 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
996 1110
997 SharedQuadState* shared_state = 1111 SharedQuadState* shared_state =
998 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1112 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
999 1113
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 1455
1342 RenderPassList pass_list; 1456 RenderPassList pass_list;
1343 pass_list.push_back(std::move(pass)); 1457 pass_list.push_back(std::move(pass));
1344 1458
1345 EXPECT_TRUE(this->RunPixelTest( 1459 EXPECT_TRUE(this->RunPixelTest(
1346 &pass_list, 1460 &pass_list,
1347 base::FilePath(FILE_PATH_LITERAL("black.png")), 1461 base::FilePath(FILE_PATH_LITERAL("black.png")),
1348 ExactPixelComparator(true))); 1462 ExactPixelComparator(true)));
1349 } 1463 }
1350 1464
1465 TEST_F(VideoGLRendererPixelTest, TwoColorY16Rect) {
1466 gfx::Rect rect(this->device_viewport_size_);
1467
1468 RenderPassId id(1, 1);
1469 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1470
1471 SharedQuadState* shared_state =
1472 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1473
1474 gfx::Rect upper_rect(rect.x(), rect.y(), rect.width(), rect.height() / 2);
1475 CreateTestY16VideoDrawQuad_TwoColor(
1476 shared_state, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 68, 123, pass.get(),
1477 video_resource_updater_.get(), rect, rect, upper_rect,
1478 resource_provider_.get());
1479
1480 RenderPassList pass_list;
1481 pass_list.push_back(std::move(pass));
1482
1483 EXPECT_TRUE(this->RunPixelTest(
1484 &pass_list,
1485 base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
1486 FuzzyPixelOffByOneComparator(true)));
1487 }
1488
1351 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { 1489 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
1352 gfx::Rect viewport_rect(this->device_viewport_size_); 1490 gfx::Rect viewport_rect(this->device_viewport_size_);
1353 1491
1354 RenderPassId root_pass_id(1, 1); 1492 RenderPassId root_pass_id(1, 1);
1355 std::unique_ptr<RenderPass> root_pass = 1493 std::unique_ptr<RenderPass> root_pass =
1356 CreateTestRootRenderPass(root_pass_id, viewport_rect); 1494 CreateTestRootRenderPass(root_pass_id, viewport_rect);
1357 1495
1358 RenderPassId child_pass_id(2, 2); 1496 RenderPassId child_pass_id(2, 2);
1359 gfx::Rect pass_rect(this->device_viewport_size_); 1497 gfx::Rect pass_rect(this->device_viewport_size_);
1360 gfx::Transform transform_to_root; 1498 gfx::Transform transform_to_root;
(...skipping 1834 matching lines...) Expand 10 before | Expand all | Expand 10 after
3195 3333
3196 EXPECT_TRUE(this->RunPixelTest( 3334 EXPECT_TRUE(this->RunPixelTest(
3197 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), 3335 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")),
3198 FuzzyPixelOffByOneComparator(true))); 3336 FuzzyPixelOffByOneComparator(true)));
3199 } 3337 }
3200 3338
3201 #endif // !defined(OS_ANDROID) 3339 #endif // !defined(OS_ANDROID)
3202 3340
3203 } // namespace 3341 } // namespace
3204 } // namespace cc 3342 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698