diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-05-23 15:46:11 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-05-28 10:47:59 +0200 |
commit | 163e3a299e1cc06f0f871d8140def974757e4a7d (patch) | |
tree | 6572d773763bf1509937b791845fb703045fa130 | |
parent | e9a868e9eef5215b468244596e2103a3add7759f (diff) | |
download | ffmpeg-163e3a299e1cc06f0f871d8140def974757e4a7d.tar.gz |
fftools/sync_queue: make sure non-limiting streams are not used as queue head
A non-limiting stream could mistakenly end up being the queue head,
which would then produce incorrect synchronization, seen e.g. in
fate-matroska-flac-extradata-update for certain number of frame threads
(e.g. 5).
Found-By: James Almer
-rw-r--r-- | fftools/sync_queue.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fftools/sync_queue.c b/fftools/sync_queue.c index c0f33e9235..bc107ba4fe 100644 --- a/fftools/sync_queue.c +++ b/fftools/sync_queue.c @@ -217,17 +217,26 @@ static void finish_stream(SyncQueue *sq, unsigned int stream_idx) static void queue_head_update(SyncQueue *sq) { + av_assert0(sq->have_limiting); + if (sq->head_stream < 0) { + unsigned first_limiting = UINT_MAX; + /* wait for one timestamp in each stream before determining * the queue head */ for (unsigned int i = 0; i < sq->nb_streams; i++) { SyncQueueStream *st = &sq->streams[i]; - if (st->limiting && st->head_ts == AV_NOPTS_VALUE) + if (!st->limiting) + continue; + if (st->head_ts == AV_NOPTS_VALUE) return; + if (first_limiting == UINT_MAX) + first_limiting = i; } // placeholder value, correct one will be found below - sq->head_stream = 0; + av_assert0(first_limiting < UINT_MAX); + sq->head_stream = first_limiting; } for (unsigned int i = 0; i < sq->nb_streams; i++) { |