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

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

Issue 2529263004: Move passing of WebRTC rendering frames to IO thread (Closed)
Patch Set: 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/renderer/media/media_stream_video_renderer_sink.h" 5 #include "content/renderer/media/media_stream_video_renderer_sink.h"
6 6
7 #include "base/feature_list.h" 7 #include "base/feature_list.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
11 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "content/child/child_process.h" 12 #include "content/child/child_process.h"
13 #include "content/public/common/content_features.h" 13 #include "content/public/common/content_features.h"
14 #include "content/public/renderer/render_thread.h" 14 #include "content/public/renderer/render_thread.h"
15 #include "media/base/bind_to_current_loop.h" 15 #include "media/base/bind_to_current_loop.h"
16 #include "media/base/video_frame.h" 16 #include "media/base/video_frame.h"
17 #include "media/base/video_frame_metadata.h" 17 #include "media/base/video_frame_metadata.h"
18 #include "media/base/video_util.h" 18 #include "media/base/video_util.h"
19 #include "media/renderers/gpu_video_accelerator_factories.h" 19 #include "media/renderers/gpu_video_accelerator_factories.h"
20 #include "media/video/gpu_memory_buffer_video_frame_pool.h" 20 #include "media/video/gpu_memory_buffer_video_frame_pool.h"
21 21
22 const int kMinFrameSize = 2; 22 const int kMinFrameSize = 2;
23 23
24 namespace content { 24 namespace content {
25 25
26 // FrameDeliverer is responsible for delivering frames received on 26 // FrameDeliverer is responsible for delivering frames received on
27 // OnVideoFrame() to |repaint_cb_| on compositor thread. 27 // OnVideoFrame() to |repaint_cb_| on |media_task_runner_|.
28 // 28 //
29 // It is created on the main thread, but methods should be called and class 29 // It is created on the main thread, but methods should be called and class
30 // should be destructed on the compositor thread. 30 // should be destructed on |media_task_runner_|.
31 class MediaStreamVideoRendererSink::FrameDeliverer { 31 class MediaStreamVideoRendererSink::FrameDeliverer {
32 public: 32 public:
33 FrameDeliverer(const RepaintCB& repaint_cb, 33 FrameDeliverer(const RepaintCB& repaint_cb,
34 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, 34 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
35 scoped_refptr<base::TaskRunner> worker_task_runner, 35 scoped_refptr<base::TaskRunner> worker_task_runner,
36 media::GpuVideoAcceleratorFactories* gpu_factories) 36 media::GpuVideoAcceleratorFactories* gpu_factories)
37 : repaint_cb_(repaint_cb), 37 : repaint_cb_(repaint_cb),
38 state_(STOPPED), 38 state_(STOPPED),
39 frame_size_(kMinFrameSize, kMinFrameSize), 39 frame_size_(kMinFrameSize, kMinFrameSize),
40 media_task_runner_(media_task_runner), 40 media_task_runner_(media_task_runner),
41 weak_factory_(this) { 41 weak_factory_(this) {
42 compositor_thread_checker_.DetachFromThread();
43 weak_this_ = weak_factory_.GetWeakPtr(); 42 weak_this_ = weak_factory_.GetWeakPtr();
44 if (gpu_factories && 43 if (gpu_factories &&
45 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames() && 44 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames() &&
46 base::FeatureList::IsEnabled( 45 base::FeatureList::IsEnabled(
47 features::kWebRtcUseGpuMemoryBufferVideoFrames)) { 46 features::kWebRtcUseGpuMemoryBufferVideoFrames)) {
48 gpu_memory_buffer_pool_.reset(new media::GpuMemoryBufferVideoFramePool( 47 gpu_memory_buffer_pool_.reset(new media::GpuMemoryBufferVideoFramePool(
49 media_task_runner, worker_task_runner, gpu_factories)); 48 media_task_runner, worker_task_runner, gpu_factories));
50 } 49 }
51 } 50 }
52 51
53 ~FrameDeliverer() { 52 ~FrameDeliverer() {
54 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 53 DCHECK(media_task_runner_->BelongsToCurrentThread());
55 DCHECK(state_ == STARTED || state_ == PAUSED) << state_; 54 DCHECK(state_ == STARTED || state_ == PAUSED) << state_;
56
57 if (gpu_memory_buffer_pool_) {
58 media_task_runner_->DeleteSoon(FROM_HERE,
59 gpu_memory_buffer_pool_.release());
60 }
61 } 55 }
62 56
63 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, 57 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
64 base::TimeTicks /*current_time*/) { 58 base::TimeTicks /*current_time*/) {
65 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 59 DCHECK(media_task_runner_->BelongsToCurrentThread());
66 DCHECK(frame); 60 DCHECK(frame);
67 TRACE_EVENT_INSTANT1("webrtc", 61 TRACE_EVENT_INSTANT1("webrtc",
68 "MediaStreamVideoRendererSink::" 62 "MediaStreamVideoRendererSink::"
69 "FrameDeliverer::OnVideoFrame", 63 "FrameDeliverer::OnVideoFrame",
70 TRACE_EVENT_SCOPE_THREAD, "timestamp", 64 TRACE_EVENT_SCOPE_THREAD, "timestamp",
71 frame->timestamp().InMilliseconds()); 65 frame->timestamp().InMilliseconds());
72 66
73 if (state_ != STARTED) 67 if (state_ != STARTED)
74 return; 68 return;
75 69
76 if (!gpu_memory_buffer_pool_) { 70 if (!gpu_memory_buffer_pool_) {
77 FrameReady(frame); 71 FrameReady(frame);
78 return; 72 return;
79 } 73 }
80 74 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(
81 // |gpu_memory_buffer_pool_| deletion is going to be posted to 75 frame, media::BindToCurrentLoop(
82 // |media_task_runner_|. base::Unretained() usage is fine since 76 base::Bind(&FrameDeliverer::FrameReady, weak_this_)));
83 // |gpu_memory_buffer_pool_| outlives the task.
84 media_task_runner_->PostTask(
85 FROM_HERE,
86 base::Bind(
87 &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
88 base::Unretained(gpu_memory_buffer_pool_.get()), frame,
89 media::BindToCurrentLoop(
90 base::Bind(&FrameDeliverer::FrameReady, weak_this_))));
91 } 77 }
92 78
93 void FrameReady(const scoped_refptr<media::VideoFrame>& frame) { 79 void FrameReady(const scoped_refptr<media::VideoFrame>& frame) {
94 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 80 DCHECK(media_task_runner_->BelongsToCurrentThread());
95 DCHECK(frame); 81 DCHECK(frame);
96 TRACE_EVENT_INSTANT1( 82 TRACE_EVENT_INSTANT1(
97 "webrtc", "MediaStreamVideoRendererSink::FrameDeliverer::FrameReady", 83 "webrtc", "MediaStreamVideoRendererSink::FrameDeliverer::FrameReady",
98 TRACE_EVENT_SCOPE_THREAD, "timestamp", 84 TRACE_EVENT_SCOPE_THREAD, "timestamp",
99 frame->timestamp().InMilliseconds()); 85 frame->timestamp().InMilliseconds());
100 86
101 frame_size_ = frame->natural_size(); 87 frame_size_ = frame->natural_size();
102 repaint_cb_.Run(frame); 88 repaint_cb_.Run(frame);
103 } 89 }
104 90
105 void RenderEndOfStream() { 91 void RenderEndOfStream() {
106 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 92 DCHECK(media_task_runner_->BelongsToCurrentThread());
107 // This is necessary to make sure audio can play if the video tag src is a 93 // This is necessary to make sure audio can play if the video tag src is a
108 // MediaStream video track that has been rejected or ended. It also ensure 94 // MediaStream video track that has been rejected or ended. It also ensure
109 // that the renderer doesn't hold a reference to a real video frame if no 95 // that the renderer doesn't hold a reference to a real video frame if no
110 // more frames are provided. This is since there might be a finite number 96 // more frames are provided. This is since there might be a finite number
111 // of available buffers. E.g, video that originates from a video camera. 97 // of available buffers. E.g, video that originates from a video camera.
112 scoped_refptr<media::VideoFrame> video_frame = 98 scoped_refptr<media::VideoFrame> video_frame =
113 media::VideoFrame::CreateBlackFrame( 99 media::VideoFrame::CreateBlackFrame(
114 state_ == STOPPED ? gfx::Size(kMinFrameSize, kMinFrameSize) 100 state_ == STOPPED ? gfx::Size(kMinFrameSize, kMinFrameSize)
115 : frame_size_); 101 : frame_size_);
116 video_frame->metadata()->SetBoolean( 102 video_frame->metadata()->SetBoolean(
117 media::VideoFrameMetadata::END_OF_STREAM, true); 103 media::VideoFrameMetadata::END_OF_STREAM, true);
118 video_frame->metadata()->SetTimeTicks( 104 video_frame->metadata()->SetTimeTicks(
119 media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks::Now()); 105 media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks::Now());
120 OnVideoFrame(video_frame, base::TimeTicks()); 106 OnVideoFrame(video_frame, base::TimeTicks());
121 } 107 }
122 108
123 void Start() { 109 void Start() {
124 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 110 DCHECK(media_task_runner_->BelongsToCurrentThread());
125 DCHECK_EQ(state_, STOPPED); 111 DCHECK_EQ(state_, STOPPED);
126 state_ = STARTED; 112 state_ = STARTED;
127 } 113 }
128 114
129 void Resume() { 115 void Resume() {
130 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 116 DCHECK(media_task_runner_->BelongsToCurrentThread());
131 if (state_ == PAUSED) 117 if (state_ == PAUSED)
132 state_ = STARTED; 118 state_ = STARTED;
133 } 119 }
134 120
135 void Pause() { 121 void Pause() {
136 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 122 DCHECK(media_task_runner_->BelongsToCurrentThread());
137 if (state_ == STARTED) 123 if (state_ == STARTED)
138 state_ = PAUSED; 124 state_ = PAUSED;
139 } 125 }
140 126
141 VideoCaptureDeliverFrameCB GetDeliverFrameCallback() { 127 VideoCaptureDeliverFrameCB GetDeliverFrameCallback() {
142 return base::Bind(&FrameDeliverer::OnVideoFrame, weak_this_); 128 return base::Bind(&FrameDeliverer::OnVideoFrame, weak_this_);
143 } 129 }
144 130
145 private: 131 private:
146 friend class MediaStreamVideoRendererSink; 132 friend class MediaStreamVideoRendererSink;
147 133
148 void SetGpuMemoryBufferVideoForTesting( 134 void SetGpuMemoryBufferVideoForTesting(
149 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) { 135 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
150 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 136 DCHECK(media_task_runner_->BelongsToCurrentThread());
151 gpu_memory_buffer_pool_.reset(gpu_memory_buffer_pool); 137 gpu_memory_buffer_pool_.reset(gpu_memory_buffer_pool);
152 } 138 }
153 139
154 const RepaintCB repaint_cb_; 140 const RepaintCB repaint_cb_;
155 State state_; 141 State state_;
156 gfx::Size frame_size_; 142 gfx::Size frame_size_;
157 143
158 // Pool of GpuMemoryBuffers and resources used to create hardware frames. 144 // Pool of GpuMemoryBuffers and resources used to create hardware frames.
159 std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_; 145 std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_;
160 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; 146 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
161 147
162 // Used for DCHECKs to ensure method calls are executed on the correct thread.
163 base::ThreadChecker compositor_thread_checker_;
164
165 base::WeakPtr<FrameDeliverer> weak_this_; 148 base::WeakPtr<FrameDeliverer> weak_this_;
166 base::WeakPtrFactory<FrameDeliverer> weak_factory_; 149 base::WeakPtrFactory<FrameDeliverer> weak_factory_;
167 150
168 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); 151 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
169 }; 152 };
170 153
171 // FrameReceiver is responsible for trampolining frames from IO thread to 154 // FrameReceiver is responsible for trampolining frames from IO thread to
172 // the compositor thread by posting a task on |deliver_frame_cb_|. 155 // media thread by posting a task on |deliver_frame_cb_|.
173 // 156 //
174 // It is created on main thread, but methods should be called and class should 157 // It is created on main thread, but methods should be called and class should
175 // be destructed on the IO thread. 158 // be destructed on the IO thread.
176 class MediaStreamVideoRendererSink::FrameReceiver { 159 class MediaStreamVideoRendererSink::FrameReceiver {
177 public: 160 public:
178 FrameReceiver( 161 FrameReceiver(
179 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 162 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
180 const VideoCaptureDeliverFrameCB& deliver_frame_cb) 163 const VideoCaptureDeliverFrameCB& deliver_frame_cb)
181 : compositor_task_runner_(compositor_task_runner), 164 : media_task_runner_(media_task_runner),
182 deliver_frame_cb_(deliver_frame_cb) { 165 deliver_frame_cb_(deliver_frame_cb) {
183 io_thread_checker_.DetachFromThread(); 166 io_thread_checker_.DetachFromThread();
184 } 167 }
185 168
186 ~FrameReceiver() { DCHECK(io_thread_checker_.CalledOnValidThread()); } 169 ~FrameReceiver() { DCHECK(io_thread_checker_.CalledOnValidThread()); }
187 170
188 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, 171 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
189 base::TimeTicks current_time) { 172 base::TimeTicks current_time) {
190 DCHECK(io_thread_checker_.CalledOnValidThread()); 173 DCHECK(io_thread_checker_.CalledOnValidThread());
191 compositor_task_runner_->PostTask( 174 media_task_runner_->PostTask(
192 FROM_HERE, base::Bind(deliver_frame_cb_, frame, current_time)); 175 FROM_HERE, base::Bind(deliver_frame_cb_, frame, current_time));
193 } 176 }
194 177
195 private: 178 private:
196 const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; 179 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
197 const VideoCaptureDeliverFrameCB deliver_frame_cb_; 180 const VideoCaptureDeliverFrameCB deliver_frame_cb_;
198 181
199 // Used for DCHECKs to ensure method calls executed in the correct thread. 182 // Used for DCHECKs to ensure method calls executed in the correct thread.
200 base::ThreadChecker io_thread_checker_; 183 base::ThreadChecker io_thread_checker_;
201 184
202 DISALLOW_COPY_AND_ASSIGN(FrameReceiver); 185 DISALLOW_COPY_AND_ASSIGN(FrameReceiver);
203 }; 186 };
204 187
205 MediaStreamVideoRendererSink::MediaStreamVideoRendererSink( 188 MediaStreamVideoRendererSink::MediaStreamVideoRendererSink(
206 const blink::WebMediaStreamTrack& video_track, 189 const blink::WebMediaStreamTrack& video_track,
207 const base::Closure& error_cb, 190 const base::Closure& error_cb,
208 const RepaintCB& repaint_cb, 191 const RepaintCB& repaint_cb,
209 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
210 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 192 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
211 const scoped_refptr<base::TaskRunner>& worker_task_runner, 193 const scoped_refptr<base::TaskRunner>& worker_task_runner,
212 media::GpuVideoAcceleratorFactories* gpu_factories) 194 media::GpuVideoAcceleratorFactories* gpu_factories)
213 : error_cb_(error_cb), 195 : error_cb_(error_cb),
214 repaint_cb_(repaint_cb), 196 repaint_cb_(repaint_cb),
215 video_track_(video_track), 197 video_track_(video_track),
216 compositor_task_runner_(compositor_task_runner),
217 media_task_runner_(media_task_runner), 198 media_task_runner_(media_task_runner),
218 worker_task_runner_(worker_task_runner), 199 worker_task_runner_(worker_task_runner),
219 gpu_factories_(gpu_factories) {} 200 gpu_factories_(gpu_factories) {}
220 201
221 MediaStreamVideoRendererSink::~MediaStreamVideoRendererSink() {} 202 MediaStreamVideoRendererSink::~MediaStreamVideoRendererSink() {}
222 203
223 void MediaStreamVideoRendererSink::Start() { 204 void MediaStreamVideoRendererSink::Start() {
224 DCHECK(main_thread_checker_.CalledOnValidThread()); 205 DCHECK(main_thread_checker_.CalledOnValidThread());
225 206
226 frame_deliverer_.reset(new MediaStreamVideoRendererSink::FrameDeliverer( 207 frame_deliverer_.reset(new MediaStreamVideoRendererSink::FrameDeliverer(
227 repaint_cb_, media_task_runner_, worker_task_runner_, gpu_factories_)); 208 repaint_cb_, media_task_runner_, worker_task_runner_, gpu_factories_));
228 compositor_task_runner_->PostTask( 209 media_task_runner_->PostTask(
229 FROM_HERE, base::Bind(&FrameDeliverer::Start, 210 FROM_HERE, base::Bind(&FrameDeliverer::Start,
230 base::Unretained(frame_deliverer_.get()))); 211 base::Unretained(frame_deliverer_.get())));
231 212
232 frame_receiver_.reset(new MediaStreamVideoRendererSink::FrameReceiver( 213 frame_receiver_.reset(new MediaStreamVideoRendererSink::FrameReceiver(
233 compositor_task_runner_, frame_deliverer_->GetDeliverFrameCallback())); 214 media_task_runner_, frame_deliverer_->GetDeliverFrameCallback()));
234 MediaStreamVideoSink::ConnectToTrack( 215 MediaStreamVideoSink::ConnectToTrack(
235 video_track_, 216 video_track_,
236 // This callback is run on IO thread. It is safe to use base::Unretained 217 // This callback is run on IO thread. It is safe to use base::Unretained
237 // here because |frame_receiver_| will be destroyed after sink is 218 // here because |frame_receiver_| will be destroyed after sink is
238 // disconnected from track. 219 // disconnected from track.
239 base::Bind(&FrameReceiver::OnVideoFrame, 220 base::Bind(&FrameReceiver::OnVideoFrame,
240 base::Unretained(frame_receiver_.get())), 221 base::Unretained(frame_receiver_.get())),
241 // Local display video rendering is considered a secure link. 222 // Local display video rendering is considered a secure link.
242 true); 223 true);
243 224
244 if (video_track_.source().getReadyState() == 225 if (video_track_.source().getReadyState() ==
245 blink::WebMediaStreamSource::ReadyStateEnded || 226 blink::WebMediaStreamSource::ReadyStateEnded ||
246 !video_track_.isEnabled()) { 227 !video_track_.isEnabled()) {
247 compositor_task_runner_->PostTask( 228 media_task_runner_->PostTask(
248 FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream, 229 FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream,
249 base::Unretained(frame_deliverer_.get()))); 230 base::Unretained(frame_deliverer_.get())));
250 } 231 }
251 } 232 }
252 233
253 void MediaStreamVideoRendererSink::Stop() { 234 void MediaStreamVideoRendererSink::Stop() {
254 DCHECK(main_thread_checker_.CalledOnValidThread()); 235 DCHECK(main_thread_checker_.CalledOnValidThread());
255 236
256 MediaStreamVideoSink::DisconnectFromTrack(); 237 MediaStreamVideoSink::DisconnectFromTrack();
257 if (frame_receiver_) { 238 if (frame_receiver_) {
258 ChildProcess::current()->io_task_runner()->DeleteSoon( 239 ChildProcess::current()->io_task_runner()->DeleteSoon(
259 FROM_HERE, frame_receiver_.release()); 240 FROM_HERE, frame_receiver_.release());
260 } 241 }
261 if (frame_deliverer_) 242 if (frame_deliverer_)
262 compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); 243 media_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
263 } 244 }
264 245
265 void MediaStreamVideoRendererSink::Resume() { 246 void MediaStreamVideoRendererSink::Resume() {
266 DCHECK(main_thread_checker_.CalledOnValidThread()); 247 DCHECK(main_thread_checker_.CalledOnValidThread());
267 if (!frame_deliverer_) 248 if (!frame_deliverer_)
268 return; 249 return;
269 250
270 compositor_task_runner_->PostTask( 251 media_task_runner_->PostTask(
271 FROM_HERE, base::Bind(&FrameDeliverer::Resume, 252 FROM_HERE, base::Bind(&FrameDeliverer::Resume,
272 base::Unretained(frame_deliverer_.get()))); 253 base::Unretained(frame_deliverer_.get())));
273 } 254 }
274 255
275 void MediaStreamVideoRendererSink::Pause() { 256 void MediaStreamVideoRendererSink::Pause() {
276 DCHECK(main_thread_checker_.CalledOnValidThread()); 257 DCHECK(main_thread_checker_.CalledOnValidThread());
277 if (!frame_deliverer_) 258 if (!frame_deliverer_)
278 return; 259 return;
279 260
280 compositor_task_runner_->PostTask( 261 media_task_runner_->PostTask(
281 FROM_HERE, base::Bind(&FrameDeliverer::Pause, 262 FROM_HERE, base::Bind(&FrameDeliverer::Pause,
282 base::Unretained(frame_deliverer_.get()))); 263 base::Unretained(frame_deliverer_.get())));
283 } 264 }
284 265
285 void MediaStreamVideoRendererSink::OnReadyStateChanged( 266 void MediaStreamVideoRendererSink::OnReadyStateChanged(
286 blink::WebMediaStreamSource::ReadyState state) { 267 blink::WebMediaStreamSource::ReadyState state) {
287 DCHECK(main_thread_checker_.CalledOnValidThread()); 268 DCHECK(main_thread_checker_.CalledOnValidThread());
288 if (state == blink::WebMediaStreamSource::ReadyStateEnded && 269 if (state == blink::WebMediaStreamSource::ReadyStateEnded &&
289 frame_deliverer_) { 270 frame_deliverer_) {
290 compositor_task_runner_->PostTask( 271 media_task_runner_->PostTask(
291 FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream, 272 FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream,
292 base::Unretained(frame_deliverer_.get()))); 273 base::Unretained(frame_deliverer_.get())));
293 } 274 }
294 } 275 }
295 276
296 MediaStreamVideoRendererSink::State 277 MediaStreamVideoRendererSink::State
297 MediaStreamVideoRendererSink::GetStateForTesting() { 278 MediaStreamVideoRendererSink::GetStateForTesting() {
298 DCHECK(main_thread_checker_.CalledOnValidThread()); 279 DCHECK(main_thread_checker_.CalledOnValidThread());
299 if (!frame_deliverer_) 280 if (!frame_deliverer_)
300 return STOPPED; 281 return STOPPED;
301 return frame_deliverer_->state_; 282 return frame_deliverer_->state_;
302 } 283 }
303 284
304 void MediaStreamVideoRendererSink::SetGpuMemoryBufferVideoForTesting( 285 void MediaStreamVideoRendererSink::SetGpuMemoryBufferVideoForTesting(
305 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) { 286 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
306 DCHECK(main_thread_checker_.CalledOnValidThread()); 287 DCHECK(main_thread_checker_.CalledOnValidThread());
307 CHECK(frame_deliverer_); 288 CHECK(frame_deliverer_);
308 compositor_task_runner_->PostTask( 289 media_task_runner_->PostTask(
309 FROM_HERE, base::Bind(&FrameDeliverer::SetGpuMemoryBufferVideoForTesting, 290 FROM_HERE, base::Bind(&FrameDeliverer::SetGpuMemoryBufferVideoForTesting,
310 base::Unretained(frame_deliverer_.get()), 291 base::Unretained(frame_deliverer_.get()),
311 gpu_memory_buffer_pool)); 292 gpu_memory_buffer_pool));
312 } 293 }
313 294
314 } // namespace content 295 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698