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 // Threaded compositing isn't enabled universally yet. | 136 compositor_task_runner_(params.compositor_task_runner()), |
137 compositor_task_runner_( | |
138 params.compositor_task_runner() | |
139 ? params.compositor_task_runner() | |
140 : base::MessageLoop::current()->task_runner()), | |
141 compositor_(new VideoFrameCompositor( | 137 compositor_(new VideoFrameCompositor( |
142 compositor_task_runner_, | |
143 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), | 138 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
144 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), | 139 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
145 encrypted_media_support_(cdm_factory, | 140 encrypted_media_support_(cdm_factory, |
146 client, | 141 client, |
147 params.media_permission(), | 142 params.media_permission(), |
148 base::Bind(&WebMediaPlayerImpl::SetCdm, | 143 base::Bind(&WebMediaPlayerImpl::SetCdm, |
149 AsWeakPtr(), | 144 AsWeakPtr(), |
150 base::Bind(&IgnoreCdmAttached))), | 145 base::Bind(&IgnoreCdmAttached))), |
151 renderer_factory_(renderer_factory.Pass()) { | 146 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 |
152 media_log_->AddEvent( | 151 media_log_->AddEvent( |
153 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 152 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
154 | 153 |
155 if (params.initial_cdm()) { | 154 if (params.initial_cdm()) { |
156 SetCdm(base::Bind(&IgnoreCdmAttached), | 155 SetCdm(base::Bind(&IgnoreCdmAttached), |
157 ToWebContentDecryptionModuleImpl(params.initial_cdm()) | 156 ToWebContentDecryptionModuleImpl(params.initial_cdm()) |
158 ->GetCdmContext()); | 157 ->GetCdmContext()); |
159 } | 158 } |
160 | 159 |
161 // 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... |
896 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 895 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
897 encrypted_media_init_data_cb, mse_log_cb, media_log_, true); | 896 encrypted_media_init_data_cb, mse_log_cb, media_log_, true); |
898 demuxer_.reset(chunk_demuxer_); | 897 demuxer_.reset(chunk_demuxer_); |
899 } | 898 } |
900 | 899 |
901 // ... and we're ready to go! | 900 // ... and we're ready to go! |
902 seeking_ = true; | 901 seeking_ = true; |
903 | 902 |
904 pipeline_.Start( | 903 pipeline_.Start( |
905 demuxer_.get(), | 904 demuxer_.get(), |
906 renderer_factory_->CreateRenderer( | 905 renderer_factory_->CreateRenderer(media_task_runner_, |
907 media_task_runner_, audio_source_provider_.get(), compositor_), | 906 audio_source_provider_.get()), |
908 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 907 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
909 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 908 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
910 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), | 909 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), |
911 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), | 910 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), |
912 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), | 911 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 |
983 static void GetCurrentFrameAndSignal( | 992 static void GetCurrentFrameAndSignal( |
984 VideoFrameCompositor* compositor, | 993 VideoFrameCompositor* compositor, |
985 scoped_refptr<VideoFrame>* video_frame_out, | 994 scoped_refptr<VideoFrame>* video_frame_out, |
986 base::WaitableEvent* event) { | 995 base::WaitableEvent* event) { |
987 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); | 996 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); |
988 *video_frame_out = compositor->GetCurrentFrameAndUpdateIfStale(); | 997 *video_frame_out = compositor->GetCurrentFrame(); |
989 event->Signal(); | 998 event->Signal(); |
990 } | 999 } |
991 | 1000 |
992 scoped_refptr<VideoFrame> | 1001 scoped_refptr<VideoFrame> |
993 WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { | 1002 WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { |
994 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); | 1003 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); |
995 if (compositor_task_runner_->BelongsToCurrentThread()) | 1004 if (compositor_task_runner_->BelongsToCurrentThread()) |
996 return compositor_->GetCurrentFrame(); | 1005 return compositor_->GetCurrentFrame(); |
997 | 1006 |
998 // Use a posted task and waitable event instead of a lock otherwise | 1007 // Use a posted task and waitable event instead of a lock otherwise |
(...skipping 14 matching lines...) Expand all Loading... |
1013 | 1022 |
1014 // pause() may be called after playback has ended and the HTMLMediaElement | 1023 // pause() may be called after playback has ended and the HTMLMediaElement |
1015 // requires that currentTime() == duration() after ending. We want to ensure | 1024 // requires that currentTime() == duration() after ending. We want to ensure |
1016 // |paused_time_| matches currentTime() in this case or a future seek() may | 1025 // |paused_time_| matches currentTime() in this case or a future seek() may |
1017 // incorrectly discard what it thinks is a seek to the existing time. | 1026 // incorrectly discard what it thinks is a seek to the existing time. |
1018 paused_time_ = | 1027 paused_time_ = |
1019 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); | 1028 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); |
1020 } | 1029 } |
1021 | 1030 |
1022 } // namespace media | 1031 } // namespace media |
OLD | NEW |