Index: media/base/pipeline_impl.cc |
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
index 7f5f3f3520e001a333450daf4aae202e2395b5da..2555bd7a6e028422aaf332407b3efc7572351ff7 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> demuxer_; |
scoped_refptr<AudioDecoder> audio_decoder_; |
scoped_refptr<VideoDecoder> video_decoder_; |
scoped_refptr<CompositeFilter> 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(); |
} |