bool MoofParser::RebuildFragmentedIndex( const MediaByteRangeSet& aByteRanges, bool* aCanEvict) { MOZ_ASSERT(aCanEvict); if (*aCanEvict && mMoofs.Length() > 1) { MOZ_ASSERT(mMoofs.Length() == mMediaRanges.Length()); mMoofs.RemoveElementsAt(0, mMoofs.Length() - 1); mMediaRanges.RemoveElementsAt(0, mMediaRanges.Length() - 1); *aCanEvict = true; } else { *aCanEvict = false; } return RebuildFragmentedIndex(aByteRanges); }
bool MoofParser::BlockingReadNextMoof() { int64_t length = std::numeric_limits<int64_t>::max(); mSource->Length(&length); nsTArray<MediaByteRange> byteRanges; byteRanges.AppendElement(MediaByteRange(0, length)); RefPtr<mp4_demuxer::BlockingStream> stream = new BlockingStream(mSource); BoxContext context(stream, byteRanges); for (Box box(&context, mOffset); box.IsAvailable(); box = box.Next()) { if (box.IsType("moof")) { byteRanges.Clear(); byteRanges.AppendElement(MediaByteRange(mOffset, box.Range().mEnd)); return RebuildFragmentedIndex(context); } } return false; }