moq-hang: add optional Timeline track for seeking by time#37
Conversation
Add an optional per-media `timeline` track that maps each moq-lite Group to the presentation timestamp of its first frame, so a subscriber can seek by time (resolve a timestamp to a Group sequence) without downloading and parsing the start of every Group. It is the hang-flavored analog of MSF's media timeline track, but binary and append-only rather than a JSON array. Design: - One frame per entry; the timeline is a single Group that grows over the broadcast, so a late subscriber reading from frame 0 gets the full index. - Each frame payload is a single varint: the Group delta from the previous entry (normally 1; larger values allow a sparse index). - The presentation timestamp rides moq-lite's existing FRAME Timestamp Delta (zigzag signed, first-of-group absolute), in the track's Publisher Timescale -- application-defined, and SHOULD match the media track being indexed. - Referenced from VideoSchema/AudioSchema via a new optional `timeline` field naming the track. No moq-lite changes are required. Validated with `make draft-lcurley-moq-hang.txt`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Warning Review limit reached
More reviews will be available in 50 minutes and 20 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughThe draft document is extended to introduce an optional Timeline track for seeking by media presentation timestamp. A "Timeline" term is added to the terminology section. Both the Video and Audio catalog schemas gain an optional 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches✨ Simplify code
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
draft-lcurley-moq-hang.md (1)
53-53: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winTighten the Timeline definition.
The glossary says the index maps each Group to its presentation timestamp, but the later section defines that timestamp as the Group's first frame. Clarifying that here avoids ambiguity.
Suggested wording
- **Timeline**: An optional index mapping each media Group to its presentation timestamps, used for seeking. + **Timeline**: An optional index mapping each media Group to the presentation timestamp of its first frame, used for seeking.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@draft-lcurley-moq-hang.md` at line 53, Update the Timeline definition in the glossary to clarify that the presentation timestamp refers to each Group's first frame rather than leaving it as a vague reference to presentation timestamp. Modify the existing definition to explicitly state that the index maps each media Group to the presentation timestamp of its first frame, which will ensure consistency with the detailed definition provided later in the document and eliminate ambiguity for readers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@draft-lcurley-moq-hang.md`:
- Around line 239-242: The section describing the timeline track uses "MAY start
a new Group" which makes re-anchoring optional, but this breaks the ability for
late subscribers to rebuild the full index unless earlier entries remain
discoverable. Either remove the optional permission to start a new Group (change
"MAY" to "SHOULD NOT" or remove the sentence), or if re-anchoring is allowed,
add explicit retention rules that guarantee earlier Group entries remain
discoverable to late subscribers even after a new Group is started, ensuring the
indexing contract remains intact.
---
Nitpick comments:
In `@draft-lcurley-moq-hang.md`:
- Line 53: Update the Timeline definition in the glossary to clarify that the
presentation timestamp refers to each Group's first frame rather than leaving it
as a vague reference to presentation timestamp. Modify the existing definition
to explicitly state that the index maps each media Group to the presentation
timestamp of its first frame, which will ensure consistency with the detailed
definition provided later in the document and eliminate ambiguity for readers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 6c0d7b8c-9590-456e-ac5d-ef0a0e94bedb
📒 Files selected for processing (1)
draft-lcurley-moq-hang.md
- Clarify the glossary: a timeline maps each Group to the presentation timestamp of its *first frame* (matching the encoding section). - Recommend against re-anchoring the index in a new Group. moq-lite no longer guarantees retention of non-latest Groups (Publisher Cache was removed), so splitting the index across Groups risks earlier entries being dropped before a late subscriber can read them; keep the whole timeline in the single growing Group. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
What
Adds an optional per-media
timelinetrack to moq-hang that maps each moq-lite Group to the presentation timestamp of its first frame. It's the hang-flavored analog of MSF's media timeline track (draft-ietf-moq-msf-01), but binary and append-only instead of a JSON array.Why
moq-lite's
SUBSCRIBE/FETCHaddress content by absolute Group sequence, but users seek by time. Without an index, the only way to map a timestamp to a Group is to download and parse the start of every Group. The timeline track is a compact seek index: find the largest entry withPTS <= target, then subscribe/fetch that Group (which starts with a keyframe).Design
1; larger values allow a sparse index).FRAMETimestamp Delta(zigzag signed, first-of-group = absolute), expressed in the track'sPublisher Timescale. The timescale is application-defined and SHOULD match the media track being indexed.VideoSchema/AudioSchemavia a new optionaltimelinefield naming the track.Reviewer notes
FETCHwithFrame Start > 0yields an absolute PTS (via the moq frame) but no Group anchor — consumers reconstruct Group numbers by reading from frame 0. Fine for the single-growing-group model.make draft-lcurley-moq-hang.txt(kramdown-rfc + xml2rfc-txt OK).🤖 Generated with Claude Code