mirror of https://github.com/devine-dl/devine.git
fix(utilities): Prevent finding the same box index over and over
Since it removed the data before the found box's index(-4), all loops would only find the same box at the same index again, but this time the box index would be 4 since all previous data was removed in the prior loop. Since the index-=4 code is only run if the index > 4, this never run on the second loop, and since this data now does not have the box length, Box.parse failed with an IOError. This corrects looping through boxes and correctly obtains and parses each box.
This commit is contained in:
parent
2e697d93fc
commit
2acee30e54
|
@ -123,18 +123,18 @@ def get_boxes(data: bytes, box_type: bytes, as_bytes: bool = False) -> Box:
|
||||||
# since it doesn't care what child box the wanted box is from, this works fine.
|
# since it doesn't care what child box the wanted box is from, this works fine.
|
||||||
if not isinstance(data, (bytes, bytearray)):
|
if not isinstance(data, (bytes, bytearray)):
|
||||||
raise ValueError("data must be bytes")
|
raise ValueError("data must be bytes")
|
||||||
|
|
||||||
|
offset = 0
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
index = data.index(box_type)
|
index = data[offset:].index(box_type)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
break
|
break
|
||||||
if index < 0:
|
if index < 0:
|
||||||
break
|
break
|
||||||
if index > 4:
|
index -= 4 # size is before box type and is 4 bytes long
|
||||||
index -= 4 # size is before box type and is 4 bytes long
|
|
||||||
data = data[index:]
|
|
||||||
try:
|
try:
|
||||||
box = Box.parse(data)
|
box = Box.parse(data[offset:][index:])
|
||||||
except IOError:
|
except IOError:
|
||||||
# since get_init_segment might cut off unexpectedly, pymp4 may be unable to read
|
# since get_init_segment might cut off unexpectedly, pymp4 may be unable to read
|
||||||
# the expected amounts of data and complain, so let's just end the function here
|
# the expected amounts of data and complain, so let's just end the function here
|
||||||
|
@ -147,6 +147,7 @@ def get_boxes(data: bytes, box_type: bytes, as_bytes: bool = False) -> Box:
|
||||||
raise e
|
raise e
|
||||||
if as_bytes:
|
if as_bytes:
|
||||||
box = Box.build(box)
|
box = Box.build(box)
|
||||||
|
offset += index + len(Box.build(box))
|
||||||
yield box
|
yield box
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue