/// <summary>
        /// Reads the full box properties from stream.
        /// </summary>
        /// <param name="reader">The binary reader with the stream.</param>
        protected override void ReadFullBoxPropertiesFromStream(BoxBinaryReader reader)
        {
            this.TrackId = reader.ReadUInt32();

            uint num = reader.ReadUInt32();

            this.reserved              = ((int)(num >> 6)) & 0x3ffffff;
            this.LengthSizeOfTrafNum   = (byte)((num >> 4) & 3);
            this.LengthSizeOfTrunNum   = (byte)((num >> 2) & 3);
            this.LengthSizeOfSampleNum = (byte)(num & 3);

            this.NumberOfEntry = reader.ReadUInt32();

            for (int i = 0; i < this.NumberOfEntry; i++)
            {
                TrackFragmentRandomAccessEntry entry = new TrackFragmentRandomAccessEntry();

                if (base.Version == 1)
                {
                    entry.Time       = reader.ReadUInt64();
                    entry.MoofOffset = reader.ReadUInt64();
                }
                else
                {
                    entry.Time       = reader.ReadUInt32();
                    entry.MoofOffset = reader.ReadUInt32();
                }

                entry.TrafNumber   = ReadIntValueFromBytes(reader, this.LengthSizeOfTrafNum);
                entry.TrunNumber   = ReadIntValueFromBytes(reader, this.LengthSizeOfTrunNum);
                entry.SampleNumber = ReadIntValueFromBytes(reader, this.LengthSizeOfSampleNum);

                this.TrackFragmentRandomAccessEntries.Add(entry);
            }
        }
        /// <summary>
        /// Reads the full box properties from stream.
        /// </summary>
        /// <param name="reader">The binary reader with the stream.</param>
        protected override void ReadFullBoxPropertiesFromStream(BoxBinaryReader reader)
        {
            this.TrackId = reader.ReadUInt32();
            
            uint num = reader.ReadUInt32();
            this.reserved = ((int)(num >> 6)) & 0x3ffffff;
            this.LengthSizeOfTrafNum = (byte)((num >> 4) & 3);
            this.LengthSizeOfTrunNum = (byte)((num >> 2) & 3);
            this.LengthSizeOfSampleNum = (byte)(num & 3);

            this.NumberOfEntry = reader.ReadUInt32();

            for (int i = 0; i < this.NumberOfEntry; i++)
            {
                TrackFragmentRandomAccessEntry entry = new TrackFragmentRandomAccessEntry();
                
                if (base.Version == 1)
                {
                    entry.Time = reader.ReadUInt64();
                    entry.MoofOffset = reader.ReadUInt64();
                }
                else
                {
                    entry.Time = reader.ReadUInt32();
                    entry.MoofOffset = reader.ReadUInt32();
                }

                entry.TrafNumber = ReadIntValueFromBytes(reader, this.LengthSizeOfTrafNum);
                entry.TrunNumber = ReadIntValueFromBytes(reader, this.LengthSizeOfTrunNum);
                entry.SampleNumber = ReadIntValueFromBytes(reader, this.LengthSizeOfSampleNum);
                               
                this.TrackFragmentRandomAccessEntries.Add(entry);
            }
        }