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:
rlaphoenix 2024-05-15 17:54:21 +01:00
parent 2e697d93fc
commit 2acee30e54
1 changed files with 6 additions and 5 deletions

View File

@ -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