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 |