Skip to content

moq-lite-05: make Timescale/Timestamp mandatory; drop one-sided field prefixes#40

Merged
kixelated merged 1 commit into
mainfrom
claude/admiring-black-116af1
Jun 24, 2026
Merged

moq-lite-05: make Timescale/Timestamp mandatory; drop one-sided field prefixes#40
kixelated merged 1 commit into
mainfrom
claude/admiring-black-116af1

Conversation

@kixelated

Copy link
Copy Markdown
Collaborator

What changed

moq-lite: Timescale & Timestamp are now mandatory

Every Track has a media timeline. Timescale MUST be non-zero, and the per-frame Timestamp Delta (FRAME) and per-datagram Timestamp (datagram body) are now unconditional on the wire.

  • Removed the Timescale == 0 case that omitted the timestamp fields — endpoints no longer have to handle both present/absent variants.
  • A Timescale of 0 is now a protocol violation (subscriber resets the Subscribe/Fetch stream).
  • Expiration is always timestamp-based. The only remaining wall-clock fallback is the empty-group case (a group with zero frames structurally carries no timestamp).

moq-lite: dropped Publisher/Subscriber prefix on one-sided fields

The prefix now appears only where the same base name exists on both sides.

  • Publisher TimescaleTimescale
  • Publisher CompressionCompression
  • Subscriber Max LatencyMax Latency
  • Priority and Ordered keep the prefix (both Publisher/Subscriber variants exist and the prioritization rules/example rely on the distinction).
  • Wire format unchanged by the rename. Released-version (-03/-04) changelog entries keep their original field names; a -05 bullet documents the rename.

moq-timestamp extension: graceful degradation instead of mandatory

moq-transport objects are independently droppable, so the extension keeps the optional/fallback posture (the inverse of moq-lite).

  • Removed SETUP negotiation entirely — the properties are self-describing KVPs, and the IANA Setup Option registration is dropped.
  • A missing Timescale defaults to 1000 (milliseconds); an object with no Timestamp falls back to wall-clock arrival time.
  • Documented that the object Timestamp is absolute, not delta-encoded, because moqt provides no reliable per-object delivery within a group/subgroup — a delta would be corrupted by any lost predecessor.

Reviewer notes

  • The two drafts are intentionally asymmetric: moq-lite mandates timestamps on the wire (reliable in-group frame ordering), while the moqt extension degrades gracefully (independently droppable objects). Flagging in case you'd prefer them to read more alike.
  • IANA in moq-timestamp now has a gap (0x915C0 TIMESCALE, 0x915C2 TIMESTAMP) where the setup option 0x915C1 used to sit. Harmless given the deliberately sparse values; can renumber to close it if preferred.
  • Both drafts build clean via make (kramdown-rfc + xml2rfc OK).

🤖 Generated with Claude Code

moq-lite: every Track now has a media timeline. `Timescale` MUST be
non-zero and the per-frame `Timestamp Delta` and per-datagram `Timestamp`
are unconditional on the wire, removing the timescale-0 fallback that
forced both endpoints to handle present/absent timestamp fields.
Expiration is always timestamp-based; only empty groups (which carry no
timestamp) fall back to wall-clock.

Also dropped the `Publisher`/`Subscriber` prefix from fields that exist
on only one side: `Publisher Timescale`/`Publisher Compression` ->
`Timescale`/`Compression`, `Subscriber Max Latency` -> `Max Latency`.
`Priority` and `Ordered` keep the prefix since both variants exist and
the prose distinguishes them. Wire format unchanged by the rename.

moq-timestamp extension: keep graceful degradation since moq-transport
objects are independently droppable. Removed SETUP negotiation (the
properties are self-describing KVPs). A missing Timescale now defaults
to milliseconds and an object with no Timestamp falls back to wall-clock
arrival time. Documented that the object Timestamp is absolute, not
delta-encoded, because moqt provides no sub-group reliability.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@kixelated kixelated merged commit 2128959 into main Jun 24, 2026
2 checks passed
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

Walkthrough

Two IETF draft documents are updated. In draft-lcurley-moq-lite.md, every Track's Timescale is now required to be non-zero; receiving a zero value triggers a protocol-violation reset. The expiration model is rewritten to derive group age from per-frame timestamps and Timescale, with a wall-clock fallback only for groups containing zero frames. Several field names are renamed: Subscriber Max LatencyMax Latency in SUBSCRIBE/SUBSCRIBE_UPDATE; Publisher Timescale/Publisher CompressionTimescale/Compression in TRACK_INFO and FRAME. Wire-format diagrams for DATAGRAM Body and FRAME are adjusted to reflect these changes. In draft-lcurley-moq-timestamp.md, the extension is made self-describing without SETUP negotiation: absent TIMESCALE defaults to 1000 ms, a zero value is invalid and treated as 1000 ms, and absent TIMESTAMP uses wall-clock arrival time as effective time. The MOQT Setup Options IANA registration table is removed.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the moq-lite changes: mandatory Timescale/Timestamp fields and removal of one-sided prefixes.
Description check ✅ Passed The description clearly matches the PR changes and objectives, including moq-lite mandatory timestamps and the moq-timestamp fallback behavior.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch claude/admiring-black-116af1

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant