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);
            }
        }