IETF MOQ WG: How timestamps totally solve delivery timeout
Martin Duke posted to the MOQ working group mailing list on June 12, 2026. The reason we have delivery timeout is because players have some amount of buffer. When it starts playing, something that arrives a little late…
Message Snapshot
- List:
moq@ietf.org - Thread subject: How timestamps totally solve delivery timeout
- Message subject: [Moq] How timestamps totally solve delivery timeout
- Author: Martin Duke
- Published: 2026-06-12T13:47:04.000Z
- Source tag:
ietf-mailing-list - Message URL: Open in IETF Mail Archive
Summary
Martin Duke posted to the MOQ working group mailing list on June 12, 2026. The reason we have delivery timeout is because players have some amount of buffer. When it starts playing, something that arrives a little late…
Why It Matters
This message came from the public MOQ working group archive and captures active discussion, meeting coordination, or implementation feedback around Media over QUIC.
Message Excerpt
The reason we have delivery timeout is because players have some amount of buffer. When it starts playing, something that arrives a little late is fine; if it is later than the buffer length, the player has already passed
Plain-Text Body
The reason we have delivery timeout is because players have some amount of buffer. When it starts playing, something that arrives a little late is fine; if it is later than the buffer length, the player has already passed it by.
Today, MOQT has no idea what the intended time interval between two objects is. So it uses the heuristic of the arrival time at the relay, which bakes in whatever jitter happened upstream. If the buffer is 5 seconds, and object(time 1 minute) arrives at the relay 1:10 after object(time 0), the relay will send it immediately if it can, even though it is 5 seconds beyond the buffer at the play head.
If there were timestamps, I would apply the following pseudocode
Subscription::MaybeSendObject(object) { if (FirstObjectInSubscription(object)) { first_object_timestamp_ = object.timestamp; first_object_send_time_ = clock_.Now(); SendObject(object); return; } intended_relative_time = object.timestamp - first_object_timestamp_; actual_relative_time = clock.Now() - first_object_send_time_; if (actual_relative_time > intended_relative_time + delivery_timeout_; { ResetStream(); return; } SendObject(object); }
If the QUIC layer doesn't fail us, I contend that this design guarantees that objects only arrive if the play head hasn't passed them by.
Martin