Bug 1389304 - Sanitize the obtained buffered ranges obtained from TrackDemuxer in MFR. draft
authorKilik Kuo <kikuo@mozilla.com>
Thu, 14 Sep 2017 18:38:45 +0800
changeset 664779 f1d5ab37ed5c4e537255a59d8ddef2a30e43b4d1
parent 663639 7da39ffbf91745bfc9f5f9430a48d460f37f854d
child 731539 3ef0dbeeaaadcef1f7f7bdc6faebe8899faabc8e
push id79799
push userkikuo@mozilla.com
push dateThu, 14 Sep 2017 10:41:16 +0000
bugs1389304
milestone57.0a1
Bug 1389304 - Sanitize the obtained buffered ranges obtained from TrackDemuxer in MFR. MozReview-Commit-ID: EBPOsFzg3pi
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -3101,23 +3101,25 @@ MediaFormatReader::UpdateBuffered()
   if (HasAudio() && HasVideo()) {
     intervals = media::Intersection(mVideo.mTimeRanges, mAudio.mTimeRanges);
   } else if (HasAudio()) {
     intervals = mAudio.mTimeRanges;
   } else if (HasVideo()) {
     intervals = mVideo.mTimeRanges;
   }
 
-  if (!intervals.Length() || intervals.GetStart() == TimeUnit::Zero()) {
-    // IntervalSet already starts at 0 or is empty, nothing to shift.
-    mBuffered = intervals;
-  } else {
-    mBuffered =
-      intervals.Shift(TimeUnit::Zero() - mInfo.mStartTime);
+  if (intervals.Length() && intervals.GetStart() != TimeUnit::Zero()) {
+    // We need to shift IntervalSet which is not empty and does not start at 0.
+    intervals = intervals.Shift(TimeUnit::Zero() - mInfo.mStartTime);
   }
+
+  // The intervals should be at least bounded to values equal to or greater than 0.
+  media::TimeIntervals boundary_intervals = TimeIntervals(
+    TimeInterval(TimeUnit::FromMicroseconds(0), TimeUnit::FromInfinity()));
+  mBuffered = media::Intersection(intervals, boundary_intervals);
 }
 
 layers::ImageContainer*
 MediaFormatReader::GetImageContainer()
 {
   return mVideoFrameContainer ? mVideoFrameContainer->GetImageContainer()
                               : nullptr;
 }