Skip to content

Commit 6cd41da

Browse files
authored
Remove group expires. (#5)
1 parent 559b3e5 commit 6cd41da

2 files changed

Lines changed: 15 additions & 30 deletions

File tree

draft-lcurley-moq-transfork.md

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,6 @@ SUBSCRIBE Message {
399399
[ Track Path Part (b) ]
400400
Track Priority (i)
401401
Group Order (i)
402-
Group Expires (i)
403402
Group Min (i)
404403
Group Max (i)
405404
}
@@ -425,11 +424,6 @@ The publisher SHOULD transmit *higher* values first during congestion.
425424
The transmission order of the Groups within the subscription.
426425
The publisher SHOULD transmit groups based on their sequence number in default (0), ascending (1), or descending (2) order.
427426

428-
**Group Expires**:
429-
A duration in milliseconds that applies to all Groups within the subscription.
430-
The group SHOULD be dropped if this duration has elapsed after group has finished, including any time spent cached.
431-
The publisher's Group Expires value (via INFO) SHOULD be used instead when smaller.
432-
433427
**Group Min**:
434428
The minimum group sequence number plus 1.
435429
A value of 0 indicates the latest Group Sequence as determined by the publisher.
@@ -446,7 +440,6 @@ A subscriber can modify a subscription with a SUBSCRIBE_UPDATE message.
446440
SUBSCRIBE_UPDATE Message {
447441
Track Priority (i)
448442
Group Order (i)
449-
Group Expires (i)
450443
Group Min (i)
451444
Group Max (i)
452445
}
@@ -504,7 +497,6 @@ INFO Message {
504497
Track Priority (i)
505498
Group Latest (i)
506499
Group Order (i)
507-
Group Expires (i)
508500
}
509501
~~~
510502

@@ -519,11 +511,6 @@ A relay without an active subscription SHOULD forward this request upstream
519511
**Group Order**:
520512
The publisher's intended order of the groups within the subscription: none (0), ascending (1), or descending (2).
521513

522-
**Group Expires**:
523-
A duration in milliseconds.
524-
The group SHOULD be dropped if this duration has elapsed after group has finished, including any time spent cached.
525-
The Subscriber's Group Expires value SHOULD be used instead when smaller.
526-
527514

528515
## INFO_PLEASE
529516
The INFO_PLEASE message is used to request an INFO response.
@@ -611,6 +598,9 @@ A generic library or relay MUST NOT inspect or modify the contents unless otherw
611598
# Appendix: Changelog
612599
Notable changes between versions of this draft.
613600

601+
## moq-transfork-04
602+
- Removed Group Expires.
603+
614604
## moq-transfork-03
615605
- Broadcast and Track have been merged.
616606
- Tracks now have a variable length path instead of a (broadcast, name) tuple

draft-lcurley-moq-use-cases.md

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,12 @@ In an ideal world, FEC would be performed by QUIC based on the properties of the
135135
However this is not currently not supported and FEC is left to the application.
136136

137137
In MoqTransfork, each FEC packet is transmitted as a separate GROUP with a single FRAME.
138-
A real-time subscriber issues a `SUBSCRIBE` with an aggressive `Group Expires` value in the milliseconds range.
139-
The publisher will drop any Groups that have not been transmitted or acknowledged within this time frame, potentially causing them to be lost.
138+
This means using QUIC streams instead of QUIC datagrams to automatically adjust to the viewer's RTT, automatically retransmitting in scenarios where RTT is small.
139+
Lost packets will be retransmitted unless a real-time subscriber updates the subscription to skip them.
140+
For example, if group 3 and group 5 are used to reconstruct group 4, then the subscriber can update the subscription to start at group 5, causing group 4 to be skipped.
140141

141-
Normally, FEC is performed by transmitting individual packets once as datagrams.
142-
However, QUIC streams are useful as they allow retransmissions when `Group Expires` is smaller than the RTT.
143-
If the RTT is too high, then the RESET_STREAM frame adds some overhead but it's inconsequential (~10 more bytes).
144-
This enables retransmitting lost packets on short hops and otherwise relying on FEC for long hops.
142+
This round trip of feedback to avoid retransmissions is not ideal but keep in mind that Group Order = DESC will be respected, meaning group 4 won't be (re)transmitted if there's more important data to send.
143+
This can result in wasted bandwidth versus something like a timeout on the sender, but it does not impact the user experience nor are these unnecessarily retransmittted audio FEC packets large enough to matter.
145144

146145

147146
# Metadata
@@ -201,8 +200,8 @@ A subscriber or publisher can reset groups to avoid wasting bandwidth on old dat
201200
A real-time viewer could issue:
202201

203202
~~~
204-
SUBSCRIBE track=audio priority=1 order=DESC group_expires=100ms
205-
SUBSCRIBE track=video priority=0 order=DESC group_expires=100ms
203+
SUBSCRIBE track=audio priority=1 order=DESC
204+
SUBSCRIBE track=video priority=0 order=DESC
206205
~~~
207206

208207
In this example, audio is higher priority than video, and newer groups are higher priority than older groups.
@@ -223,10 +222,6 @@ The user experience depends on the amount of congestion:
223222
- If there's moderate congestion, the tail of the old video group is dropped.
224223
- If there's severe congestion, all video will be late/dropped and some audio groups/frames will be dropped.
225224

226-
The value of `group_expires` is optional.
227-
In this example it means that the publisher automatically resets each group 100ms after they are no longer the latest.
228-
It's recommended to use the maximum jitter buffer size.
229-
230225
## Unreliable Live
231226
Unreliable live is a term I made up.
232227
Basically we want low latency, but we don't need it at all costs and we're willing to skip some video to achieve it.
@@ -236,16 +231,16 @@ An unreliable live viewer could issue:
236231

237232
~~~
238233
SUBSCRIBE track=audio priority=1 order=ASC
239-
SUBSCRIBE track=video priority=0 order=DESC group_expires=3s
234+
SUBSCRIBE track=video priority=0 order=DESC
240235
~~~
241236

242-
This example is different from the real-time one in that audio is fully reliable and delivered in order.
237+
This example is different from the real-time one in that audio is reliable and delivered in order.
243238
Of course this is optional and up to the application, as it will result in buffering during significant congestion.
244239
If the viewer goes through a tunnel and then comes back online, they won't miss any audio.
245240

246-
A key difference is that our jitter buffer is much larger for video, 3s in this example.
247-
The player will tolerate up to 3s of latency before it starts skipping past video frames.
248-
Note that the `group_expires` value can be increased during buffering by issuing a SUBSCRIBE_UPDATE.
241+
Video will be delivered out of order but the player can maintain a jitter buffer.
242+
For example, it could hold onto up to 3s of video frames in memory so it can tolerate an equal amount of congestion.
243+
If the buffer fills up, the player can STOP_SENDING any old groups and/or update the subscription to skip them.
249244

250245
## Reliable Live
251246
Reliable live is another term I made up.

0 commit comments

Comments
 (0)