Exemple #1
0
        /// <summary>
        ///    Constructs and initializes a new instance of <see
        ///    cref="AviHeaderList" /> by reading the contents of a raw
        ///    RIFF list from a specified position in a <see
        ///    cref="TagLib.File"/>.
        /// </summary>
        /// <param name="file">
        ///    A <see cref="TagLib.File" /> object containing the file
        ///    from which the contents of the new instance is to be
        ///    read.
        /// </param>
        /// <param name="position">
        ///    A <see cref="long" /> value specify at what position to
        ///    read the list.
        /// </param>
        /// <param name="length">
        ///    A <see cref="int" /> value specifying the number of bytes
        ///    to read.
        /// </param>
        /// <exception cref="ArgumentNullException">
        ///    <paramref name="file" /> is <see langword="null" />.
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">
        ///    <paramref name="position" /> is less than zero or greater
        ///    than the size of the file.
        /// </exception>
        /// <exception cref="CorruptFileException">
        ///    The list does not contain an AVI header or the AVI header
        ///    is the wrong length.
        /// </exception>
        public AviHeaderList(TagLib.File file, long position,
                             int length)
        {
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }

            if (length < 0)
            {
                throw new ArgumentOutOfRangeException(
                          "length");
            }

            if (position < 0 || position > file.Length - length)
            {
                throw new ArgumentOutOfRangeException(
                          "position");
            }

            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, 0);

            foreach (ByteVector list_data in list["LIST"])
            {
                if (list_data.StartsWith("strl"))
                {
                    codecs.Add(AviStream
                               .ParseStreamList(list_data)
                               .Codec);
                }
            }
        }