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")
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