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; } }
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 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 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 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 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; } }