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

Side by Side Diff: content/renderer/media/media_stream_video_renderer_sink_unittest.cc

Issue 2472273002: Move passing of WebRTC rendering frames from main thread to compositor thread (Closed)
Patch Set: Make |render_frame_suspended_| android specific. 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 2015 The Chromium Authors. All rights reserved. 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 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/macros.h" 6 #include "base/macros.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "content/child/child_process.h" 9 #include "content/child/child_process.h"
10 #include "content/renderer/media/media_stream_video_renderer_sink.h" 10 #include "content/renderer/media/media_stream_video_renderer_sink.h"
(...skipping 30 matching lines...) Expand all
41 // Extract the Blink Video Track for the MSVRSink. 41 // Extract the Blink Video Track for the MSVRSink.
42 registry_.test_stream().videoTracks(video_tracks_); 42 registry_.test_stream().videoTracks(video_tracks_);
43 EXPECT_EQ(1u, video_tracks_.size()); 43 EXPECT_EQ(1u, video_tracks_.size());
44 44
45 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( 45 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
46 video_tracks_[0], 46 video_tracks_[0],
47 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, 47 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
48 base::Unretained(this)), 48 base::Unretained(this)),
49 base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback, 49 base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback,
50 base::Unretained(this)), 50 base::Unretained(this)),
51 message_loop_.task_runner(), message_loop_.task_runner().get(), 51 message_loop_.task_runner(), message_loop_.task_runner(),
52 nullptr /* gpu_factories */); 52 message_loop_.task_runner(), nullptr /* gpu_factories */);
53 53
54 EXPECT_TRUE(IsInStoppedState()); 54 EXPECT_TRUE(IsInStoppedState());
55 } 55 }
56 56
57 ~MediaStreamVideoRendererSinkTest() { 57 ~MediaStreamVideoRendererSinkTest() {
58 media_stream_video_renderer_sink_ = nullptr; 58 media_stream_video_renderer_sink_ = nullptr;
59 registry_.reset(); 59 registry_.reset();
60 blink::WebHeap::collectAllGarbageForTesting(); 60 blink::WebHeap::collectAllGarbageForTesting();
61 61
62 // Let the message loop run to finish destroying the pool. 62 // Let the message loop run to finish destroying the pool.
63 base::RunLoop().RunUntilIdle(); 63 base::RunLoop().RunUntilIdle();
64 } 64 }
65 65
66 MOCK_METHOD1(RepaintCallback, void(const scoped_refptr<media::VideoFrame>&)); 66 MOCK_METHOD1(RepaintCallback, void(const scoped_refptr<media::VideoFrame>&));
67 MOCK_METHOD0(ErrorCallback, void(void)); 67 MOCK_METHOD0(ErrorCallback, void(void));
68 68
69 bool IsInStartedState() const { 69 bool IsInStartedState() const {
70 return media_stream_video_renderer_sink_->state_ == 70 return media_stream_video_renderer_sink_->GetStateForTesting() ==
71 MediaStreamVideoRendererSink::STARTED; 71 MediaStreamVideoRendererSink::STARTED;
72 } 72 }
73 bool IsInStoppedState() const { 73 bool IsInStoppedState() const {
74 return media_stream_video_renderer_sink_->state_ == 74 return media_stream_video_renderer_sink_->GetStateForTesting() ==
75 MediaStreamVideoRendererSink::STOPPED; 75 MediaStreamVideoRendererSink::STOPPED;
76 } 76 }
77 bool IsInPausedState() const { 77 bool IsInPausedState() const {
78 return media_stream_video_renderer_sink_->state_ == 78 return media_stream_video_renderer_sink_->GetStateForTesting() ==
79 MediaStreamVideoRendererSink::PAUSED; 79 MediaStreamVideoRendererSink::PAUSED;
80 } 80 }
81 81
82 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame) { 82 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame) {
83 media_stream_video_renderer_sink_->OnVideoFrame(frame, 83 media_stream_video_renderer_sink_->OnVideoFrameForTesting(
84 base::TimeTicks::Now()); 84 frame, base::TimeTicks::Now());
85 }
86
87 void SetGpuMemoryBufferVideoForTesting(
88 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
89 media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting(
90 gpu_memory_buffer_pool);
85 } 91 }
86 92
87 scoped_refptr<MediaStreamVideoRendererSink> media_stream_video_renderer_sink_; 93 scoped_refptr<MediaStreamVideoRendererSink> media_stream_video_renderer_sink_;
88 94
89 // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks 95 // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks
90 // and Sources in |registry_| into believing they are on the right threads. 96 // and Sources in |registry_| into believing they are on the right threads.
91 base::MessageLoopForUI message_loop_; 97 base::MessageLoopForUI message_loop_;
92 const ChildProcess child_process_; 98 const ChildProcess child_process_;
93 99
100 base::RunLoop run_loop_;
101
94 blink::WebVector<blink::WebMediaStreamTrack> video_tracks_; 102 blink::WebVector<blink::WebMediaStreamTrack> video_tracks_;
95 MockMediaStreamRegistry registry_; 103 MockMediaStreamRegistry registry_;
96 104
97 private: 105 private:
98 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSinkTest); 106 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSinkTest);
99 }; 107 };
100 108
101 // Checks that the initialization-destruction sequence works fine. 109 // Checks that the initialization-destruction sequence works fine.
102 TEST_F(MediaStreamVideoRendererSinkTest, StartStop) { 110 TEST_F(MediaStreamVideoRendererSinkTest, StartStop) {
103 EXPECT_TRUE(IsInStoppedState()); 111 EXPECT_TRUE(IsInStoppedState());
104 112
105 media_stream_video_renderer_sink_->Start(); 113 media_stream_video_renderer_sink_->Start();
114 run_loop_.RunUntilIdle();
106 EXPECT_TRUE(IsInStartedState()); 115 EXPECT_TRUE(IsInStartedState());
107 116
108 media_stream_video_renderer_sink_->Pause(); 117 media_stream_video_renderer_sink_->Pause();
118 base::RunLoop().RunUntilIdle();
109 EXPECT_TRUE(IsInPausedState()); 119 EXPECT_TRUE(IsInPausedState());
110 120
111 media_stream_video_renderer_sink_->Resume(); 121 media_stream_video_renderer_sink_->Resume();
122 base::RunLoop().RunUntilIdle();
112 EXPECT_TRUE(IsInStartedState()); 123 EXPECT_TRUE(IsInStartedState());
113 124
114 media_stream_video_renderer_sink_->Stop(); 125 media_stream_video_renderer_sink_->Stop();
126 base::RunLoop().RunUntilIdle();
115 EXPECT_TRUE(IsInStoppedState()); 127 EXPECT_TRUE(IsInStoppedState());
116 } 128 }
117 129
118 // Sends 2 frames and expect them as WebM contained encoded data in writeData(). 130 // Sends 2 frames and expect them as WebM contained encoded data in writeData().
119 TEST_F(MediaStreamVideoRendererSinkTest, EncodeVideoFrames) { 131 TEST_F(MediaStreamVideoRendererSinkTest, EncodeVideoFrames) {
120 media_stream_video_renderer_sink_->Start(); 132 media_stream_video_renderer_sink_->Start();
121 133
122 InSequence s; 134 InSequence s;
123 const scoped_refptr<media::VideoFrame> video_frame = 135 const scoped_refptr<media::VideoFrame> video_frame =
124 media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80)); 136 media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80));
125 137
126 EXPECT_CALL(*this, RepaintCallback(video_frame)).Times(1); 138 EXPECT_CALL(*this, RepaintCallback(video_frame)).Times(1);
127 OnVideoFrame(video_frame); 139 OnVideoFrame(video_frame);
128 140
129 media_stream_video_renderer_sink_->Stop(); 141 media_stream_video_renderer_sink_->Stop();
130 } 142 }
131 143
132 class MediaStreamVideoRendererSinkAsyncAddFrameReadyTest 144 class MediaStreamVideoRendererSinkAsyncAddFrameReadyTest
133 : public MediaStreamVideoRendererSinkTest { 145 : public MediaStreamVideoRendererSinkTest {
134 public: 146 public:
135 MediaStreamVideoRendererSinkAsyncAddFrameReadyTest() { 147 MediaStreamVideoRendererSinkAsyncAddFrameReadyTest() {
136 media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting( 148 SetGpuMemoryBufferVideoForTesting(
137 new media::MockGpuMemoryBufferVideoFramePool(&frame_ready_cbs_)); 149 new media::MockGpuMemoryBufferVideoFramePool(&frame_ready_cbs_));
150 base::RunLoop().RunUntilIdle();
138 } 151 }
139 152
140 protected: 153 protected:
141 std::vector<base::Closure> frame_ready_cbs_; 154 std::vector<base::Closure> frame_ready_cbs_;
142 }; 155 };
143 156
144 TEST_F(MediaStreamVideoRendererSinkAsyncAddFrameReadyTest, 157 TEST_F(MediaStreamVideoRendererSinkAsyncAddFrameReadyTest,
145 CreateHardwareFrames) { 158 CreateHardwareFrames) {
146 media_stream_video_renderer_sink_->Start(); 159 media_stream_video_renderer_sink_->Start();
147 160
(...skipping 15 matching lines...) Expand all
163 : public MediaStreamVideoRendererSinkTest { 176 : public MediaStreamVideoRendererSinkTest {
164 public: 177 public:
165 MediaStreamVideoRendererSinkTransparencyTest() { 178 MediaStreamVideoRendererSinkTransparencyTest() {
166 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( 179 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
167 video_tracks_[0], 180 video_tracks_[0],
168 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, 181 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
169 base::Unretained(this)), 182 base::Unretained(this)),
170 base::Bind(&MediaStreamVideoRendererSinkTransparencyTest:: 183 base::Bind(&MediaStreamVideoRendererSinkTransparencyTest::
171 VerifyTransparentFrame, 184 VerifyTransparentFrame,
172 base::Unretained(this)), 185 base::Unretained(this)),
173 message_loop_.task_runner(), message_loop_.task_runner().get(), 186 message_loop_.task_runner(), message_loop_.task_runner(),
174 nullptr /* gpu_factories */); 187 message_loop_.task_runner(), nullptr /* gpu_factories */);
175 } 188 }
176 189
177 void VerifyTransparentFrame(const scoped_refptr<media::VideoFrame>& frame) { 190 void VerifyTransparentFrame(const scoped_refptr<media::VideoFrame>& frame) {
178 EXPECT_EQ(media::PIXEL_FORMAT_YV12A, frame->format()); 191 EXPECT_EQ(media::PIXEL_FORMAT_YV12A, frame->format());
179 } 192 }
180 }; 193 };
181 194
182 TEST_F(MediaStreamVideoRendererSinkTransparencyTest, 195 TEST_F(MediaStreamVideoRendererSinkTransparencyTest,
183 SendTransparentFrame) { 196 SendTransparentFrame) {
184 media_stream_video_renderer_sink_->Start(); 197 media_stream_video_renderer_sink_->Start();
185 198
186 InSequence s; 199 InSequence s;
187 const gfx::Size kSize(10, 10); 200 const gfx::Size kSize(10, 10);
188 const base::TimeDelta kTimestamp = base::TimeDelta(); 201 const base::TimeDelta kTimestamp = base::TimeDelta();
189 const scoped_refptr<media::VideoFrame> video_frame = 202 const scoped_refptr<media::VideoFrame> video_frame =
190 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12A, kSize, 203 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12A, kSize,
191 gfx::Rect(kSize), kSize, kTimestamp); 204 gfx::Rect(kSize), kSize, kTimestamp);
192 OnVideoFrame(video_frame); 205 OnVideoFrame(video_frame);
193 base::RunLoop().RunUntilIdle(); 206 base::RunLoop().RunUntilIdle();
194 207
195 media_stream_video_renderer_sink_->Stop(); 208 media_stream_video_renderer_sink_->Stop();
196 } 209 }
197 210
198 } // namespace content 211 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698