/// <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="TagLibSharp.File"/>. /// </summary> /// <param name="file"> /// A <see cref="TagLibSharp.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(TagLibSharp.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); } } }
/// <summary> /// Parses a raw AVI stream list and returns the stream /// information. /// </summary> /// <param name="data"> /// A <see cref="ByteVector" /> object containing raw stream /// list. /// </param> /// <returns> /// A <see cref="AviStream" /> object containing stream /// information. /// </returns> public static AviStream ParseStreamList(ByteVector data) { if (data == null) { throw new ArgumentNullException("data"); } if (!data.StartsWith("strl")) { return(null); } AviStream stream = null; int pos = 4; 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); }