Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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));
 }
Пример #4
0
        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));
            }
        }
Пример #5
0
      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);
      }
Пример #6
0
		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;
			}
		}