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

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

Powered by Google App Engine
This is Rietveld 408576698