Chromium Code Reviews| Index: content/renderer/media/webmediaplayer_impl.cc |
| diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc |
| index a99c3aef5920e14e1db9ac4e0afb103eb5867f8b..d738895e5ecd7d51a4ad25d42a1b817d26683e04 100644 |
| --- a/content/renderer/media/webmediaplayer_impl.cc |
| +++ b/content/renderer/media/webmediaplayer_impl.cc |
| @@ -138,9 +138,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
| media_loop_(params.message_loop_proxy()), |
| paused_(true), |
| seeking_(false), |
| - playback_rate_(0.0f), |
| + playback_rate_(0.0), |
| pending_seek_(false), |
| - pending_seek_seconds_(0.0f), |
| client_(client), |
| delegate_(delegate), |
| defer_load_cb_(params.defer_load_cb()), |
| @@ -337,30 +336,40 @@ bool WebMediaPlayerImpl::supportsSave() const { |
| void WebMediaPlayerImpl::seek(double seconds) { |
| DCHECK(main_loop_->BelongsToCurrentThread()); |
| - base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); |
| + base::TimeDelta new_seek_time = ConvertSecondsToTimestamp(seconds); |
| + |
| + // Suppress redundant seek to same microsecond as current seek. Clear any |
| + // pending seek in this case, too. For example, seek(1), seek(2), seek(1) |
| + // without any intervening seek completion should result in only a current |
| + // seek to (1) without any left-over pending seek. |
| + if (seeking_ && new_seek_time == seek_time_) { |
|
wolenetz
2013/10/01 19:51:49
This is incorrect; I'll need to fix this in subseq
|
| + pending_seek_ = false; |
| + return; |
| + } |
| if (starting_ || seeking_) { |
| pending_seek_ = true; |
| - pending_seek_seconds_ = seconds; |
| + pending_seek_time_ = new_seek_time; |
| if (chunk_demuxer_) |
| - chunk_demuxer_->CancelPendingSeek(seek_time); |
| + chunk_demuxer_->CancelPendingSeek(pending_seek_time_); |
| return; |
| } |
| + seek_time_ = new_seek_time; |
| media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); |
| // Update our paused time. |
| if (paused_) |
| - paused_time_ = seek_time; |
| + paused_time_ = seek_time_; |
| seeking_ = true; |
| if (chunk_demuxer_) |
| - chunk_demuxer_->StartWaitingForSeek(seek_time); |
| + chunk_demuxer_->StartWaitingForSeek(seek_time_); |
| // Kick off the asynchronous seek! |
| pipeline_->Seek( |
| - seek_time, |
| + seek_time_, |
| BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek)); |
| } |
| @@ -838,7 +847,7 @@ void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { |
| seeking_ = false; |
| if (pending_seek_) { |
| pending_seek_ = false; |
| - seek(pending_seek_seconds_); |
| + seek(pending_seek_time_.InSecondsF()); |
| return; |
| } |
| @@ -882,6 +891,7 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { |
| void WebMediaPlayerImpl::OnPipelineBufferingState( |
| media::Pipeline::BufferingState buffering_state) { |
| + DCHECK(main_loop_->BelongsToCurrentThread()); |
| DVLOG(1) << "OnPipelineBufferingState(" << buffering_state << ")"; |
| switch (buffering_state) { |