| 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 "media/blink/webmediaplayer_impl.h" | 5 #include "media/blink/webmediaplayer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 ended_(false), | 126 ended_(false), |
| 127 pending_seek_(false), | 127 pending_seek_(false), |
| 128 pending_seek_seconds_(0.0f), | 128 pending_seek_seconds_(0.0f), |
| 129 should_notify_time_changed_(false), | 129 should_notify_time_changed_(false), |
| 130 client_(client), | 130 client_(client), |
| 131 delegate_(delegate), | 131 delegate_(delegate), |
| 132 defer_load_cb_(params.defer_load_cb()), | 132 defer_load_cb_(params.defer_load_cb()), |
| 133 context_3d_cb_(params.context_3d_cb()), | 133 context_3d_cb_(params.context_3d_cb()), |
| 134 supports_save_(true), | 134 supports_save_(true), |
| 135 chunk_demuxer_(NULL), | 135 chunk_demuxer_(NULL), |
| 136 compositor_task_runner_(params.compositor_task_runner()), | 136 // Threaded compositing isn't enabled universally yet. |
| 137 compositor_task_runner_( |
| 138 params.compositor_task_runner() |
| 139 ? params.compositor_task_runner() |
| 140 : base::MessageLoop::current()->task_runner()), |
| 137 compositor_(new VideoFrameCompositor( | 141 compositor_(new VideoFrameCompositor( |
| 142 compositor_task_runner_, |
| 138 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), | 143 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
| 139 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), | 144 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
| 140 encrypted_media_support_(cdm_factory, | 145 encrypted_media_support_(cdm_factory, |
| 141 client, | 146 client, |
| 142 params.media_permission(), | 147 params.media_permission(), |
| 143 base::Bind(&WebMediaPlayerImpl::SetCdm, | 148 base::Bind(&WebMediaPlayerImpl::SetCdm, |
| 144 AsWeakPtr(), | 149 AsWeakPtr(), |
| 145 base::Bind(&IgnoreCdmAttached))), | 150 base::Bind(&IgnoreCdmAttached))), |
| 146 renderer_factory_(renderer_factory.Pass()) { | 151 renderer_factory_(renderer_factory.Pass()) { |
| 147 // Threaded compositing isn't enabled universally yet. | |
| 148 if (!compositor_task_runner_.get()) | |
| 149 compositor_task_runner_ = base::MessageLoopProxy::current(); | |
| 150 | |
| 151 media_log_->AddEvent( | 152 media_log_->AddEvent( |
| 152 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 153 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
| 153 | 154 |
| 154 if (params.initial_cdm()) { | 155 if (params.initial_cdm()) { |
| 155 SetCdm(base::Bind(&IgnoreCdmAttached), | 156 SetCdm(base::Bind(&IgnoreCdmAttached), |
| 156 ToWebContentDecryptionModuleImpl(params.initial_cdm()) | 157 ToWebContentDecryptionModuleImpl(params.initial_cdm()) |
| 157 ->GetCdmContext()); | 158 ->GetCdmContext()); |
| 158 } | 159 } |
| 159 | 160 |
| 160 // TODO(xhwang): When we use an external Renderer, many methods won't work, | 161 // TODO(xhwang): When we use an external Renderer, many methods won't work, |
| (...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 896 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
| 896 encrypted_media_init_data_cb, mse_log_cb, media_log_, true); | 897 encrypted_media_init_data_cb, mse_log_cb, media_log_, true); |
| 897 demuxer_.reset(chunk_demuxer_); | 898 demuxer_.reset(chunk_demuxer_); |
| 898 } | 899 } |
| 899 | 900 |
| 900 // ... and we're ready to go! | 901 // ... and we're ready to go! |
| 901 seeking_ = true; | 902 seeking_ = true; |
| 902 | 903 |
| 903 pipeline_.Start( | 904 pipeline_.Start( |
| 904 demuxer_.get(), | 905 demuxer_.get(), |
| 905 renderer_factory_->CreateRenderer(media_task_runner_, | 906 renderer_factory_->CreateRenderer( |
| 906 audio_source_provider_.get()), | 907 media_task_runner_, audio_source_provider_.get(), compositor_), |
| 907 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 908 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
| 908 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 909 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
| 909 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), | 910 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), |
| 910 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), | 911 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), |
| 911 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), | 912 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), |
| 912 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), | |
| 913 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), | 913 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), |
| 914 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack), | 914 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack), |
| 915 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnWaitingForDecryptionKey)); | 915 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnWaitingForDecryptionKey)); |
| 916 } | 916 } |
| 917 | 917 |
| 918 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { | 918 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { |
| 919 DVLOG(1) << __FUNCTION__ << "(" << state << ")"; | 919 DVLOG(1) << __FUNCTION__ << "(" << state << ")"; |
| 920 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 920 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 921 network_state_ = state; | 921 network_state_ = state; |
| 922 // Always notify to ensure client has the latest value. | 922 // Always notify to ensure client has the latest value. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 | 973 |
| 974 void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { | 974 void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { |
| 975 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 975 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 976 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 976 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
| 977 | 977 |
| 978 opaque_ = opaque; | 978 opaque_ = opaque; |
| 979 if (video_weblayer_) | 979 if (video_weblayer_) |
| 980 video_weblayer_->setOpaque(opaque_); | 980 video_weblayer_->setOpaque(opaque_); |
| 981 } | 981 } |
| 982 | 982 |
| 983 void WebMediaPlayerImpl::FrameReady( | |
| 984 const scoped_refptr<VideoFrame>& frame) { | |
| 985 compositor_task_runner_->PostTask( | |
| 986 FROM_HERE, | |
| 987 base::Bind(&VideoFrameCompositor::UpdateCurrentFrame, | |
| 988 base::Unretained(compositor_), | |
| 989 frame)); | |
| 990 } | |
| 991 | |
| 992 static void GetCurrentFrameAndSignal( | 983 static void GetCurrentFrameAndSignal( |
| 993 VideoFrameCompositor* compositor, | 984 VideoFrameCompositor* compositor, |
| 994 scoped_refptr<VideoFrame>* video_frame_out, | 985 scoped_refptr<VideoFrame>* video_frame_out, |
| 995 base::WaitableEvent* event) { | 986 base::WaitableEvent* event) { |
| 996 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); | 987 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); |
| 997 *video_frame_out = compositor->GetCurrentFrame(); | 988 *video_frame_out = compositor->GetCurrentFrameAndUpdateIfStale(); |
| 998 event->Signal(); | 989 event->Signal(); |
| 999 } | 990 } |
| 1000 | 991 |
| 1001 scoped_refptr<VideoFrame> | 992 scoped_refptr<VideoFrame> |
| 1002 WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { | 993 WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { |
| 1003 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); | 994 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); |
| 1004 if (compositor_task_runner_->BelongsToCurrentThread()) | 995 if (compositor_task_runner_->BelongsToCurrentThread()) |
| 1005 return compositor_->GetCurrentFrame(); | 996 return compositor_->GetCurrentFrame(); |
| 1006 | 997 |
| 1007 // Use a posted task and waitable event instead of a lock otherwise | 998 // Use a posted task and waitable event instead of a lock otherwise |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1022 | 1013 |
| 1023 // pause() may be called after playback has ended and the HTMLMediaElement | 1014 // pause() may be called after playback has ended and the HTMLMediaElement |
| 1024 // requires that currentTime() == duration() after ending. We want to ensure | 1015 // requires that currentTime() == duration() after ending. We want to ensure |
| 1025 // |paused_time_| matches currentTime() in this case or a future seek() may | 1016 // |paused_time_| matches currentTime() in this case or a future seek() may |
| 1026 // incorrectly discard what it thinks is a seek to the existing time. | 1017 // incorrectly discard what it thinks is a seek to the existing time. |
| 1027 paused_time_ = | 1018 paused_time_ = |
| 1028 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); | 1019 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); |
| 1029 } | 1020 } |
| 1030 | 1021 |
| 1031 } // namespace media | 1022 } // namespace media |
| OLD | NEW |