[webvtt] Fix timestamp overflow adjustment (#698)

In some streams, empty segments may appear with a bogus, non-monotone MPEG timestamp.
This should not be considered as an overflow

Authored by: fstirlitz
This commit is contained in:
Felix S 2021-08-15 15:33:06 +00:00 committed by GitHub
parent e040bb0a41
commit 7a6742b5f9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -254,8 +254,14 @@ class HlsFD(FragmentFD):
def pack_fragment(frag_content, frag_index): def pack_fragment(frag_content, frag_index):
output = io.StringIO() output = io.StringIO()
adjust = 0 adjust = 0
overflow = False
mpegts_last = None
for block in webvtt.parse_fragment(frag_content): for block in webvtt.parse_fragment(frag_content):
if isinstance(block, webvtt.CueBlock): if isinstance(block, webvtt.CueBlock):
extra_state['webvtt_mpegts_last'] = mpegts_last
if overflow:
extra_state['webvtt_mpegts_adjust'] += 1
overflow = False
block.start += adjust block.start += adjust
block.end += adjust block.end += adjust
@ -296,9 +302,9 @@ class HlsFD(FragmentFD):
extra_state.setdefault('webvtt_mpegts_adjust', 0) extra_state.setdefault('webvtt_mpegts_adjust', 0)
block.mpegts += extra_state['webvtt_mpegts_adjust'] << 33 block.mpegts += extra_state['webvtt_mpegts_adjust'] << 33
if block.mpegts < extra_state.get('webvtt_mpegts_last', 0): if block.mpegts < extra_state.get('webvtt_mpegts_last', 0):
extra_state['webvtt_mpegts_adjust'] += 1 overflow = True
block.mpegts += 1 << 33 block.mpegts += 1 << 33
extra_state['webvtt_mpegts_last'] = block.mpegts mpegts_last = block.mpegts
if frag_index == 1: if frag_index == 1:
extra_state['webvtt_mpegts'] = block.mpegts or 0 extra_state['webvtt_mpegts'] = block.mpegts or 0