public Page (File file, long position) : this (new PageHeader (file, position)) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (position + header.Size); foreach (int packet_size in header.PacketSizes) packets.Add (file.ReadBlock (packet_size)); }
public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Mode = AccessMode.Read; try { tag = new GroupedComment (); Read (propertiesStyle); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } }
public PageHeader (File file, long position) { file.Seek (position); // An Ogg page header is at least 27 bytes, so we'll go ahead and read that // much and then get the rest when we're ready for it. ByteVector data = file.ReadBlock (27); if (data.Count < 27 || !data.StartsWith ("OggS")) throw new CorruptFileException ("Error reading page header"); _version = data [4]; _flags = (PageFlags) data [5]; _absolute_granular_position = data.Mid( 6, 8).ToULong (false); _stream_serial_number = data.Mid(14, 4).ToUInt (false); _page_sequence_number = data.Mid(18, 4).ToUInt (false); // Byte number 27 is the number of page segments, which is the only variable // length portion of the page header. After reading the number of page // segments we'll then read in the coresponding data for this count. int page_segment_count = data [26]; ByteVector page_segments = file.ReadBlock (page_segment_count); // Another sanity check. if(page_segment_count < 1 || page_segments.Count != page_segment_count) throw new CorruptFileException ("Incorrect number of page segments"); // The base size of an Ogg page 27 bytes plus the number of lacing values. _size = (uint)(27 + page_segment_count); _packet_sizes = new List<int> (); int packet_size = 0; _data_size = 0; for (int i = 0; i < page_segment_count; i++) { _data_size += page_segments [i]; packet_size += page_segments [i]; if (page_segments [i] < 255) { _packet_sizes.Add (packet_size); packet_size = 0; } } if (packet_size > 0) _packet_sizes.Add (packet_size); }
public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) {}
public static void OverwriteSequenceNumbers (File file, long position, IDictionary<uint, int> shiftTable) { bool done = true; foreach (KeyValuePair<uint, int> pair in shiftTable) if (pair.Value != 0) { done = false; break; } if (done) return; while (position < file.Length) { PageHeader header = new PageHeader (file, position); int size = (int) (header.Size + header.DataSize); if (shiftTable.ContainsKey (header.StreamSerialNumber) && shiftTable [header.StreamSerialNumber] != 0) { file.Seek (position); ByteVector page_data = file.ReadBlock (size); ByteVector new_data = ByteVector.FromUInt ( (uint)(header.PageSequenceNumber + shiftTable [header.StreamSerialNumber]), false); for (int i = 18; i < 22; i ++) page_data [i] = new_data [i - 18]; for (int i = 22; i < 26; i++) page_data [i] = 0; new_data.Add (ByteVector.FromUInt ( page_data.Checksum, false)); file.Seek (position + 18); file.WriteBlock (new_data); } position += size; } }