Bug 1220033 - Don't use fuzz arithmetic for calculating internal buffered ranges. r=gerald, a=lizzard
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -569,18 +569,18 @@ TrackBuffersManager::CodedFrameRemoval(T
return dataRemoved;
}
void
TrackBuffersManager::UpdateBufferedRanges()
{
MonitorAutoLock mon(mMonitor);
- mVideoBufferedRanges = mVideoTracks.mBufferedRanges;
- mAudioBufferedRanges = mAudioTracks.mBufferedRanges;
+ mVideoBufferedRanges = mVideoTracks.mSanitizedBufferedRanges;
+ mAudioBufferedRanges = mAudioTracks.mSanitizedBufferedRanges;
#if DEBUG
if (HasVideo()) {
MSE_DEBUG("after video ranges=%s",
DumpTimeRanges(mVideoTracks.mBufferedRanges).get());
}
if (HasAudio()) {
MSE_DEBUG("after audio ranges=%s",
@@ -1679,22 +1679,23 @@ TrackBuffersManager::InsertFrames(TrackB
}
}
TrackBuffer& data = trackBuffer.mBuffers.LastElement();
data.InsertElementsAt(trackBuffer.mNextInsertionIndex.ref(), aSamples);
trackBuffer.mNextInsertionIndex.ref() += aSamples.Length();
// Update our buffered range with new sample interval.
+ trackBuffer.mBufferedRanges += aIntervals;
// We allow a fuzz factor in our interval of half a frame length,
// as fuzz is +/- value, giving an effective leeway of a full frame
// length.
TimeIntervals range(aIntervals);
range.SetFuzz(trackBuffer.mLongestFrameDuration.ref() / 2);
- trackBuffer.mBufferedRanges += range;
+ trackBuffer.mSanitizedBufferedRanges += range;
}
void
TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
TrackData& aTrackData,
uint32_t aStartIndex)
{
TrackBuffer& data = aTrackData.mBuffers.LastElement();
@@ -1775,19 +1776,22 @@ TrackBuffersManager::RemoveFrames(const
MSE_DEBUG("NextInsertionIndex got reset.");
} else if (aTrackData.mNextInsertionIndex.ref() > lastRemovedIndex + 1) {
aTrackData.mNextInsertionIndex.ref() -=
lastRemovedIndex - firstRemovedIndex.ref() + 1;
}
}
// Update our buffered range to exclude the range just removed.
- removedIntervals.SetFuzz(TimeUnit::FromMicroseconds(maxSampleDuration/2));
aTrackData.mBufferedRanges -= removedIntervals;
+ // Recalculate sanitized buffered ranges.
+ aTrackData.mSanitizedBufferedRanges = aTrackData.mBufferedRanges;
+ aTrackData.mSanitizedBufferedRanges.SetFuzz(TimeUnit::FromMicroseconds(maxSampleDuration/2));
+
data.RemoveElementsAt(firstRemovedIndex.ref(),
lastRemovedIndex - firstRemovedIndex.ref() + 1);
}
void
TrackBuffersManager::RecreateParser(bool aReuseInitData)
{
MOZ_ASSERT(OnTaskQueue());
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -250,16 +250,19 @@ private:
Maybe<size_t> mNextInsertionIndex;
// Samples just demuxed, but not yet parsed.
TrackBuffer mQueuedSamples;
// We only manage a single track of each type at this time.
nsTArray<TrackBuffer> mBuffers;
// Track buffer ranges variable that represents the presentation time ranges
// occupied by the coded frames currently stored in the track buffer.
media::TimeIntervals mBufferedRanges;
+ // Sanitized mBufferedRanges with a fuzz of half a sample's duration applied
+ // This buffered ranges is the basis of what is exposed to the JS.
+ media::TimeIntervals mSanitizedBufferedRanges;
// Byte size of all samples contained in this track buffer.
uint32_t mSizeBuffer;
// TrackInfo of the first metadata received.
nsRefPtr<SharedTrackInfo> mInfo;
// TrackInfo of the last metadata parsed (updated with each init segment.
nsRefPtr<SharedTrackInfo> mLastInfo;
// If set, position of the next sample to be retrieved by GetSample().