video_frame_provider_client_impl_unittest.cc 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "cc/layers/video_frame_provider_client_impl.h"
  5. #include "base/memory/raw_ptr.h"
  6. #include "cc/layers/video_layer_impl.h"
  7. #include "cc/test/fake_video_frame_provider.h"
  8. #include "cc/test/layer_tree_impl_test_base.h"
  9. #include "components/viz/common/frame_sinks/begin_frame_args.h"
  10. #include "media/base/video_frame.h"
  11. #include "testing/gmock/include/gmock/gmock.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. using testing::_;
  14. namespace cc {
  15. // NOTE: We cannot use DebugScopedSetImplThreadAndMainThreadBlocked in these
  16. // tests because it gets destroyed before the VideoLayerImpl is destroyed. This
  17. // causes a DCHECK in VideoLayerImpl's destructor to fail.
  18. static void DebugSetImplThreadAndMainThreadBlocked(
  19. TaskRunnerProvider* task_runner_provider) {
  20. #if DCHECK_IS_ON()
  21. task_runner_provider->SetCurrentThreadIsImplThread(true);
  22. task_runner_provider->SetMainThreadBlocked(true);
  23. #endif
  24. }
  25. class VideoFrameProviderClientImplTest : public testing::Test,
  26. public VideoFrameControllerClient {
  27. public:
  28. VideoFrameProviderClientImplTest()
  29. : client_impl_(VideoFrameProviderClientImpl::Create(&provider_, this)),
  30. video_layer_impl_(nullptr),
  31. test_frame_(media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_I420,
  32. gfx::Size(10, 10),
  33. gfx::Rect(10, 10),
  34. gfx::Size(10, 10),
  35. base::TimeDelta())) {
  36. DebugSetImplThreadAndMainThreadBlocked(impl_.task_runner_provider());
  37. }
  38. VideoFrameProviderClientImplTest(const VideoFrameProviderClientImplTest&) =
  39. delete;
  40. ~VideoFrameProviderClientImplTest() override {
  41. if (!client_impl_->Stopped()) {
  42. client_impl_->Stop();
  43. DCHECK(client_impl_->Stopped());
  44. DCHECK(!client_impl_->ActiveVideoLayer());
  45. }
  46. provider_.SetVideoFrameProviderClient(nullptr);
  47. }
  48. VideoFrameProviderClientImplTest& operator=(
  49. const VideoFrameProviderClientImplTest&) = delete;
  50. void StartRendering() {
  51. EXPECT_CALL(*this, AddVideoFrameController(_));
  52. client_impl_->StartRendering();
  53. }
  54. void StopRendering() {
  55. EXPECT_CALL(*this, RemoveVideoFrameController(_));
  56. client_impl_->StopRendering();
  57. }
  58. void StartRenderingAndRenderFrame() {
  59. EXPECT_FALSE(client_impl_->HasCurrentFrame());
  60. provider_.set_frame(test_frame_);
  61. EXPECT_TRUE(client_impl_->HasCurrentFrame());
  62. // Start rendering and verify SetNeedsRedraw() was called for the new frame.
  63. StartRendering();
  64. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  65. client_impl_->OnBeginFrame(viz::BeginFrameArgs());
  66. EXPECT_NE(gfx::Rect(), video_layer_impl_->update_rect());
  67. }
  68. void CreateActiveVideoLayer() {
  69. gfx::Size layer_size(100, 100);
  70. video_layer_impl_ =
  71. impl_.AddLayer<VideoLayerImpl>(&provider_, media::VIDEO_ROTATION_0);
  72. video_layer_impl_->SetBounds(layer_size);
  73. video_layer_impl_->SetDrawsContent(true);
  74. client_impl_->SetActiveVideoLayer(video_layer_impl_);
  75. ASSERT_TRUE(client_impl_->ActiveVideoLayer());
  76. }
  77. MOCK_METHOD1(AddVideoFrameController, void(VideoFrameController*));
  78. MOCK_METHOD1(RemoveVideoFrameController, void(VideoFrameController*));
  79. protected:
  80. FakeVideoFrameProvider provider_;
  81. LayerTreeImplTestBase impl_;
  82. scoped_refptr<VideoFrameProviderClientImpl> client_impl_;
  83. raw_ptr<VideoLayerImpl> video_layer_impl_;
  84. scoped_refptr<media::VideoFrame> test_frame_;
  85. };
  86. TEST_F(VideoFrameProviderClientImplTest, StartStopRendering) {
  87. StartRendering();
  88. StopRendering();
  89. }
  90. TEST_F(VideoFrameProviderClientImplTest, StopRenderingUpdateDamage) {
  91. CreateActiveVideoLayer();
  92. StartRendering();
  93. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  94. StopRendering();
  95. EXPECT_NE(gfx::Rect(), video_layer_impl_->update_rect());
  96. }
  97. TEST_F(VideoFrameProviderClientImplTest, StopUsingProvider) {
  98. ASSERT_TRUE(client_impl_->get_provider_for_testing());
  99. StartRendering();
  100. EXPECT_CALL(*this, RemoveVideoFrameController(_));
  101. client_impl_->StopUsingProvider();
  102. ASSERT_FALSE(client_impl_->get_provider_for_testing());
  103. }
  104. TEST_F(VideoFrameProviderClientImplTest, StopUsingProviderUpdateDamage) {
  105. CreateActiveVideoLayer();
  106. ASSERT_TRUE(client_impl_->get_provider_for_testing());
  107. StartRendering();
  108. EXPECT_CALL(*this, RemoveVideoFrameController(_));
  109. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  110. client_impl_->StopUsingProvider();
  111. EXPECT_NE(gfx::Rect(), video_layer_impl_->update_rect());
  112. ASSERT_FALSE(client_impl_->get_provider_for_testing());
  113. }
  114. TEST_F(VideoFrameProviderClientImplTest, StopNotUpdateDamage) {
  115. CreateActiveVideoLayer();
  116. ASSERT_TRUE(client_impl_->get_provider_for_testing());
  117. StartRendering();
  118. EXPECT_CALL(*this, RemoveVideoFrameController(_));
  119. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  120. client_impl_->Stop();
  121. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  122. ASSERT_FALSE(client_impl_->get_provider_for_testing());
  123. }
  124. TEST_F(VideoFrameProviderClientImplTest, FrameAcquisition) {
  125. CreateActiveVideoLayer();
  126. StartRenderingAndRenderFrame();
  127. // Verify GetCurrentFrame() and PutCurrentFrame() work correctly.
  128. EXPECT_EQ(test_frame_, client_impl_->AcquireLockAndCurrentFrame());
  129. EXPECT_EQ(0, provider_.put_current_frame_count());
  130. client_impl_->PutCurrentFrame();
  131. EXPECT_EQ(1, provider_.put_current_frame_count());
  132. client_impl_->ReleaseLock();
  133. StopRendering();
  134. }
  135. TEST_F(VideoFrameProviderClientImplTest, DidReceiveFrame) {
  136. CreateActiveVideoLayer();
  137. EXPECT_EQ(gfx::Rect(), video_layer_impl_->update_rect());
  138. client_impl_->DidReceiveFrame();
  139. EXPECT_NE(gfx::Rect(), video_layer_impl_->update_rect());
  140. }
  141. TEST_F(VideoFrameProviderClientImplTest, DidDrawFrameIssuesPutCurrentFrame) {
  142. CreateActiveVideoLayer();
  143. StartRenderingAndRenderFrame();
  144. EXPECT_EQ(0, provider_.put_current_frame_count());
  145. client_impl_->DidDrawFrame();
  146. EXPECT_EQ(1, provider_.put_current_frame_count());
  147. StopRendering();
  148. }
  149. } // namespace cc