OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |