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