in utils/frame_range.py [0:0]
def parse_frame_range(frame_range_str: str) -> NamedOptionalSet:
"""
Create a frame range from a string, e.g.: 1-10,15,21-40,51-62.
"""
if len(frame_range_str) == 0:
return NamedOptionalSet(name=frame_range_str, set=OptionalSet())
range_strs = frame_range_str.split(',')
def parse_sub_range(sub_range_str: str):
splits = [int(s) for s in sub_range_str.split('-', maxsplit=1)]
if len(splits) == 1:
return splits
start, end = splits
assert start <= end
return range(start, end + 1)
frame_range = set()
for range_str in range_strs:
frame_range.update(parse_sub_range(range_str))
# Convert the range to a friendly string representation, e.g.,
# 6,6,5,8,0,2-4,5-6,10,9 -> "0,2-6,8-10"
it = iter(sorted(frame_range))
ranges = []
start = next(it)
last_index = start
def add_range(ranges):
if last_index == start:
ranges.append(f"{start}")
else:
ranges.append(f"{start}-{last_index}")
for i in it:
if i < 0:
raise ValueError("Frame indices must be positive.")
assert(i > last_index)
if i - last_index > 1:
add_range(ranges)
start = i
last_index = i
add_range(ranges)
name = ",".join(ranges)
return NamedOptionalSet(name=name, set=OptionalSet(frame_range))