| 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 24 matching lines...) Expand all Loading... |
| 35 #include "webkit/glue/media/media_stream_client.h" | 35 #include "webkit/glue/media/media_stream_client.h" |
| 36 #include "webkit/glue/media/video_renderer_impl.h" | 36 #include "webkit/glue/media/video_renderer_impl.h" |
| 37 #include "webkit/glue/media/web_video_renderer.h" | 37 #include "webkit/glue/media/web_video_renderer.h" |
| 38 #include "webkit/glue/webmediaplayer_delegate.h" | 38 #include "webkit/glue/webmediaplayer_delegate.h" |
| 39 #include "webkit/glue/webmediaplayer_proxy.h" | 39 #include "webkit/glue/webmediaplayer_proxy.h" |
| 40 #include "webkit/glue/webvideoframe_impl.h" | 40 #include "webkit/glue/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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 pending_seek_ = true; | 336 pending_seek_ = true; |
| 336 pending_seek_seconds_ = seconds; | 337 pending_seek_seconds_ = seconds; |
| 337 return; | 338 return; |
| 338 } | 339 } |
| 339 | 340 |
| 340 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); | 341 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); |
| 341 | 342 |
| 342 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | 343 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); |
| 343 | 344 |
| 344 // Update our paused time. | 345 // Update our paused time. |
| 345 if (paused_) { | 346 if (paused_) |
| 346 paused_time_ = seek_time; | 347 paused_time_ = seek_time; |
| 347 } | |
| 348 | 348 |
| 349 seeking_ = true; | 349 seeking_ = true; |
| 350 | 350 |
| 351 proxy_->DemuxerFlush(); | 351 proxy_->DemuxerFlush(); |
| 352 | 352 |
| 353 // Kick off the asynchronous seek! | 353 // Kick off the asynchronous seek! |
| 354 pipeline_->Seek( | 354 pipeline_->Seek( |
| 355 seek_time, | 355 seek_time, |
| 356 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback, | 356 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback, |
| 357 proxy_.get())); | 357 proxy_.get())); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 DCHECK_EQ(main_loop_, MessageLoop::current()); | 458 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 459 | 459 |
| 460 base::TimeDelta duration = pipeline_->GetMediaDuration(); | 460 base::TimeDelta duration = pipeline_->GetMediaDuration(); |
| 461 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) | 461 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) |
| 462 return std::numeric_limits<float>::infinity(); | 462 return std::numeric_limits<float>::infinity(); |
| 463 return static_cast<float>(duration.InSecondsF()); | 463 return static_cast<float>(duration.InSecondsF()); |
| 464 } | 464 } |
| 465 | 465 |
| 466 float WebMediaPlayerImpl::currentTime() const { | 466 float WebMediaPlayerImpl::currentTime() const { |
| 467 DCHECK_EQ(main_loop_, MessageLoop::current()); | 467 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 468 if (paused_) { | 468 if (paused_) |
| 469 return static_cast<float>(paused_time_.InSecondsF()); | 469 return static_cast<float>(paused_time_.InSecondsF()); |
| 470 } | |
| 471 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); | 470 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); |
| 472 } | 471 } |
| 473 | 472 |
| 474 int WebMediaPlayerImpl::dataRate() const { | 473 int WebMediaPlayerImpl::dataRate() const { |
| 475 DCHECK_EQ(main_loop_, MessageLoop::current()); | 474 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 476 | 475 |
| 477 // TODO(hclam): Add this method call if pipeline has it in the interface. | 476 // TODO(hclam): Add this method call if pipeline has it in the interface. |
| 478 return 0; | 477 return 0; |
| 479 } | 478 } |
| 480 | 479 |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { | 700 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { |
| 702 DCHECK_EQ(main_loop_, MessageLoop::current()); | 701 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 703 if (status == media::PIPELINE_OK) { | 702 if (status == media::PIPELINE_OK) { |
| 704 // Only keep one time range starting from 0. | 703 // Only keep one time range starting from 0. |
| 705 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); | 704 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); |
| 706 new_buffered[0].start = 0.0f; | 705 new_buffered[0].start = 0.0f; |
| 707 new_buffered[0].end = | 706 new_buffered[0].end = |
| 708 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); | 707 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); |
| 709 buffered_.swap(new_buffered); | 708 buffered_.swap(new_buffered); |
| 710 | 709 |
| 711 if (pipeline_->IsLoaded()) { | 710 if (pipeline_->IsLoaded()) |
| 712 SetNetworkState(WebKit::WebMediaPlayer::Loaded); | 711 SetNetworkState(WebKit::WebMediaPlayer::Loaded); |
| 713 } | |
| 714 | 712 |
| 715 // Since we have initialized the pipeline, say we have everything otherwise | |
| 716 // we'll remain either loading/idle. | |
| 717 // TODO(hclam): change this to report the correct status. | |
| 718 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); | 713 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); |
| 719 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | 714 SetReadyState(WebKit::WebMediaPlayer::HaveFutureData); |
| 720 } else { | 715 } else { |
| 721 // TODO(hclam): should use |status| to determine the state | 716 // TODO(hclam): should use |status| to determine the state |
| 722 // properly and reports error using MediaError. | 717 // properly and reports error using MediaError. |
| 723 // WebKit uses FormatError to indicate an error for bogus URL or bad file. | 718 // WebKit uses FormatError to indicate an error for bogus URL or bad file. |
| 724 // Since we are at the initialization stage we can safely treat every error | 719 // Since we are at the initialization stage we can safely treat every error |
| 725 // as format error. Should post a task to call to |webmediaplayer_|. | 720 // as format error. Should post a task to call to |webmediaplayer_|. |
| 726 SetNetworkState(WebKit::WebMediaPlayer::FormatError); | 721 SetNetworkState(WebKit::WebMediaPlayer::FormatError); |
| 727 } | 722 } |
| 728 | 723 |
| 729 // Repaint to trigger UI update. | 724 // Repaint to trigger UI update. |
| 730 Repaint(); | 725 Repaint(); |
| 731 } | 726 } |
| 732 | 727 |
| 733 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { | 728 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { |
| 734 DCHECK_EQ(main_loop_, MessageLoop::current()); | 729 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 735 seeking_ = false; | 730 seeking_ = false; |
| 736 if (pending_seek_) { | 731 if (pending_seek_) { |
| 737 pending_seek_ = false; | 732 pending_seek_ = false; |
| 738 seek(pending_seek_seconds_); | 733 seek(pending_seek_seconds_); |
| 739 return; | 734 return; |
| 740 } | 735 } |
| 741 | 736 |
| 742 if (status == media::PIPELINE_OK) { | 737 if (status == media::PIPELINE_OK) { |
| 743 // Update our paused time. | 738 // Update our paused time. |
| 744 if (paused_) { | 739 if (paused_) |
| 745 paused_time_ = pipeline_->GetCurrentTime(); | 740 paused_time_ = pipeline_->GetCurrentTime(); |
| 746 } | |
| 747 | 741 |
| 748 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | |
| 749 GetClient()->timeChanged(); | 742 GetClient()->timeChanged(); |
| 750 } | 743 } |
| 751 } | 744 } |
| 752 | 745 |
| 753 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) { | 746 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) { |
| 754 DCHECK_EQ(main_loop_, MessageLoop::current()); | 747 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 755 if (status == media::PIPELINE_OK) { | 748 if (status == media::PIPELINE_OK) |
| 756 GetClient()->timeChanged(); | 749 GetClient()->timeChanged(); |
| 757 } | |
| 758 } | 750 } |
| 759 | 751 |
| 760 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { | 752 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { |
| 761 DCHECK_EQ(main_loop_, MessageLoop::current()); | 753 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 762 switch (error) { | 754 switch (error) { |
| 763 case media::PIPELINE_OK: | 755 case media::PIPELINE_OK: |
| 764 LOG(DFATAL) << "PIPELINE_OK isn't an error!"; | 756 LOG(DFATAL) << "PIPELINE_OK isn't an error!"; |
| 765 break; | 757 break; |
| 766 | 758 |
| 767 case media::PIPELINE_ERROR_NETWORK: | 759 case media::PIPELINE_ERROR_NETWORK: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 791 case media::PIPELINE_ERROR_INVALID_STATE: | 783 case media::PIPELINE_ERROR_INVALID_STATE: |
| 792 // Decode error. | 784 // Decode error. |
| 793 SetNetworkState(WebMediaPlayer::DecodeError); | 785 SetNetworkState(WebMediaPlayer::DecodeError); |
| 794 break; | 786 break; |
| 795 } | 787 } |
| 796 | 788 |
| 797 // Repaint to trigger UI update. | 789 // Repaint to trigger UI update. |
| 798 Repaint(); | 790 Repaint(); |
| 799 } | 791 } |
| 800 | 792 |
| 801 void WebMediaPlayerImpl::OnNetworkEvent(bool is_downloading_data) { | 793 void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) { |
| 802 DCHECK_EQ(main_loop_, MessageLoop::current()); | 794 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 803 if (is_downloading_data) | 795 switch(type) { |
| 804 SetNetworkState(WebKit::WebMediaPlayer::Loading); | 796 case media::DOWNLOAD_CONTINUED: |
| 805 else | 797 SetNetworkState(WebKit::WebMediaPlayer::Loading); |
| 806 SetNetworkState(WebKit::WebMediaPlayer::Idle); | 798 break; |
| 799 case media::DOWNLOAD_PAUSED: |
| 800 SetNetworkState(WebKit::WebMediaPlayer::Idle); |
| 801 break; |
| 802 case media::CAN_PLAY_THROUGH: |
| 803 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); |
| 804 break; |
| 805 default: |
| 806 NOTREACHED(); |
| 807 } |
| 807 } | 808 } |
| 808 | 809 |
| 809 void WebMediaPlayerImpl::OnDemuxerOpened() { | 810 void WebMediaPlayerImpl::OnDemuxerOpened() { |
| 810 DCHECK_EQ(main_loop_, MessageLoop::current()); | 811 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 811 | 812 |
| 812 GetClient()->sourceOpened(); | 813 GetClient()->sourceOpened(); |
| 813 } | 814 } |
| 814 | 815 |
| 815 void WebMediaPlayerImpl::SetNetworkState( | 816 void WebMediaPlayerImpl::SetNetworkState( |
| 816 WebKit::WebMediaPlayer::NetworkState state) { | 817 WebKit::WebMediaPlayer::NetworkState state) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 return client_; | 869 return client_; |
| 869 } | 870 } |
| 870 | 871 |
| 871 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { | 872 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { |
| 872 DCHECK_EQ(main_loop_, MessageLoop::current()); | 873 DCHECK_EQ(main_loop_, MessageLoop::current()); |
| 873 incremented_externally_allocated_memory_ = true; | 874 incremented_externally_allocated_memory_ = true; |
| 874 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); | 875 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); |
| 875 } | 876 } |
| 876 | 877 |
| 877 } // namespace webkit_glue | 878 } // namespace webkit_glue |
| OLD | NEW |