bool MoofParser::RebuildFragmentedIndex(BoxContext& aContext) { bool foundValidMoof = false; for (Box box(&aContext, mOffset); box.IsAvailable(); box = box.Next()) { if (box.IsType("moov")) { mInitRange = MediaByteRange(0, box.Range().mEnd); ParseMoov(box); } else if (box.IsType("moof")) { Moof moof(box, mTrex, mMdhd, mEdts, mSinf, mIsAudio); if (!moof.IsValid() && !box.Next().IsAvailable()) { // Moof isn't valid abort search for now. break; } if (!mMoofs.IsEmpty()) { // Stitch time ranges together in the case of a (hopefully small) time // range gap between moofs. mMoofs.LastElement().FixRounding(moof); } mMoofs.AppendElement(moof); foundValidMoof = true; } mOffset = box.NextOffset(); } return foundValidMoof; }
bool MoofParser::RebuildFragmentedIndex(BoxContext& aContext) { bool foundValidMoof = false; bool foundMdat = false; for (Box box(&aContext, mOffset); box.IsAvailable(); box = box.Next()) { if (box.IsType("moov") && mInitRange.IsNull()) { mInitRange = MediaByteRange(0, box.Range().mEnd); ParseMoov(box); } else if (box.IsType("moof")) { Moof moof(box, mTrex, mMvhd, mMdhd, mEdts, mSinf, mIsAudio); if (!moof.IsValid() && !box.Next().IsAvailable()) { // Moof isn't valid abort search for now. break; } if (!mMoofs.IsEmpty()) { // Stitch time ranges together in the case of a (hopefully small) time // range gap between moofs. mMoofs.LastElement().FixRounding(moof); } mMoofs.AppendElement(moof); mMediaRanges.AppendElement(moof.mRange); foundValidMoof = true; } else if (box.IsType("mdat") && !Moofs().IsEmpty()) { // Check if we have all our data from last moof. Moof& moof = Moofs().LastElement(); media::Interval<int64_t> datarange(moof.mMdatRange.mStart, moof.mMdatRange.mEnd, 0); media::Interval<int64_t> mdat(box.Range().mStart, box.Range().mEnd, 0); if (datarange.Intersects(mdat)) { mMediaRanges.LastElement() = mMediaRanges.LastElement().Extents(box.Range()); } } mOffset = box.NextOffset(); } return foundValidMoof; }
void MoofParser::RebuildFragmentedIndex(BoxContext& aContext) { for (Box box(&aContext, mOffset); box.IsAvailable(); box = box.Next()) { if (box.IsType("moov")) { mInitRange = MediaByteRange(0, box.Range().mEnd); ParseMoov(box); } else if (box.IsType("moof")) { Moof moof(box, mTrex, mMdhd, mEdts, mSinf); if (!mMoofs.IsEmpty()) { // Stitch time ranges together in the case of a (hopefully small) time // range gap between moofs. mMoofs.LastElement().FixRounding(moof); } mMoofs.AppendElement(moof); } mOffset = box.NextOffset(); } }