protected override void SaveToStream(Stream stream) { sbyte GetIntSize(uint value) { if (value > 16777215) { return(4); } else if (value > ushort.MaxValue) { return(3); } else if (value > byte.MaxValue) { return(2); } else { return(1); } } bool has64BitEntry = false; uint maxFrafNumber = 0; uint maxTrunNumber = 0; uint maxSampleNumber = 0; for (int i = 0; i < Entries.Length; i++) { ref TrackFragmentEntry entry = ref Entries[i]; if (entry.TrafNumber > maxFrafNumber) { maxFrafNumber = entry.TrafNumber; } if (entry.TrunNumber > maxTrunNumber) { maxTrunNumber = entry.TrunNumber; } if (entry.SampleNumber > maxSampleNumber) { maxSampleNumber = entry.SampleNumber; } if (!has64BitEntry && (entry.Time > uint.MaxValue || entry.MoofOffset > uint.MaxValue)) { has64BitEntry = true; } }
protected override void LoadFromStream(Stream stream) { base.LoadFromStream(stream); TrackID = stream.ReadBEUInt32(); _reserved = stream.ReadBytes(3); _sizeOf = stream.ReadOneByte(); uint entryCount = stream.ReadBEUInt32(); Entries = new TrackFragmentEntry[entryCount]; for (uint i = 0; i < entryCount; i++) { ulong time; ulong moofOffset; uint trafNumber; uint trunNumber; uint sampleNumber; if (Version == 0x01) { time = stream.ReadBEUInt64(); moofOffset = stream.ReadBEUInt64(); } else { time = stream.ReadBEUInt32(); moofOffset = stream.ReadBEUInt32(); } switch (SizeOfTrafNumber) { case 1: trafNumber = stream.ReadOneByte(); break; case 2: trafNumber = stream.ReadBEUInt16(); break; case 3: trafNumber = stream.ReadBEUInt24(); break; default: trafNumber = stream.ReadBEUInt32(); break; } switch (SizeOfTrunNumber) { case 1: trunNumber = stream.ReadOneByte(); break; case 2: trunNumber = stream.ReadBEUInt16(); break; case 3: trunNumber = stream.ReadBEUInt24(); break; default: trunNumber = stream.ReadBEUInt32(); break; } switch (SizeOfSampleNumber) { case 1: sampleNumber = stream.ReadOneByte(); break; case 2: sampleNumber = stream.ReadBEUInt16(); break; case 3: sampleNumber = stream.ReadBEUInt24(); break; default: sampleNumber = stream.ReadBEUInt32(); break; } Entries[i] = new TrackFragmentEntry(time, moofOffset, trafNumber, trunNumber, sampleNumber); } }
protected override void LoadFromStream(Stream stream) { base.LoadFromStream(stream); TrackID = stream.ReadBEUInt32(); Reserved = stream.ReadBytes(3); _SizeOf = stream.ReadOneByte(); uint NumberOfEntries = stream.ReadBEUInt32(); for (uint i = 0; i < NumberOfEntries; i++) { TrackFragmentEntry entry = new TrackFragmentEntry(); if (Version == 0x01) { entry.Time = stream.ReadBEUInt64(); entry.MoofOffset = stream.ReadBEUInt64(); } else { entry.Time = stream.ReadBEUInt32(); entry.MoofOffset = stream.ReadBEUInt32(); } if (SizeOfTrafNumber == 1) { entry.TrafNumber = stream.ReadOneByte(); } else if (SizeOfTrafNumber == 2) { entry.TrafNumber = stream.ReadBEUInt16(); } else if (SizeOfTrafNumber == 3) { entry.TrafNumber = stream.ReadBEUInt24(); } else { entry.TrafNumber = stream.ReadBEUInt32(); } if (SizeOfTrunNumber == 1) { entry.TrunNumber = stream.ReadOneByte(); } else if (SizeOfTrunNumber == 2) { entry.TrunNumber = stream.ReadBEUInt16(); } else if (SizeOfTrunNumber == 3) { entry.TrunNumber = stream.ReadBEUInt24(); } else { entry.TrunNumber = stream.ReadBEUInt32(); } if (SizeOfSampleNumber == 1) { entry.SampleNumber = stream.ReadOneByte(); } else if (SizeOfSampleNumber == 2) { entry.SampleNumber = stream.ReadBEUInt16(); } else if (SizeOfSampleNumber == 3) { entry.SampleNumber = stream.ReadBEUInt24(); } else { entry.SampleNumber = stream.ReadBEUInt32(); } _Entries.Add(entry); } }