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> |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 worker_task_runner_(worker_task_runner), | 63 worker_task_runner_(worker_task_runner), |
64 gpu_factories_(gpu_factories), | 64 gpu_factories_(gpu_factories), |
65 compositor_task_runner_(compositor_task_runner), | 65 compositor_task_runner_(compositor_task_runner), |
66 initial_audio_output_device_id_(sink_id.utf8()), | 66 initial_audio_output_device_id_(sink_id.utf8()), |
67 initial_security_origin_(security_origin.isNull() | 67 initial_security_origin_(security_origin.isNull() |
68 ? url::Origin() | 68 ? url::Origin() |
69 : url::Origin(security_origin)), | 69 : url::Origin(security_origin)), |
70 volume_(1.0), | 70 volume_(1.0), |
71 volume_multiplier_(1.0), | 71 volume_multiplier_(1.0), |
72 should_play_upon_shown_(false) { | 72 should_play_upon_shown_(false) { |
73 DVLOG(1) << __FUNCTION__; | 73 DVLOG(1) << __func__; |
74 DCHECK(client); | 74 DCHECK(client); |
75 if (delegate_) | 75 if (delegate_) |
76 delegate_id_ = delegate_->AddObserver(this); | 76 delegate_id_ = delegate_->AddObserver(this); |
77 | 77 |
78 media_log_->AddEvent( | 78 media_log_->AddEvent( |
79 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 79 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
80 } | 80 } |
81 | 81 |
82 WebMediaPlayerMS::~WebMediaPlayerMS() { | 82 WebMediaPlayerMS::~WebMediaPlayerMS() { |
83 DVLOG(1) << __FUNCTION__; | 83 DVLOG(1) << __func__; |
84 DCHECK(thread_checker_.CalledOnValidThread()); | 84 DCHECK(thread_checker_.CalledOnValidThread()); |
85 | 85 |
86 // Destruct compositor resources in the proper order. | 86 // Destruct compositor resources in the proper order. |
87 get_client()->setWebLayer(nullptr); | 87 get_client()->setWebLayer(nullptr); |
88 if (video_weblayer_) | 88 if (video_weblayer_) |
89 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); | 89 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); |
90 if (compositor_) | 90 if (compositor_) |
91 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); | 91 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); |
92 | 92 |
93 if (video_frame_provider_) | 93 if (video_frame_provider_) |
94 video_frame_provider_->Stop(); | 94 video_frame_provider_->Stop(); |
95 | 95 |
96 if (audio_renderer_) | 96 if (audio_renderer_) |
97 audio_renderer_->Stop(); | 97 audio_renderer_->Stop(); |
98 | 98 |
99 media_log_->AddEvent( | 99 media_log_->AddEvent( |
100 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); | 100 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); |
101 | 101 |
102 if (delegate_) { | 102 if (delegate_) { |
103 delegate_->PlayerGone(delegate_id_); | 103 delegate_->PlayerGone(delegate_id_); |
104 delegate_->RemoveObserver(delegate_id_); | 104 delegate_->RemoveObserver(delegate_id_); |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 void WebMediaPlayerMS::load(LoadType load_type, | 108 void WebMediaPlayerMS::load(LoadType load_type, |
109 const blink::WebMediaPlayerSource& source, | 109 const blink::WebMediaPlayerSource& source, |
110 CORSMode /*cors_mode*/) { | 110 CORSMode /*cors_mode*/) { |
111 DVLOG(1) << __FUNCTION__; | 111 DVLOG(1) << __func__; |
112 DCHECK(thread_checker_.CalledOnValidThread()); | 112 DCHECK(thread_checker_.CalledOnValidThread()); |
113 | 113 |
114 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) | 114 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) |
115 // once Blink-side changes land. | 115 // once Blink-side changes land. |
116 DCHECK_NE(load_type, LoadTypeMediaSource); | 116 DCHECK_NE(load_type, LoadTypeMediaSource); |
117 blink::WebMediaStream web_stream = | 117 blink::WebMediaStream web_stream = |
118 GetWebMediaStreamFromWebMediaPlayerSource(source); | 118 GetWebMediaStreamFromWebMediaPlayerSource(source); |
119 | 119 |
120 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, | 120 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, |
121 web_stream, AsWeakPtr())); | 121 web_stream, AsWeakPtr())); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 if (video_frame_provider_) | 155 if (video_frame_provider_) |
156 video_frame_provider_->Start(); | 156 video_frame_provider_->Start(); |
157 if (audio_renderer_ && !video_frame_provider_) { | 157 if (audio_renderer_ && !video_frame_provider_) { |
158 // This is audio-only mode. | 158 // This is audio-only mode. |
159 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 159 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
160 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 160 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
161 } | 161 } |
162 } | 162 } |
163 | 163 |
164 void WebMediaPlayerMS::play() { | 164 void WebMediaPlayerMS::play() { |
165 DVLOG(1) << __FUNCTION__; | 165 DVLOG(1) << __func__; |
166 DCHECK(thread_checker_.CalledOnValidThread()); | 166 DCHECK(thread_checker_.CalledOnValidThread()); |
167 | 167 |
168 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); | 168 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); |
169 if (!paused_) | 169 if (!paused_) |
170 return; | 170 return; |
171 | 171 |
172 if (video_frame_provider_) | 172 if (video_frame_provider_) |
173 video_frame_provider_->Resume(); | 173 video_frame_provider_->Resume(); |
174 | 174 |
175 compositor_->StartRendering(); | 175 compositor_->StartRendering(); |
176 | 176 |
177 if (audio_renderer_) | 177 if (audio_renderer_) |
178 audio_renderer_->Play(); | 178 audio_renderer_->Play(); |
179 | 179 |
180 if (delegate_) { | 180 if (delegate_) { |
181 // TODO(perkj, magjed): We send a duration of 1 second here to avoid | 181 // TODO(perkj, magjed): We send a duration of 1 second here to avoid |
182 // creating an interactive media session on Android. We'd like to use zero | 182 // creating an interactive media session on Android. We'd like to use zero |
183 // here, but that is treated as an unknown duration and assumed to be | 183 // here, but that is treated as an unknown duration and assumed to be |
184 // interactive. See http://crbug.com/595297 for more details. | 184 // interactive. See http://crbug.com/595297 for more details. |
185 delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false, | 185 delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false, |
186 base::TimeDelta::FromSeconds(1)); | 186 base::TimeDelta::FromSeconds(1)); |
187 } | 187 } |
188 | 188 |
189 paused_ = false; | 189 paused_ = false; |
190 } | 190 } |
191 | 191 |
192 void WebMediaPlayerMS::pause() { | 192 void WebMediaPlayerMS::pause() { |
193 DVLOG(1) << __FUNCTION__; | 193 DVLOG(1) << __func__; |
194 DCHECK(thread_checker_.CalledOnValidThread()); | 194 DCHECK(thread_checker_.CalledOnValidThread()); |
195 | 195 |
196 should_play_upon_shown_ = false; | 196 should_play_upon_shown_ = false; |
197 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); | 197 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); |
198 if (paused_) | 198 if (paused_) |
199 return; | 199 return; |
200 | 200 |
201 if (video_frame_provider_) | 201 if (video_frame_provider_) |
202 video_frame_provider_->Pause(); | 202 video_frame_provider_->Pause(); |
203 | 203 |
(...skipping 16 matching lines...) Expand all Loading... |
220 | 220 |
221 void WebMediaPlayerMS::seek(double seconds) { | 221 void WebMediaPlayerMS::seek(double seconds) { |
222 DCHECK(thread_checker_.CalledOnValidThread()); | 222 DCHECK(thread_checker_.CalledOnValidThread()); |
223 } | 223 } |
224 | 224 |
225 void WebMediaPlayerMS::setRate(double rate) { | 225 void WebMediaPlayerMS::setRate(double rate) { |
226 DCHECK(thread_checker_.CalledOnValidThread()); | 226 DCHECK(thread_checker_.CalledOnValidThread()); |
227 } | 227 } |
228 | 228 |
229 void WebMediaPlayerMS::setVolume(double volume) { | 229 void WebMediaPlayerMS::setVolume(double volume) { |
230 DVLOG(1) << __FUNCTION__ << "(volume=" << volume << ")"; | 230 DVLOG(1) << __func__ << "(volume=" << volume << ")"; |
231 DCHECK(thread_checker_.CalledOnValidThread()); | 231 DCHECK(thread_checker_.CalledOnValidThread()); |
232 volume_ = volume; | 232 volume_ = volume; |
233 if (audio_renderer_.get()) | 233 if (audio_renderer_.get()) |
234 audio_renderer_->SetVolume(volume_ * volume_multiplier_); | 234 audio_renderer_->SetVolume(volume_ * volume_multiplier_); |
235 } | 235 } |
236 | 236 |
237 void WebMediaPlayerMS::setSinkId( | 237 void WebMediaPlayerMS::setSinkId( |
238 const blink::WebString& sink_id, | 238 const blink::WebString& sink_id, |
239 const blink::WebSecurityOrigin& security_origin, | 239 const blink::WebSecurityOrigin& security_origin, |
240 blink::WebSetSinkIdCallbacks* web_callback) { | 240 blink::WebSetSinkIdCallbacks* web_callback) { |
241 DVLOG(1) << __FUNCTION__; | 241 DVLOG(1) << __func__; |
242 DCHECK(thread_checker_.CalledOnValidThread()); | 242 DCHECK(thread_checker_.CalledOnValidThread()); |
243 const media::OutputDeviceStatusCB callback = | 243 const media::OutputDeviceStatusCB callback = |
244 media::ConvertToOutputDeviceStatusCB(web_callback); | 244 media::ConvertToOutputDeviceStatusCB(web_callback); |
245 if (audio_renderer_) { | 245 if (audio_renderer_) { |
246 audio_renderer_->SwitchOutputDevice(sink_id.utf8(), security_origin, | 246 audio_renderer_->SwitchOutputDevice(sink_id.utf8(), security_origin, |
247 callback); | 247 callback); |
248 } else { | 248 } else { |
249 callback.Run(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL); | 249 callback.Run(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL); |
250 } | 250 } |
251 } | 251 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 DCHECK(thread_checker_.CalledOnValidThread()); | 293 DCHECK(thread_checker_.CalledOnValidThread()); |
294 const base::TimeDelta current_time = compositor_->GetCurrentTime(); | 294 const base::TimeDelta current_time = compositor_->GetCurrentTime(); |
295 if (current_time.ToInternalValue() != 0) | 295 if (current_time.ToInternalValue() != 0) |
296 return current_time.InSecondsF(); | 296 return current_time.InSecondsF(); |
297 else if (audio_renderer_.get()) | 297 else if (audio_renderer_.get()) |
298 return audio_renderer_->GetCurrentRenderTime().InSecondsF(); | 298 return audio_renderer_->GetCurrentRenderTime().InSecondsF(); |
299 return 0.0; | 299 return 0.0; |
300 } | 300 } |
301 | 301 |
302 blink::WebMediaPlayer::NetworkState WebMediaPlayerMS::getNetworkState() const { | 302 blink::WebMediaPlayer::NetworkState WebMediaPlayerMS::getNetworkState() const { |
303 DVLOG(1) << __FUNCTION__ << ", state:" << network_state_; | 303 DVLOG(1) << __func__ << ", state:" << network_state_; |
304 DCHECK(thread_checker_.CalledOnValidThread()); | 304 DCHECK(thread_checker_.CalledOnValidThread()); |
305 return network_state_; | 305 return network_state_; |
306 } | 306 } |
307 | 307 |
308 blink::WebMediaPlayer::ReadyState WebMediaPlayerMS::getReadyState() const { | 308 blink::WebMediaPlayer::ReadyState WebMediaPlayerMS::getReadyState() const { |
309 DVLOG(1) << __FUNCTION__ << ", state:" << ready_state_; | 309 DVLOG(1) << __func__ << ", state:" << ready_state_; |
310 DCHECK(thread_checker_.CalledOnValidThread()); | 310 DCHECK(thread_checker_.CalledOnValidThread()); |
311 return ready_state_; | 311 return ready_state_; |
312 } | 312 } |
313 | 313 |
314 blink::WebString WebMediaPlayerMS::getErrorMessage() { | 314 blink::WebString WebMediaPlayerMS::getErrorMessage() { |
315 return blink::WebString::fromUTF8(media_log_->GetLastErrorMessage()); | 315 return blink::WebString::fromUTF8(media_log_->GetLastErrorMessage()); |
316 } | 316 } |
317 | 317 |
318 blink::WebTimeRanges WebMediaPlayerMS::buffered() const { | 318 blink::WebTimeRanges WebMediaPlayerMS::buffered() const { |
319 DCHECK(thread_checker_.CalledOnValidThread()); | 319 DCHECK(thread_checker_.CalledOnValidThread()); |
320 return buffered_; | 320 return buffered_; |
321 } | 321 } |
322 | 322 |
323 blink::WebTimeRanges WebMediaPlayerMS::seekable() const { | 323 blink::WebTimeRanges WebMediaPlayerMS::seekable() const { |
324 DCHECK(thread_checker_.CalledOnValidThread()); | 324 DCHECK(thread_checker_.CalledOnValidThread()); |
325 return blink::WebTimeRanges(); | 325 return blink::WebTimeRanges(); |
326 } | 326 } |
327 | 327 |
328 bool WebMediaPlayerMS::didLoadingProgress() { | 328 bool WebMediaPlayerMS::didLoadingProgress() { |
329 DCHECK(thread_checker_.CalledOnValidThread()); | 329 DCHECK(thread_checker_.CalledOnValidThread()); |
330 return true; | 330 return true; |
331 } | 331 } |
332 | 332 |
333 void WebMediaPlayerMS::paint(blink::WebCanvas* canvas, | 333 void WebMediaPlayerMS::paint(blink::WebCanvas* canvas, |
334 const blink::WebRect& rect, | 334 const blink::WebRect& rect, |
335 unsigned char alpha, | 335 unsigned char alpha, |
336 SkXfermode::Mode mode) { | 336 SkXfermode::Mode mode) { |
337 DVLOG(3) << __FUNCTION__; | 337 DVLOG(3) << __func__; |
338 DCHECK(thread_checker_.CalledOnValidThread()); | 338 DCHECK(thread_checker_.CalledOnValidThread()); |
339 | 339 |
340 const scoped_refptr<media::VideoFrame> frame = | 340 const scoped_refptr<media::VideoFrame> frame = |
341 compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 341 compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
342 | 342 |
343 media::Context3D context_3d; | 343 media::Context3D context_3d; |
344 if (frame && frame->HasTextures()) { | 344 if (frame && frame->HasTextures()) { |
345 auto* provider = | 345 auto* provider = |
346 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); | 346 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); |
347 // GPU Process crashed. | 347 // GPU Process crashed. |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 return false; | 476 return false; |
477 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); | 477 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); |
478 DCHECK(context_3d.gl); | 478 DCHECK(context_3d.gl); |
479 return video_renderer_.CopyVideoFrameTexturesToGLTexture( | 479 return video_renderer_.CopyVideoFrameTexturesToGLTexture( |
480 context_3d, gl, video_frame.get(), texture, internal_format, type, | 480 context_3d, gl, video_frame.get(), texture, internal_format, type, |
481 premultiply_alpha, flip_y); | 481 premultiply_alpha, flip_y); |
482 } | 482 } |
483 | 483 |
484 void WebMediaPlayerMS::OnFrameAvailable( | 484 void WebMediaPlayerMS::OnFrameAvailable( |
485 const scoped_refptr<media::VideoFrame>& frame) { | 485 const scoped_refptr<media::VideoFrame>& frame) { |
486 DVLOG(3) << __FUNCTION__; | 486 DVLOG(3) << __func__; |
487 DCHECK(thread_checker_.CalledOnValidThread()); | 487 DCHECK(thread_checker_.CalledOnValidThread()); |
488 | 488 |
489 if (render_frame_suspended_) | 489 if (render_frame_suspended_) |
490 return; | 490 return; |
491 | 491 |
492 base::TimeTicks render_time; | 492 base::TimeTicks render_time; |
493 if (frame->metadata()->GetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME, | 493 if (frame->metadata()->GetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME, |
494 &render_time)) { | 494 &render_time)) { |
495 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", | 495 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", |
496 "Ideal Render Instant", render_time.ToInternalValue()); | 496 "Ideal Render Instant", render_time.ToInternalValue()); |
(...skipping 15 matching lines...) Expand all Loading... |
512 video_weblayer_->layer()->SetContentsOpaque(false); | 512 video_weblayer_->layer()->SetContentsOpaque(false); |
513 video_weblayer_->SetContentsOpaqueIsFixed(true); | 513 video_weblayer_->SetContentsOpaqueIsFixed(true); |
514 get_client()->setWebLayer(video_weblayer_.get()); | 514 get_client()->setWebLayer(video_weblayer_.get()); |
515 } | 515 } |
516 } | 516 } |
517 | 517 |
518 compositor_->EnqueueFrame(frame); | 518 compositor_->EnqueueFrame(frame); |
519 } | 519 } |
520 | 520 |
521 void WebMediaPlayerMS::RepaintInternal() { | 521 void WebMediaPlayerMS::RepaintInternal() { |
522 DVLOG(1) << __FUNCTION__; | 522 DVLOG(1) << __func__; |
523 DCHECK(thread_checker_.CalledOnValidThread()); | 523 DCHECK(thread_checker_.CalledOnValidThread()); |
524 get_client()->repaint(); | 524 get_client()->repaint(); |
525 } | 525 } |
526 | 526 |
527 void WebMediaPlayerMS::OnSourceError() { | 527 void WebMediaPlayerMS::OnSourceError() { |
528 DCHECK(thread_checker_.CalledOnValidThread()); | 528 DCHECK(thread_checker_.CalledOnValidThread()); |
529 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); | 529 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); |
530 RepaintInternal(); | 530 RepaintInternal(); |
531 } | 531 } |
532 | 532 |
(...skipping 18 matching lines...) Expand all Loading... |
551 void WebMediaPlayerMS::ResetCanvasCache() { | 551 void WebMediaPlayerMS::ResetCanvasCache() { |
552 DCHECK(thread_checker_.CalledOnValidThread()); | 552 DCHECK(thread_checker_.CalledOnValidThread()); |
553 video_renderer_.ResetCache(); | 553 video_renderer_.ResetCache(); |
554 } | 554 } |
555 | 555 |
556 void WebMediaPlayerMS::TriggerResize() { | 556 void WebMediaPlayerMS::TriggerResize() { |
557 get_client()->sizeChanged(); | 557 get_client()->sizeChanged(); |
558 } | 558 } |
559 | 559 |
560 } // namespace content | 560 } // namespace content |
OLD | NEW |