summaryrefslogtreecommitdiff
path: root/fftools/sync_queue.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-05-23 15:46:11 +0200
committerAnton Khirnov <anton@khirnov.net>2023-05-28 10:47:59 +0200
commit163e3a299e1cc06f0f871d8140def974757e4a7d (patch)
tree6572d773763bf1509937b791845fb703045fa130 /fftools/sync_queue.c
parente9a868e9eef5215b468244596e2103a3add7759f (diff)
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
Diffstat (limited to 'fftools/sync_queue.c')
-rw-r--r--fftools/sync_queue.c13
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++) {