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

Side by Side Diff: content/renderer/media/webmediaplayer_ms.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/webmediaplayer_ms.h" 5 #include "content/renderer/media/webmediaplayer_ms.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback.h" 13 #include "base/callback.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "build/build_config.h" 15 #include "build/build_config.h"
16 #include "cc/blink/web_layer_impl.h" 16 #include "cc/blink/web_layer_impl.h"
17 #include "cc/layers/video_frame_provider_client_impl.h" 17 #include "cc/layers/video_frame_provider_client_impl.h"
18 #include "cc/layers/video_layer.h" 18 #include "cc/layers/video_layer.h"
19 #include "content/child/child_process.h"
19 #include "content/common/gpu/client/context_provider_command_buffer.h" 20 #include "content/common/gpu/client/context_provider_command_buffer.h"
20 #include "content/public/renderer/media_stream_audio_renderer.h" 21 #include "content/public/renderer/media_stream_audio_renderer.h"
21 #include "content/public/renderer/media_stream_renderer_factory.h" 22 #include "content/public/renderer/media_stream_renderer_factory.h"
22 #include "content/public/renderer/media_stream_video_renderer.h" 23 #include "content/public/renderer/media_stream_video_renderer.h"
23 #include "content/renderer/media/web_media_element_source_utils.h" 24 #include "content/renderer/media/web_media_element_source_utils.h"
24 #include "content/renderer/media/webmediaplayer_ms_compositor.h" 25 #include "content/renderer/media/webmediaplayer_ms_compositor.h"
25 #include "content/renderer/render_frame_impl.h" 26 #include "content/renderer/render_frame_impl.h"
26 #include "content/renderer/render_thread_impl.h" 27 #include "content/renderer/render_thread_impl.h"
27 #include "media/base/bind_to_current_loop.h" 28 #include "media/base/bind_to_current_loop.h"
28 #include "media/base/media_content_type.h" 29 #include "media/base/media_content_type.h"
29 #include "media/base/media_log.h" 30 #include "media/base/media_log.h"
30 #include "media/base/video_frame.h" 31 #include "media/base/video_frame.h"
31 #include "media/base/video_rotation.h" 32 #include "media/base/video_rotation.h"
32 #include "media/base/video_types.h" 33 #include "media/base/video_types.h"
33 #include "media/blink/webmediaplayer_util.h" 34 #include "media/blink/webmediaplayer_util.h"
34 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 35 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
35 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" 36 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h"
36 #include "third_party/WebKit/public/platform/WebRect.h" 37 #include "third_party/WebKit/public/platform/WebRect.h"
37 #include "third_party/WebKit/public/platform/WebSize.h" 38 #include "third_party/WebKit/public/platform/WebSize.h"
38 39
39 namespace content { 40 namespace content {
40 41
41 // FrameDeliverer is responsible for delivering frames received on 42 // FrameDeliverer is responsible for delivering frames received on
42 // compositor thread by calling of EnqueueFrame() method of |compositor_|. 43 // the IO thread by calling of EnqueueFrame() method of |compositor_|.
43 // 44 //
44 // It is created on the main thread, but methods should be called and class 45 // It is created on the main thread, but methods should be called and class
45 // should be destructed on the compositor thread. 46 // should be destructed on the IO thread.
46 class WebMediaPlayerMS::FrameDeliverer { 47 class WebMediaPlayerMS::FrameDeliverer {
47 public: 48 public:
48 typedef base::Callback<void(scoped_refptr<media::VideoFrame>)>
49 EnqueueFrameCallback;
50
51 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, 49 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player,
52 const EnqueueFrameCallback& enqueue_frame_cb) 50 const MediaStreamVideoRenderer::RepaintCB& enqueue_frame_cb)
53 : last_frame_opaque_(true), 51 : last_frame_opaque_(true),
54 last_frame_rotation_(media::VIDEO_ROTATION_0), 52 last_frame_rotation_(media::VIDEO_ROTATION_0),
55 received_first_frame_(false), 53 received_first_frame_(false),
56 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), 54 main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
57 player_(player), 55 player_(player),
58 enqueue_frame_cb_(enqueue_frame_cb), 56 enqueue_frame_cb_(enqueue_frame_cb),
59 weak_factory_for_compositor_(this) { 57 weak_factory_(this) {
60 compositor_thread_checker_.DetachFromThread(); 58 io_thread_checker_.DetachFromThread();
61 } 59 }
62 60
63 ~FrameDeliverer() { 61 ~FrameDeliverer() { DCHECK(io_thread_checker_.CalledOnValidThread()); }
64 DCHECK(compositor_thread_checker_.CalledOnValidThread());
65 }
66 62
67 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { 63 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) {
68 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 64 DCHECK(io_thread_checker_.CalledOnValidThread());
69 65
70 #if defined(OS_ANDROID) 66 #if defined(OS_ANDROID)
71 if (render_frame_suspended_) 67 if (render_frame_suspended_)
72 return; 68 return;
73 #endif // defined(OS_ANDROID) 69 #endif // defined(OS_ANDROID)
74 70
75 base::TimeTicks render_time; 71 base::TimeTicks render_time;
76 if (frame->metadata()->GetTimeTicks( 72 if (frame->metadata()->GetTimeTicks(
77 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { 73 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) {
78 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", 74 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnVideoFrame",
79 "Ideal Render Instant", render_time.ToInternalValue()); 75 "Ideal Render Instant", render_time.ToInternalValue());
80 } else { 76 } else {
81 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable"); 77 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnVideoFrame");
82 } 78 }
83 79
84 const bool is_opaque = media::IsOpaque(frame->format()); 80 const bool is_opaque = media::IsOpaque(frame->format());
85 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; 81 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0;
86 ignore_result(frame->metadata()->GetRotation( 82 ignore_result(frame->metadata()->GetRotation(
87 media::VideoFrameMetadata::ROTATION, &video_rotation)); 83 media::VideoFrameMetadata::ROTATION, &video_rotation));
88 84
89 if (!received_first_frame_) { 85 if (!received_first_frame_) {
90 received_first_frame_ = true; 86 received_first_frame_ = true;
91 last_frame_opaque_ = is_opaque; 87 last_frame_opaque_ = is_opaque;
(...skipping 14 matching lines...) Expand all
106 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_, 102 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_,
107 video_rotation, is_opaque)); 103 video_rotation, is_opaque));
108 } 104 }
109 } 105 }
110 106
111 enqueue_frame_cb_.Run(frame); 107 enqueue_frame_cb_.Run(frame);
112 } 108 }
113 109
114 #if defined(OS_ANDROID) 110 #if defined(OS_ANDROID)
115 void SetRenderFrameSuspended(bool render_frame_suspended) { 111 void SetRenderFrameSuspended(bool render_frame_suspended) {
116 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 112 DCHECK(io_thread_checker_.CalledOnValidThread());
117 render_frame_suspended_ = render_frame_suspended; 113 render_frame_suspended_ = render_frame_suspended;
118 } 114 }
119 #endif // defined(OS_ANDROID) 115 #endif // defined(OS_ANDROID)
120 116
121 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { 117 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() {
122 return base::Bind(&FrameDeliverer::OnVideoFrame, 118 return base::Bind(&FrameDeliverer::OnVideoFrame,
123 weak_factory_for_compositor_.GetWeakPtr()); 119 weak_factory_.GetWeakPtr());
124 } 120 }
125 121
126 private: 122 private:
127 bool last_frame_opaque_; 123 bool last_frame_opaque_;
128 media::VideoRotation last_frame_rotation_; 124 media::VideoRotation last_frame_rotation_;
129 bool received_first_frame_; 125 bool received_first_frame_;
130 126
131 #if defined(OS_ANDROID) 127 #if defined(OS_ANDROID)
132 bool render_frame_suspended_ = false; 128 bool render_frame_suspended_ = false;
133 #endif // defined(OS_ANDROID) 129 #endif // defined(OS_ANDROID)
134 130
135 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 131 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
136 const base::WeakPtr<WebMediaPlayerMS> player_; 132 const base::WeakPtr<WebMediaPlayerMS> player_;
137 const EnqueueFrameCallback enqueue_frame_cb_; 133 const MediaStreamVideoRenderer::RepaintCB enqueue_frame_cb_;
138 134
139 // Used for DCHECKs to ensure method calls executed on the correct thread, 135 // Used for DCHECKs to ensure method calls are executed on the correct thread.
140 // i.e. compositor thread. 136 base::ThreadChecker io_thread_checker_;
141 base::ThreadChecker compositor_thread_checker_;
142 137
143 base::WeakPtrFactory<FrameDeliverer> weak_factory_for_compositor_; 138 base::WeakPtrFactory<FrameDeliverer> weak_factory_;
144 139
145 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); 140 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
146 }; 141 };
147 142
148 WebMediaPlayerMS::WebMediaPlayerMS( 143 WebMediaPlayerMS::WebMediaPlayerMS(
149 blink::WebFrame* frame, 144 blink::WebFrame* frame,
150 blink::WebMediaPlayerClient* client, 145 blink::WebMediaPlayerClient* client,
151 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, 146 base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
152 media::MediaLog* media_log, 147 media::MediaLog* media_log,
153 std::unique_ptr<MediaStreamRendererFactory> factory, 148 std::unique_ptr<MediaStreamRendererFactory> factory,
154 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 149 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
155 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 150 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
156 const scoped_refptr<base::TaskRunner>& worker_task_runner, 151 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
152 scoped_refptr<base::TaskRunner> worker_task_runner,
157 media::GpuVideoAcceleratorFactories* gpu_factories, 153 media::GpuVideoAcceleratorFactories* gpu_factories,
158 const blink::WebString& sink_id, 154 const blink::WebString& sink_id,
159 const blink::WebSecurityOrigin& security_origin) 155 const blink::WebSecurityOrigin& security_origin)
160 : frame_(frame), 156 : frame_(frame),
161 network_state_(WebMediaPlayer::NetworkStateEmpty), 157 network_state_(WebMediaPlayer::NetworkStateEmpty),
162 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 158 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
163 buffered_(static_cast<size_t>(0)), 159 buffered_(static_cast<size_t>(0)),
164 client_(client), 160 client_(client),
165 delegate_(delegate), 161 delegate_(delegate),
166 delegate_id_(0), 162 delegate_id_(0),
167 paused_(true), 163 paused_(true),
168 video_rotation_(media::VIDEO_ROTATION_0), 164 video_rotation_(media::VIDEO_ROTATION_0),
169 media_log_(media_log), 165 media_log_(media_log),
170 renderer_factory_(std::move(factory)), 166 renderer_factory_(std::move(factory)),
167 io_task_runner_(io_task_runner),
168 compositor_task_runner_(compositor_task_runner),
171 media_task_runner_(media_task_runner), 169 media_task_runner_(media_task_runner),
172 worker_task_runner_(worker_task_runner), 170 worker_task_runner_(worker_task_runner),
173 gpu_factories_(gpu_factories), 171 gpu_factories_(gpu_factories),
174 compositor_task_runner_(compositor_task_runner),
175 initial_audio_output_device_id_(sink_id.utf8()), 172 initial_audio_output_device_id_(sink_id.utf8()),
176 initial_security_origin_(security_origin.isNull() 173 initial_security_origin_(security_origin.isNull()
177 ? url::Origin() 174 ? url::Origin()
178 : url::Origin(security_origin)), 175 : url::Origin(security_origin)),
179 volume_(1.0), 176 volume_(1.0),
180 volume_multiplier_(1.0), 177 volume_multiplier_(1.0),
181 should_play_upon_shown_(false) { 178 should_play_upon_shown_(false) {
182 DVLOG(1) << __func__; 179 DVLOG(1) << __func__;
183 DCHECK(client); 180 DCHECK(client);
184 if (delegate_) 181 if (delegate_)
185 delegate_id_ = delegate_->AddObserver(this); 182 delegate_id_ = delegate_->AddObserver(this);
186 183
187 media_log_->AddEvent( 184 media_log_->AddEvent(
188 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 185 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
189 } 186 }
190 187
191 WebMediaPlayerMS::~WebMediaPlayerMS() { 188 WebMediaPlayerMS::~WebMediaPlayerMS() {
192 DVLOG(1) << __func__; 189 DVLOG(1) << __func__;
193 DCHECK(thread_checker_.CalledOnValidThread()); 190 DCHECK(thread_checker_.CalledOnValidThread());
194 191
195 // Destruct compositor resources in the proper order. 192 // Destruct compositor resources in the proper order.
196 get_client()->setWebLayer(nullptr); 193 get_client()->setWebLayer(nullptr);
197 if (video_weblayer_) 194 if (video_weblayer_)
198 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); 195 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider();
199 196
200 if (frame_deliverer_) 197 if (frame_deliverer_)
201 compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); 198 io_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
202 199
203 if (compositor_) 200 if (compositor_)
204 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); 201 compositor_->StopUsingProvider();
205 202
206 if (video_frame_provider_) 203 if (video_frame_provider_)
207 video_frame_provider_->Stop(); 204 video_frame_provider_->Stop();
208 205
209 if (audio_renderer_) 206 if (audio_renderer_)
210 audio_renderer_->Stop(); 207 audio_renderer_->Stop();
211 208
212 media_log_->AddEvent( 209 media_log_->AddEvent(
213 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 210 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
214 211
215 if (delegate_) { 212 if (delegate_) {
216 delegate_->PlayerGone(delegate_id_); 213 delegate_->PlayerGone(delegate_id_);
217 delegate_->RemoveObserver(delegate_id_); 214 delegate_->RemoveObserver(delegate_id_);
218 } 215 }
219 } 216 }
220 217
221 void WebMediaPlayerMS::load(LoadType load_type, 218 void WebMediaPlayerMS::load(LoadType load_type,
222 const blink::WebMediaPlayerSource& source, 219 const blink::WebMediaPlayerSource& source,
223 CORSMode /*cors_mode*/) { 220 CORSMode /*cors_mode*/) {
224 DVLOG(1) << __func__; 221 DVLOG(1) << __func__;
225 DCHECK(thread_checker_.CalledOnValidThread()); 222 DCHECK(thread_checker_.CalledOnValidThread());
226 223
227 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) 224 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream)
228 // once Blink-side changes land. 225 // once Blink-side changes land.
229 DCHECK_NE(load_type, LoadTypeMediaSource); 226 DCHECK_NE(load_type, LoadTypeMediaSource);
230 blink::WebMediaStream web_stream = 227 blink::WebMediaStream web_stream =
231 GetWebMediaStreamFromWebMediaPlayerSource(source); 228 GetWebMediaStreamFromWebMediaPlayerSource(source);
232 229
233 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, 230 compositor_ = new WebMediaPlayerMSCompositor(compositor_task_runner_,
234 web_stream, AsWeakPtr())); 231 web_stream, AsWeakPtr());
235 232
236 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 233 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
237 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 234 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
238 std::string stream_id = 235 std::string stream_id =
239 web_stream.isNull() ? std::string() : web_stream.id().utf8(); 236 web_stream.isNull() ? std::string() : web_stream.id().utf8();
240 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); 237 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id));
241 238
242 // base::Unretained usage is safe here because |compositor_| is destroyed
243 // after |frame_deliverer_|.
244 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer( 239 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer(
245 AsWeakPtr(), base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, 240 AsWeakPtr(),
246 base::Unretained(compositor_.get())))); 241 base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, compositor_)));
247 video_frame_provider_ = renderer_factory_->GetVideoRenderer( 242 video_frame_provider_ = renderer_factory_->GetVideoRenderer(
248 web_stream, media::BindToCurrentLoop(base::Bind( 243 web_stream, media::BindToCurrentLoop(base::Bind(
249 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())), 244 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
250 frame_deliverer_->GetRepaintCallback(), compositor_task_runner_, 245 frame_deliverer_->GetRepaintCallback(), io_task_runner_,
251 media_task_runner_, worker_task_runner_, gpu_factories_); 246 media_task_runner_, worker_task_runner_, gpu_factories_);
252 247
253 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); 248 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_);
254 249
255 if (frame) { 250 if (frame) {
256 // Report UMA and RAPPOR metrics. 251 // Report UMA and RAPPOR metrics.
257 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL(); 252 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL();
258 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin()); 253 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin());
259 254
260 audio_renderer_ = renderer_factory_->GetAudioRenderer( 255 audio_renderer_ = renderer_factory_->GetAudioRenderer(
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 #if defined(OS_ANDROID) 507 #if defined(OS_ANDROID)
513 DCHECK(thread_checker_.CalledOnValidThread()); 508 DCHECK(thread_checker_.CalledOnValidThread());
514 509
515 // Method called when the RenderFrame is sent to background and suspended 510 // Method called when the RenderFrame is sent to background and suspended
516 // (android). Substitute the displayed VideoFrame with a copy to avoid 511 // (android). Substitute the displayed VideoFrame with a copy to avoid
517 // holding on to it unnecessarily. 512 // holding on to it unnecessarily.
518 // 513 //
519 // During undoable tab closures OnHidden() may be called back to back, so we 514 // During undoable tab closures OnHidden() may be called back to back, so we
520 // can't rely on |render_frame_suspended_| being false here. 515 // can't rely on |render_frame_suspended_| being false here.
521 if (frame_deliverer_) { 516 if (frame_deliverer_) {
522 compositor_task_runner_->PostTask( 517 io_task_runner_->PostTask(
523 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, 518 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended,
524 base::Unretained(frame_deliverer_.get()), true)); 519 base::Unretained(frame_deliverer_.get()), true));
525 } 520 }
526 521
527 if (!paused_) 522 if (!paused_)
528 compositor_->ReplaceCurrentFrameWithACopy(); 523 compositor_->ReplaceCurrentFrameWithACopy();
529 #endif // defined(OS_ANDROID) 524 #endif // defined(OS_ANDROID)
530 } 525 }
531 526
532 void WebMediaPlayerMS::OnShown() { 527 void WebMediaPlayerMS::OnShown() {
533 #if defined(OS_ANDROID) 528 #if defined(OS_ANDROID)
534 DCHECK(thread_checker_.CalledOnValidThread()); 529 DCHECK(thread_checker_.CalledOnValidThread());
535 530
536 if (frame_deliverer_) { 531 if (frame_deliverer_) {
537 compositor_task_runner_->PostTask( 532 io_task_runner_->PostTask(
538 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, 533 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended,
539 base::Unretained(frame_deliverer_.get()), false)); 534 base::Unretained(frame_deliverer_.get()), false));
540 } 535 }
541 536
542 // Resume playback on visibility. play() clears |should_play_upon_shown_|. 537 // Resume playback on visibility. play() clears |should_play_upon_shown_|.
543 if (should_play_upon_shown_) 538 if (should_play_upon_shown_)
544 play(); 539 play();
545 #endif // defined(OS_ANDROID) 540 #endif // defined(OS_ANDROID)
546 } 541 }
547 542
548 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { 543 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) {
549 #if defined(OS_ANDROID) 544 #if defined(OS_ANDROID)
550 if (!must_suspend) 545 if (!must_suspend)
551 return false; 546 return false;
552 547
553 if (!paused_) { 548 if (!paused_) {
554 pause(); 549 pause();
555 should_play_upon_shown_ = true; 550 should_play_upon_shown_ = true;
556 } 551 }
557 552
558 if (delegate_) 553 if (delegate_)
559 delegate_->PlayerGone(delegate_id_); 554 delegate_->PlayerGone(delegate_id_);
560 555
561 if (frame_deliverer_) { 556 if (frame_deliverer_) {
562 compositor_task_runner_->PostTask( 557 io_task_runner_->PostTask(
563 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, 558 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended,
564 base::Unretained(frame_deliverer_.get()), true)); 559 base::Unretained(frame_deliverer_.get()), true));
565 } 560 }
566 #endif // defined(OS_ANDROID) 561 #endif // defined(OS_ANDROID)
567 return true; 562 return true;
568 } 563 }
569 564
570 void WebMediaPlayerMS::OnPlay() { 565 void WebMediaPlayerMS::OnPlay() {
571 // TODO(perkj, magjed): It's not clear how WebRTC should work with an 566 // TODO(perkj, magjed): It's not clear how WebRTC should work with an
572 // MediaSession, until these issues are resolved, disable session controls. 567 // MediaSession, until these issues are resolved, disable session controls.
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 void WebMediaPlayerMS::ResetCanvasCache() { 670 void WebMediaPlayerMS::ResetCanvasCache() {
676 DCHECK(thread_checker_.CalledOnValidThread()); 671 DCHECK(thread_checker_.CalledOnValidThread());
677 video_renderer_.ResetCache(); 672 video_renderer_.ResetCache();
678 } 673 }
679 674
680 void WebMediaPlayerMS::TriggerResize() { 675 void WebMediaPlayerMS::TriggerResize() {
681 get_client()->sizeChanged(); 676 get_client()->sizeChanged();
682 } 677 }
683 678
684 } // namespace content 679 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/webmediaplayer_ms.h ('k') | content/renderer/media/webmediaplayer_ms_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698