| 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/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 24 matching lines...) Expand all Loading... |
| 35 #include "webkit/media/simple_data_source.h" | 35 #include "webkit/media/simple_data_source.h" |
| 36 #include "webkit/media/video_renderer_impl.h" | 36 #include "webkit/media/video_renderer_impl.h" |
| 37 #include "webkit/media/web_video_renderer.h" | 37 #include "webkit/media/web_video_renderer.h" |
| 38 #include "webkit/media/webmediaplayer_delegate.h" | 38 #include "webkit/media/webmediaplayer_delegate.h" |
| 39 #include "webkit/media/webmediaplayer_proxy.h" | 39 #include "webkit/media/webmediaplayer_proxy.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::WebRect; | 43 using WebKit::WebRect; |
| 44 using WebKit::WebSize; | 44 using WebKit::WebSize; |
| 45 using media::NetworkEvent; |
| 45 using media::PipelineStatus; | 46 using media::PipelineStatus; |
| 46 | 47 |
| 47 namespace { | 48 namespace { |
| 48 | 49 |
| 49 // Amount of extra memory used by each player instance reported to V8. | 50 // Amount of extra memory used by each player instance reported to V8. |
| 50 // It is not exact number -- first, it differs on different platforms, | 51 // It is not exact number -- first, it differs on different platforms, |
| 51 // and second, it is very hard to calculate. Instead, use some arbitrary | 52 // and second, it is very hard to calculate. Instead, use some arbitrary |
| 52 // value that will cause garbage collection from time to time. We don't want | 53 // value that will cause garbage collection from time to time. We don't want |
| 53 // it to happen on every allocation, but don't want 5k players to sit in memory | 54 // it to happen on every allocation, but don't want 5k players to sit in memory |
| 54 // either. Looks that chosen constant achieves both goals, at least for audio | 55 // either. Looks that chosen constant achieves both goals, at least for audio |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 pending_seek_ = true; | 371 pending_seek_ = true; |
| 371 pending_seek_seconds_ = seconds; | 372 pending_seek_seconds_ = seconds; |
| 372 return; | 373 return; |
| 373 } | 374 } |
| 374 | 375 |
| 375 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); | 376 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); |
| 376 | 377 |
| 377 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | 378 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); |
| 378 | 379 |
| 379 // Update our paused time. | 380 // Update our paused time. |
| 380 if (paused_) { | 381 if (paused_) |
| 381 paused_time_ = seek_time; | 382 paused_time_ = seek_time; |
| 382 } | |
| 383 | 383 |
| 384 seeking_ = true; | 384 seeking_ = true; |
| 385 | 385 |
| 386 proxy_->DemuxerFlush(); | 386 proxy_->DemuxerFlush(); |
| 387 | 387 |
| 388 // Kick off the asynchronous seek! | 388 // Kick off the asynchronous seek! |
| 389 pipeline_->Seek( | 389 pipeline_->Seek( |
| 390 seek_time, | 390 seek_time, |
| 391 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback, | 391 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback, |
| 392 proxy_.get())); | 392 proxy_.get())); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 DCHECK_EQ(main_loop_, MessageLoop::current()); | 493 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 494 | 494 |
| 495 base::TimeDelta duration = pipeline_->GetMediaDuration(); | 495 base::TimeDelta duration = pipeline_->GetMediaDuration(); |
| 496 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) | 496 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) |
| 497 return std::numeric_limits<float>::infinity(); | 497 return std::numeric_limits<float>::infinity(); |
| 498 return static_cast<float>(duration.InSecondsF()); | 498 return static_cast<float>(duration.InSecondsF()); |
| 499 } | 499 } |
| 500 | 500 |
| 501 float WebMediaPlayerImpl::currentTime() const { | 501 float WebMediaPlayerImpl::currentTime() const { |
| 502 DCHECK_EQ(main_loop_, MessageLoop::current()); | 502 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 503 if (paused_) { | 503 if (paused_) |
| 504 return static_cast<float>(paused_time_.InSecondsF()); | 504 return static_cast<float>(paused_time_.InSecondsF()); |
| 505 } | |
| 506 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); | 505 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); |
| 507 } | 506 } |
| 508 | 507 |
| 509 int WebMediaPlayerImpl::dataRate() const { | 508 int WebMediaPlayerImpl::dataRate() const { |
| 510 DCHECK_EQ(main_loop_, MessageLoop::current()); | 509 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 511 | 510 |
| 512 // TODO(hclam): Add this method call if pipeline has it in the interface. | 511 // TODO(hclam): Add this method call if pipeline has it in the interface. |
| 513 return 0; | 512 return 0; |
| 514 } | 513 } |
| 515 | 514 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 new_buffered[0].start = 0.0f; | 740 new_buffered[0].start = 0.0f; |
| 742 new_buffered[0].end = | 741 new_buffered[0].end = |
| 743 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); | 742 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); |
| 744 buffered_.swap(new_buffered); | 743 buffered_.swap(new_buffered); |
| 745 | 744 |
| 746 if (hasVideo()) { | 745 if (hasVideo()) { |
| 747 UMA_HISTOGRAM_BOOLEAN("Media.AcceleratedCompositingActive", | 746 UMA_HISTOGRAM_BOOLEAN("Media.AcceleratedCompositingActive", |
| 748 is_accelerated_compositing_active_); | 747 is_accelerated_compositing_active_); |
| 749 } | 748 } |
| 750 | 749 |
| 751 if (pipeline_->IsLoaded()) { | 750 if (pipeline_->IsLoaded()) |
| 752 SetNetworkState(WebKit::WebMediaPlayer::Loaded); | 751 SetNetworkState(WebKit::WebMediaPlayer::Loaded); |
| 753 } | |
| 754 | 752 |
| 755 // Since we have initialized the pipeline, say we have everything otherwise | |
| 756 // we'll remain either loading/idle. | |
| 757 // TODO(hclam): change this to report the correct status. | |
| 758 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); | 753 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); |
| 759 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | 754 SetReadyState(WebKit::WebMediaPlayer::HaveFutureData); |
| 760 } else { | 755 } else { |
| 761 // TODO(hclam): should use |status| to determine the state | 756 // TODO(hclam): should use |status| to determine the state |
| 762 // properly and reports error using MediaError. | 757 // properly and reports error using MediaError. |
| 763 // WebKit uses FormatError to indicate an error for bogus URL or bad file. | 758 // WebKit uses FormatError to indicate an error for bogus URL or bad file. |
| 764 // Since we are at the initialization stage we can safely treat every error | 759 // Since we are at the initialization stage we can safely treat every error |
| 765 // as format error. Should post a task to call to |webmediaplayer_|. | 760 // as format error. Should post a task to call to |webmediaplayer_|. |
| 766 SetNetworkState(WebKit::WebMediaPlayer::FormatError); | 761 SetNetworkState(WebKit::WebMediaPlayer::FormatError); |
| 767 } | 762 } |
| 768 | 763 |
| 769 // Repaint to trigger UI update. | 764 // Repaint to trigger UI update. |
| 770 Repaint(); | 765 Repaint(); |
| 771 } | 766 } |
| 772 | 767 |
| 773 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { | 768 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { |
| 774 DCHECK_EQ(main_loop_, MessageLoop::current()); | 769 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 775 seeking_ = false; | 770 seeking_ = false; |
| 776 if (pending_seek_) { | 771 if (pending_seek_) { |
| 777 pending_seek_ = false; | 772 pending_seek_ = false; |
| 778 seek(pending_seek_seconds_); | 773 seek(pending_seek_seconds_); |
| 779 return; | 774 return; |
| 780 } | 775 } |
| 781 | 776 |
| 782 if (status == media::PIPELINE_OK) { | 777 if (status == media::PIPELINE_OK) { |
| 783 // Update our paused time. | 778 // Update our paused time. |
| 784 if (paused_) { | 779 if (paused_) |
| 785 paused_time_ = pipeline_->GetCurrentTime(); | 780 paused_time_ = pipeline_->GetCurrentTime(); |
| 786 } | |
| 787 | 781 |
| 788 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | |
| 789 GetClient()->timeChanged(); | 782 GetClient()->timeChanged(); |
| 790 } | 783 } |
| 791 } | 784 } |
| 792 | 785 |
| 793 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) { | 786 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) { |
| 794 DCHECK_EQ(main_loop_, MessageLoop::current()); | 787 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 795 if (status == media::PIPELINE_OK) { | 788 if (status == media::PIPELINE_OK) |
| 796 GetClient()->timeChanged(); | 789 GetClient()->timeChanged(); |
| 797 } | |
| 798 } | 790 } |
| 799 | 791 |
| 800 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { | 792 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { |
| 801 DCHECK_EQ(main_loop_, MessageLoop::current()); | 793 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 802 switch (error) { | 794 switch (error) { |
| 803 case media::PIPELINE_OK: | 795 case media::PIPELINE_OK: |
| 804 LOG(DFATAL) << "PIPELINE_OK isn't an error!"; | 796 LOG(DFATAL) << "PIPELINE_OK isn't an error!"; |
| 805 break; | 797 break; |
| 806 | 798 |
| 807 case media::PIPELINE_ERROR_NETWORK: | 799 case media::PIPELINE_ERROR_NETWORK: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 831 case media::PIPELINE_ERROR_INVALID_STATE: | 823 case media::PIPELINE_ERROR_INVALID_STATE: |
| 832 // Decode error. | 824 // Decode error. |
| 833 SetNetworkState(WebMediaPlayer::DecodeError); | 825 SetNetworkState(WebMediaPlayer::DecodeError); |
| 834 break; | 826 break; |
| 835 } | 827 } |
| 836 | 828 |
| 837 // Repaint to trigger UI update. | 829 // Repaint to trigger UI update. |
| 838 Repaint(); | 830 Repaint(); |
| 839 } | 831 } |
| 840 | 832 |
| 841 void WebMediaPlayerImpl::OnNetworkEvent(bool is_downloading_data) { | 833 void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) { |
| 842 DCHECK_EQ(main_loop_, MessageLoop::current()); | 834 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 843 if (is_downloading_data) | 835 switch(type) { |
| 844 SetNetworkState(WebKit::WebMediaPlayer::Loading); | 836 case media::DOWNLOAD_CONTINUED: |
| 845 else | 837 SetNetworkState(WebKit::WebMediaPlayer::Loading); |
| 846 SetNetworkState(WebKit::WebMediaPlayer::Idle); | 838 break; |
| 839 case media::DOWNLOAD_PAUSED: |
| 840 SetNetworkState(WebKit::WebMediaPlayer::Idle); |
| 841 break; |
| 842 case media::CAN_PLAY_THROUGH: |
| 843 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); |
| 844 break; |
| 845 default: |
| 846 NOTREACHED(); |
| 847 } |
| 847 } | 848 } |
| 848 | 849 |
| 849 void WebMediaPlayerImpl::OnDemuxerOpened() { | 850 void WebMediaPlayerImpl::OnDemuxerOpened() { |
| 850 DCHECK_EQ(main_loop_, MessageLoop::current()); | 851 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 851 | 852 |
| 852 GetClient()->sourceOpened(); | 853 GetClient()->sourceOpened(); |
| 853 } | 854 } |
| 854 | 855 |
| 855 void WebMediaPlayerImpl::SetNetworkState( | 856 void WebMediaPlayerImpl::SetNetworkState( |
| 856 WebKit::WebMediaPlayer::NetworkState state) { | 857 WebKit::WebMediaPlayer::NetworkState state) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 return client_; | 909 return client_; |
| 909 } | 910 } |
| 910 | 911 |
| 911 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { | 912 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { |
| 912 DCHECK_EQ(main_loop_, MessageLoop::current()); | 913 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 913 incremented_externally_allocated_memory_ = true; | 914 incremented_externally_allocated_memory_ = true; |
| 914 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); | 915 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); |
| 915 } | 916 } |
| 916 | 917 |
| 917 } // namespace webkit_media | 918 } // namespace webkit_media |
| OLD | NEW |