/// <summary> /// Reads the contents of the current instance determining /// the size of the riff data, the area the tagging is in, /// and optionally reading in the tags and media properties. /// </summary> /// <param name="read_tags"> /// If <see langword="true" />, any tags found will be read /// into the current instance. /// </param> /// <param name="style"> /// A <see cref="ReadStyle"/> value specifying how the media /// data is to be read into the current instance. /// </param> /// <param name="riff_size"> /// A <see cref="uint"/> value reference to be filled with /// the size of the RIFF data as read from the file. /// </param> /// <param name="tag_start"> /// A <see cref="long" /> value reference to be filled with /// the absolute seek position at which the tagging data /// starts. /// </param> /// <param name="tag_end"> /// A <see cref="long" /> value reference to be filled with /// the absolute seek position at which the tagging data /// ends. /// </param> /// <exception cref="CorruptFileException"> /// The file does not begin with <see cref="FileIdentifier" /// />. /// </exception> private void Read(bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { Seek (0); if (ReadBlock (4) != FileIdentifier) throw new CorruptFileException ( "File does not begin with RIFF identifier"); riff_size = ReadBlock (4).ToUInt (false); ByteVector stream_format = ReadBlock (4); tag_start = -1; tag_end = -1; long position = 12; long length = Length; uint size = 0; TimeSpan duration = TimeSpan.Zero; ICodec [] codecs = new ICodec [0]; // Read until there are less than 8 bytes to read. do { bool tag_found = false; Seek (position); string fourcc = ReadBlock (4).ToString (StringType.UTF8); size = ReadBlock (4).ToUInt (false); switch (fourcc) { // "fmt " is used by Wave files to hold the // WaveFormatEx structure. case "fmt ": if (style == ReadStyle.None || stream_format != "WAVE") break; Seek (position + 8); codecs = new ICodec [] { new WaveFormatEx (ReadBlock (18), 0) }; break; // "data" contains the audio data for wave // files. It's contents represent the invariant // portion of the file and is used to determine // the duration of a file. It should always // appear after "fmt ". case "data": if (stream_format != "WAVE") break; InvariantStartPosition = position; InvariantEndPosition = position + size; if (style == ReadStyle.None || codecs.Length != 1 || !(codecs [0] is WaveFormatEx)) break; duration += TimeSpan.FromSeconds ( (double) size / (double) ((WaveFormatEx) codecs [0]) .AverageBytesPerSecond); break; // Lists are used to store a variety of data // collections. Read the type and act on it. case "LIST": { switch (ReadBlock (4).ToString (StringType.UTF8)) { // "hdlr" is used by AVI files to hold // a media header and BitmapInfoHeader // and WaveFormatEx structures. case "hdrl": if (style == ReadStyle.None || stream_format != "AVI ") continue; AviHeaderList header_list = new AviHeaderList (this, position + 12, (int) (size - 4)); duration = header_list.Header.Duration; codecs = header_list.Codecs; break; // "INFO" is a tagging format handled by // the InfoTag class. case "INFO": if (read_tags && info_tag == null) info_tag = new InfoTag ( this, position + 12, (int) (size - 4)); tag_found = true; break; // "MID " is a tagging format handled by // the MovieIdTag class. case "MID ": if (read_tags && mid_tag == null) mid_tag = new MovieIdTag ( this, position + 12, (int) (size - 4)); tag_found = true; break; // "movi" contains the media data for // and AVI and its contents represent // the invariant portion of the file. case "movi": if (stream_format != "AVI ") break; InvariantStartPosition = position; InvariantEndPosition = position + size; break; } break; } // "ID32" is a custom box for this format that // contains an ID3v2 tag. case "ID32": if (read_tags && id32_tag == null) id32_tag = new Id3v2.Tag (this, position + 8); tag_found = true; break; // "IDVX" is used by DivX and holds an ID3v1- // style tag. case "IDVX": if (read_tags && divx_tag == null) divx_tag = new DivXTag (this, position + 8); tag_found = true; break; // "JUNK" is a padding element that could be // associated with tag data. case "JUNK": if (tag_end == position) tag_end = position + 8 + size; break; } // Determine the region of the file that // contains tags. if (tag_found) { if (tag_start == -1) { tag_start = position; tag_end = position + 8 + size; } else if (tag_end == position) { tag_end = position + 8 + size; } } // Move to the next item. } while ((position += 8 + size) + 8 < length); // If we're reading properties, and one were found, // throw an exception. Otherwise, create the Properties // object. if (style != ReadStyle.None) { if (codecs.Length == 0) throw new UnsupportedFormatException ( "Unsupported RIFF type."); properties = new Properties (duration, codecs); } // If we're reading tags, update the combined tag. if (read_tags) tag.SetTags (id32_tag, info_tag, mid_tag, divx_tag); }
/// <summary> /// Reads the contents of the current instance determining /// the size of the riff data, the area the tagging is in, /// and optionally reading in the tags and media properties. /// </summary> /// <param name="read_tags"> /// If <see langword="true" />, any tags found will be read /// into the current instance. /// </param> /// <param name="style"> /// A <see cref="ReadStyle"/> value specifying how the media /// data is to be read into the current instance. /// </param> /// <param name="riff_size"> /// A <see cref="uint"/> value reference to be filled with /// the size of the RIFF data as read from the file. /// </param> /// <param name="tag_start"> /// A <see cref="long" /> value reference to be filled with /// the absolute seek position at which the tagging data /// starts. /// </param> /// <param name="tag_end"> /// A <see cref="long" /> value reference to be filled with /// the absolute seek position at which the tagging data /// ends. /// </param> /// <exception cref="CorruptFileException"> /// The file does not begin with <see cref="FileIdentifier" /// />. /// </exception> private void Read(bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { Seek(0); if (ReadBlock(4) != FileIdentifier) { throw new CorruptFileException( "File does not begin with RIFF identifier"); } riff_size = ReadBlock(4).ToUInt(false); ByteVector stream_format = ReadBlock(4); tag_start = -1; tag_end = -1; long position = 12; long length = Length; uint size = 0; TimeSpan duration = TimeSpan.Zero; ICodec [] codecs = new ICodec [0]; // Read until there are less than 8 bytes to read. do { bool tag_found = false; Seek(position); string fourcc = ReadBlock(4).ToString(StringType.UTF8); size = ReadBlock(4).ToUInt(false); switch (fourcc) { // "fmt " is used by Wave files to hold the // WaveFormatEx structure. case "fmt ": if (style == ReadStyle.None || stream_format != "WAVE") { break; } Seek(position + 8); codecs = new ICodec [] { new WaveFormatEx(ReadBlock(18), 0) }; break; // "data" contains the audio data for wave // files. It's contents represent the invariant // portion of the file and is used to determine // the duration of a file. It should always // appear after "fmt ". case "data": if (stream_format != "WAVE") { break; } InvariantStartPosition = position; InvariantEndPosition = position + size; if (style == ReadStyle.None || codecs.Length != 1 || !(codecs [0] is WaveFormatEx)) { break; } duration += TimeSpan.FromSeconds( (double)size / (double) ((WaveFormatEx)codecs [0]) .AverageBytesPerSecond); break; // Lists are used to store a variety of data // collections. Read the type and act on it. case "LIST": { switch (ReadBlock(4).ToString(StringType.UTF8)) { // "hdlr" is used by AVI files to hold // a media header and BitmapInfoHeader // and WaveFormatEx structures. case "hdrl": if (style == ReadStyle.None || stream_format != "AVI ") { continue; } AviHeaderList header_list = new AviHeaderList(this, position + 12, (int)(size - 4)); duration = header_list.Header.Duration; codecs = header_list.Codecs; break; // "INFO" is a tagging format handled by // the InfoTag class. case "INFO": if (read_tags && info_tag == null) { info_tag = new InfoTag( this, position + 12, (int)(size - 4)); } tag_found = true; break; // "MID " is a tagging format handled by // the MovieIdTag class. case "MID ": if (read_tags && mid_tag == null) { mid_tag = new MovieIdTag( this, position + 12, (int)(size - 4)); } tag_found = true; break; // "movi" contains the media data for // and AVI and its contents represent // the invariant portion of the file. case "movi": if (stream_format != "AVI ") { break; } InvariantStartPosition = position; InvariantEndPosition = position + size; break; } break; } // "ID32" is a custom box for this format that // contains an ID3v2 tag. case "ID32": if (read_tags && id32_tag == null) { id32_tag = new Id3v2.Tag(this, position + 8); } tag_found = true; break; // "IDVX" is used by DivX and holds an ID3v1- // style tag. case "IDVX": if (read_tags && divx_tag == null) { divx_tag = new DivXTag(this, position + 8); } tag_found = true; break; // "JUNK" is a padding element that could be // associated with tag data. case "JUNK": if (tag_end == position) { tag_end = position + 8 + size; } break; } // Determine the region of the file that // contains tags. if (tag_found) { if (tag_start == -1) { tag_start = position; tag_end = position + 8 + size; } else if (tag_end == position) { tag_end = position + 8 + size; } } // Move to the next item. } while ((position += 8 + (long)size) + 8 < length); // If we're reading properties, and one were found, // throw an exception. Otherwise, create the Properties // object. if (style != ReadStyle.None) { if (codecs.Length == 0) { throw new UnsupportedFormatException( "Unsupported RIFF type."); } properties = new Properties(duration, codecs); } // If we're reading tags, update the combined tag. if (read_tags) { tag.SetTags(id32_tag, info_tag, mid_tag, divx_tag); } }
private void Read(bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { bool flag; base.Seek(0L); if (base.ReadBlock(4) != FileIdentifier) { throw new CorruptFileException("File does not begin with RIFF identifier"); } riff_size = base.ReadBlock(4).ToUInt(false); ByteVector vector = base.ReadBlock(4); tag_start = -1L; tag_end = -1L; long offset = 12L; long length = base.Length; uint num3 = 0; TimeSpan zero = TimeSpan.Zero; ICodec[] codecs = new ICodec[0]; Label_0066: flag = false; base.Seek(offset); string str = base.ReadBlock(4).ToString(StringType.UTF8); num3 = base.ReadBlock(4).ToUInt(false); string key = str; if (key != null) { Dictionary<string, int> dictionary; int num4; if (<>f__switch$map3 == null) { dictionary = new Dictionary<string, int>(6); dictionary.Add("fmt ", 0); dictionary.Add("data", 1); dictionary.Add("LIST", 2); dictionary.Add("ID32", 3); dictionary.Add("IDVX", 4); dictionary.Add("JUNK", 5); <>f__switch$map3 = dictionary; } if (<>f__switch$map3.TryGetValue(key, out num4)) { switch (num4) { case 0: if ((style != ReadStyle.None) && (vector == "WAVE")) { base.Seek(offset + 8L); codecs = new ICodec[] { new WaveFormatEx(base.ReadBlock(0x12), 0) }; break; } break; case 1: if (vector == "WAVE") { base.InvariantStartPosition = offset; base.InvariantEndPosition = offset + num3; if (((style != ReadStyle.None) && (codecs.Length == 1)) && (codecs[0] is WaveFormatEx)) { WaveFormatEx ex = (WaveFormatEx) codecs[0]; zero += TimeSpan.FromSeconds(((double) num3) / ((double) ex.AverageBytesPerSecond)); } break; } break; case 2: { string str3 = base.ReadBlock(4).ToString(StringType.UTF8); if (str3 != null) { int num5; if (<>f__switch$map2 == null) { dictionary = new Dictionary<string, int>(4); dictionary.Add("hdrl", 0); dictionary.Add("INFO", 1); dictionary.Add("MID ", 2); dictionary.Add("movi", 3); <>f__switch$map2 = dictionary; } if (<>f__switch$map2.TryGetValue(str3, out num5)) { switch (num5) { case 0: if ((style != ReadStyle.None) && (vector == "AVI ")) { AviHeaderList list = new AviHeaderList(this, offset + 12L, ((int) num3) - 4); zero = list.Header.Duration; codecs = list.Codecs; break; } goto Label_040E; case 1: if (read_tags && (this.info_tag == null)) { this.info_tag = new InfoTag(this, offset + 12L, ((int) num3) - 4); } flag = true; break; case 2: if (read_tags && (this.mid_tag == null)) { this.mid_tag = new MovieIdTag(this, offset + 12L, ((int) num3) - 4); } flag = true; break; case 3: if (vector == "AVI ") { base.InvariantStartPosition = offset; base.InvariantEndPosition = offset + num3; break; } break; } } } break; } case 3: if (read_tags && (this.id32_tag == null)) { this.id32_tag = new TagLib.Id3v2.Tag(this, offset + 8L); } flag = true; break; case 4: if (read_tags && (this.divx_tag == null)) { this.divx_tag = new DivXTag(this, offset + 8L); } flag = true; break; case 5: if (tag_end == offset) { tag_end = (offset + 8L) + num3; } break; } } } if (flag) { if (tag_start == -1L) { tag_start = offset; tag_end = (offset + 8L) + num3; } else if (tag_end == offset) { tag_end = (offset + 8L) + num3; } } Label_040E: if (((offset += (8 + num3)) + 8L) < length) { goto Label_0066; } if (style != ReadStyle.None) { if (codecs.Length == 0) { throw new UnsupportedFormatException("Unsupported RIFF type."); } this.properties = new TagLib.Properties(zero, codecs); } if (read_tags) { TagLib.Tag[] tags = new TagLib.Tag[] { this.id32_tag, this.info_tag, this.mid_tag, this.divx_tag }; this.tag.SetTags(tags); } }
private void Read (bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { Seek (0); if (ReadBlock (4) != FileIdentifier) throw new CorruptFileException ("File does not begin with RIFF identifier"); riff_size = ReadBlock (4).ToUInt (false); ByteVector stream_format = ReadBlock (4); tag_start = -1; tag_end = -1; long position = 12; long length = Length; TimeSpan duration = TimeSpan.Zero; ICodec[] codecs = new ICodec [0]; do { bool tag_found = false; Seek (position); string fourcc = ReadBlock (4).ToString (StringType.UTF8); uint size = ReadBlock (4).ToUInt (false); switch (fourcc) { case "fmt ": if (stream_format == "WAVE" && style != ReadStyle.None) { Seek (position + 8); codecs = new ICodec [] {new WaveFormatEx (ReadBlock (18), 0)}; } break; case "data": if (stream_format == "WAVE") { if (style != ReadStyle.None && codecs.Length == 1 && codecs [0] is WaveFormatEx) duration += TimeSpan.FromSeconds ((double) size / (double) ((WaveFormatEx) codecs [0]).AverageBytesPerSecond); InvariantStartPosition = position; InvariantEndPosition = position + size; } break; case "LIST": { switch (ReadBlock (4).ToString (StringType.UTF8)) { case "hdrl": if (stream_format == "AVI " && style != ReadStyle.None) { AviHeaderList header_list = new AviHeaderList (this, position + 12, (int) (size - 4)); duration = header_list.Header.Duration; codecs = header_list.Codecs; } break; case "INFO": { if (read_tags && info_tag == null) info_tag = new InfoTag (this, position + 12, (int) (size - 4)); tag_found = true; break; } case "MID ": if (read_tags && mid_tag == null) mid_tag = new MovieIdTag (this, position + 12, (int) (size - 4)); tag_found = true; break; case "movi": if (stream_format == "AVI ") { InvariantStartPosition = position; InvariantEndPosition = position + size; } break; } break; } case "ID32": if (read_tags && id32_tag == null) id32_tag = new Id3v2.Tag (this, position + 8); tag_found = true; break; case "IDVX": if (read_tags && divx_tag == null) divx_tag = new DivXTag (this, position + 8); tag_found = true; break; case "JUNK": if (tag_end == position) tag_end = position + 8 + size; break; } if (tag_found) { if (tag_start == -1) { tag_start = position; tag_end = position + 8 + size; } else if (tag_end == position) tag_end = position + 8 + size; } position += 8 + size; } while (position + 8 < length); if (style != ReadStyle.None) { if (codecs.Length == 0) throw new UnsupportedFormatException ("Unsupported RIFF type."); properties = new Properties (duration, codecs); } if (read_tags) tag.SetTags (id32_tag, info_tag, mid_tag, divx_tag); }
private void Read(bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { Seek(0); if (ReadBlock(4) != FileIdentifier) { throw new CorruptFileException("File does not begin with RIFF identifier"); } riff_size = ReadBlock(4).ToUInt(false); ByteVector stream_format = ReadBlock(4); tag_start = -1; tag_end = -1; long position = 12; long length = Length; uint size = 0; TimeSpan duration = TimeSpan.Zero; ICodec[] codecs = new ICodec[0]; do { bool tag_found = false; Seek(position); string fourcc = ReadBlock(4).ToString(StringType.UTF8); size = ReadBlock(4).ToUInt(false); switch (fourcc) { case "fmt ": if (style == ReadStyle.None || stream_format != "WAVE") { break; } Seek(position + 8); codecs = new ICodec[] { new WaveFormatEx(ReadBlock(18), 0) }; break; case "data": if (stream_format != "WAVE") { break; } InvariantStartPosition = position; InvariantEndPosition = position + size; if (style == ReadStyle.None || codecs.Length != 1 || !(codecs[0] is WaveFormatEx)) { break; } duration += TimeSpan.FromSeconds((double)size / (double)((WaveFormatEx)codecs[0]).AverageBytesPerSecond); break; case "LIST": { switch (ReadBlock(4).ToString(StringType.UTF8)) { case "hdrl": if (style == ReadStyle.None || stream_format != "AVI ") { continue; } AviHeaderList header_list = new AviHeaderList(this, position + 12, (int)(size - 4)); duration = header_list.Header.Duration; codecs = header_list.Codecs; break; case "INFO": if (read_tags && info_tag == null) { info_tag = new InfoTag(this, position + 12, (int)(size - 4)); } tag_found = true; break; case "MID ": if (read_tags && mid_tag == null) { mid_tag = new MovieIdTag(this, position + 12, (int)(size - 4)); } tag_found = true; break; case "movi": if (stream_format != "AVI ") { break; } InvariantStartPosition = position; InvariantEndPosition = position + size; break; } break; } case "ID32": if (read_tags && id32_tag == null) { id32_tag = new Id3v2.Tag(this, position + 8); } tag_found = true; break; case "IDVX": if (read_tags && divx_tag == null) { divx_tag = new DivXTag(this, position + 8); } tag_found = true; break; case "JUNK": if (tag_end == position) { tag_end = position + 8 + size; } break; } if (tag_found) { if (tag_start == -1) { tag_start = position; tag_end = position + 8 + size; } else if (tag_end == position) { tag_end = position + 8 + size; } } }while((position += 8 + size) + 8 < length); if (style != ReadStyle.None) { if (codecs.Length == 0) { throw new UnsupportedFormatException("Unsupported RIFF type."); } properties = new Properties(duration, codecs); } if (read_tags) { tag.SetTags(id32_tag, info_tag, mid_tag, divx_tag); } }