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 |