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

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

Issue 2529263004: Move passing of WebRTC rendering frames to IO thread (Closed)
Patch Set: ncarter@ comment. Created 4 years 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 true); 48 true);
49 mock_source_->StartMockedSource(); 49 mock_source_->StartMockedSource();
50 base::RunLoop().RunUntilIdle(); 50 base::RunLoop().RunUntilIdle();
51 51
52 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( 52 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
53 blink_track_, 53 blink_track_,
54 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, 54 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
55 base::Unretained(this)), 55 base::Unretained(this)),
56 base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback, 56 base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback,
57 base::Unretained(this)), 57 base::Unretained(this)),
58 message_loop_.task_runner(), message_loop_.task_runner(), 58 child_process_->io_task_runner(), message_loop_.task_runner(),
59 message_loop_.task_runner(), nullptr /* gpu_factories */); 59 message_loop_.task_runner(), nullptr /* gpu_factories */);
60 base::RunLoop().RunUntilIdle(); 60 base::RunLoop().RunUntilIdle();
61 61
62 EXPECT_TRUE(IsInStoppedState()); 62 EXPECT_TRUE(IsInStoppedState());
63 } 63 }
64 64
65 void TearDown() override { 65 void TearDown() override {
66 media_stream_video_renderer_sink_ = nullptr; 66 media_stream_video_renderer_sink_ = nullptr;
67 blink_source_.reset(); 67 blink_source_.reset();
68 blink_track_.reset(); 68 blink_track_.reset();
69 blink::WebHeap::collectAllGarbageForTesting(); 69 blink::WebHeap::collectAllGarbageForTesting();
70 70
71 // Let the message loop run to finish destroying the pool. 71 // Let the message loop run to finish destroying the pool.
72 base::RunLoop().RunUntilIdle(); 72 base::RunLoop().RunUntilIdle();
73 } 73 }
74 74
75 MOCK_METHOD1(RepaintCallback, void(scoped_refptr<media::VideoFrame>)); 75 MOCK_METHOD1(RepaintCallback, void(scoped_refptr<media::VideoFrame>));
76 MOCK_METHOD0(ErrorCallback, void(void)); 76 MOCK_METHOD0(ErrorCallback, void(void));
77 77
78 bool IsInStartedState() const { 78 bool IsInStartedState() const {
79 RunIOUntilIdle();
79 return media_stream_video_renderer_sink_->GetStateForTesting() == 80 return media_stream_video_renderer_sink_->GetStateForTesting() ==
80 MediaStreamVideoRendererSink::STARTED; 81 MediaStreamVideoRendererSink::STARTED;
81 } 82 }
82 bool IsInStoppedState() const { 83 bool IsInStoppedState() const {
84 RunIOUntilIdle();
83 return media_stream_video_renderer_sink_->GetStateForTesting() == 85 return media_stream_video_renderer_sink_->GetStateForTesting() ==
84 MediaStreamVideoRendererSink::STOPPED; 86 MediaStreamVideoRendererSink::STOPPED;
85 } 87 }
86 bool IsInPausedState() const { 88 bool IsInPausedState() const {
89 RunIOUntilIdle();
87 return media_stream_video_renderer_sink_->GetStateForTesting() == 90 return media_stream_video_renderer_sink_->GetStateForTesting() ==
88 MediaStreamVideoRendererSink::PAUSED; 91 MediaStreamVideoRendererSink::PAUSED;
89 } 92 }
90 93
91 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { 94 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) {
92 mock_source_->DeliverVideoFrame(frame); 95 mock_source_->DeliverVideoFrame(frame);
93 base::RunLoop().RunUntilIdle(); 96 base::RunLoop().RunUntilIdle();
94 97
95 // |blink_track_| uses IO thread to send frames to sinks. Make sure that 98 RunIOUntilIdle();
96 // tasks on IO thread are completed before moving on.
97 base::RunLoop run_loop;
98 child_process_->io_task_runner()->PostTaskAndReply(
99 FROM_HERE, base::Bind([] {}), run_loop.QuitClosure());
100 run_loop.Run();
101 base::RunLoop().RunUntilIdle();
102 } 99 }
103 100
104 void SetGpuMemoryBufferVideoForTesting( 101 void SetGpuMemoryBufferVideoForTesting(
105 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) { 102 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
106 media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting( 103 media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting(
107 gpu_memory_buffer_pool); 104 gpu_memory_buffer_pool);
108 } 105 }
109 106
110 scoped_refptr<MediaStreamVideoRendererSink> media_stream_video_renderer_sink_; 107 scoped_refptr<MediaStreamVideoRendererSink> media_stream_video_renderer_sink_;
111 108
112 protected: 109 protected:
113 // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks 110 // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks
114 // and Sources in |registry_| into believing they are on the right threads. 111 // and Sources in |registry_| into believing they are on the right threads.
115 base::MessageLoopForUI message_loop_; 112 base::MessageLoopForUI message_loop_;
116 const std::unique_ptr<ChildProcess> child_process_; 113 const std::unique_ptr<ChildProcess> child_process_;
117 114
118 blink::WebMediaStreamTrack blink_track_; 115 blink::WebMediaStreamTrack blink_track_;
119 116
120 private: 117 private:
118 void RunIOUntilIdle() const {
119 // |blink_track_| uses IO thread to send frames to sinks. Make sure that
120 // tasks on IO thread are completed before moving on.
121 base::RunLoop run_loop;
122 child_process_->io_task_runner()->PostTaskAndReply(
123 FROM_HERE, base::Bind([] {}), run_loop.QuitClosure());
124 run_loop.Run();
125 base::RunLoop().RunUntilIdle();
126 }
127
121 blink::WebMediaStreamSource blink_source_; 128 blink::WebMediaStreamSource blink_source_;
122 MockMediaStreamVideoSource* mock_source_; 129 MockMediaStreamVideoSource* mock_source_;
123 130
124 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSinkTest); 131 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSinkTest);
125 }; 132 };
126 133
127 // Checks that the initialization-destruction sequence works fine. 134 // Checks that the initialization-destruction sequence works fine.
128 TEST_F(MediaStreamVideoRendererSinkTest, StartStop) { 135 TEST_F(MediaStreamVideoRendererSinkTest, StartStop) {
129 EXPECT_TRUE(IsInStoppedState()); 136 EXPECT_TRUE(IsInStoppedState());
130 137
131 media_stream_video_renderer_sink_->Start(); 138 media_stream_video_renderer_sink_->Start();
132 base::RunLoop().RunUntilIdle();
133 EXPECT_TRUE(IsInStartedState()); 139 EXPECT_TRUE(IsInStartedState());
134 140
135 media_stream_video_renderer_sink_->Pause(); 141 media_stream_video_renderer_sink_->Pause();
136 base::RunLoop().RunUntilIdle();
137 EXPECT_TRUE(IsInPausedState()); 142 EXPECT_TRUE(IsInPausedState());
138 143
139 media_stream_video_renderer_sink_->Resume(); 144 media_stream_video_renderer_sink_->Resume();
140 base::RunLoop().RunUntilIdle();
141 EXPECT_TRUE(IsInStartedState()); 145 EXPECT_TRUE(IsInStartedState());
142 146
143 media_stream_video_renderer_sink_->Stop(); 147 media_stream_video_renderer_sink_->Stop();
144 base::RunLoop().RunUntilIdle();
145 EXPECT_TRUE(IsInStoppedState()); 148 EXPECT_TRUE(IsInStoppedState());
146 } 149 }
147 150
148 // Sends 2 frames and expect them as WebM contained encoded data in writeData(). 151 // Sends 2 frames and expect them as WebM contained encoded data in writeData().
149 TEST_F(MediaStreamVideoRendererSinkTest, EncodeVideoFrames) { 152 TEST_F(MediaStreamVideoRendererSinkTest, EncodeVideoFrames) {
150 media_stream_video_renderer_sink_->Start(); 153 media_stream_video_renderer_sink_->Start();
151 154
152 InSequence s; 155 InSequence s;
153 const scoped_refptr<media::VideoFrame> video_frame = 156 const scoped_refptr<media::VideoFrame> video_frame =
154 media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80)); 157 media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 : public MediaStreamVideoRendererSinkTest { 195 : public MediaStreamVideoRendererSinkTest {
193 public: 196 public:
194 MediaStreamVideoRendererSinkTransparencyTest() { 197 MediaStreamVideoRendererSinkTransparencyTest() {
195 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( 198 media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
196 blink_track_, 199 blink_track_,
197 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, 200 base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
198 base::Unretained(this)), 201 base::Unretained(this)),
199 base::Bind(&MediaStreamVideoRendererSinkTransparencyTest:: 202 base::Bind(&MediaStreamVideoRendererSinkTransparencyTest::
200 VerifyTransparentFrame, 203 VerifyTransparentFrame,
201 base::Unretained(this)), 204 base::Unretained(this)),
202 message_loop_.task_runner(), message_loop_.task_runner(), 205 child_process_->io_task_runner(), message_loop_.task_runner(),
203 message_loop_.task_runner(), nullptr /* gpu_factories */); 206 message_loop_.task_runner(), nullptr /* gpu_factories */);
204 } 207 }
205 208
206 void VerifyTransparentFrame(scoped_refptr<media::VideoFrame> frame) { 209 void VerifyTransparentFrame(scoped_refptr<media::VideoFrame> frame) {
207 EXPECT_EQ(media::PIXEL_FORMAT_YV12A, frame->format()); 210 EXPECT_EQ(media::PIXEL_FORMAT_YV12A, frame->format());
208 } 211 }
209 }; 212 };
210 213
211 TEST_F(MediaStreamVideoRendererSinkTransparencyTest, 214 TEST_F(MediaStreamVideoRendererSinkTransparencyTest,
212 SendTransparentFrame) { 215 SendTransparentFrame) {
213 media_stream_video_renderer_sink_->Start(); 216 media_stream_video_renderer_sink_->Start();
214 217
215 InSequence s; 218 InSequence s;
216 const gfx::Size kSize(10, 10); 219 const gfx::Size kSize(10, 10);
217 const base::TimeDelta kTimestamp = base::TimeDelta(); 220 const base::TimeDelta kTimestamp = base::TimeDelta();
218 const scoped_refptr<media::VideoFrame> video_frame = 221 const scoped_refptr<media::VideoFrame> video_frame =
219 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12A, kSize, 222 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12A, kSize,
220 gfx::Rect(kSize), kSize, kTimestamp); 223 gfx::Rect(kSize), kSize, kTimestamp);
221 OnVideoFrame(video_frame); 224 OnVideoFrame(video_frame);
222 base::RunLoop().RunUntilIdle(); 225 base::RunLoop().RunUntilIdle();
223 226
224 media_stream_video_renderer_sink_->Stop(); 227 media_stream_video_renderer_sink_->Stop();
225 } 228 }
226 229
227 } // namespace content 230 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_video_renderer_sink.cc ('k') | content/renderer/media/webmediaplayer_ms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698