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

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

Issue 8399023: Fire canplaythrough event at the proper time for audio/video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move canplaythrough logic into pipeline; fix other stuff Created 9 years, 1 month 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) 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 22 matching lines...) Expand all
33 #include "webkit/glue/media/media_stream_client.h" 33 #include "webkit/glue/media/media_stream_client.h"
34 #include "webkit/glue/media/video_renderer_impl.h" 34 #include "webkit/glue/media/video_renderer_impl.h"
35 #include "webkit/glue/media/web_video_renderer.h" 35 #include "webkit/glue/media/web_video_renderer.h"
36 #include "webkit/glue/webmediaplayer_delegate.h" 36 #include "webkit/glue/webmediaplayer_delegate.h"
37 #include "webkit/glue/webmediaplayer_proxy.h" 37 #include "webkit/glue/webmediaplayer_proxy.h"
38 #include "webkit/glue/webvideoframe_impl.h" 38 #include "webkit/glue/webvideoframe_impl.h"
39 39
40 using WebKit::WebCanvas; 40 using WebKit::WebCanvas;
41 using WebKit::WebRect; 41 using WebKit::WebRect;
42 using WebKit::WebSize; 42 using WebKit::WebSize;
43 using media::NetworkEvent;
43 using media::PipelineStatus; 44 using media::PipelineStatus;
44 45
45 namespace { 46 namespace {
46 47
47 // Amount of extra memory used by each player instance reported to V8. 48 // Amount of extra memory used by each player instance reported to V8.
48 // It is not exact number -- first, it differs on different platforms, 49 // It is not exact number -- first, it differs on different platforms,
49 // and second, it is very hard to calculate. Instead, use some arbitrary 50 // and second, it is very hard to calculate. Instead, use some arbitrary
50 // value that will cause garbage collection from time to time. We don't want 51 // value that will cause garbage collection from time to time. We don't want
51 // it to happen on every allocation, but don't want 5k players to sit in memory 52 // it to happen on every allocation, but don't want 5k players to sit in memory
52 // either. Looks that chosen constant achieves both goals, at least for audio 53 // either. Looks that chosen constant achieves both goals, at least for audio
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 message_loop_factory_(message_loop_factory), 112 message_loop_factory_(message_loop_factory),
112 paused_(true), 113 paused_(true),
113 seeking_(false), 114 seeking_(false),
114 playback_rate_(0.0f), 115 playback_rate_(0.0f),
115 pending_seek_(false), 116 pending_seek_(false),
116 client_(client), 117 client_(client),
117 proxy_(NULL), 118 proxy_(NULL),
118 delegate_(delegate), 119 delegate_(delegate),
119 media_stream_client_(media_stream_client), 120 media_stream_client_(media_stream_client),
120 media_log_(media_log), 121 media_log_(media_log),
121 incremented_externally_allocated_memory_(false) { 122 incremented_externally_allocated_memory_(false),
123 can_play_through_(false) {
122 // Saves the current message loop. 124 // Saves the current message loop.
123 DCHECK(!main_loop_); 125 DCHECK(!main_loop_);
124 main_loop_ = MessageLoop::current(); 126 main_loop_ = MessageLoop::current();
125 media_log_->AddEvent( 127 media_log_->AddEvent(
126 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 128 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
127 } 129 }
128 130
129 bool WebMediaPlayerImpl::Initialize( 131 bool WebMediaPlayerImpl::Initialize(
130 WebKit::WebFrame* frame, 132 WebKit::WebFrame* frame,
131 bool use_simple_data_source, 133 bool use_simple_data_source,
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 pending_seek_ = true; 321 pending_seek_ = true;
320 pending_seek_seconds_ = seconds; 322 pending_seek_seconds_ = seconds;
321 return; 323 return;
322 } 324 }
323 325
324 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); 326 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds));
325 327
326 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); 328 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds);
327 329
328 // Update our paused time. 330 // Update our paused time.
329 if (paused_) { 331 if (paused_)
330 paused_time_ = seek_time; 332 paused_time_ = seek_time;
331 }
332 333
333 seeking_ = true; 334 seeking_ = true;
334 335
335 proxy_->DemuxerFlush(); 336 proxy_->DemuxerFlush();
336 337
337 // Kick off the asynchronous seek! 338 // Kick off the asynchronous seek!
338 pipeline_->Seek( 339 pipeline_->Seek(
339 seek_time, 340 seek_time,
340 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback, 341 base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback,
341 proxy_.get())); 342 proxy_.get()));
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 DCHECK_EQ(main_loop_, MessageLoop::current()); 443 DCHECK_EQ(main_loop_, MessageLoop::current());
443 444
444 base::TimeDelta duration = pipeline_->GetMediaDuration(); 445 base::TimeDelta duration = pipeline_->GetMediaDuration();
445 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) 446 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds)
446 return std::numeric_limits<float>::infinity(); 447 return std::numeric_limits<float>::infinity();
447 return static_cast<float>(duration.InSecondsF()); 448 return static_cast<float>(duration.InSecondsF());
448 } 449 }
449 450
450 float WebMediaPlayerImpl::currentTime() const { 451 float WebMediaPlayerImpl::currentTime() const {
451 DCHECK_EQ(main_loop_, MessageLoop::current()); 452 DCHECK_EQ(main_loop_, MessageLoop::current());
452 if (paused_) { 453 if (paused_)
453 return static_cast<float>(paused_time_.InSecondsF()); 454 return static_cast<float>(paused_time_.InSecondsF());
454 }
455 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); 455 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF());
456 } 456 }
457 457
458 int WebMediaPlayerImpl::dataRate() const { 458 int WebMediaPlayerImpl::dataRate() const {
459 DCHECK_EQ(main_loop_, MessageLoop::current()); 459 DCHECK_EQ(main_loop_, MessageLoop::current());
460 460
461 // TODO(hclam): Add this method call if pipeline has it in the interface. 461 // TODO(hclam): Add this method call if pipeline has it in the interface.
462 return 0; 462 return 0;
463 } 463 }
464 464
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { 689 void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) {
690 DCHECK_EQ(main_loop_, MessageLoop::current()); 690 DCHECK_EQ(main_loop_, MessageLoop::current());
691 if (status == media::PIPELINE_OK) { 691 if (status == media::PIPELINE_OK) {
692 // Only keep one time range starting from 0. 692 // Only keep one time range starting from 0.
693 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); 693 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1));
694 new_buffered[0].start = 0.0f; 694 new_buffered[0].start = 0.0f;
695 new_buffered[0].end = 695 new_buffered[0].end =
696 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); 696 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF());
697 buffered_.swap(new_buffered); 697 buffered_.swap(new_buffered);
698 698
699 if (pipeline_->IsLoaded()) { 699 if (pipeline_->IsLoaded())
700 SetNetworkState(WebKit::WebMediaPlayer::Loaded); 700 SetNetworkState(WebKit::WebMediaPlayer::Loaded);
701 }
702 701
703 // Since we have initialized the pipeline, say we have everything otherwise
704 // we'll remain either loading/idle.
705 // TODO(hclam): change this to report the correct status.
706 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); 702 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata);
707 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); 703 SetReadyState(WebKit::WebMediaPlayer::HaveFutureData);
708 } else { 704 } else {
709 // TODO(hclam): should use |status| to determine the state 705 // TODO(hclam): should use |status| to determine the state
710 // properly and reports error using MediaError. 706 // properly and reports error using MediaError.
711 // WebKit uses FormatError to indicate an error for bogus URL or bad file. 707 // WebKit uses FormatError to indicate an error for bogus URL or bad file.
712 // Since we are at the initialization stage we can safely treat every error 708 // Since we are at the initialization stage we can safely treat every error
713 // as format error. Should post a task to call to |webmediaplayer_|. 709 // as format error. Should post a task to call to |webmediaplayer_|.
714 SetNetworkState(WebKit::WebMediaPlayer::FormatError); 710 SetNetworkState(WebKit::WebMediaPlayer::FormatError);
715 } 711 }
716 712
717 // Repaint to trigger UI update. 713 // Repaint to trigger UI update.
718 Repaint(); 714 Repaint();
719 } 715 }
720 716
721 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { 717 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) {
722 DCHECK_EQ(main_loop_, MessageLoop::current()); 718 DCHECK_EQ(main_loop_, MessageLoop::current());
723 seeking_ = false; 719 seeking_ = false;
724 if (pending_seek_) { 720 if (pending_seek_) {
725 pending_seek_ = false; 721 pending_seek_ = false;
726 seek(pending_seek_seconds_); 722 seek(pending_seek_seconds_);
727 return; 723 return;
728 } 724 }
729 725
730 if (status == media::PIPELINE_OK) { 726 if (status == media::PIPELINE_OK) {
731 // Update our paused time. 727 // Update our paused time.
732 if (paused_) { 728 if (paused_)
733 paused_time_ = pipeline_->GetCurrentTime(); 729 paused_time_ = pipeline_->GetCurrentTime();
734 }
735 730
736 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); 731 if (can_play_through_)
732 SetReadyState(WebKit::WebMediaPlayer::HaveFutureData);
733 else
734 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData);
735
737 GetClient()->timeChanged(); 736 GetClient()->timeChanged();
738 } 737 }
739 } 738 }
740 739
741 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) { 740 void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) {
742 DCHECK_EQ(main_loop_, MessageLoop::current()); 741 DCHECK_EQ(main_loop_, MessageLoop::current());
743 if (status == media::PIPELINE_OK) { 742 if (status == media::PIPELINE_OK)
744 GetClient()->timeChanged(); 743 GetClient()->timeChanged();
745 }
746 } 744 }
747 745
748 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { 746 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) {
749 DCHECK_EQ(main_loop_, MessageLoop::current()); 747 DCHECK_EQ(main_loop_, MessageLoop::current());
750 switch (error) { 748 switch (error) {
751 case media::PIPELINE_OK: 749 case media::PIPELINE_OK:
752 LOG(DFATAL) << "PIPELINE_OK isn't an error!"; 750 LOG(DFATAL) << "PIPELINE_OK isn't an error!";
753 break; 751 break;
754 752
755 case media::PIPELINE_ERROR_NETWORK: 753 case media::PIPELINE_ERROR_NETWORK:
(...skipping 23 matching lines...) Expand all
779 case media::PIPELINE_ERROR_INVALID_STATE: 777 case media::PIPELINE_ERROR_INVALID_STATE:
780 // Decode error. 778 // Decode error.
781 SetNetworkState(WebMediaPlayer::DecodeError); 779 SetNetworkState(WebMediaPlayer::DecodeError);
782 break; 780 break;
783 } 781 }
784 782
785 // Repaint to trigger UI update. 783 // Repaint to trigger UI update.
786 Repaint(); 784 Repaint();
787 } 785 }
788 786
789 void WebMediaPlayerImpl::OnNetworkEvent(bool is_downloading_data) { 787 void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) {
790 DCHECK_EQ(main_loop_, MessageLoop::current()); 788 DCHECK_EQ(main_loop_, MessageLoop::current());
791 if (is_downloading_data) 789 switch(type) {
792 SetNetworkState(WebKit::WebMediaPlayer::Loading); 790 case media::DOWNLOAD_CONTINUED:
793 else 791 SetNetworkState(WebKit::WebMediaPlayer::Loading);
794 SetNetworkState(WebKit::WebMediaPlayer::Idle); 792 break;
793 case media::DOWNLOAD_PAUSED:
794 SetNetworkState(WebKit::WebMediaPlayer::Idle);
795 break;
796 case media::CAN_PLAY_THROUGH:
797 if (!can_play_through_) {
798 can_play_through_ = true;
799 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData);
800 }
801 break;
802 default:
803 NOTREACHED();
804 }
795 } 805 }
796 806
797 void WebMediaPlayerImpl::OnDemuxerOpened() { 807 void WebMediaPlayerImpl::OnDemuxerOpened() {
798 DCHECK_EQ(main_loop_, MessageLoop::current()); 808 DCHECK_EQ(main_loop_, MessageLoop::current());
799 809
800 // TODO(acolwell): Uncomment once WebKit changes are checked in. 810 // TODO(acolwell): Uncomment once WebKit changes are checked in.
801 // https://bugs.webkit.org/show_bug.cgi?id=64731 811 // https://bugs.webkit.org/show_bug.cgi?id=64731
802 //GetClient()->sourceOpened(); 812 //GetClient()->sourceOpened();
803 } 813 }
804 814
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 return client_; 868 return client_;
859 } 869 }
860 870
861 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { 871 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() {
862 DCHECK_EQ(main_loop_, MessageLoop::current()); 872 DCHECK_EQ(main_loop_, MessageLoop::current());
863 incremented_externally_allocated_memory_ = true; 873 incremented_externally_allocated_memory_ = true;
864 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); 874 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory);
865 } 875 }
866 876
867 } // namespace webkit_glue 877 } // namespace webkit_glue
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698