# File lib/ogg/page.rb, line 9
    def self.read(io, options = {})
      return nil if io.eof?
      
      chunk = io.read(27)
      
      capture_pattern,
      version,
      header,
      granule_pos,
      bitstream_serial_no,
      sequence_no,
      @checksum,
      segments = chunk.unpack("a4CCQVVVC") #a4CCQNNNC
      
      if capture_pattern != "OggS"
        raise(StreamError, "bad magic number '#{ capture_pattern }'")
      end
      
      page = Page.new(bitstream_serial_no, granule_pos)
      page.header = header
      page.sequence_no = sequence_no
      raise(StreamError, "got EOF when reading page") if io.eof?
      
      segment_sizes = io.read(segments).unpack("C*")
      if options[:skip_body]
        body_size = segment_sizes.inject(0) { |sum, i| sum + i }
        io.seek(body_size, IO::SEEK_CUR)
      else
        segment_sizes.each do |size| 
          break if io.eof?
          page.segments << io.read(size)
        end
        if options[:checksum] 
          if @checksum != Ogg.compute_checksum(page.pack)
            raise(StreamError, "bad checksum: expected #{ @checksum }, got #{ page.checksum }")
          end
        end
      end
      
      page
    end