wahwah 0.1.0.pre.test → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +8 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/wahwah.rb +3 -74
- data/lib/wahwah/version.rb +2 -4
- data/wahwah.gemspec +27 -0
- metadata +25 -96
- data/LICENSE +0 -21
- data/lib/wahwah/asf/object.rb +0 -39
- data/lib/wahwah/asf_tag.rb +0 -220
- data/lib/wahwah/errors.rb +0 -6
- data/lib/wahwah/flac/block.rb +0 -57
- data/lib/wahwah/flac/streaminfo_block.rb +0 -51
- data/lib/wahwah/flac_tag.rb +0 -84
- data/lib/wahwah/helper.rb +0 -37
- data/lib/wahwah/id3/comment_frame_body.rb +0 -21
- data/lib/wahwah/id3/frame.rb +0 -180
- data/lib/wahwah/id3/frame_body.rb +0 -36
- data/lib/wahwah/id3/genre_frame_body.rb +0 -15
- data/lib/wahwah/id3/image_frame_body.rb +0 -60
- data/lib/wahwah/id3/text_frame_body.rb +0 -16
- data/lib/wahwah/id3/v1.rb +0 -96
- data/lib/wahwah/id3/v2.rb +0 -60
- data/lib/wahwah/id3/v2_header.rb +0 -53
- data/lib/wahwah/mp3/mpeg_frame_header.rb +0 -141
- data/lib/wahwah/mp3/vbri_header.rb +0 -47
- data/lib/wahwah/mp3/xing_header.rb +0 -45
- data/lib/wahwah/mp3_tag.rb +0 -110
- data/lib/wahwah/mp4/atom.rb +0 -105
- data/lib/wahwah/mp4_tag.rb +0 -126
- data/lib/wahwah/ogg/flac_tag.rb +0 -37
- data/lib/wahwah/ogg/opus_tag.rb +0 -33
- data/lib/wahwah/ogg/packets.rb +0 -41
- data/lib/wahwah/ogg/page.rb +0 -121
- data/lib/wahwah/ogg/pages.rb +0 -24
- data/lib/wahwah/ogg/vorbis_comment.rb +0 -51
- data/lib/wahwah/ogg/vorbis_tag.rb +0 -35
- data/lib/wahwah/ogg_tag.rb +0 -66
- data/lib/wahwah/riff/chunk.rb +0 -54
- data/lib/wahwah/riff_tag.rb +0 -140
- data/lib/wahwah/tag.rb +0 -59
- data/lib/wahwah/tag_delegate.rb +0 -16
data/lib/wahwah/id3/v2.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'forwardable'
|
4
|
-
|
5
|
-
module WahWah
|
6
|
-
module ID3
|
7
|
-
class V2 < Tag
|
8
|
-
extend Forwardable
|
9
|
-
|
10
|
-
def_delegators :@header, :major_version, :size, :has_extended_header?, :valid?
|
11
|
-
|
12
|
-
def version
|
13
|
-
"v2.#{major_version}"
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
def parse
|
18
|
-
@file_io.rewind
|
19
|
-
@header = V2Header.new(@file_io)
|
20
|
-
|
21
|
-
return unless valid?
|
22
|
-
|
23
|
-
until end_of_tag? do
|
24
|
-
frame = ID3::Frame.new(@file_io, major_version)
|
25
|
-
next unless frame.valid?
|
26
|
-
|
27
|
-
update_attribute(frame)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def update_attribute(frame)
|
32
|
-
name = frame.name
|
33
|
-
value = frame.value
|
34
|
-
|
35
|
-
case name
|
36
|
-
when :comment
|
37
|
-
# Because there may be more than one comment frame in each tag,
|
38
|
-
# so push it into a array.
|
39
|
-
@comments.push(value)
|
40
|
-
when :image
|
41
|
-
# Because there may be more than one image frame in each tag,
|
42
|
-
# so push it into a array.
|
43
|
-
@images.push(value)
|
44
|
-
when :track, :disc
|
45
|
-
# Track and disc value may be extended with a "/" character
|
46
|
-
# and a numeric string containing the total numer.
|
47
|
-
count, total_count = value.split('/', 2)
|
48
|
-
instance_variable_set("@#{name}", count)
|
49
|
-
instance_variable_set("@#{name}_total", total_count) unless total_count.nil?
|
50
|
-
else
|
51
|
-
instance_variable_set("@#{name}", value)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def end_of_tag?
|
56
|
-
size <= @file_io.pos || file_size <= @file_io.pos
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
data/lib/wahwah/id3/v2_header.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module WahWah
|
4
|
-
module ID3
|
5
|
-
# The ID3v2 tag header, which should be the first information in the file,
|
6
|
-
# is 10 bytes as follows:
|
7
|
-
|
8
|
-
# ID3v2/file identifier "ID3"
|
9
|
-
# ID3v2 version $03 00
|
10
|
-
# ID3v2 flags %abc00000
|
11
|
-
# ID3v2 size 4 * %0xxxxxxx
|
12
|
-
class V2Header
|
13
|
-
TAG_ID = 'ID3'
|
14
|
-
HEADER_SIZE = 10
|
15
|
-
HEADER_FORMAT = 'A3CxB8B*'
|
16
|
-
|
17
|
-
attr_reader :major_version, :size
|
18
|
-
|
19
|
-
def initialize(file_io)
|
20
|
-
header_content = file_io.read(HEADER_SIZE)
|
21
|
-
@id, @major_version, @flags, size_bits = header_content.unpack(HEADER_FORMAT) if header_content.size >= HEADER_SIZE
|
22
|
-
|
23
|
-
return unless valid?
|
24
|
-
|
25
|
-
# Tag size is the size excluding the header size,
|
26
|
-
# so add header size back to get total size.
|
27
|
-
@size = Helper.id3_size_caculate(size_bits) + HEADER_SIZE
|
28
|
-
|
29
|
-
if has_extended_header?
|
30
|
-
# Extended header structure:
|
31
|
-
#
|
32
|
-
# Extended header size $xx xx xx xx
|
33
|
-
# Extended Flags $xx xx
|
34
|
-
# Size of padding $xx xx xx xx
|
35
|
-
|
36
|
-
# Skip extended_header
|
37
|
-
extended_header_size = Helper.id3_size_caculate(file_io.read(4).unpack('B32').first)
|
38
|
-
file_io.seek(extended_header_size - 4, IO::SEEK_CUR)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def valid?
|
43
|
-
@id == TAG_ID
|
44
|
-
end
|
45
|
-
|
46
|
-
# The second bit in flags byte indicates whether or not the header
|
47
|
-
# is followed by an extended header.
|
48
|
-
def has_extended_header?
|
49
|
-
@flags[1] == '1'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,141 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module WahWah
|
4
|
-
module Mp3
|
5
|
-
# mpeg frame header structure:
|
6
|
-
#
|
7
|
-
# Position Length Meaning
|
8
|
-
# 0 11 Frame sync to find the header (all bits are always set)
|
9
|
-
#
|
10
|
-
# 11 2 Audio version ID
|
11
|
-
# 00 - MPEG Version 2.5 (unofficial extension of MPEG 2)
|
12
|
-
# 01 - reserved
|
13
|
-
# 10 - MPEG Version 2 (ISO/IEC 13818-3)
|
14
|
-
# 11 - MPEG Version 1 (ISO/IEC 11172-3)
|
15
|
-
#
|
16
|
-
# 13 2 Layer index
|
17
|
-
# 00 - reserved
|
18
|
-
# 01 - Layer III
|
19
|
-
# 10 - Layer II
|
20
|
-
# 11 - Layer I
|
21
|
-
#
|
22
|
-
# 15 1 Protection bit
|
23
|
-
#
|
24
|
-
# 16 4 Bitrate index, see FRAME_BITRATE_INDEX constant
|
25
|
-
#
|
26
|
-
# 20 2 Sampling rate index, see SAMPLE_RATE_INDEX constant
|
27
|
-
#
|
28
|
-
# 22 1 Padding bit
|
29
|
-
#
|
30
|
-
# 23 1 Private bit
|
31
|
-
#
|
32
|
-
# 24 2 Channel mode
|
33
|
-
# 00 - Stereo
|
34
|
-
# 01 - Joint Stereo (Stereo)
|
35
|
-
# 10 - Dual channel (Two mono channels)
|
36
|
-
# 11 - Single channel (Mono)
|
37
|
-
#
|
38
|
-
# 26 2 Mode extension (Only used in Joint Stereo)
|
39
|
-
#
|
40
|
-
# 28 1 Copyright bit (only informative)
|
41
|
-
#
|
42
|
-
# 29 1 Original bit (only informative)
|
43
|
-
#
|
44
|
-
# 30 2 Emphasis
|
45
|
-
class MpegFrameHeader
|
46
|
-
HEADER_SIZE = 4
|
47
|
-
|
48
|
-
FRAME_BITRATE_INDEX = {
|
49
|
-
'MPEG1 layer1' => [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0],
|
50
|
-
'MPEG1 layer2' => [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0],
|
51
|
-
'MPEG1 layer3' => [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0],
|
52
|
-
|
53
|
-
'MPEG2 layer1' => [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0],
|
54
|
-
'MPEG2 layer2' => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],
|
55
|
-
'MPEG2 layer3' => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],
|
56
|
-
|
57
|
-
'MPEG2.5 layer1' => [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0],
|
58
|
-
'MPEG2.5 layer2' => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],
|
59
|
-
'MPEG2.5 layer3' => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0]
|
60
|
-
}
|
61
|
-
|
62
|
-
VERSIONS_INDEX = ['MPEG2.5', nil, 'MPEG2', 'MPEG1']
|
63
|
-
LAYER_INDEX = [nil, 'layer3', 'layer2', 'layer1']
|
64
|
-
CHANNEL_MODE_INDEX = ['Stereo', 'Joint Stereo', 'Dual Channel', 'Single Channel']
|
65
|
-
|
66
|
-
SAMPLE_RATE_INDEX = {
|
67
|
-
'MPEG1' => [44100, 48000, 32000],
|
68
|
-
'MPEG2' => [22050, 24000, 16000],
|
69
|
-
'MPEG2.5' => [11025, 12000, 8000]
|
70
|
-
}
|
71
|
-
|
72
|
-
SAMPLES_PER_FRAME_INDEX = {
|
73
|
-
'MPEG1 layer1' => 384,
|
74
|
-
'MPEG1 layer2' => 1152,
|
75
|
-
'MPEG1 layer3' => 1152,
|
76
|
-
|
77
|
-
'MPEG2 layer1' => 384,
|
78
|
-
'MPEG2 layer2' => 1152,
|
79
|
-
'MPEG2 layer3' => 576,
|
80
|
-
|
81
|
-
'MPEG2.5 layer1' => 384,
|
82
|
-
'MPEG2.5 layer2' => 1152,
|
83
|
-
'MPEG2.5 layer3' => 576
|
84
|
-
}
|
85
|
-
|
86
|
-
attr_reader :version, :layer, :frame_bitrate, :channel_mode, :sample_rate
|
87
|
-
|
88
|
-
def initialize(file_io, offset = 0)
|
89
|
-
# mpeg frame header start with '11111111111' sync bits,
|
90
|
-
# So look through file until find it.
|
91
|
-
loop do
|
92
|
-
file_io.rewind
|
93
|
-
file_io.seek(offset)
|
94
|
-
|
95
|
-
break if file_io.eof?
|
96
|
-
|
97
|
-
header = file_io.read(HEADER_SIZE)
|
98
|
-
sync_bits = header.unpack('B11').first
|
99
|
-
|
100
|
-
if sync_bits == "#{'1' * 11}".b
|
101
|
-
@header = header.unpack('B*').first
|
102
|
-
@position = offset
|
103
|
-
|
104
|
-
parse; break
|
105
|
-
end
|
106
|
-
|
107
|
-
offset += 1
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def valid?
|
112
|
-
!@header.nil?
|
113
|
-
end
|
114
|
-
|
115
|
-
def position
|
116
|
-
return 0 unless valid?
|
117
|
-
@position
|
118
|
-
end
|
119
|
-
|
120
|
-
def kind
|
121
|
-
return if @version.nil? && @layer.nil?
|
122
|
-
"#{@version} #{@layer}"
|
123
|
-
end
|
124
|
-
|
125
|
-
def samples_per_frame
|
126
|
-
SAMPLES_PER_FRAME_INDEX[kind]
|
127
|
-
end
|
128
|
-
|
129
|
-
private
|
130
|
-
def parse
|
131
|
-
return unless valid?
|
132
|
-
|
133
|
-
@version = VERSIONS_INDEX[@header[11..12].to_i(2)]
|
134
|
-
@layer = LAYER_INDEX[@header[13..14].to_i(2)]
|
135
|
-
@frame_bitrate = FRAME_BITRATE_INDEX[kind]&.fetch(@header[16..19].to_i(2))
|
136
|
-
@channel_mode = CHANNEL_MODE_INDEX[@header[24..25].to_i(2)]
|
137
|
-
@sample_rate = SAMPLE_RATE_INDEX[@version]&.fetch(@header[20..21].to_i(2))
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module WahWah
|
4
|
-
module Mp3
|
5
|
-
# VBRI header structure:
|
6
|
-
#
|
7
|
-
# Position Length Meaning
|
8
|
-
# 0 4 VBR header ID in 4 ASCII chars, always 'VBRI', not NULL-terminated
|
9
|
-
#
|
10
|
-
# 4 2 Version ID as Big-Endian 16-bit unsigned
|
11
|
-
#
|
12
|
-
# 6 2 Delay as Big-Endian float
|
13
|
-
#
|
14
|
-
# 8 2 Quality indicator
|
15
|
-
#
|
16
|
-
# 10 4 Number of Bytes as Big-Endian 32-bit unsigned
|
17
|
-
#
|
18
|
-
# 14 4 Number of Frames as Big-Endian 32-bit unsigned
|
19
|
-
#
|
20
|
-
# 18 2 Number of entries within TOC table as Big-Endian 16-bit unsigned
|
21
|
-
#
|
22
|
-
# 20 2 Scale factor of TOC table entries as Big-Endian 32-bit unsigned
|
23
|
-
#
|
24
|
-
# 22 2 Size per table entry in bytes (max 4) as Big-Endian 16-bit unsigned
|
25
|
-
#
|
26
|
-
# 24 2 Frames per table entry as Big-Endian 16-bit unsigned
|
27
|
-
#
|
28
|
-
# 26 TOC entries for seeking as Big-Endian integral.
|
29
|
-
# From size per table entry and number of entries,
|
30
|
-
# you can calculate the length of this field.
|
31
|
-
class VbriHeader
|
32
|
-
HEADER_SIZE = 32
|
33
|
-
HEADER_FORMAT = 'A4x6NN'
|
34
|
-
|
35
|
-
attr_reader :frames_count, :bytes_count
|
36
|
-
|
37
|
-
def initialize(file_io, offset = 0)
|
38
|
-
file_io.seek(offset)
|
39
|
-
@id, @bytes_count, @frames_count = file_io.read(HEADER_SIZE)&.unpack(HEADER_FORMAT)
|
40
|
-
end
|
41
|
-
|
42
|
-
def valid?
|
43
|
-
@id == 'VBRI'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module WahWah
|
4
|
-
module Mp3
|
5
|
-
# Xing header structure:
|
6
|
-
#
|
7
|
-
# Position Length Meaning
|
8
|
-
# 0 4 VBR header ID in 4 ASCII chars, either 'Xing' or 'Info',
|
9
|
-
# not NULL-terminated
|
10
|
-
#
|
11
|
-
# 4 4 Flags which indicate what fields are present,
|
12
|
-
# flags are combined with a logical OR. Field is mandatory.
|
13
|
-
#
|
14
|
-
# 0x0001 - Frames field is present
|
15
|
-
# 0x0002 - Bytes field is present
|
16
|
-
# 0x0004 - TOC field is present
|
17
|
-
# 0x0008 - Quality indicator field is present
|
18
|
-
#
|
19
|
-
# 8 4 Number of Frames as Big-Endian 32-bit unsigned (optional)
|
20
|
-
#
|
21
|
-
# 8 or 12 4 Number of Bytes in file as Big-Endian 32-bit unsigned (optional)
|
22
|
-
#
|
23
|
-
# 8,12 or 16 100 100 TOC entries for seeking as integral BYTE (optional)
|
24
|
-
#
|
25
|
-
# 8,12,16,108,112 or 116 4 Quality indicator as Big-Endian 32-bit unsigned
|
26
|
-
# from 0 - best quality to 100 - worst quality (optional)
|
27
|
-
class XingHeader
|
28
|
-
attr_reader :frames_count, :bytes_count
|
29
|
-
|
30
|
-
def initialize(file_io, offset = 0)
|
31
|
-
file_io.seek(offset)
|
32
|
-
|
33
|
-
@id, @flags = file_io.read(8)&.unpack('A4N')
|
34
|
-
return unless valid?
|
35
|
-
|
36
|
-
@frames_count = @flags & 1 == 1 ? file_io.read(4).unpack('N').first : 0
|
37
|
-
@bytes_count = @flags & 2 == 2 ? file_io.read(4).unpack('N').first : 0
|
38
|
-
end
|
39
|
-
|
40
|
-
def valid?
|
41
|
-
%w(Xing Info).include? @id
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/lib/wahwah/mp3_tag.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'forwardable'
|
4
|
-
|
5
|
-
module WahWah
|
6
|
-
class Mp3Tag < Tag
|
7
|
-
extend TagDelegate
|
8
|
-
extend Forwardable
|
9
|
-
|
10
|
-
def_delegator :@mpeg_frame_header, :version, :mpeg_version
|
11
|
-
def_delegator :@mpeg_frame_header, :layer, :mpeg_layer
|
12
|
-
def_delegator :@mpeg_frame_header, :kind, :mpeg_kind
|
13
|
-
def_delegators :@mpeg_frame_header, :channel_mode, :sample_rate
|
14
|
-
|
15
|
-
tag_delegate :@id3_tag,
|
16
|
-
:title,
|
17
|
-
:artist,
|
18
|
-
:album,
|
19
|
-
:albumartist,
|
20
|
-
:composer,
|
21
|
-
:comments,
|
22
|
-
:track,
|
23
|
-
:track_total,
|
24
|
-
:genre,
|
25
|
-
:year,
|
26
|
-
:disc,
|
27
|
-
:disc_total,
|
28
|
-
:images
|
29
|
-
|
30
|
-
def id3v2?
|
31
|
-
@id3_tag.instance_of? ID3::V2
|
32
|
-
end
|
33
|
-
|
34
|
-
def invalid_id3?
|
35
|
-
@id3_tag.nil?
|
36
|
-
end
|
37
|
-
|
38
|
-
def id3_version
|
39
|
-
@id3_tag&.version
|
40
|
-
end
|
41
|
-
|
42
|
-
def is_vbr?
|
43
|
-
xing_header.valid? || vbri_header.valid?
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
def parse
|
48
|
-
@id3_tag = parse_id3_tag
|
49
|
-
parse_duration if mpeg_frame_header.valid?
|
50
|
-
end
|
51
|
-
|
52
|
-
def parse_id3_tag
|
53
|
-
id3_v1_tag = ID3::V1.new(@file_io)
|
54
|
-
id3_v2_tag = ID3::V2.new(@file_io)
|
55
|
-
|
56
|
-
return id3_v2_tag if id3_v2_tag.valid?
|
57
|
-
id3_v1_tag if id3_v1_tag.valid?
|
58
|
-
end
|
59
|
-
|
60
|
-
def parse_duration
|
61
|
-
if is_vbr?
|
62
|
-
@duration = (frames_count * (mpeg_frame_header.samples_per_frame / sample_rate.to_f)).round
|
63
|
-
@bitrate = bytes_count * 8 / @duration / 1000 unless @duration.zero?
|
64
|
-
else
|
65
|
-
@bitrate = mpeg_frame_header.frame_bitrate
|
66
|
-
@duration = (file_size - (@id3_tag&.size || 0)) * 8 / (@bitrate * 1000) unless @bitrate.zero?
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def mpeg_frame_header
|
71
|
-
# Because id3v2 tag on the file header so skip id3v2 tag
|
72
|
-
@mpeg_frame_header ||= Mp3::MpegFrameHeader.new(@file_io, id3v2? ? @id3_tag&.size : 0)
|
73
|
-
end
|
74
|
-
|
75
|
-
def xing_header
|
76
|
-
@xing_header ||= Mp3::XingHeader.new(@file_io, xing_header_offset)
|
77
|
-
end
|
78
|
-
|
79
|
-
def vbri_header
|
80
|
-
@vbri_header ||= Mp3::VbriHeader.new(@file_io, vbri_header_offset)
|
81
|
-
end
|
82
|
-
|
83
|
-
def xing_header_offset
|
84
|
-
mpeg_frame_header_position = mpeg_frame_header.position
|
85
|
-
mpeg_frame_header_size = Mp3::MpegFrameHeader::HEADER_SIZE
|
86
|
-
mpeg_frame_side_info_size = mpeg_version == 'MPEG1' ?
|
87
|
-
(channel_mode == 'Single Channel' ? 17 : 32) :
|
88
|
-
(channel_mode == 'Single Channel' ? 9 : 17)
|
89
|
-
|
90
|
-
mpeg_frame_header_position + mpeg_frame_header_size + mpeg_frame_side_info_size
|
91
|
-
end
|
92
|
-
|
93
|
-
def vbri_header_offset
|
94
|
-
mpeg_frame_header_position = mpeg_frame_header.position
|
95
|
-
mpeg_frame_header_size = Mp3::MpegFrameHeader::HEADER_SIZE
|
96
|
-
|
97
|
-
mpeg_frame_header_position + mpeg_frame_header_size + 32
|
98
|
-
end
|
99
|
-
|
100
|
-
def frames_count
|
101
|
-
return xing_header.frames_count if xing_header.valid?
|
102
|
-
vbri_header.frames_count if vbri_header.valid?
|
103
|
-
end
|
104
|
-
|
105
|
-
def bytes_count
|
106
|
-
return xing_header.bytes_count if xing_header.valid?
|
107
|
-
vbri_header.bytes_count if vbri_header.valid?
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|