Bug 1089586 - Abort pending seeks. r=jwwang, a=sylvestre
We only perform the last seek requested instead.
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1365,25 +1365,34 @@ MediaFormatReader::Seek(int64_t aTime, i
return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
}
mOriginalSeekTime = Some(media::TimeUnit::FromMicroseconds(aTime));
mPendingSeekTime = mOriginalSeekTime;
nsRefPtr<SeekPromise> p = mSeekPromise.Ensure(__func__);
- AttemptSeek();
+ RefPtr<nsIRunnable> task(
+ NS_NewRunnableMethod(this, &MediaFormatReader::AttemptSeek));
+ OwnerThread()->Dispatch(task.forget());
return p;
}
void
MediaFormatReader::AttemptSeek()
{
MOZ_ASSERT(OnTaskQueue());
+ if (mPendingSeekTime.isNothing()) {
+ return;
+ }
+ // An internal seek may be pending due to Seek queueing multiple tasks calling
+ // AttemptSeek ; we can ignore those by resetting any pending demuxer's seek.
+ mAudio.mSeekRequest.DisconnectIfExists();
+ mVideo.mSeekRequest.DisconnectIfExists();
if (HasVideo()) {
DoVideoSeek();
} else if (HasAudio()) {
DoAudioSeek();
} else {
MOZ_CRASH();
}
}