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