Bug 1389844 - P3. Handle case where currentTime isn't contained in buffered range. r?gerald
When playback starts, currentTime is always 0, and even if the buffered data doesn't contain currentTime it is possible for playback to progress as we always allow up to 500ms gap in the buffered data.
As such, we must use fuzzing on the interval's start time when determining if we have future data.
MozReview-Commit-ID: Ki9QxmKhfdY
--- a/dom/media/mediasource/MediaSourceDecoder.cpp
+++ b/dom/media/mediasource/MediaSourceDecoder.cpp
@@ -291,17 +291,17 @@ MediaSourceDecoder::NextFrameBufferedSta
// Next frame hasn't been decoded yet.
// Use the buffered range to consider if we have the next frame available.
auto currentPosition = CurrentPosition();
TimeIntervals buffered = GetBuffered();
buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
TimeInterval interval(
currentPosition,
currentPosition + DEFAULT_NEXT_FRAME_AVAILABLE_BUFFERED);
- return buffered.ContainsStrict(ClampIntervalToEnd(interval))
+ return buffered.ContainsWithStrictEnd(ClampIntervalToEnd(interval))
? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
: MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
}
bool
MediaSourceDecoder::CanPlayThroughImpl()
{
MOZ_ASSERT(NS_IsMainThread());
@@ -326,17 +326,17 @@ MediaSourceDecoder::CanPlayThroughImpl()
}
// If we have data up to the mediasource's duration or 10s ahead, we can
// assume that we can play without interruption.
TimeIntervals buffered = GetBuffered();
buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
TimeUnit timeAhead =
std::min(duration, currentPosition + TimeUnit::FromSeconds(10));
TimeInterval interval(currentPosition, timeAhead);
- return buffered.ContainsStrict(ClampIntervalToEnd(interval));
+ return buffered.ContainsWithStrictEnd(ClampIntervalToEnd(interval));
}
TimeInterval
MediaSourceDecoder::ClampIntervalToEnd(const TimeInterval& aInterval)
{
MOZ_ASSERT(NS_IsMainThread());
AbstractThread::AutoEnter context(AbstractMainThread());