bool ParseVersion3(DataFrameReader reader)
        {
            if (!reader.EnsureBuffer(4))
            {
                return false;
            }

            // calc size
            byte[] sizeBytes = reader.Read(0, 4);
            int size = 0;
            for (int i = 0; i < 4; i++)
            {
                size = (size << 8) | sizeBytes[i];
            }

            size += 4;

            // get data
            if (!reader.EnsureBuffer(size))
            {
                return false;
            }

            m_Data = reader.GetBuffer(size);

            // get flags
            m_Flags = ID3v2ExtendedHeaderFlags.FromID3v23(m_Data);
            return true;
        }
        /// <summary>
        /// Parses the specified buffer starting at index to load all data for this frame.
        /// </summary>
        /// <param name="reader">FrameReader to read from.</param>
        public override bool Parse(DataFrameReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("Stream");
            }

            m_Flags = new ID3v2ExtendedHeaderFlags();

            switch (m_Header.Version)
            {
                case 2: return ParseVersion2(reader);
                case 3: return ParseVersion3(reader);
                case 4: return ParseVersion4(reader);
                default: return false;
            }
        }
        bool ParseVersion4(DataFrameReader reader)
        {
            if (!reader.EnsureBuffer(4))
            {
                return false;
            }

            // calc size
            int size = ID3v2DeUnsync.Int32(reader.Read(0, 4), 0);

            // get data
            if (!reader.EnsureBuffer(size))
            {
                return false;
            }

            m_Data = reader.GetBuffer(size);

            // get flags
            m_Flags = ID3v2ExtendedHeaderFlags.FromID3v24(m_Data);
            return true;
        }