| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/glue/webmediaplayer_impl.h" | 5 #include "webkit/glue/webmediaplayer_impl.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 message_loop_factory_(message_loop_factory), | 113 message_loop_factory_(message_loop_factory), |
| 114 paused_(true), | 114 paused_(true), |
| 115 seeking_(false), | 115 seeking_(false), |
| 116 playback_rate_(0.0f), | 116 playback_rate_(0.0f), |
| 117 pending_seek_(false), | 117 pending_seek_(false), |
| 118 client_(client), | 118 client_(client), |
| 119 proxy_(NULL), | 119 proxy_(NULL), |
| 120 delegate_(delegate), | 120 delegate_(delegate), |
| 121 media_stream_client_(media_stream_client), | 121 media_stream_client_(media_stream_client), |
| 122 media_log_(media_log), | 122 media_log_(media_log), |
| 123 is_accelerated_compositing_active_(false), |
| 123 incremented_externally_allocated_memory_(false) { | 124 incremented_externally_allocated_memory_(false) { |
| 124 // Saves the current message loop. | 125 // Saves the current message loop. |
| 125 DCHECK(!main_loop_); | 126 DCHECK(!main_loop_); |
| 126 main_loop_ = MessageLoop::current(); | 127 main_loop_ = MessageLoop::current(); |
| 127 media_log_->AddEvent( | 128 media_log_->AddEvent( |
| 128 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 129 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
| 129 } | 130 } |
| 130 | 131 |
| 131 bool WebMediaPlayerImpl::Initialize( | 132 bool WebMediaPlayerImpl::Initialize( |
| 132 WebKit::WebFrame* frame, | 133 WebKit::WebFrame* frame, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 145 // Also, delaying GC until after player starts gets rid of starting lag -- | 146 // Also, delaying GC until after player starts gets rid of starting lag -- |
| 146 // collection happens in parallel with playing. | 147 // collection happens in parallel with playing. |
| 147 // TODO(enal): remove when we get rid of per-audio-stream thread. | 148 // TODO(enal): remove when we get rid of per-audio-stream thread. |
| 148 if (!incremented_externally_allocated_memory_) { | 149 if (!incremented_externally_allocated_memory_) { |
| 149 MessageLoop::current()->PostTask( | 150 MessageLoop::current()->PostTask( |
| 150 FROM_HERE, | 151 FROM_HERE, |
| 151 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, | 152 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, |
| 152 AsWeakPtr())); | 153 AsWeakPtr())); |
| 153 } | 154 } |
| 154 | 155 |
| 155 UMA_HISTOGRAM_BOOLEAN("Media.AcceleratedCompositingActive", | 156 is_accelerated_compositing_active_ = |
| 156 frame->view()->isAcceleratedCompositingActive()); | 157 frame->view()->isAcceleratedCompositingActive(); |
| 157 | 158 |
| 158 pipeline_ = new media::PipelineImpl(pipeline_message_loop, media_log_); | 159 pipeline_ = new media::PipelineImpl(pipeline_message_loop, media_log_); |
| 159 | 160 |
| 160 // Also we want to be notified of |main_loop_| destruction. | 161 // Also we want to be notified of |main_loop_| destruction. |
| 161 main_loop_->AddDestructionObserver(this); | 162 main_loop_->AddDestructionObserver(this); |
| 162 | 163 |
| 163 // Creates the proxy. | 164 // Creates the proxy. |
| 164 proxy_ = new WebMediaPlayerProxy(main_loop_, this); | 165 proxy_ = new WebMediaPlayerProxy(main_loop_, this); |
| 165 web_video_renderer->SetWebMediaPlayerProxy(proxy_); | 166 web_video_renderer->SetWebMediaPlayerProxy(proxy_); |
| 166 proxy_->SetVideoRenderer(web_video_renderer); | 167 proxy_->SetVideoRenderer(web_video_renderer); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 if (delegate_) | 231 if (delegate_) |
| 231 delegate_->PlayerGone(this); | 232 delegate_->PlayerGone(this); |
| 232 | 233 |
| 233 // Finally tell the |main_loop_| we don't want to be notified of destruction | 234 // Finally tell the |main_loop_| we don't want to be notified of destruction |
| 234 // event. | 235 // event. |
| 235 if (main_loop_) { | 236 if (main_loop_) { |
| 236 main_loop_->RemoveDestructionObserver(this); | 237 main_loop_->RemoveDestructionObserver(this); |
| 237 } | 238 } |
| 238 } | 239 } |
| 239 | 240 |
| 241 namespace { |
| 242 |
| 243 // Helper enum for reporting scheme histograms. |
| 244 enum URLSchemeForHistogram { |
| 245 kUnknownURLScheme, |
| 246 kMissingURLScheme, |
| 247 kHttpURLScheme, |
| 248 kHttpsURLScheme, |
| 249 kFtpURLScheme, |
| 250 kChromeExtensionURLScheme, |
| 251 kJavascriptURLScheme, |
| 252 kFileURLScheme, |
| 253 kBlobURLScheme, |
| 254 kDataURLScheme, |
| 255 kMaxURLScheme = kDataURLScheme // Must be equal to highest enum value. |
| 256 }; |
| 257 |
| 258 URLSchemeForHistogram URLScheme(const GURL& url) { |
| 259 if (!url.has_scheme()) return kMissingURLScheme; |
| 260 if (url.SchemeIs("http")) return kHttpURLScheme; |
| 261 if (url.SchemeIs("https")) return kHttpsURLScheme; |
| 262 if (url.SchemeIs("ftp")) return kFtpURLScheme; |
| 263 if (url.SchemeIs("chrome-extension")) return kChromeExtensionURLScheme; |
| 264 if (url.SchemeIs("javascript")) return kJavascriptURLScheme; |
| 265 if (url.SchemeIs("file")) return kFileURLScheme; |
| 266 if (url.SchemeIs("blob")) return kBlobURLScheme; |
| 267 if (url.SchemeIs("data")) return kDataURLScheme; |
| 268 return kUnknownURLScheme; |
| 269 } |
| 270 |
| 271 } // anonymous namespace |
| 272 |
| 240 void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { | 273 void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { |
| 241 DCHECK_EQ(main_loop_, MessageLoop::current()); | 274 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 242 DCHECK(proxy_); | 275 DCHECK(proxy_); |
| 243 | 276 |
| 277 UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(url), kMaxURLScheme); |
| 278 |
| 244 if (media_stream_client_) { | 279 if (media_stream_client_) { |
| 245 bool has_video = false; | 280 bool has_video = false; |
| 246 bool has_audio = false; | 281 bool has_audio = false; |
| 247 scoped_refptr<media::VideoDecoder> new_decoder = | 282 scoped_refptr<media::VideoDecoder> new_decoder = |
| 248 media_stream_client_->GetVideoDecoder(url, message_loop_factory_.get()); | 283 media_stream_client_->GetVideoDecoder(url, message_loop_factory_.get()); |
| 249 if (new_decoder.get()) { | 284 if (new_decoder.get()) { |
| 250 // Remove the default decoder. | 285 // Remove the default decoder. |
| 251 scoped_refptr<media::VideoDecoder> old_videodecoder; | 286 scoped_refptr<media::VideoDecoder> old_videodecoder; |
| 252 filter_collection_->SelectVideoDecoder(&old_videodecoder); | 287 filter_collection_->SelectVideoDecoder(&old_videodecoder); |
| 253 filter_collection_->AddVideoDecoder(new_decoder.get()); | 288 filter_collection_->AddVideoDecoder(new_decoder.get()); |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { | 736 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { |
| 702 DCHECK_EQ(main_loop_, MessageLoop::current()); | 737 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 703 if (status == media::PIPELINE_OK) { | 738 if (status == media::PIPELINE_OK) { |
| 704 // Only keep one time range starting from 0. | 739 // Only keep one time range starting from 0. |
| 705 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); | 740 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); |
| 706 new_buffered[0].start = 0.0f; | 741 new_buffered[0].start = 0.0f; |
| 707 new_buffered[0].end = | 742 new_buffered[0].end = |
| 708 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); | 743 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); |
| 709 buffered_.swap(new_buffered); | 744 buffered_.swap(new_buffered); |
| 710 | 745 |
| 746 if (hasVideo()) { |
| 747 UMA_HISTOGRAM_BOOLEAN("Media.AcceleratedCompositingActive", |
| 748 is_accelerated_compositing_active_); |
| 749 } |
| 750 |
| 711 if (pipeline_->IsLoaded()) { | 751 if (pipeline_->IsLoaded()) { |
| 712 SetNetworkState(WebKit::WebMediaPlayer::Loaded); | 752 SetNetworkState(WebKit::WebMediaPlayer::Loaded); |
| 713 } | 753 } |
| 714 | 754 |
| 715 // Since we have initialized the pipeline, say we have everything otherwise | 755 // Since we have initialized the pipeline, say we have everything otherwise |
| 716 // we'll remain either loading/idle. | 756 // we'll remain either loading/idle. |
| 717 // TODO(hclam): change this to report the correct status. | 757 // TODO(hclam): change this to report the correct status. |
| 718 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); | 758 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); |
| 719 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | 759 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); |
| 720 } else { | 760 } else { |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 return client_; | 908 return client_; |
| 869 } | 909 } |
| 870 | 910 |
| 871 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { | 911 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { |
| 872 DCHECK_EQ(main_loop_, MessageLoop::current()); | 912 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 873 incremented_externally_allocated_memory_ = true; | 913 incremented_externally_allocated_memory_ = true; |
| 874 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); | 914 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); |
| 875 } | 915 } |
| 876 | 916 |
| 877 } // namespace webkit_glue | 917 } // namespace webkit_glue |
| OLD | NEW |