Beispiel #1
0
        public ByteVector Render()
        {
            ByteVector data = header.Render();

            if (packets.IsEmpty)
            {
                if (file != null)
                {
                    file.Seek(packetOffset);
                    data.Add(file.ReadBlock(dataSize));
                }
                else
                {
                    TagLibDebugger.Debug("Ogg.Page.Render() -- this page is empty!");
                }
            }
            else
            {
                foreach (ByteVector v in packets)
                {
                    data.Add(v);
                }
            }

            // Compute and set the checksum for the Ogg page.  The checksum is taken over
            // the entire page with the 4 buffer reserved for the checksum zeroed and then
            // inserted in buffer 22-25 of the page header.

            ByteVector checksum = ByteVector.FromUInt(data.Checksum, false);

            for (int i = 0; i < 4; i++)
            {
                data [i + 22] = checksum [i];
            }

            return(data);
        }
Beispiel #2
0
        private void Read(OggFile file, long file_offset)
        {
            file.Seek(file_offset);

            // An Ogg page header is at least 27 buffer, 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);

            // Sanity check -- make sure that we were in fact able to read as much data as
            // we asked for and that the page begins with "OggS".

            if (data.Count != 27 || !data.StartsWith("OggS"))
            {
                TagLibDebugger.Debug("Ogg.PageHeader.Read() -- error reading page header");
                return;
            }

            byte flags = data[5];

            firstPacketContinued = (flags & 1) != 0;
            firstPageOfStream    = ((flags >> 1) & 1) != 0;
            lastPageOfStream     = ((flags >> 2) & 1) != 0;

            absoluteGranularPosition = data.Mid(6, 8).ToLong(false);
            streamSerialNumber       = data.Mid(14, 4).ToUInt(false);
            pageSequenceNumber       = (int)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 pageSegmentCount = data[26];

            ByteVector page_segments = file.ReadBlock(pageSegmentCount);

            // Another sanity check.

            if (pageSegmentCount < 1 || page_segments.Count != pageSegmentCount)
            {
                return;
            }

            // The base size of an Ogg page 27 buffer plus the number of lacing values.

            size = 27 + pageSegmentCount;

            int packetSize = 0;

            for (int i = 0; i < pageSegmentCount; i++)
            {
                dataSize   += page_segments[i];
                packetSize += page_segments[i];

                if (page_segments[i] < 255)
                {
                    packetSizes.Add(packetSize);
                    packetSize = 0;
                }
            }

            if (packetSize > 0)
            {
                packetSizes.Add(packetSize);
                lastPacketCompleted = false;
            }
            else
            {
                lastPacketCompleted = true;
            }

            isValid = true;
        }
		private void Read(OggFile file, long file_offset)
		{
			file.Seek(file_offset);

			// An Ogg page header is at least 27 buffer, 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);

			// Sanity check -- make sure that we were in fact able to read as much data as
			// we asked for and that the page begins with "OggS".

			if (data.Count != 27 || !data.StartsWith("OggS"))
			{
				TagLibDebugger.Debug("Ogg.PageHeader.Read() -- error reading page header");
				return;
			}

			byte flags = data[5];

			firstPacketContinued = (flags & 1) != 0;
			firstPageOfStream = ((flags >> 1) & 1) != 0;
			lastPageOfStream = ((flags >> 2) & 1) != 0;

			absoluteGranularPosition = data.Mid(6, 8).ToLong(false);
			streamSerialNumber = data.Mid(14, 4).ToUInt(false);
			pageSequenceNumber = (int)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 pageSegmentCount = data[26];

			ByteVector page_segments = file.ReadBlock(pageSegmentCount);

			// Another sanity check.

			if (pageSegmentCount < 1 || page_segments.Count != pageSegmentCount)
				return;

			// The base size of an Ogg page 27 buffer plus the number of lacing values.

			size = 27 + pageSegmentCount;

			int packetSize = 0;

			for (int i = 0; i < pageSegmentCount; i++)
			{
				dataSize += page_segments[i];
				packetSize += page_segments[i];

				if (page_segments[i] < 255)
				{
					packetSizes.Add(packetSize);
					packetSize = 0;
				}
			}

			if (packetSize > 0)
			{
				packetSizes.Add(packetSize);
				lastPacketCompleted = false;
			}
			else
				lastPacketCompleted = true;

			isValid = true;
		}