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

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

Issue 11468033: Vanquish the remnants of media::MessageLoopFactory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "webkit/media/webmediaplayer_impl.h" 5 #include "webkit/media/webmediaplayer_impl.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 // are really necessary. 115 // are really necessary.
116 typedef base::Callback<void(const std::string&, 116 typedef base::Callback<void(const std::string&,
117 const std::string&, 117 const std::string&,
118 scoped_array<uint8>, 118 scoped_array<uint8>,
119 int)> OnNeedKeyCB; 119 int)> OnNeedKeyCB;
120 120
121 WebMediaPlayerImpl::WebMediaPlayerImpl( 121 WebMediaPlayerImpl::WebMediaPlayerImpl(
122 WebKit::WebFrame* frame, 122 WebKit::WebFrame* frame,
123 WebKit::WebMediaPlayerClient* client, 123 WebKit::WebMediaPlayerClient* client,
124 base::WeakPtr<WebMediaPlayerDelegate> delegate, 124 base::WeakPtr<WebMediaPlayerDelegate> delegate,
125 media::FilterCollection* collection,
126 WebKit::WebAudioSourceProvider* audio_source_provider, 125 WebKit::WebAudioSourceProvider* audio_source_provider,
127 media::AudioRendererSink* audio_renderer_sink, 126 media::AudioRendererSink* audio_renderer_sink,
128 media::MessageLoopFactory* message_loop_factory, 127 const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories,
129 MediaStreamClient* media_stream_client, 128 MediaStreamClient* media_stream_client,
130 media::MediaLog* media_log) 129 media::MediaLog* media_log)
131 : frame_(frame), 130 : frame_(frame),
132 network_state_(WebMediaPlayer::NetworkStateEmpty), 131 network_state_(WebMediaPlayer::NetworkStateEmpty),
133 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 132 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
134 main_loop_(MessageLoop::current()), 133 main_loop_(MessageLoop::current()),
135 filter_collection_(collection), 134 filter_collection_(new media::FilterCollection()),
136 message_loop_factory_(message_loop_factory), 135 media_thread_("MediaPipeline"),
137 paused_(true), 136 paused_(true),
138 seeking_(false), 137 seeking_(false),
139 playback_rate_(0.0f), 138 playback_rate_(0.0f),
140 pending_seek_(false), 139 pending_seek_(false),
141 pending_seek_seconds_(0.0f), 140 pending_seek_seconds_(0.0f),
142 client_(client), 141 client_(client),
143 proxy_(new WebMediaPlayerProxy(main_loop_->message_loop_proxy(), this)), 142 proxy_(new WebMediaPlayerProxy(main_loop_->message_loop_proxy(), this)),
144 delegate_(delegate), 143 delegate_(delegate),
145 media_stream_client_(media_stream_client), 144 media_stream_client_(media_stream_client),
146 media_log_(media_log), 145 media_log_(media_log),
147 accelerated_compositing_reported_(false), 146 accelerated_compositing_reported_(false),
148 incremented_externally_allocated_memory_(false), 147 incremented_externally_allocated_memory_(false),
149 audio_source_provider_(audio_source_provider), 148 audio_source_provider_(audio_source_provider),
150 audio_renderer_sink_(audio_renderer_sink), 149 audio_renderer_sink_(audio_renderer_sink),
151 is_local_source_(false), 150 is_local_source_(false),
152 supports_save_(true), 151 supports_save_(true),
153 starting_(false) { 152 starting_(false) {
154 media_log_->AddEvent( 153 media_log_->AddEvent(
155 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 154 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
156 155
157 scoped_refptr<base::MessageLoopProxy> pipeline_message_loop = 156 CHECK(media_thread_.Start());
158 message_loop_factory_->GetMessageLoop( 157 pipeline_ = new media::Pipeline(
159 media::MessageLoopFactory::kPipeline); 158 media_thread_.message_loop_proxy(), media_log_);
160 pipeline_ = new media::Pipeline(pipeline_message_loop, media_log_); 159
160 decryptor_.reset(new ProxyDecryptor(
161 media_thread_.message_loop_proxy(), proxy_.get(), client, frame));
161 162
162 // Let V8 know we started new thread if we did not did it yet. 163 // Let V8 know we started new thread if we did not did it yet.
163 // Made separate task to avoid deletion of player currently being created. 164 // Made separate task to avoid deletion of player currently being created.
164 // Also, delaying GC until after player starts gets rid of starting lag -- 165 // Also, delaying GC until after player starts gets rid of starting lag --
165 // collection happens in parallel with playing. 166 // collection happens in parallel with playing.
166 // 167 //
167 // TODO(enal): remove when we get rid of per-audio-stream thread. 168 // TODO(enal): remove when we get rid of per-audio-stream thread.
168 MessageLoop::current()->PostTask( 169 MessageLoop::current()->PostTask(
169 FROM_HERE, 170 FROM_HERE,
170 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, 171 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory,
171 AsWeakPtr())); 172 AsWeakPtr()));
172 173
173 // Also we want to be notified of |main_loop_| destruction. 174 // Also we want to be notified of |main_loop_| destruction.
174 main_loop_->AddDestructionObserver(this); 175 main_loop_->AddDestructionObserver(this);
175 176
177 // Create the GPU video decoder if factories were provided.
178 if (gpu_factories) {
179 filter_collection_->GetVideoDecoders()->push_back(
180 new media::GpuVideoDecoder(
181 media_thread_.message_loop_proxy(),
182 gpu_factories));
183 }
184
176 // Create default video renderer. 185 // Create default video renderer.
177 scoped_refptr<media::VideoRendererBase> video_renderer = 186 scoped_refptr<media::VideoRendererBase> video_renderer =
178 new media::VideoRendererBase( 187 new media::VideoRendererBase(
179 pipeline_message_loop, 188 media_thread_.message_loop_proxy(),
180 base::Bind(&WebMediaPlayerProxy::Repaint, proxy_), 189 base::Bind(&WebMediaPlayerProxy::Repaint, proxy_),
181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), 190 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque),
182 true); 191 true);
183 filter_collection_->AddVideoRenderer(video_renderer); 192 filter_collection_->AddVideoRenderer(video_renderer);
184 proxy_->set_frame_provider(video_renderer); 193 proxy_->set_frame_provider(video_renderer);
185 194
186 // Create default audio renderer. 195 // Create default audio renderer using the null sink if no sink was provided.
196 if (!audio_renderer_sink) {
acolwell GONE FROM CHROMIUM 2012/12/10 18:12:16 Why are these audio changes included in this CL?
197 audio_renderer_sink = new media::NullAudioSink();
198 }
187 filter_collection_->AddAudioRenderer( 199 filter_collection_->AddAudioRenderer(
188 new media::AudioRendererImpl(new media::NullAudioSink())); 200 new media::AudioRendererImpl(audio_renderer_sink));
189 201
190 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) { 202 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) {
191 decryptor_.reset(new ProxyDecryptor(message_loop_factory_->GetMessageLoop( 203 decryptor_.reset(new ProxyDecryptor(
192 media::MessageLoopFactory::kPipeline), proxy_.get(), client, frame)); 204 media_thread_.message_loop_proxy(), proxy_.get(), client, frame));
193 } 205 }
194 } 206 }
195 207
196 WebMediaPlayerImpl::~WebMediaPlayerImpl() { 208 WebMediaPlayerImpl::~WebMediaPlayerImpl() {
197 DCHECK_EQ(main_loop_, MessageLoop::current()); 209 DCHECK_EQ(main_loop_, MessageLoop::current());
198 Destroy(); 210 Destroy();
199 media_log_->AddEvent( 211 media_log_->AddEvent(
200 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 212 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
201 213
202 if (delegate_) 214 if (delegate_)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(gurl), kMaxURLScheme); 262 UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(gurl), kMaxURLScheme);
251 263
252 // Handle any volume/preload changes that occured before load(). 264 // Handle any volume/preload changes that occured before load().
253 setVolume(GetClient()->volume()); 265 setVolume(GetClient()->volume());
254 setPreload(GetClient()->preload()); 266 setPreload(GetClient()->preload());
255 267
256 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 268 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
257 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 269 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
258 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); 270 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
259 271
260 scoped_refptr<base::MessageLoopProxy> message_loop =
261 message_loop_factory_->GetMessageLoop(
262 media::MessageLoopFactory::kPipeline);
263
264 // Media streams pipelines can start immediately. 272 // Media streams pipelines can start immediately.
265 if (BuildMediaStreamCollection(url, media_stream_client_, 273 if (BuildMediaStreamCollection(url, media_stream_client_,
266 message_loop, 274 media_thread_.message_loop_proxy(),
267 filter_collection_.get())) { 275 filter_collection_.get())) {
268 supports_save_ = false; 276 supports_save_ = false;
269 StartPipeline(); 277 StartPipeline();
270 return; 278 return;
271 } 279 }
272 280
273 // Media source pipelines can start immediately. 281 // Media source pipelines can start immediately.
274 if (!url.isEmpty() && url == GetClient()->sourceURL()) { 282 if (!url.isEmpty() && url == GetClient()->sourceURL()) {
275 chunk_demuxer_ = new media::ChunkDemuxer( 283 chunk_demuxer_ = new media::ChunkDemuxer(
276 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), 284 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened),
277 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")); 285 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""));
278 286
279 BuildMediaSourceCollection(chunk_demuxer_, 287 BuildMediaSourceCollection(chunk_demuxer_,
280 message_loop, 288 media_thread_.message_loop_proxy(),
281 filter_collection_.get(), 289 filter_collection_.get(),
282 decryptor_.get()); 290 decryptor_.get());
283 supports_save_ = false; 291 supports_save_ = false;
284 StartPipeline(); 292 StartPipeline();
285 return; 293 return;
286 } 294 }
287 295
288 // Otherwise it's a regular request which requires resolving the URL first. 296 // Otherwise it's a regular request which requires resolving the URL first.
289 proxy_->set_data_source( 297 proxy_->set_data_source(
290 new BufferedDataSource(main_loop_, frame_, media_log_, 298 new BufferedDataSource(main_loop_, frame_, media_log_,
291 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, 299 base::Bind(&WebMediaPlayerImpl::NotifyDownloading,
292 AsWeakPtr()))); 300 AsWeakPtr())));
293 proxy_->data_source()->Initialize( 301 proxy_->data_source()->Initialize(
294 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), 302 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode),
295 base::Bind( 303 base::Bind(
296 &WebMediaPlayerImpl::DataSourceInitialized, 304 &WebMediaPlayerImpl::DataSourceInitialized,
297 AsWeakPtr(), gurl)); 305 AsWeakPtr(), gurl));
298 306
299 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); 307 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https");
300 308
301 BuildDefaultCollection(proxy_->data_source(), 309 BuildDefaultCollection(proxy_->data_source(),
302 message_loop, 310 media_thread_.message_loop_proxy(),
303 filter_collection_.get(), 311 filter_collection_.get(),
304 decryptor_.get()); 312 decryptor_.get());
305 } 313 }
306 314
307 void WebMediaPlayerImpl::cancelLoad() { 315 void WebMediaPlayerImpl::cancelLoad() {
308 DCHECK_EQ(main_loop_, MessageLoop::current()); 316 DCHECK_EQ(main_loop_, MessageLoop::current());
309 } 317 }
310 318
311 void WebMediaPlayerImpl::play() { 319 void WebMediaPlayerImpl::play() {
312 DCHECK_EQ(main_loop_, MessageLoop::current()); 320 DCHECK_EQ(main_loop_, MessageLoop::current());
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; 811 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
804 812
805 DVLOG(1) << "generateKeyRequest: " << key_system.utf8().data() << ": " 813 DVLOG(1) << "generateKeyRequest: " << key_system.utf8().data() << ": "
806 << std::string(reinterpret_cast<const char*>(init_data), 814 << std::string(reinterpret_cast<const char*>(init_data),
807 static_cast<size_t>(init_data_length)); 815 static_cast<size_t>(init_data_length));
808 816
809 // TODO(xhwang): We assume all streams are from the same container (thus have 817 // TODO(xhwang): We assume all streams are from the same container (thus have
810 // the same "type") for now. In the future, the "type" should be passed down 818 // the same "type") for now. In the future, the "type" should be passed down
811 // from the application. 819 // from the application.
812 if (!decryptor_->GenerateKeyRequest(key_system.utf8(), 820 if (!decryptor_->GenerateKeyRequest(key_system.utf8(),
813 init_data_type_, 821 init_data_type_,
814 init_data, init_data_length)) { 822 init_data, init_data_length)) {
815 current_key_system_.reset(); 823 current_key_system_.reset();
816 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 824 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
817 } 825 }
818 826
819 return WebMediaPlayer::MediaKeyExceptionNoError; 827 return WebMediaPlayer::MediaKeyExceptionNoError;
820 } 828 }
821 829
822 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey( 830 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey(
823 const WebString& key_system, 831 const WebString& key_system,
824 const unsigned char* key, 832 const unsigned char* key,
(...skipping 25 matching lines...) Expand all
850 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; 858 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
851 859
852 DVLOG(1) << "addKey: " << key_system.utf8().data() << ": " 860 DVLOG(1) << "addKey: " << key_system.utf8().data() << ": "
853 << std::string(reinterpret_cast<const char*>(key), 861 << std::string(reinterpret_cast<const char*>(key),
854 static_cast<size_t>(key_length)) << ", " 862 static_cast<size_t>(key_length)) << ", "
855 << std::string(reinterpret_cast<const char*>(init_data), 863 << std::string(reinterpret_cast<const char*>(init_data),
856 static_cast<size_t>(init_data_length)) 864 static_cast<size_t>(init_data_length))
857 << " [" << session_id.utf8().data() << "]"; 865 << " [" << session_id.utf8().data() << "]";
858 866
859 decryptor_->AddKey(key_system.utf8(), key, key_length, 867 decryptor_->AddKey(key_system.utf8(), key, key_length,
860 init_data, init_data_length, session_id.utf8()); 868 init_data, init_data_length, session_id.utf8());
861 return WebMediaPlayer::MediaKeyExceptionNoError; 869 return WebMediaPlayer::MediaKeyExceptionNoError;
862 } 870 }
863 871
864 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest( 872 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest(
865 const WebString& key_system, 873 const WebString& key_system,
866 const WebString& session_id) { 874 const WebString& session_id) {
867 WebMediaPlayer::MediaKeyException e = 875 WebMediaPlayer::MediaKeyException e =
868 CancelKeyRequestInternal(key_system, session_id); 876 CancelKeyRequestInternal(key_system, session_id);
869 ReportMediaKeyExceptionToUMA("cancelKeyRequest", key_system, e); 877 ReportMediaKeyExceptionToUMA("cancelKeyRequest", key_system, e);
870 return e; 878 return e;
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1173 pipeline_->Stop(base::Bind( 1181 pipeline_->Stop(base::Bind(
1174 &base::WaitableEvent::Signal, base::Unretained(&waiter))); 1182 &base::WaitableEvent::Signal, base::Unretained(&waiter)));
1175 waiter.Wait(); 1183 waiter.Wait();
1176 1184
1177 // Let V8 know we are not using extra resources anymore. 1185 // Let V8 know we are not using extra resources anymore.
1178 if (incremented_externally_allocated_memory_) { 1186 if (incremented_externally_allocated_memory_) {
1179 v8::V8::AdjustAmountOfExternalAllocatedMemory(-kPlayerExtraMemory); 1187 v8::V8::AdjustAmountOfExternalAllocatedMemory(-kPlayerExtraMemory);
1180 incremented_externally_allocated_memory_ = false; 1188 incremented_externally_allocated_memory_ = false;
1181 } 1189 }
1182 1190
1183 message_loop_factory_.reset(); 1191 media_thread_.Stop();
1184 1192
1185 // And then detach the proxy, it may live on the render thread for a little 1193 // And then detach the proxy, it may live on the render thread for a little
1186 // longer until all the tasks are finished. 1194 // longer until all the tasks are finished.
1187 if (proxy_) { 1195 if (proxy_) {
1188 proxy_->Detach(); 1196 proxy_->Detach();
1189 proxy_ = NULL; 1197 proxy_ = NULL;
1190 } 1198 }
1191 } 1199 }
1192 1200
1193 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { 1201 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
1194 DCHECK_EQ(main_loop_, MessageLoop::current()); 1202 DCHECK_EQ(main_loop_, MessageLoop::current());
1195 DCHECK(client_); 1203 DCHECK(client_);
1196 return client_; 1204 return client_;
1197 } 1205 }
1198 1206
1199 WebKit::WebAudioSourceProvider* WebMediaPlayerImpl::audioSourceProvider() { 1207 WebKit::WebAudioSourceProvider* WebMediaPlayerImpl::audioSourceProvider() {
1200 return audio_source_provider_; 1208 return audio_source_provider_;
1201 } 1209 }
1202 1210
1203 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { 1211 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() {
1204 DCHECK_EQ(main_loop_, MessageLoop::current()); 1212 DCHECK_EQ(main_loop_, MessageLoop::current());
1205 incremented_externally_allocated_memory_ = true; 1213 incremented_externally_allocated_memory_ = true;
1206 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); 1214 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory);
1207 } 1215 }
1208 1216
1209 } // namespace webkit_media 1217 } // namespace webkit_media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698