diff options
Diffstat (limited to 'media/base/pipeline_impl.cc')
-rw-r--r-- | media/base/pipeline_impl.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index f574b85..25bdf47 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc @@ -358,6 +358,7 @@ void PipelineImpl::ResetState() { seek_pending_ = false; tearing_down_ = false; error_caused_teardown_ = false; + playback_rate_change_pending_ = false; duration_ = kZero; buffered_time_ = kZero; buffered_bytes_ = 0; @@ -369,6 +370,7 @@ void PipelineImpl::ResetState() { volume_ = 1.0f; preload_ = AUTO; playback_rate_ = 0.0f; + pending_playback_rate_ = 0.0f; status_ = PIPELINE_OK; has_audio_ = false; has_video_ = false; @@ -780,6 +782,14 @@ void PipelineImpl::ErrorChangedTask(PipelineStatus error) { void PipelineImpl::PlaybackRateChangedTask(float playback_rate) { DCHECK_EQ(MessageLoop::current(), message_loop_); + + // Suppress rate change until after seeking. + if (IsPipelineSeeking()) { + pending_playback_rate_ = playback_rate; + playback_rate_change_pending_ = true; + return; + } + { base::AutoLock auto_lock(lock_); clock_->SetPlaybackRate(playback_rate); @@ -959,6 +969,13 @@ void PipelineImpl::FilterStateTransitionTask() { seek_timestamp_ = base::TimeDelta(); seek_pending_ = false; + // If a playback rate change was requested during a seek, do it now that + // the seek has compelted. + if (playback_rate_change_pending_) { + playback_rate_change_pending_ = false; + PlaybackRateChangedTask(pending_playback_rate_); + } + base::AutoLock auto_lock(lock_); // We use audio stream to update the clock. So if there is such a stream, // we pause the clock until we receive a valid timestamp. |