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) { |