From 23a8b1d8f4c8c3b3c37811f310891256f45c8063 Mon Sep 17 00:00:00 2001 From: "vrk@google.com" Date: Tue, 5 Apr 2011 16:28:20 +0000 Subject: Implementing preload=metadata for video This patch implements the logic necessary to respect the preload attribute when it is set to MetaData. This also refactors the BufferedResourceLoader to determine its buffering techniques based on a DeferStrategy value. BUG=16482,76555 TEST=media/video-preload.html, test_shell_tests Review URL: http://codereview.chromium.org/6625059 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80465 0039d316-1c4b-4281-b951-d872f2087c98 --- media/base/pipeline_impl.cc | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'media/base/pipeline_impl.cc') diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 7f5f3f3..2555bd7 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc @@ -55,7 +55,6 @@ media::PipelineStatus PipelineStatusNotification::status() { class PipelineImpl::PipelineInitState { public: - scoped_refptr demuxer_; scoped_refptr audio_decoder_; scoped_refptr video_decoder_; scoped_refptr composite_; @@ -219,6 +218,21 @@ void PipelineImpl::SetVolume(float volume) { } } +Preload PipelineImpl::GetPreload() const { + base::AutoLock auto_lock(lock_); + return preload_; +} + +void PipelineImpl::SetPreload(Preload preload) { + base::AutoLock auto_lock(lock_); + preload_ = preload; + if (running_) { + message_loop_->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineImpl::PreloadChangedTask, + preload)); + } +} + base::TimeDelta PipelineImpl::GetCurrentTime() const { // TODO(scherkus): perhaps replace checking state_ == kEnded with a bool that // is set/get under the lock, because this is breaching the contract that @@ -630,7 +644,7 @@ void PipelineImpl::InitializeTask() { if (state_ == kInitDemuxer) { set_state(kInitAudioDecoder); // If this method returns false, then there's no audio stream. - if (InitializeAudioDecoder(pipeline_init_state_->demuxer_)) + if (InitializeAudioDecoder(demuxer_)) return; } @@ -649,7 +663,7 @@ void PipelineImpl::InitializeTask() { if (state_ == kInitAudioRenderer) { // Then perform the stage of initialization, i.e. initialize video decoder. set_state(kInitVideoDecoder); - if (InitializeVideoDecoder(pipeline_init_state_->demuxer_)) + if (InitializeVideoDecoder(demuxer_)) return; } @@ -685,6 +699,7 @@ void PipelineImpl::InitializeTask() { // Initialization was successful, we are now considered paused, so it's safe // to set the initial playback rate and volume. + PreloadChangedTask(GetPreload()); PlaybackRateChangedTask(GetPlaybackRate()); VolumeChangedTask(GetVolume()); @@ -785,6 +800,12 @@ void PipelineImpl::VolumeChangedTask(float volume) { } } +void PipelineImpl::PreloadChangedTask(Preload preload) { + DCHECK_EQ(MessageLoop::current(), message_loop_); + if (demuxer_) + demuxer_->SetPreload(preload); +} + void PipelineImpl::SeekTask(base::TimeDelta time, PipelineStatusCallback* seek_callback) { DCHECK_EQ(MessageLoop::current(), message_loop_); @@ -994,9 +1015,10 @@ void PipelineImpl::FinishDestroyingFiltersTask() { DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK(IsPipelineStopped()); - // Clear renderer references. + // Clear filter references. audio_renderer_ = NULL; video_renderer_ = NULL; + demuxer_ = NULL; pipeline_filter_ = NULL; @@ -1057,7 +1079,7 @@ void PipelineImpl::OnDemuxerBuilt(PipelineStatus status, Demuxer* demuxer) { if (!PrepareFilter(demuxer)) return; - pipeline_init_state_->demuxer_ = demuxer; + demuxer_ = demuxer; OnFilterInitialize(); } -- cgit v1.1