Exemple #1
0
        /// <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.");
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }