| 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.
|
|
|