Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: media/blink/webmediaplayer_impl.cc

Issue 1053113002: Prime the landing pad for the new video rendering pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix cast. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/blink/video_frame_compositor_unittest.cc ('k') | media/media.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/blink/video_frame_compositor_unittest.cc ('k') | media/media.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698