Bug 1261900: [MSE] P4. Only evict no longer used data from resource. r=gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Fri, 22 Apr 2016 16:33:56 +1000
changeset 356741 31b62692275d5f8d5b118cb1a93735f2009aafd4
parent 356740 e53e1f9fd1925ec358c11687521b987ae98e6b4b
child 356742 e6a461ea8028284b890d5abaf778a46099af8094
push id16586
push userbmo:jyavenard@mozilla.com
push dateWed, 27 Apr 2016 02:47:40 +0000
reviewersgerald
bugs1261900
milestone49.0a1
Bug 1261900: [MSE] P4. Only evict no longer used data from resource. r=gerald MozReview-Commit-ID: 9ueagW9ufky
dom/media/mediasource/TrackBuffersManager.cpp
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -1318,19 +1318,31 @@ TrackBuffersManager::CompleteCodedFrameP
     return;
   }
 
   mLastParsedEndTime = Some(std::max(mAudioTracks.mLastParsedEndTime,
                                      mVideoTracks.mLastParsedEndTime));
 
   // 6. Remove the media segment bytes from the beginning of the input buffer.
   // Clear our demuxer from any already processed data.
-  // As we have handled a complete media segment, it is safe to evict all data
-  // from the resource.
-  mCurrentInputBuffer->EvictAll();
+  int64_t safeToEvict = std::min(
+    HasVideo()
+      ? mVideoTracks.mDemuxer->GetEvictionOffset(mVideoTracks.mLastParsedEndTime)
+      : INT64_MAX,
+    HasAudio()
+      ? mAudioTracks.mDemuxer->GetEvictionOffset(mAudioTracks.mLastParsedEndTime)
+      : INT64_MAX);
+  ErrorResult rv;
+  mCurrentInputBuffer->EvictBefore(safeToEvict, rv);
+  if (rv.Failed()) {
+    rv.SuppressException();
+    RejectProcessing(NS_ERROR_OUT_OF_MEMORY, __func__);
+    return;
+  }
+
   mInputDemuxer->NotifyDataRemoved();
   RecreateParser(true);
 
   // 7. Set append state to WAITING_FOR_SEGMENT.
   SetAppendState(AppendState::WAITING_FOR_SEGMENT);
 
   // 8. Jump to the loop top step above.
   ResolveProcessing(false, __func__);