You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* moq-lite-05: add Start Frame to FETCH
Allow a subscriber to begin a FETCH partway through a group instead of
always at frame 0, enabling resumption of a partially-received group.
A Start Frame past the end of the group returns no frames.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* moq-lite-05: rename Start/End Group to Group Start/Group End
Use entity-first naming consistent with Group Sequence and the new
Frame Start field. Wire format is unchanged. The moq-lite-03 changelog
keeps the original names since those drafts shipped with them.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* moq-lite-05: clarify Frame Start timing for in-progress groups
Define when the out-of-range case is evaluated: for an open group the
publisher waits and delivers frame Frame Start (and later) as they
arrive, like a live subscription; the empty/out-of-range result is only
resolved against the final frame count once the group closes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: draft-lcurley-moq-lite.md
+28-16Lines changed: 28 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -295,7 +295,7 @@ Either endpoint MAY reset/cancel the stream at any time.
295
295
### Fetch
296
296
A subscriber opens a Fetch Stream (0x3) to request a single Group from a Track.
297
297
298
-
The subscriber sends a FETCH message containing the broadcast path, track name, priority, and group sequence.
298
+
The subscriber sends a FETCH message containing the broadcast path, track name, priority, group sequence, and the frame index at which to start.
299
299
Unlike Group Streams (which MUST start with a GROUP message), the publisher responds with FRAME messages directly on the same bidirectional stream — there is no preceding GROUP header.
300
300
The Subscribe ID and Group Sequence for the returned FRAME messages are implicit, taken from the original FETCH request.
301
301
The publisher FINs the stream after the last frame, or resets the stream on error.
@@ -608,8 +608,8 @@ SUBSCRIBE Message {
608
608
Subscriber Priority (8)
609
609
Subscriber Ordered (8)
610
610
Subscriber Stale (i)
611
-
Start Group (i)
612
-
End Group (i)
611
+
Group Start (i)
612
+
Group End (i)
613
613
}
614
614
~~~
615
615
@@ -635,12 +635,12 @@ A value of `0` means the subscriber wants only the latest group in live delivery
635
635
This is a delivery-time preference, not a retention rule: the publisher's cache (see `Publisher Cache` in [SUBSCRIBE_OK](#subscribe-ok)) may still hold these groups for FETCH or future subscriptions.
636
636
See the [Expiration](#expiration) section for more information.
637
637
638
-
**Start Group**:
638
+
**Group Start**:
639
639
The first group to deliver.
640
640
A value of 0 means the latest group (default).
641
641
A non-zero value is the absolute group sequence + 1.
642
642
643
-
**End Group**:
643
+
**Group End**:
644
644
The last group to deliver (inclusive).
645
645
A value of 0 means unbounded (default).
646
646
A non-zero value is the absolute group sequence + 1.
@@ -657,8 +657,8 @@ SUBSCRIBE_UPDATE Message {
657
657
Subscriber Priority (8)
658
658
Subscriber Ordered (8)
659
659
Subscriber Stale (i)
660
-
Start Group (i)
661
-
End Group (i)
660
+
Group Start (i)
661
+
Group End (i)
662
662
}
663
663
~~~
664
664
@@ -677,8 +677,8 @@ SUBSCRIBE_OK Message {
677
677
Publisher Priority (8)
678
678
Publisher Ordered (8)
679
679
Publisher Cache (i)
680
-
Start Group (i)
681
-
End Group (i)
680
+
Group Start (i)
681
+
Group End (i)
682
682
Publisher Timescale (i)
683
683
Publisher Compression (i)
684
684
}
@@ -687,12 +687,12 @@ SUBSCRIBE_OK Message {
687
687
**Type**:
688
688
Set to 0x0 to indicate a SUBSCRIBE_OK message.
689
689
690
-
**Start Group**:
690
+
**Group Start**:
691
691
The resolved absolute start group sequence.
692
692
A value of 0 means the start group is not yet known; the publisher MUST send a subsequent SUBSCRIBE_OK with a resolved value.
693
693
A non-zero value is the absolute group sequence + 1.
694
694
695
-
**End Group**:
695
+
**Group End**:
696
696
The resolved absolute end group sequence (inclusive).
697
697
A value of 0 means unbounded.
698
698
A non-zero value is the absolute group sequence + 1.
@@ -709,7 +709,7 @@ The minimum age, in milliseconds, the publisher guarantees to retain a group pas
709
709
Applies only to non-latest groups; the latest group is always retained.
710
710
Analogous to HTTP `Cache-Control: max-age` as a lower bound:
711
711
712
-
- A subscriber MAY issue a SUBSCRIBE or FETCH with an older `Start Group` and expect the publisher to still have it, as long as the group's age does not exceed `Publisher Cache`.
712
+
- A subscriber MAY issue a SUBSCRIBE or FETCH with an older `Group Start` and expect the publisher to still have it, as long as the group's age does not exceed `Publisher Cache`.
713
713
- The publisher MAY retain groups longer than `Publisher Cache` (a best-effort cache beyond the guarantee); subscribers MUST NOT assume older groups are unavailable.
714
714
715
715
A value of `0` means no retention guarantee beyond live delivery; older groups MAY still be available but the publisher makes no promise.
@@ -744,19 +744,19 @@ A SUBSCRIBE_DROP message is sent by the publisher on the Subscribe Stream when g
744
744
SUBSCRIBE_DROP Message {
745
745
Type (i) = 0x1
746
746
Message Length (i)
747
-
Start Group (i)
748
-
End Group (i)
747
+
Group Start (i)
748
+
Group End (i)
749
749
Error Code (i)
750
750
}
751
751
~~~
752
752
753
753
**Type**:
754
754
Set to 0x1 to indicate a SUBSCRIBE_DROP message.
755
755
756
-
**Start Group**:
756
+
**Group Start**:
757
757
The first absolute group sequence in the dropped range.
758
758
759
-
**End Group**:
759
+
**Group End**:
760
760
The last absolute group sequence in the dropped range (inclusive).
761
761
762
762
**Error Code**:
@@ -773,6 +773,7 @@ FETCH Message {
773
773
Track Name (s)
774
774
Subscriber Priority (8)
775
775
Group Sequence (i)
776
+
Frame Start (i)
776
777
}
777
778
~~~
778
779
@@ -789,6 +790,15 @@ See the [Prioritization](#prioritization) section for more information.
789
790
**Group Sequence**:
790
791
The sequence number of the group to fetch.
791
792
793
+
**Frame Start**:
794
+
The index of the first frame to return, counting from `0` for the first frame in the group.
795
+
The publisher skips all frames before this index and begins the response at this frame, allowing a subscriber to resume partway through a group.
796
+
A value of `0` returns the entire group.
797
+
If the group is still in progress and frame `Frame Start` has not yet been produced, the publisher waits and delivers it (and any later frames) as they arrive, just like a live subscription; it does not return early.
798
+
Only once the group is complete is the out-of-range case resolved: if `Frame Start` is greater than or equal to the group's final frame count, the publisher returns no FRAME messages and FINs the stream.
799
+
800
+
The returned FRAME messages are otherwise unchanged: when the Track's `Publisher Timescale` is non-zero, the first returned frame's `Timestamp Delta` is delta-encoded from `0` (i.e. its absolute timestamp), not from the timestamp of the skipped frame (see [FRAME](#frame)).
801
+
792
802
The publisher responds with FRAME messages on the same stream.
793
803
The publisher FINs the stream after the last frame, or resets on error.
794
804
@@ -897,6 +907,8 @@ A generic library or relay MUST NOT inspect or modify the decompressed contents
897
907
# Appendix A: Changelog
898
908
899
909
## moq-lite-05
910
+
- Added `Frame Start` to FETCH so a subscriber can begin partway through a group instead of always at frame `0`, allowing resumption of a partially-received group.
911
+
- Renamed `Start Group`/`End Group` to `Group Start`/`Group End` in SUBSCRIBE, SUBSCRIBE_UPDATE, SUBSCRIBE_OK, and SUBSCRIBE_DROP for consistency with the entity-first naming used elsewhere (e.g. `Group Sequence`). Wire format unchanged.
900
912
- Allowed a duplicate `active` ANNOUNCE to atomically replace the prior advertisement (equivalent to UNANNOUNCE+ANNOUNCE). Used when only the origin or hop path changes (e.g. relay failover) without interrupting the broadcast. No new wire enum value — the existing `active` status carries the new metadata.
901
913
- Added ANNOUNCE_OK message, sent once at the head of the Announce Stream response. Carries the publisher's `Hop ID` (hoisted out of every ANNOUNCE's Hop ID list) and an `Active Count` so subscribers can batch the initial set instead of reporting each ANNOUNCE as it trickles in.
902
914
- Added `Publisher Timescale` to SUBSCRIBE_OK for per-track timestamp negotiation. When `Publisher Timescale` is 0, the per-frame timestamp/duration fields are omitted entirely from FRAME and datagram bodies.
0 commit comments