From c052ba992cee6d00e84ee00d434453700fe89731 Mon Sep 17 00:00:00 2001 From: sunnyps Date: Mon, 4 May 2015 17:42:29 -0700 Subject: [PATCH] cc: Send BeginFrame to VideoFrameController when added. When a VideoFrameController starts rendering it has to wait until the next frame to get a BeginFrame message. This means that it renders nothing for the first frame if it is able to draw in that frame. Review URL: https://codereview.chromium.org/1113283002 Cr-Commit-Position: refs/heads/master@{#328238} --- cc/layers/video_frame_provider_client_impl.cc | 2 +- cc/trees/layer_tree_host_impl.cc | 2 ++ cc/trees/layer_tree_host_impl_unittest.cc | 42 +++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/cc/layers/video_frame_provider_client_impl.cc b/cc/layers/video_frame_provider_client_impl.cc index 17bf3e6640c7..5fab4e2f04c4 100644 --- a/cc/layers/video_frame_provider_client_impl.cc +++ b/cc/layers/video_frame_provider_client_impl.cc @@ -118,8 +118,8 @@ void VideoFrameProviderClientImpl::StartRendering() { TRACE_EVENT0("cc", "VideoFrameProviderClientImpl::StartRendering"); DCHECK(!rendering_); DCHECK(!stopped_); - client_->AddVideoFrameController(this); rendering_ = true; + client_->AddVideoFrameController(this); } void VideoFrameProviderClientImpl::StopRendering() { diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index f8ffbd3ca173..0af4fbc58cdd 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -3103,6 +3103,8 @@ void LayerTreeHostImpl::AddVideoFrameController( VideoFrameController* controller) { bool was_empty = video_frame_controllers_.empty(); video_frame_controllers_.insert(controller); + if (current_begin_frame_args_.IsValid()) + controller->OnBeginFrame(current_begin_frame_args_); if (was_empty) client_->SetVideoNeedsBeginFrames(true); } diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index e1040e3dae73..96fe963999f0 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -7894,5 +7894,47 @@ TEST_F(LayerTreeHostImplTest, DoNotRemoveEmptyRootRenderPass) { EXPECT_EQ(0u, pass1->quad_list.size()); } +class FakeVideoFrameController : public VideoFrameController { + public: + void OnBeginFrame(const BeginFrameArgs& args) override { + begin_frame_args_ = args; + } + + const BeginFrameArgs& begin_frame_args() { return begin_frame_args_; } + + private: + BeginFrameArgs begin_frame_args_; +}; + +TEST_F(LayerTreeHostImplTest, AddVideoFrameControllerInsideFrame) { + BeginFrameArgs begin_frame_args = + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); + FakeVideoFrameController controller; + + host_impl_->WillBeginImplFrame(begin_frame_args); + EXPECT_FALSE(controller.begin_frame_args().IsValid()); + host_impl_->AddVideoFrameController(&controller); + EXPECT_TRUE(controller.begin_frame_args().IsValid()); + host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); +} + +TEST_F(LayerTreeHostImplTest, AddVideoFrameControllerOutsideFrame) { + BeginFrameArgs begin_frame_args = + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); + FakeVideoFrameController controller; + + host_impl_->WillBeginImplFrame(begin_frame_args); + host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); + + EXPECT_FALSE(controller.begin_frame_args().IsValid()); + host_impl_->AddVideoFrameController(&controller); + EXPECT_FALSE(controller.begin_frame_args().IsValid()); + + begin_frame_args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); + EXPECT_FALSE(controller.begin_frame_args().IsValid()); + host_impl_->WillBeginImplFrame(begin_frame_args); + EXPECT_TRUE(controller.begin_frame_args().IsValid()); +} + } // namespace } // namespace cc -- 2.11.4.GIT