/// <summary> /// Skip over any whitespace or any comments. /// </summary> public static void SkipWhitespaceAndComments(this BufferedReadStream stream) { bool isWhitespace; do { int val = stream.ReadByte(); // Comments start with '#' and end at the next new-line. if (val == 0x23) { int innerValue; do { innerValue = stream.ReadByte(); }while (innerValue != 0x0a); // Continue searching for whitespace. val = innerValue; } isWhitespace = val is 0x09 or 0x0a or 0x0d or 0x20; }while (isWhitespace); stream.Seek(-1, SeekOrigin.Current); }
/// <summary> /// Decompresses image data into the supplied buffer. /// </summary> /// <param name="stream">The <see cref="Stream" /> to read image data from.</param> /// <param name="stripOffset">The strip offset of stream.</param> /// <param name="stripByteCount">The number of bytes to read from the input stream.</param> /// <param name="stripHeight">The height of the strip.</param> /// <param name="buffer">The output buffer for uncompressed data.</param> public void Decompress(BufferedReadStream stream, ulong stripOffset, ulong stripByteCount, int stripHeight, Span <byte> buffer) { DebugGuard.MustBeLessThanOrEqualTo(stripOffset, (ulong)long.MaxValue, nameof(stripOffset)); DebugGuard.MustBeLessThanOrEqualTo(stripByteCount, (ulong)long.MaxValue, nameof(stripByteCount)); stream.Seek((long)stripOffset, SeekOrigin.Begin); this.Decompress(stream, (int)stripByteCount, stripHeight, buffer); if ((long)stripOffset + (long)stripByteCount < stream.Position) { TiffThrowHelper.ThrowImageFormatException("Out of range when reading a strip."); } }
/// <summary> /// Decompresses image data into the supplied buffer. /// </summary> /// <param name="stream">The <see cref="Stream" /> to read image data from.</param> /// <param name="stripOffset">The strip offset of stream.</param> /// <param name="stripByteCount">The number of bytes to read from the input stream.</param> /// <param name="stripHeight">The height of the strip.</param> /// <param name="buffer">The output buffer for uncompressed data.</param> public void Decompress(BufferedReadStream stream, uint stripOffset, uint stripByteCount, int stripHeight, Span <byte> buffer) { if (stripByteCount > int.MaxValue) { TiffThrowHelper.ThrowImageFormatException("The StripByteCount value is too big."); } stream.Seek(stripOffset, SeekOrigin.Begin); this.Decompress(stream, (int)stripByteCount, stripHeight, buffer); if (stripOffset + stripByteCount < stream.Position) { TiffThrowHelper.ThrowImageFormatException("Out of range when reading a strip."); } }
protected override int ReadNextByte() { if (_curOfs == _length) { if (_mergedPacket == null) { return(-1); } return(_mergedPacket.ReadNextByte()); } _stream.Seek(_curOfs + _offset, SeekOrigin.Begin); var b = _stream.ReadByte(); ++_curOfs; return(b); }
PageHeader ReadPageHeader(long position) { // set the stream's position _stream.Seek(position, SeekOrigin.Begin); // header // NB: if the stream didn't have an EOS flag, this is the most likely spot for the EOF to be found... if (_stream.Read(_readBuffer, 0, 27) != 27) { return(null); } // capture signature if (_readBuffer[0] != 0x4f || _readBuffer[1] != 0x67 || _readBuffer[2] != 0x67 || _readBuffer[3] != 0x53) { return(null); } // check the stream version if (_readBuffer[4] != 0) { return(null); } // start populating the header var hdr = new PageHeader(); // bit flags hdr.Flags = (PageFlags)_readBuffer[5]; // granulePosition hdr.GranulePosition = BitConverter.ToInt64(_readBuffer, 6); // stream serial hdr.StreamSerial = BitConverter.ToInt32(_readBuffer, 14); // sequence number hdr.SequenceNumber = BitConverter.ToInt32(_readBuffer, 18); // save off the CRC var crc = BitConverter.ToUInt32(_readBuffer, 22); // start calculating the CRC value for this page _crc.Reset(); for (int i = 0; i < 22; i++) { _crc.Update(_readBuffer[i]); } _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(_readBuffer[26]); // figure out the length of the page var segCnt = (int)_readBuffer[26]; if (_stream.Read(_readBuffer, 0, segCnt) != segCnt) { return(null); } var packetSizes = new List <int>(segCnt); int size = 0, idx = 0; for (int i = 0; i < segCnt; i++) { var temp = _readBuffer[i]; _crc.Update(temp); if (idx == packetSizes.Count) { packetSizes.Add(0); } packetSizes[idx] += temp; if (temp < 255) { ++idx; hdr.LastPacketContinues = false; } else { hdr.LastPacketContinues = true; } size += temp; } hdr.PacketSizes = packetSizes.ToArray(); hdr.DataOffset = position + 27 + segCnt; // now we have to go through every byte in the page if (_stream.Read(_readBuffer, 0, size) != size) { return(null); } for (int i = 0; i < size; i++) { _crc.Update(_readBuffer[i]); } if (_crc.Test(crc)) { _containerBits += 8 * (27 + segCnt); ++_pageCount; return(hdr); } return(null); }
public PageHeader ReadPageHeader(long position) { _stream.Seek(position, SeekOrigin.Begin); if (_stream.Read(_readBuffer, 0, 27) != 27) { return(null); } if (_readBuffer[0] != 79 || _readBuffer[1] != 103 || _readBuffer[2] != 103 || _readBuffer[3] != 83) { return(null); } if (_readBuffer[4] != 0) { return(null); } PageHeader pageHeader = new PageHeader(); pageHeader.Flags = (PageFlags)_readBuffer[5]; long num = BitConverter.ToInt32(_readBuffer, 6); long num2 = BitConverter.ToInt32(_readBuffer, 10); pageHeader.GranulePosition = num + (num2 << 32); pageHeader.StreamSerial = BitConverter.ToInt32(_readBuffer, 14); pageHeader.SequenceNumber = BitConverter.ToInt32(_readBuffer, 18); uint checkCrc = BitConverter.ToUInt32(_readBuffer, 22); _crc.Reset(); for (int i = 0; i < 22; i++) { _crc.Update(_readBuffer[i]); } _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(_readBuffer[26]); int num3 = _readBuffer[26]; if (_stream.Read(_readBuffer, 0, num3) != num3) { return(null); } List <int> list = new List <int>(num3); int num4 = 0; int num5 = 0; for (int j = 0; j < num3; j++) { byte b = _readBuffer[j]; _crc.Update(b); if (num5 == list.Count) { list.Add(0); } list[num5] += b; if (b < byte.MaxValue) { num5++; pageHeader.LastPacketContinues = false; } else { pageHeader.LastPacketContinues = true; } num4 += b; } pageHeader.PacketSizes = list.ToArray(); pageHeader.DataOffset = position + 27 + num3; if (_stream.Read(_readBuffer, 0, num4) != num4) { return(null); } for (int k = 0; k < num4; k++) { _crc.Update(_readBuffer[k]); } if (_crc.Test(checkCrc)) { _containerBits += 8 * (27 + num3); _pageCount++; return(pageHeader); } return(null); }
private unsafe bool ReadPageHeader(long position, out PageHeader header) { header = default; // set the stream's position _stream.Seek(position, SeekOrigin.Begin); // header // NB: if the stream didn't have an EOS flag, this is the most likely spot for the EOF to be found... if (_stream.Read(_readBuffer, 0, 27) != 27) { return(false); } // capture signature if (_readBuffer[0] != 0x4f || _readBuffer[1] != 0x67 || _readBuffer[2] != 0x67 || _readBuffer[3] != 0x53) { return(false); } // check the stream version if (_readBuffer[4] != 0) { return(false); } // start populating the header header = new PageHeader(); // bit flags header.Flags = (OggPageFlags)_readBuffer[5]; // granulePosition header.GranulePosition = BitConverter.ToInt64(_readBuffer, 6); // stream serial header.StreamSerial = BitConverter.ToInt32(_readBuffer, 14); // sequence number header.SequenceNumber = BitConverter.ToInt32(_readBuffer, 18); // save off the CRC var crc = BitConverter.ToUInt32(_readBuffer, 22); // start calculating the CRC value for this page _crc.Reset(); for (int i = 0; i < 22; i++) { _crc.Update(_readBuffer[i]); } _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(0); _crc.Update(_readBuffer[26]); // figure out the length of the page header.SegCount = _readBuffer[26]; if (_stream.Read(_readBuffer, 0, header.SegCount) != header.SegCount) { return(false); } int size = 0; int idx = 0; for (int i = 0; i < header.SegCount; i++) { var tmp = _readBuffer[i]; _crc.Update(tmp); header.PacketSizes[idx] += tmp; if (tmp < 255) { idx++; header.LastPacketContinues = false; } else { header.LastPacketContinues = true; } size += tmp; } header.DataOffset = position + 27 + header.SegCount; // now we have to go through every byte in the page if (_stream.Read(_readBuffer, 0, size) != size) { return(false); } for (int i = 0; i < size; i++) { _crc.Update(_readBuffer[i]); } if (_crc.Test(crc)) { _containerBits += 8 * (27 + header.SegCount); ++_pageCount; return(true); } return(false); }