Bug 1261900: [MSE] P4. Only evict no longer used data from resource. r=gerald
MozReview-Commit-ID: 9ueagW9ufky
--- 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__);