| 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 |