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

Unified 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: Split webrtc_depth_capture_browsertest. Thanks phoglund@, 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 side-by-side diff with in-line comments
Download patch
Index: cc/output/renderer_pixeltest.cc
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index c62ae058d00de3a93b6a68d2ecc1a2a8cbc5a1c1..c799d62a8cf092ecf4e9b9dc11b5ad25cd8e47cf 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -285,6 +285,35 @@ void CreateTestYUVVideoDrawQuad_FromVideoFrame(
bits_per_channel);
}
+void CreateTestY16TextureDrawQuad_FromVideoFrame(
+ const SharedQuadState* shared_state,
+ scoped_refptr<media::VideoFrame> video_frame,
+ const gfx::RectF& tex_coord_rect,
+ RenderPass* render_pass,
+ VideoResourceUpdater* video_resource_updater,
+ const gfx::Rect& rect,
+ const gfx::Rect& visible_rect,
+ ResourceProvider* resource_provider) {
+ VideoFrameExternalResources resources =
+ video_resource_updater->CreateExternalResourcesFromVideoFrame(
+ video_frame);
+
+ EXPECT_EQ(VideoFrameExternalResources::RGBA_RESOURCE, resources.type);
+ EXPECT_EQ(1u, resources.mailboxes.size());
+ EXPECT_EQ(1u, resources.release_callbacks.size());
+
+ ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox(
+ resources.mailboxes[0],
+ SingleReleaseCallbackImpl::Create(resources.release_callbacks[0]));
+
+ TextureDrawQuad* quad =
+ render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+ float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ quad->SetNew(shared_state, rect, gfx::Rect(), rect, y_resource, false,
+ tex_coord_rect.origin(), tex_coord_rect.bottom_right(),
+ SK_ColorBLACK, vertex_opacity, false, false, false);
+}
+
// Upshift video frame to 10 bit.
scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame(
media::VideoFrame* video_frame) {
@@ -539,6 +568,61 @@ void CreateTestYUVVideoDrawQuad_NV12(const SharedQuadState* shared_state,
color_space, video_color_space, 0.0f, 1.0f, 8);
}
+void CreateTestY16TextureDrawQuad_TwoColor(
+ const SharedQuadState* shared_state,
+ const gfx::RectF& tex_coord_rect,
+ uint8_t g_foreground,
+ uint8_t g_background,
+ RenderPass* render_pass,
+ VideoResourceUpdater* video_resource_updater,
+ const gfx::Rect& rect,
+ const gfx::Rect& visible_rect,
+ const gfx::Rect& foreground_rect,
+ ResourceProvider* resource_provider) {
+ std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
+ static_cast<unsigned char*>(
+ base::AlignedAlloc(rect.size().GetArea() * 2,
+ media::VideoFrame::kFrameAddressAlignment)));
+ scoped_refptr<media::VideoFrame> video_frame =
+ media::VideoFrame::WrapExternalData(
+ media::PIXEL_FORMAT_Y16, rect.size(), visible_rect,
+ visible_rect.size(), memory.get(), rect.size().GetArea() * 2,
+ base::TimeDelta());
+ DCHECK_EQ(video_frame->rows(0) % 2, 0);
+ DCHECK_EQ(video_frame->stride(0) % 2, 0);
+
+ for (int j = 0; j < video_frame->rows(0); ++j) {
+ uint8_t* row = video_frame->data(0) + j * video_frame->stride(0);
+ if (j < foreground_rect.y() || j >= foreground_rect.bottom()) {
+ for (int i = 0; i < video_frame->stride(0) / 2; ++i) {
+ *row++ = i & 0xFF; // Fill R with anything. It is not rendered.
+ *row++ = g_background;
+ }
+ } else {
+ for (int i = 0;
+ i < std::min(video_frame->stride(0) / 2, foreground_rect.x()); ++i) {
+ *row++ = i & 0xFF;
+ *row++ = g_background;
+ }
+ for (int i = foreground_rect.x();
+ i < std::min(video_frame->stride(0) / 2, foreground_rect.right());
+ ++i) {
+ *row++ = i & 0xFF;
+ *row++ = g_foreground;
+ }
+ for (int i = foreground_rect.right(); i < video_frame->stride(0) / 2;
+ ++i) {
+ *row++ = i & 0xFF;
+ *row++ = g_background;
+ }
+ }
+ }
+
+ CreateTestY16TextureDrawQuad_FromVideoFrame(
+ shared_state, video_frame, tex_coord_rect, render_pass,
+ video_resource_updater, rect, visible_rect, resource_provider);
+}
+
typedef ::testing::Types<GLRenderer,
SoftwareRenderer,
GLRendererWithExpandedViewport,
@@ -711,19 +795,6 @@ TYPED_TEST(RendererPixelTest, PremultipliedTextureWithBackground) {
FuzzyPixelOffByOneComparator(true)));
}
-template <typename QuadType>
-static const base::FilePath::CharType* IntersectingQuadImage() {
- return FILE_PATH_LITERAL("intersecting_blue_green_squares.png");
-}
-template <>
-const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() {
- return FILE_PATH_LITERAL("intersecting_blue_green.png");
-}
-template <>
-const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() {
- return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png");
-}
-
template <typename TypeParam>
class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
protected:
@@ -763,8 +834,8 @@ class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
back_quad_state_->sorting_context_id = 1;
back_quad_state_->clip_rect = quad_rect_;
}
- template <typename T>
- void AppendBackgroundAndRunTest(const PixelComparator& comparator) {
+ void AppendBackgroundAndRunTest(const PixelComparator& comparator,
+ const base::FilePath::CharType* ref_file) {
SharedQuadState* background_quad_state = CreateTestSharedQuadState(
gfx::Transform(), viewport_rect_, render_pass_.get());
SolidColorDrawQuad* background_quad =
@@ -772,9 +843,8 @@ class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
background_quad->SetNew(background_quad_state, viewport_rect_,
viewport_rect_, SK_ColorWHITE, false);
pass_list_.push_back(std::move(render_pass_));
- const base::FilePath::CharType* fileName = IntersectingQuadImage<T>();
EXPECT_TRUE(
- this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator));
+ this->RunPixelTest(&pass_list_, base::FilePath(ref_file), comparator));
}
template <typename T>
T* CreateAndAppendDrawQuad() {
@@ -834,8 +904,9 @@ TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) {
quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_,
SK_ColorGREEN, false);
SCOPED_TRACE("IntersectingSolidColorQuads");
- this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>(
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f),
+ FILE_PATH_LITERAL("intersecting_blue_green.png"));
}
template <typename TypeParam>
@@ -867,8 +938,9 @@ TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) {
this->render_pass_.get());
SCOPED_TRACE("IntersectingTexturedQuads");
- this->template AppendBackgroundAndRunTest<TextureDrawQuad>(
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f),
+ FILE_PATH_LITERAL("intersecting_blue_green_squares.png"));
}
TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) {
@@ -917,8 +989,9 @@ TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) {
this->quad_rect_.size(), false, RGBA_8888,
this->quad_rect_, 1.f, green_raster_source);
SCOPED_TRACE("IntersectingPictureQuadsPass");
- this->template AppendBackgroundAndRunTest<PictureDrawQuad>(
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f),
+ FILE_PATH_LITERAL("intersecting_blue_green_squares.png"));
}
TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
@@ -953,8 +1026,9 @@ TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
this->pass_list_.push_back(std::move(child_pass1));
this->pass_list_.push_back(std::move(child_pass2));
SCOPED_TRACE("IntersectingRenderQuadsPass");
- this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>(
- FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f),
+ FILE_PATH_LITERAL("intersecting_blue_green_squares.png"));
}
TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
@@ -980,8 +1054,35 @@ TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
this->resource_provider_.get());
SCOPED_TRACE("IntersectingVideoQuads");
- this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
- FuzzyPixelOffByOneComparator(false));
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelOffByOneComparator(false),
+ FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"));
+}
+
+TYPED_TEST(IntersectingQuadGLPixelTest, Y16VideoQuads) {
+ this->SetupQuadStateAndRenderPass();
+ gfx::Rect inner_rect(
+ ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF),
+ ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF),
+ (this->quad_rect_.width() / 2) & ~0xF,
+ (this->quad_rect_.height() / 2) & ~0xF);
+
+ CreateTestY16TextureDrawQuad_TwoColor(
+ this->front_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 18, 0,
+ this->render_pass_.get(), this->video_resource_updater_.get(),
+ this->quad_rect_, this->quad_rect_, inner_rect,
+ this->resource_provider_.get());
+
+ CreateTestY16TextureDrawQuad_TwoColor(
+ this->back_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 0, 182,
+ this->render_pass_.get(), this->video_resource_updater2_.get(),
+ this->quad_rect_, this->quad_rect_, inner_rect,
+ this->resource_provider_.get());
+
+ SCOPED_TRACE("IntersectingVideoQuads");
+ this->AppendBackgroundAndRunTest(
+ FuzzyPixelOffByOneComparator(false),
+ FILE_PATH_LITERAL("intersecting_light_dark_squares_video.png"));
}
// TODO(skaslev): The software renderer does not support non-premultplied alpha.
@@ -1345,6 +1446,30 @@ TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
ExactPixelComparator(true)));
}
+TEST_F(VideoGLRendererPixelTest, TwoColorY16Rect) {
+ gfx::Rect rect(this->device_viewport_size_);
+
+ RenderPassId id(1, 1);
+ std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+
+ SharedQuadState* shared_state =
+ CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+
+ gfx::Rect upper_rect(rect.x(), rect.y(), rect.width(), rect.height() / 2);
+ CreateTestY16TextureDrawQuad_TwoColor(
+ shared_state, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 68, 123, pass.get(),
+ video_resource_updater_.get(), rect, rect, upper_rect,
+ resource_provider_.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(std::move(pass));
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
+ FuzzyPixelOffByOneComparator(true)));
+}
+
TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
gfx::Rect viewport_rect(this->device_viewport_size_);
« no previous file with comments | « no previous file | cc/resources/video_resource_updater.cc » ('j') | content/test/data/media/depth_stream_test_utilities.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698