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

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

Issue 2428263004: 16 bpp video stream capture, render and createImageBitmap(video) using (CPU) shared memory buffers (Closed)
Patch Set: fix windows approach and video_capture_utils. Created 4 years, 1 month 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/base/math_util.h" 10 #include "cc/base/math_util.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 bits_per_channel = 10; 278 bits_per_channel = 10;
279 } 279 }
280 280
281 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 281 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
282 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 282 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
283 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 283 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
284 color_space, video_color_space, 0.0f, 1.0f, 284 color_space, video_color_space, 0.0f, 1.0f,
285 bits_per_channel); 285 bits_per_channel);
286 } 286 }
287 287
288 void CreateTestY16VideoDrawQuad_FromVideoFrame(
289 const SharedQuadState* shared_state,
290 scoped_refptr<media::VideoFrame> video_frame,
291 const gfx::RectF& tex_coord_rect,
292 RenderPass* render_pass,
293 VideoResourceUpdater* video_resource_updater,
294 const gfx::Rect& rect,
295 const gfx::Rect& visible_rect,
296 ResourceProvider* resource_provider) {
297 VideoFrameExternalResources resources =
298 video_resource_updater->CreateExternalResourcesFromVideoFrame(
299 video_frame);
300
301 EXPECT_EQ(VideoFrameExternalResources::RGBA_RESOURCE, resources.type);
302 EXPECT_EQ(1u, resources.mailboxes.size());
303 EXPECT_EQ(1u, resources.release_callbacks.size());
304
305 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox(
306 resources.mailboxes[0],
307 SingleReleaseCallbackImpl::Create(resources.release_callbacks[0]));
308
309 TextureDrawQuad* quad =
310 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
311 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
312 quad->SetNew(shared_state, rect, gfx::Rect(), rect, y_resource, false,
313 tex_coord_rect.origin(), tex_coord_rect.bottom_right(),
314 SK_ColorBLACK, vertex_opacity, false, false, false);
315 }
316
288 // Upshift video frame to 10 bit. 317 // Upshift video frame to 10 bit.
289 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( 318 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame(
290 media::VideoFrame* video_frame) { 319 media::VideoFrame* video_frame) {
291 media::VideoPixelFormat format; 320 media::VideoPixelFormat format;
292 switch (video_frame->format()) { 321 switch (video_frame->format()) {
293 case media::PIXEL_FORMAT_I420: 322 case media::PIXEL_FORMAT_I420:
294 case media::PIXEL_FORMAT_YV12: 323 case media::PIXEL_FORMAT_YV12:
295 format = media::PIXEL_FORMAT_YUV420P10; 324 format = media::PIXEL_FORMAT_YUV420P10;
296 break; 325 break;
297 case media::PIXEL_FORMAT_YV16: 326 case media::PIXEL_FORMAT_YV16:
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 tex_coord_rect.height() * uv_tex_size.height()); 561 tex_coord_rect.height() * uv_tex_size.height());
533 562
534 YUVVideoDrawQuad* yuv_quad = 563 YUVVideoDrawQuad* yuv_quad =
535 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); 564 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
536 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 565 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
537 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 566 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
538 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 567 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
539 color_space, video_color_space, 0.0f, 1.0f, 8); 568 color_space, video_color_space, 0.0f, 1.0f, 8);
540 } 569 }
541 570
571 void CreateTestY16VideoDrawQuad_TwoColor(
572 const SharedQuadState* shared_state,
573 const gfx::RectF& tex_coord_rect,
574 uint8_t g_foreground,
575 uint8_t g_background,
576 RenderPass* render_pass,
577 VideoResourceUpdater* video_resource_updater,
578 const gfx::Rect& rect,
579 const gfx::Rect& visible_rect,
580 const gfx::Rect& foreground_rect,
581 ResourceProvider* resource_provider) {
582 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
583 static_cast<unsigned char*>(
584 base::AlignedAlloc(rect.size().GetArea() * 2,
585 media::VideoFrame::kFrameAddressAlignment)));
586 scoped_refptr<media::VideoFrame> video_frame =
587 media::VideoFrame::WrapExternalData(
588 media::PIXEL_FORMAT_Y16, rect.size(), visible_rect,
589 visible_rect.size(), memory.get(), rect.size().GetArea() * 2,
590 base::TimeDelta());
591 DCHECK_EQ(video_frame->rows(0) % 2, 0);
592 DCHECK_EQ(video_frame->stride(0) % 2, 0);
593
594 for (int j = 0; j < video_frame->rows(0); ++j) {
595 uint8_t* row = video_frame->data(0) + j * video_frame->stride(0);
596 if (j < foreground_rect.y() || j >= foreground_rect.bottom()) {
597 for (int i = 0; i < video_frame->stride(0) / 2; ++i) {
598 *row++ = i & 0xFF; // Fill R with anything. It is not rendered.
599 *row++ = g_background;
600 }
601 } else {
602 for (int i = 0;
603 i < std::min(video_frame->stride(0) / 2, foreground_rect.x()); ++i) {
604 *row++ = i & 0xFF;
605 *row++ = g_background;
606 }
607 for (int i = foreground_rect.x();
608 i < std::min(video_frame->stride(0) / 2, foreground_rect.right());
609 ++i) {
610 *row++ = i & 0xFF;
611 *row++ = g_foreground;
612 }
613 for (int i = foreground_rect.right(); i < video_frame->stride(0) / 2;
614 ++i) {
615 *row++ = i & 0xFF;
616 *row++ = g_background;
617 }
618 }
619 }
620
621 CreateTestY16VideoDrawQuad_FromVideoFrame(
622 shared_state, video_frame, tex_coord_rect, render_pass,
623 video_resource_updater, rect, visible_rect, resource_provider);
624 }
625
542 typedef ::testing::Types<GLRenderer, 626 typedef ::testing::Types<GLRenderer,
543 SoftwareRenderer, 627 SoftwareRenderer,
544 GLRendererWithExpandedViewport, 628 GLRendererWithExpandedViewport,
545 SoftwareRendererWithExpandedViewport> RendererTypes; 629 SoftwareRendererWithExpandedViewport> RendererTypes;
546 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 630 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
547 631
548 template <typename RendererType> 632 template <typename RendererType>
549 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; 633 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {};
550 634
551 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> 635 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport>
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 trans = gfx::Transform(); 842 trans = gfx::Transform();
759 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0); 843 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0);
760 trans.RotateAboutYAxis(-45.0); 844 trans.RotateAboutYAxis(-45.0);
761 back_quad_state_ = 845 back_quad_state_ =
762 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); 846 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
763 back_quad_state_->sorting_context_id = 1; 847 back_quad_state_->sorting_context_id = 1;
764 back_quad_state_->clip_rect = quad_rect_; 848 back_quad_state_->clip_rect = quad_rect_;
765 } 849 }
766 template <typename T> 850 template <typename T>
767 void AppendBackgroundAndRunTest(const PixelComparator& comparator) { 851 void AppendBackgroundAndRunTest(const PixelComparator& comparator) {
852 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>();
853 AppendBackgroundAndRunTest(comparator, fileName);
854 }
855 void AppendBackgroundAndRunTest(const PixelComparator& comparator,
danakj 2016/10/24 21:46:37 Can we not do function overloading?
aleksandar.stojiljkovic 2016/10/25 10:12:28 Is the suggestion is to overloading function templ
danakj 2016/10/25 20:21:23 Just name the functions different names?
aleksandar.stojiljkovic 2016/10/25 21:51:41 Done.
856 const base::FilePath::CharType* fileName) {
768 SharedQuadState* background_quad_state = CreateTestSharedQuadState( 857 SharedQuadState* background_quad_state = CreateTestSharedQuadState(
769 gfx::Transform(), viewport_rect_, render_pass_.get()); 858 gfx::Transform(), viewport_rect_, render_pass_.get());
770 SolidColorDrawQuad* background_quad = 859 SolidColorDrawQuad* background_quad =
771 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 860 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
772 background_quad->SetNew(background_quad_state, viewport_rect_, 861 background_quad->SetNew(background_quad_state, viewport_rect_,
773 viewport_rect_, SK_ColorWHITE, false); 862 viewport_rect_, SK_ColorWHITE, false);
774 pass_list_.push_back(std::move(render_pass_)); 863 pass_list_.push_back(std::move(render_pass_));
775 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>();
776 EXPECT_TRUE( 864 EXPECT_TRUE(
777 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); 865 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator));
778 } 866 }
779 template <typename T> 867 template <typename T>
780 T* CreateAndAppendDrawQuad() { 868 T* CreateAndAppendDrawQuad() {
781 return render_pass_->CreateAndAppendDrawQuad<T>(); 869 return render_pass_->CreateAndAppendDrawQuad<T>();
782 } 870 }
783 871
784 std::unique_ptr<RenderPass> render_pass_; 872 std::unique_ptr<RenderPass> render_pass_;
785 gfx::Rect viewport_rect_; 873 gfx::Rect viewport_rect_;
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
977 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 1065 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(),
978 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, 1066 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128,
979 this->render_pass_.get(), this->video_resource_updater2_.get(), 1067 this->render_pass_.get(), this->video_resource_updater2_.get(),
980 this->resource_provider_.get()); 1068 this->resource_provider_.get());
981 1069
982 SCOPED_TRACE("IntersectingVideoQuads"); 1070 SCOPED_TRACE("IntersectingVideoQuads");
983 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( 1071 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
984 FuzzyPixelOffByOneComparator(false)); 1072 FuzzyPixelOffByOneComparator(false));
985 } 1073 }
986 1074
1075 TYPED_TEST(IntersectingQuadGLPixelTest, Y16VideoQuads) {
1076 this->SetupQuadStateAndRenderPass();
1077 gfx::Rect inner_rect(
1078 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF),
1079 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF),
1080 (this->quad_rect_.width() / 2) & ~0xF,
1081 (this->quad_rect_.height() / 2) & ~0xF);
1082
1083 CreateTestY16VideoDrawQuad_TwoColor(
1084 this->front_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 18, 0,
1085 this->render_pass_.get(), this->video_resource_updater_.get(),
1086 this->quad_rect_, this->quad_rect_, inner_rect,
1087 this->resource_provider_.get());
1088
1089 CreateTestY16VideoDrawQuad_TwoColor(
1090 this->back_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 0, 182,
1091 this->render_pass_.get(), this->video_resource_updater2_.get(),
1092 this->quad_rect_, this->quad_rect_, inner_rect,
1093 this->resource_provider_.get());
1094
1095 SCOPED_TRACE("IntersectingVideoQuads");
1096 this->AppendBackgroundAndRunTest(
1097 FuzzyPixelOffByOneComparator(false),
1098 FILE_PATH_LITERAL("intersecting_light_dark_squares_video.png"));
1099 }
1100
987 // TODO(skaslev): The software renderer does not support non-premultplied alpha. 1101 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
988 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { 1102 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
989 gfx::Rect rect(this->device_viewport_size_); 1103 gfx::Rect rect(this->device_viewport_size_);
990 1104
991 RenderPassId id(1, 1); 1105 RenderPassId id(1, 1);
992 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1106 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
993 1107
994 SharedQuadState* shared_state = 1108 SharedQuadState* shared_state =
995 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1109 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
996 1110
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 1452
1339 RenderPassList pass_list; 1453 RenderPassList pass_list;
1340 pass_list.push_back(std::move(pass)); 1454 pass_list.push_back(std::move(pass));
1341 1455
1342 EXPECT_TRUE(this->RunPixelTest( 1456 EXPECT_TRUE(this->RunPixelTest(
1343 &pass_list, 1457 &pass_list,
1344 base::FilePath(FILE_PATH_LITERAL("black.png")), 1458 base::FilePath(FILE_PATH_LITERAL("black.png")),
1345 ExactPixelComparator(true))); 1459 ExactPixelComparator(true)));
1346 } 1460 }
1347 1461
1462 TEST_F(VideoGLRendererPixelTest, TwoColorY16Rect) {
1463 gfx::Rect rect(this->device_viewport_size_);
1464
1465 RenderPassId id(1, 1);
1466 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1467
1468 SharedQuadState* shared_state =
1469 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1470
1471 gfx::Rect upper_rect(rect.x(), rect.y(), rect.width(), rect.height() / 2);
1472 CreateTestY16VideoDrawQuad_TwoColor(
1473 shared_state, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 68, 123, pass.get(),
1474 video_resource_updater_.get(), rect, rect, upper_rect,
1475 resource_provider_.get());
1476
1477 RenderPassList pass_list;
1478 pass_list.push_back(std::move(pass));
1479
1480 EXPECT_TRUE(this->RunPixelTest(
1481 &pass_list,
1482 base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
1483 FuzzyPixelOffByOneComparator(true)));
1484 }
1485
1348 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { 1486 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
1349 gfx::Rect viewport_rect(this->device_viewport_size_); 1487 gfx::Rect viewport_rect(this->device_viewport_size_);
1350 1488
1351 RenderPassId root_pass_id(1, 1); 1489 RenderPassId root_pass_id(1, 1);
1352 std::unique_ptr<RenderPass> root_pass = 1490 std::unique_ptr<RenderPass> root_pass =
1353 CreateTestRootRenderPass(root_pass_id, viewport_rect); 1491 CreateTestRootRenderPass(root_pass_id, viewport_rect);
1354 1492
1355 RenderPassId child_pass_id(2, 2); 1493 RenderPassId child_pass_id(2, 2);
1356 gfx::Rect pass_rect(this->device_viewport_size_); 1494 gfx::Rect pass_rect(this->device_viewport_size_);
1357 gfx::Transform transform_to_root; 1495 gfx::Transform transform_to_root;
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after
3147 3285
3148 EXPECT_TRUE(this->RunPixelTest( 3286 EXPECT_TRUE(this->RunPixelTest(
3149 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), 3287 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")),
3150 FuzzyPixelOffByOneComparator(true))); 3288 FuzzyPixelOffByOneComparator(true)));
3151 } 3289 }
3152 3290
3153 #endif // !defined(OS_ANDROID) 3291 #endif // !defined(OS_ANDROID)
3154 3292
3155 } // namespace 3293 } // namespace
3156 } // namespace cc 3294 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/resources/video_resource_updater.cc » ('j') | cc/resources/video_resource_updater.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698