public AviHeaderList(TagLib.File file, long position, int length)
        {
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }

            List list = new List(file, position, length);

            if (!list.ContainsKey("avih"))
            {
                throw new CorruptFileException("Avi header not found.");
            }

            ByteVector header_data = list ["avih"][0];

            if (header_data.Count != 0x38)
            {
                throw new CorruptFileException("Invalid header length.");
            }

            header = new AviHeader(header_data);

            foreach (ByteVector list_data in list["LIST"])
            {
                if (list_data.StartsWith("strl"))
                {
                    codecs.Add(AviStream.ParseStreamList(list_data).Codec);
                }
            }
        }
        public static AviStream ParseStreamList(ByteVector data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            AviStream stream = null;
            int       pos    = 4;

            if (data.StartsWith("strl"))
            {
                while (pos + 8 < data.Count)
                {
                    ByteVector id           = data.Mid(pos, 4);
                    int        block_length = (int)data.Mid(pos + 4, 4).ToUInt(false);

                    if (id == "strh" && stream == null)
                    {
                        AviStreamHeader stream_header = new AviStreamHeader(data, pos + 8);
                        if (stream_header.Type == "vids")
                        {
                            stream = new AviVideoStream(stream_header);
                        }
                        else if (stream_header.Type == "auds")
                        {
                            stream = new AviAudioStream(stream_header);
                        }
                    }
                    else if (stream != null)
                    {
                        stream.ParseItem(id, data, pos + 8, block_length);
                    }

                    pos += block_length + 8;
                }
            }

            return(stream);
        }