Class: Ogg::Page

Inherits:
Object
  • Object
show all
Defined in:
lib/ogg/page.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bitstream_serial_no = 0, granule_pos = 0) ⇒ Page

Returns a new instance of Page.



52
53
54
55
56
57
# File 'lib/ogg/page.rb', line 52

def initialize(bitstream_serial_no = 0, granule_pos = 0)
  @bitstream_serial_no = bitstream_serial_no
  @granule_pos = granule_pos
  @segments = []
  @header = 0
end

Instance Attribute Details

#bitstream_serial_no ⇒ Object

Returns the value of attribute bitstream_serial_no.



3
4
5
# File 'lib/ogg/page.rb', line 3

def bitstream_serial_no
  @bitstream_serial_no
end

#checksum ⇒ Object (readonly)

Returns the value of attribute checksum.



4
5
6
# File 'lib/ogg/page.rb', line 4

def checksum
  @checksum
end

#granule_pos ⇒ Object

Returns the value of attribute granule_pos.



3
4
5
# File 'lib/ogg/page.rb', line 3

def granule_pos
  @granule_pos
end

#header ⇒ Object

Returns the value of attribute header.



3
4
5
# File 'lib/ogg/page.rb', line 3

def header
  @header
end

#segments ⇒ Object

Returns the value of attribute segments.



3
4
5
# File 'lib/ogg/page.rb', line 3

def segments
  @segments
end

#sequence_no ⇒ Object

Returns the value of attribute sequence_no.



3
4
5
# File 'lib/ogg/page.rb', line 3

def sequence_no
  @sequence_no
end

Class Method Details

.read(io, options = {}) ⇒ Object

read an ogg frame from the file file must be positioned at end of frame after this loop options - :skip_body = seek to end of frame rather than reading in the data



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 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")
  end
  
  page = Page.new(bitstream_serial_no, granule_pos)
  page.header = header
  page.sequence_no = sequence_no
  
  unless 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
  end
    
  page
end

Instance Method Details

#pack ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/ogg/page.rb', line 59

def pack
  packed =  [
    "OggS",
    0, #version
    @header,
    @granule_pos,
    @bitstream_serial_no,
    @sequence_no,
    0, #checksum
    @segments.length
  ].pack("a4CCQVVVC")
  
  packed << @segments.collect { |segment| segment.length }.pack("C*")
  packed << @segments.join
  crc = Ogg.compute_checksum(packed)
  packed[22..25] = [crc].pack("V")
  packed
end