format_parser 0.13.5 → 0.13.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/format_parser/version.rb +1 -1
- data/lib/parsers/moov_parser/decoder.rb +32 -23
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 236f35fe657e5bb8f51cf08724fb3138f17b6a20605af4131a7643711f43cd93
|
4
|
+
data.tar.gz: 65037da607c406be2bf0d8e7eb549537199a4ed8c97243c68b63c62e20bdb9e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aaa8a5c25a9b9b6884e0ec22adf90390aa2a32e4268e7e1d01c98a5d88a20bb25a4635ca53fd891d28bae8de34287ff57c943af76c905425f41ade98985408d9
|
7
|
+
data.tar.gz: 54a417ead7b3d12d585f6775feee2295d95f40fe9ac66a7a5e0788dfd6791271d95ddc1ef230a7c3e17c04635765916090db2a0cf98a722e5c7d662f80eb7d37
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 0.13.6
|
2
|
+
* Make all reads in the MOOV decoder strict - fail early if reads are improperly sized
|
3
|
+
* Disable parsing for `udta` atoms in MP4/MOV since we do not have a good way of parsing them yet
|
4
|
+
|
1
5
|
## 0.13.5
|
2
6
|
* Use the same TIFF parsing flow for CR2 files as it seems we are not very reliable _yet._ The CR2 parser will need some work.
|
3
7
|
|
@@ -2,6 +2,8 @@
|
|
2
2
|
# read atoms and parse their data fields if applicable. Also contains
|
3
3
|
# a few utility functions for finding atoms in a list etc.
|
4
4
|
class FormatParser::MOOVParser::Decoder
|
5
|
+
include FormatParser::IOUtils
|
6
|
+
|
5
7
|
class Atom < Struct.new(:at, :atom_size, :atom_type, :path, :children, :atom_fields)
|
6
8
|
def to_s
|
7
9
|
'%s (%s): %d bytes at offset %d' % [atom_type, path.join('.'), atom_size, at]
|
@@ -18,11 +20,13 @@ class FormatParser::MOOVParser::Decoder
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
# Atoms (boxes) that are known to only contain children, no data fields
|
22
|
-
|
23
|
+
# Atoms (boxes) that are known to only contain children, no data fields.
|
24
|
+
# Avoid including udta or udta.meta here since we do not have methods
|
25
|
+
# for dealing with them yet.
|
26
|
+
KNOWN_BRANCH_ATOM_TYPES = %w(moov mdia trak clip edts minf dinf stbl)
|
23
27
|
|
24
|
-
#
|
25
|
-
KNOWN_BRANCH_AND_LEAF_ATOM_TYPES = %w(
|
28
|
+
# Mark that udta may contain both
|
29
|
+
KNOWN_BRANCH_AND_LEAF_ATOM_TYPES = [] # %w(udta) # the udta.meta thing used by iTunes
|
26
30
|
|
27
31
|
# Limit how many atoms we scan in sequence, to prevent derailments
|
28
32
|
MAX_ATOMS_AT_LEVEL = 128
|
@@ -169,16 +173,24 @@ class FormatParser::MOOVParser::Decoder
|
|
169
173
|
|
170
174
|
def parse_hdlr_atom(io, atom_size)
|
171
175
|
sub_io = StringIO.new(io.read(atom_size - 8))
|
172
|
-
|
173
|
-
|
176
|
+
version = read_byte_value(sub_io)
|
177
|
+
base_fields = {
|
178
|
+
version: version,
|
174
179
|
flags: read_bytes(sub_io, 3),
|
175
180
|
component_type: read_bytes(sub_io, 4),
|
176
181
|
component_subtype: read_bytes(sub_io, 4),
|
177
182
|
component_manufacturer: read_bytes(sub_io, 4),
|
178
|
-
component_flags: read_bytes(sub_io, 4),
|
179
|
-
component_flags_mask: read_bytes(sub_io, 4),
|
180
|
-
component_name: sub_io.read,
|
181
183
|
}
|
184
|
+
if version == 1
|
185
|
+
version1_fields = {
|
186
|
+
component_flags: read_bytes(sub_io, 4),
|
187
|
+
component_flags_mask: read_bytes(sub_io, 4),
|
188
|
+
component_name: sub_io.read,
|
189
|
+
}
|
190
|
+
base_fields.merge(version1_fields)
|
191
|
+
else
|
192
|
+
base_fields
|
193
|
+
end
|
182
194
|
end
|
183
195
|
|
184
196
|
def parse_meta_atom(io, atom_size)
|
@@ -217,11 +229,8 @@ class FormatParser::MOOVParser::Decoder
|
|
217
229
|
# If atom_size is specified to be 1, it is larger than what fits into the
|
218
230
|
# 4 bytes and we need to read it right after the atom type
|
219
231
|
atom_size = read_64bit_uint(io) if atom_size == 1
|
220
|
-
|
221
|
-
|
222
|
-
# the atom size and atom type, but not any more than that
|
223
|
-
size_of_atom_type_and_size = io.pos - atom_pos
|
224
|
-
atom_size_sans_header = atom_size - size_of_atom_type_and_size
|
232
|
+
atom_header_size = io.pos - atom_pos
|
233
|
+
atom_size_sans_header = atom_size - atom_header_size
|
225
234
|
|
226
235
|
children, fields = if KNOWN_BRANCH_AND_LEAF_ATOM_TYPES.include?(atom_type)
|
227
236
|
parse_atom_children_and_data_fields(io, atom_size_sans_header, atom_type, current_branch)
|
@@ -239,39 +248,39 @@ class FormatParser::MOOVParser::Decoder
|
|
239
248
|
end
|
240
249
|
|
241
250
|
def read_16bit_fixed_point(io)
|
242
|
-
_whole, _fraction = io
|
251
|
+
_whole, _fraction = safe_read(io, 2).unpack('CC')
|
243
252
|
end
|
244
253
|
|
245
254
|
def read_32bit_fixed_point(io)
|
246
|
-
_whole, _fraction = io
|
255
|
+
_whole, _fraction = safe_read(io, 4).unpack('nn')
|
247
256
|
end
|
248
257
|
|
249
258
|
def read_chars(io, n)
|
250
|
-
io
|
259
|
+
safe_read(io, n)
|
251
260
|
end
|
252
261
|
|
253
262
|
def read_byte_value(io)
|
254
|
-
io
|
263
|
+
safe_read(io, 1).unpack('C').first
|
255
264
|
end
|
256
265
|
|
257
266
|
def read_bytes(io, n)
|
258
|
-
io
|
267
|
+
safe_read(io, n)
|
259
268
|
end
|
260
269
|
|
261
270
|
def read_16bit_uint(io)
|
262
|
-
io
|
271
|
+
safe_read(io, 2).unpack('n').first
|
263
272
|
end
|
264
273
|
|
265
274
|
def read_32bit_uint(io)
|
266
|
-
io
|
275
|
+
safe_read(io, 4).unpack('N').first
|
267
276
|
end
|
268
277
|
|
269
278
|
def read_64bit_uint(io)
|
270
|
-
io
|
279
|
+
safe_read(io, 8).unpack('Q>').first
|
271
280
|
end
|
272
281
|
|
273
282
|
def read_binary_coded_decimal(io)
|
274
|
-
bcd_string = io
|
283
|
+
bcd_string = safe_read(io, 4)
|
275
284
|
[bcd_string].pack('H*').unpack('C*')
|
276
285
|
end
|
277
286
|
end
|