From 7a6742b5f9e7b8d0c92fb6b1f56e7e486873c169 Mon Sep 17 00:00:00 2001 From: Felix S Date: Sun, 15 Aug 2021 15:33:06 +0000 Subject: [PATCH] [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 --- yt_dlp/downloader/hls.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py index 9cfc191cb..779658b70 100644 --- a/yt_dlp/downloader/hls.py +++ b/yt_dlp/downloader/hls.py @@ -254,8 +254,14 @@ class HlsFD(FragmentFD): def pack_fragment(frag_content, frag_index): output = io.StringIO() adjust = 0 + overflow = False + mpegts_last = None for block in webvtt.parse_fragment(frag_content): 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.end += adjust @@ -296,9 +302,9 @@ class HlsFD(FragmentFD): extra_state.setdefault('webvtt_mpegts_adjust', 0) block.mpegts += extra_state['webvtt_mpegts_adjust'] << 33 if block.mpegts < extra_state.get('webvtt_mpegts_last', 0): - extra_state['webvtt_mpegts_adjust'] += 1 + overflow = True block.mpegts += 1 << 33 - extra_state['webvtt_mpegts_last'] = block.mpegts + mpegts_last = block.mpegts if frag_index == 1: extra_state['webvtt_mpegts'] = block.mpegts or 0