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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/fileshunter/Decoders/OGG.rb', line 19
def decode(offset)
ending_offset = nil
cursor = offset
extensions = [ :ogg, :ogx ]
nbr_pages = 0
bitstreams = []
while (ending_offset == nil)
= @data[cursor+5].ord
invalid_data("@#{cursor} - Invalid header type: #{header_type}") if ( > 7)
bitstream_sn = BinData::Uint32le.read(@data[cursor+14..cursor+17])
page_sequence_idx = BinData::Uint32le.read(@data[cursor+18..cursor+21])
nbr_segments = @data[cursor+26].ord
size = 0
@data[cursor+27..cursor+26+nbr_segments].bytes.each do |segment_size|
size += segment_size
end
log_debug("@#{cursor} - [ Bitstream ##{bitstream_sn} / Page ##{page_sequence_idx} ]: Type #{header_type}, having #{nbr_segments} (total size of #{size})")
cursor += 27 + nbr_segments
found_relevant_data(extensions)
if (( & 0b00000010) != 0)
invalid_data("@#{cursor} - Stream #{bitstream_sn} was already marked as begun.") if (bitstreams.include?(bitstream_sn))
KNOWN_EXTENSIONS.each do |token, extension|
extensions.unshift(extension) if (@data[cursor..cursor+size-1].index(token) != nil)
extensions.delete(:oga) if (extensions.include?(:ogv))
found_relevant_data(extensions)
end
bitstreams << bitstream_sn
elsif (( & 0b00000100) == 0)
missing_previous_data if (!bitstreams.include?(bitstream_sn))
end
cursor += size
progress(cursor)
nbr_pages += 1
ending_offset = cursor if ((cursor == @end_offset) or (@data[cursor..cursor+4] != BEGIN_PATTERN_OGG))
end
metadata( :nbr_pages => nbr_pages )
return ending_offset
end
|