OLD | NEW |
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 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "webkit/media/webmediaplayer_delegate.h" | 37 #include "webkit/media/webmediaplayer_delegate.h" |
38 #include "webkit/media/webmediaplayer_proxy.h" | 38 #include "webkit/media/webmediaplayer_proxy.h" |
39 #include "webkit/media/webmediaplayer_util.h" | 39 #include "webkit/media/webmediaplayer_util.h" |
40 #include "webkit/media/webvideoframe_impl.h" | 40 #include "webkit/media/webvideoframe_impl.h" |
41 | 41 |
42 using WebKit::WebCanvas; | 42 using WebKit::WebCanvas; |
43 using WebKit::WebMediaPlayer; | 43 using WebKit::WebMediaPlayer; |
44 using WebKit::WebRect; | 44 using WebKit::WebRect; |
45 using WebKit::WebSize; | 45 using WebKit::WebSize; |
46 using WebKit::WebString; | 46 using WebKit::WebString; |
47 using media::NetworkEvent; | |
48 using media::PipelineStatus; | 47 using media::PipelineStatus; |
49 | 48 |
50 namespace { | 49 namespace { |
51 | 50 |
52 // Amount of extra memory used by each player instance reported to V8. | 51 // Amount of extra memory used by each player instance reported to V8. |
53 // It is not exact number -- first, it differs on different platforms, | 52 // It is not exact number -- first, it differs on different platforms, |
54 // and second, it is very hard to calculate. Instead, use some arbitrary | 53 // and second, it is very hard to calculate. Instead, use some arbitrary |
55 // value that will cause garbage collection from time to time. We don't want | 54 // value that will cause garbage collection from time to time. We don't want |
56 // it to happen on every allocation, but don't want 5k players to sit in memory | 55 // it to happen on every allocation, but don't want 5k players to sit in memory |
57 // either. Looks that chosen constant achieves both goals, at least for audio | 56 // either. Looks that chosen constant achieves both goals, at least for audio |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 filter_collection_.get(), | 236 filter_collection_.get(), |
238 decryptor_.get(), | 237 decryptor_.get(), |
239 &video_decoder)) { | 238 &video_decoder)) { |
240 proxy_->set_video_decoder(video_decoder); | 239 proxy_->set_video_decoder(video_decoder); |
241 StartPipeline(); | 240 StartPipeline(); |
242 return; | 241 return; |
243 } | 242 } |
244 | 243 |
245 // Otherwise it's a regular request which requires resolving the URL first. | 244 // Otherwise it's a regular request which requires resolving the URL first. |
246 proxy_->set_data_source( | 245 proxy_->set_data_source( |
247 new BufferedDataSource(main_loop_, frame_, media_log_)); | 246 new BufferedDataSource(main_loop_, frame_, media_log_, |
| 247 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, |
| 248 base::Unretained(this)))); |
248 proxy_->data_source()->Initialize( | 249 proxy_->data_source()->Initialize( |
249 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), | 250 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), |
250 base::Bind( | 251 base::Bind( |
251 &WebMediaPlayerImpl::DataSourceInitialized, | 252 &WebMediaPlayerImpl::DataSourceInitialized, |
252 base::Unretained(this), gurl)); | 253 base::Unretained(this), gurl)); |
253 | 254 |
254 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); | 255 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); |
255 | 256 |
256 BuildDefaultCollection(proxy_->data_source(), | 257 BuildDefaultCollection(proxy_->data_source(), |
257 message_loop_factory_.get(), | 258 message_loop_factory_.get(), |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 } | 452 } |
452 | 453 |
453 int WebMediaPlayerImpl::dataRate() const { | 454 int WebMediaPlayerImpl::dataRate() const { |
454 DCHECK_EQ(main_loop_, MessageLoop::current()); | 455 DCHECK_EQ(main_loop_, MessageLoop::current()); |
455 | 456 |
456 // TODO(hclam): Add this method call if pipeline has it in the interface. | 457 // TODO(hclam): Add this method call if pipeline has it in the interface. |
457 return 0; | 458 return 0; |
458 } | 459 } |
459 | 460 |
460 WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { | 461 WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { |
| 462 DCHECK_EQ(main_loop_, MessageLoop::current()); |
461 return network_state_; | 463 return network_state_; |
462 } | 464 } |
463 | 465 |
464 WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { | 466 WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { |
| 467 DCHECK_EQ(main_loop_, MessageLoop::current()); |
465 return ready_state_; | 468 return ready_state_; |
466 } | 469 } |
467 | 470 |
468 const WebKit::WebTimeRanges& WebMediaPlayerImpl::buffered() { | 471 const WebKit::WebTimeRanges& WebMediaPlayerImpl::buffered() { |
469 DCHECK_EQ(main_loop_, MessageLoop::current()); | 472 DCHECK_EQ(main_loop_, MessageLoop::current()); |
470 media::Ranges<base::TimeDelta> buffered_time_ranges = | 473 media::Ranges<base::TimeDelta> buffered_time_ranges = |
471 pipeline_->GetBufferedTimeRanges(); | 474 pipeline_->GetBufferedTimeRanges(); |
472 WebKit::WebTimeRanges web_ranges(buffered_time_ranges.size()); | 475 WebKit::WebTimeRanges web_ranges(buffered_time_ranges.size()); |
473 for (size_t i = 0; i < buffered_time_ranges.size(); ++i) { | 476 for (size_t i = 0; i < buffered_time_ranges.size(); ++i) { |
474 web_ranges[i].start = buffered_time_ranges.start(i).InSecondsF(); | 477 web_ranges[i].start = buffered_time_ranges.start(i).InSecondsF(); |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 // TODO(xhwang): Change to use NetworkStateDecryptError once it's added in | 913 // TODO(xhwang): Change to use NetworkStateDecryptError once it's added in |
911 // Webkit (see http://crbug.com/124486). | 914 // Webkit (see http://crbug.com/124486). |
912 SetNetworkState(WebMediaPlayer::NetworkStateDecodeError); | 915 SetNetworkState(WebMediaPlayer::NetworkStateDecodeError); |
913 break; | 916 break; |
914 } | 917 } |
915 | 918 |
916 // Repaint to trigger UI update. | 919 // Repaint to trigger UI update. |
917 Repaint(); | 920 Repaint(); |
918 } | 921 } |
919 | 922 |
920 void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) { | |
921 DCHECK_EQ(main_loop_, MessageLoop::current()); | |
922 switch(type) { | |
923 case media::DOWNLOAD_CONTINUED: | |
924 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | |
925 break; | |
926 case media::DOWNLOAD_PAUSED: | |
927 SetNetworkState(WebMediaPlayer::NetworkStateIdle); | |
928 break; | |
929 case media::CAN_PLAY_THROUGH: | |
930 // Temporarily disable delayed firing of CAN_PLAY_THROUGH due to | |
931 // crbug.com/106480. | |
932 // TODO(vrk): uncomment code below when bug above is fixed. | |
933 // SetReadyState(WebMediaPlayer::NetworkStateHaveEnoughData); | |
934 break; | |
935 default: | |
936 NOTREACHED(); | |
937 } | |
938 } | |
939 | |
940 void WebMediaPlayerImpl::OnDemuxerOpened() { | 923 void WebMediaPlayerImpl::OnDemuxerOpened() { |
941 DCHECK_EQ(main_loop_, MessageLoop::current()); | 924 DCHECK_EQ(main_loop_, MessageLoop::current()); |
942 | 925 |
943 GetClient()->sourceOpened(); | 926 GetClient()->sourceOpened(); |
944 } | 927 } |
945 | 928 |
946 void WebMediaPlayerImpl::OnKeyNeeded(scoped_array<uint8> init_data, | 929 void WebMediaPlayerImpl::OnKeyNeeded(scoped_array<uint8> init_data, |
947 int init_data_size) { | 930 int init_data_size) { |
948 DCHECK_EQ(main_loop_, MessageLoop::current()); | 931 DCHECK_EQ(main_loop_, MessageLoop::current()); |
949 | 932 |
(...skipping 14 matching lines...) Expand all Loading... |
964 if (status != media::PIPELINE_OK) { | 947 if (status != media::PIPELINE_OK) { |
965 DVLOG(1) << "DataSourceInitialized status: " << status; | 948 DVLOG(1) << "DataSourceInitialized status: " << status; |
966 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); | 949 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); |
967 Repaint(); | 950 Repaint(); |
968 return; | 951 return; |
969 } | 952 } |
970 | 953 |
971 StartPipeline(); | 954 StartPipeline(); |
972 } | 955 } |
973 | 956 |
| 957 void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { |
| 958 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) |
| 959 SetNetworkState(WebMediaPlayer::NetworkStateIdle); |
| 960 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) |
| 961 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
| 962 media_log_->AddEvent( |
| 963 media_log_->CreateBooleanEvent( |
| 964 media::MediaLogEvent::NETWORK_ACTIVITY_SET, |
| 965 "is_downloading_data", is_downloading)); |
| 966 } |
| 967 |
974 void WebMediaPlayerImpl::StartPipeline() { | 968 void WebMediaPlayerImpl::StartPipeline() { |
975 started_ = true; | 969 started_ = true; |
976 pipeline_->Start( | 970 pipeline_->Start( |
977 filter_collection_.Pass(), | 971 filter_collection_.Pass(), |
978 base::Bind(&WebMediaPlayerProxy::PipelineEndedCallback, proxy_.get()), | 972 base::Bind(&WebMediaPlayerProxy::PipelineEndedCallback, proxy_.get()), |
979 base::Bind(&WebMediaPlayerProxy::PipelineErrorCallback, proxy_.get()), | 973 base::Bind(&WebMediaPlayerProxy::PipelineErrorCallback, proxy_.get()), |
980 base::Bind(&WebMediaPlayerProxy::NetworkEventCallback, proxy_.get()), | |
981 base::Bind(&WebMediaPlayerProxy::PipelineInitializationCallback, | 974 base::Bind(&WebMediaPlayerProxy::PipelineInitializationCallback, |
982 proxy_.get())); | 975 proxy_.get())); |
983 } | 976 } |
984 | 977 |
985 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { | 978 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { |
986 DCHECK_EQ(main_loop_, MessageLoop::current()); | 979 DCHECK_EQ(main_loop_, MessageLoop::current()); |
987 DVLOG(1) << "SetNetworkState: " << state; | 980 DVLOG(1) << "SetNetworkState: " << state; |
988 network_state_ = state; | 981 network_state_ = state; |
989 // Always notify to ensure client has the latest value. | 982 // Always notify to ensure client has the latest value. |
990 GetClient()->networkStateChanged(); | 983 GetClient()->networkStateChanged(); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 return audio_source_provider_; | 1037 return audio_source_provider_; |
1045 } | 1038 } |
1046 | 1039 |
1047 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { | 1040 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { |
1048 DCHECK_EQ(main_loop_, MessageLoop::current()); | 1041 DCHECK_EQ(main_loop_, MessageLoop::current()); |
1049 incremented_externally_allocated_memory_ = true; | 1042 incremented_externally_allocated_memory_ = true; |
1050 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); | 1043 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); |
1051 } | 1044 } |
1052 | 1045 |
1053 } // namespace webkit_media | 1046 } // namespace webkit_media |
OLD | NEW |