Bug 1276184: [MSE] P1. Scan where to start removing frames from the start if new block added starts with a keyframe. r?kamidphish draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 02 Jun 2016 16:40:43 +1000
changeset 374299 d9987c6b42cf82f257e37fe870d855f5fdb69ac4
parent 374298 54ce8b16957cf1a59695cffa2395de9d1017e27d
child 374300 7d06e4ec7a1caf9dee42b726b577505b9d50865e
push id19986
push userbmo:jyavenard@mozilla.com
push dateThu, 02 Jun 2016 07:36:36 +0000
reviewerskamidphish
bugs1276184
milestone49.0a1
Bug 1276184: [MSE] P1. Scan where to start removing frames from the start if new block added starts with a keyframe. r?kamidphish We keep the next position on where to add frames so that we do not break the current coded frame group. However, when the new group of added frames starts with a keyframe we do not have to worry about breaking the previous coded frame group. MozReview-Commit-ID: G81xGuSa4Y2
dom/media/mediasource/TrackBuffersManager.cpp
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -1619,16 +1619,22 @@ TrackBuffersManager::InsertFrames(TrackB
 
   // 15. Remove decoding dependencies of the coded frames removed in the previous step:
   // Remove all coded frames between the coded frames removed in the previous step and the next random access point after those removed frames.
 
   TimeIntervals intersection = trackBuffer.mBufferedRanges;
   intersection.Intersection(aIntervals);
 
   if (intersection.Length()) {
+    if (aSamples[0]->mKeyframe) {
+      // We are starting a new GOP, we do not have to worry about breaking an
+      // existing current coded frame group. Reset the next insertion index
+      // so the search for when to start our frames removal can be exhaustive.
+      trackBuffer.mNextInsertionIndex.reset();
+    }
     RemoveFrames(aIntervals, trackBuffer, trackBuffer.mNextInsertionIndex.refOr(0));
   }
 
   // 16. Add the coded frame with the presentation timestamp, decode timestamp, and frame duration to the track buffer.
   if (!CheckNextInsertionIndex(aTrackData,
                                TimeUnit::FromMicroseconds(aSamples[0]->mTime))) {
     RejectProcessing(NS_ERROR_FAILURE, __func__);
     return;