Index: media/base/pipeline_impl.cc |
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
index f574b8515f96c146a0321b2a33c69850ad5cf002..25bdf47baa2bd119a44be67ac83971ec2ed8e1dd 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. |