Repository navigation
quest: datagrams are live-only, capture by default; drop hls-linger #4551
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e3caf5c
7db2ab9
87c27c7
e86f00a
c8bb7cf
5b43339
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| # [S] Capture is a default feature | ||
|
|
||
| ## Goal | ||
|
|
||
| `capture` is on by default in moq-video and moq-audio, so the pre-merge | ||
| `just check` compiles and tests device capture like any other default code, | ||
| and the separate capture CI gate goes away. The flag stays so a minimal build | ||
| can opt out. Workspace consumers that set `default-features = false` (the | ||
| relay, the language bindings) keep building without it. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided in planning (09-29), after capture-control (#4545) found that | ||
| pre-merge `just check` never runs moq-video's `capture` tests: | ||
|
|
||
| - **Default-on, keep the flag.** Removing the flag was rejected: consumers | ||
| that don't want device stacks would pay for them. | ||
| - moq-video's `capture` already costs nothing to build on any platform. Its | ||
| Cargo comment says it stays off only "until every distribution ships it", a | ||
| packaging concern this reverses. | ||
| - moq-audio's `capture` links libasound when it builds on Linux, which is why | ||
| it depends on [ALSA link](/quest/m1/capture-alsa-link.md). Once libasound | ||
| loads at runtime, the default costs no system library. | ||
| - Delete the special capture gate (`rs capture`, `capture-test`, and the | ||
| capture branch in `sh/rs/select.sh` on the tooling line) once default | ||
| `just check` covers it. Keep the platform jobs (`just rs macos`, | ||
| `just rs windows`). | ||
| - Update the Cargo feature comments, moq-cli's `capture` feature (it may | ||
| become redundant), and `doc/` wherever capture is described as opt-in. | ||
|
|
||
| Verify: `just check` on a moq-video or moq-audio change runs the capture | ||
| tests, and a `default-features = false` consumer (for example | ||
| `cargo tree -p moq-ffi -e features`) pulls no capture dependency. | ||
|
|
||
| ## Required | ||
|
|
||
| - [Tooling](/quest/m1/tooling/README.md) - rewrites the capture gate this deletes | ||
| - [ALSA link](/quest/m1/capture-alsa-link.md) - moq-audio capture can't be on by default while it links libasound at build time |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # [XS] Data tracks stamp on the catalog's current clock | ||
|
|
||
| ## Goal | ||
|
|
||
| A JSON or binary data track publishes timestamps on the same clock mapping as | ||
| the media next to it, however early it was created. Today a data track copies | ||
| the catalog clock when it's created. An importer sets that clock from its | ||
| first frame (remove-live, #4543), so a data track created before that frame | ||
| maps its timestamps to a different clock than the media. | ||
|
Comment on lines
+7
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
If AGENTS.md reference: AGENTS.md:L23-L23 Useful? React with 👍 / 👎.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Settled already: #4543 (the remove-live PR, which this quest requires) chooses the importer-anchors-the-clock design. (Written by Claude Opus 5.5) |
||
|
|
||
| ## Plan | ||
|
|
||
| Have data tracks read the catalog's clock when they stamp, not a copy made | ||
| when they were created. Keep it crate-private if possible. Test: a data track | ||
| created before an importer's first frame stamps on the anchored clock. | ||
|
|
||
| ## Required | ||
|
|
||
| - [Remove live()](/quest/m1/remove-live.md) - introduces the first-frame clock anchor | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| # [S] Datagrams are live-only | ||
|
|
||
| ## Goal | ||
|
|
||
| A datagram group is delivered only to subscribers present when it is sent. | ||
| FETCH never returns one, a new subscription never replays buffered datagrams, | ||
| and a relay fills no cache miss with one. Anything that needs reliable or | ||
| late-joiner delivery should use a stream group instead. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided in planning (09-29), after the moxygen fetch-fill agent found that the | ||
| relay's group-fetch decoder refuses a draft-16+ fetch object that carries the | ||
| datagram flag, and reports it as "unsupported": | ||
|
|
||
| - Keep the existing 64-datagram send buffer per track | ||
| (`rs/moq-net/src/model/track.rs`, `MAX_DATAGRAMS`). An age bound was | ||
| considered and dropped. | ||
| - A new subscription starts at the next datagram sent, not at the buffered | ||
| backlog. This covers Rust and `@moq/net`, lite and IETF. | ||
| - FETCH never serves a datagram group. A publisher answers a FETCH for one the | ||
| way it answers any group it won't deliver (dropped or does not exist), | ||
| never with its payload. | ||
| - A received fetch object with the datagram flag is refused as not fetchable. | ||
| It fails only that fetch or fill, not the session, because draft-16+ allows | ||
| the flag (maintainer, 09-29, on Codex's review). That covers the relay's group | ||
| fill (`recv_group_fetch_objects`, on the moxygen line) and the joining-fetch | ||
| fill (`run_fill_objects`). | ||
| - Update `drafts/draft-lcurley-moq-lite.md` to say datagrams are neither | ||
| cached nor fetchable, and `doc/concept/`. Run `just drafts check` and | ||
| `just test interop --all`. | ||
|
|
||
| Not planned: reliable or cached datagrams. If they are ever wanted, the way to | ||
| get them is back-pressure in the QUIC library and treating each datagram like | ||
| a one-shot stream, not a cache. | ||
|
|
||
| Tests: a subscriber joining after datagrams were sent receives only later | ||
| ones. A FETCH covering a datagram group gets no payload. A fetch stream | ||
| carrying a datagram-flagged object fails that fetch and leaves the session up. | ||
|
|
||
| ## Related | ||
|
|
||
| - [Moxygen compatibility](/quest/m1/moxygen/README.md) - says it carries one datagram per group live; this keeps them out of FETCH | ||
| - [JS IETF datagrams](/quest/m1/js-ietf-datagram.md) - JS datagram send and receive over moq-transport | ||
| - [SUBSCRIBE_DROP](/quest/m1/subscribe-drop.md) - datagram groups stay best effort there too |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| # [XS] Demo serve-hls publishes distinct renditions | ||
|
|
||
| ## Goal | ||
|
|
||
| `just pub serve-hls` serves two renditions at different resolutions, as | ||
| `just pub hls` does. Today both come out 256 wide: the `-vf:0` and `-vf:1` | ||
| options aren't per-stream in ffmpeg, so the last filter wins. | ||
|
|
||
| ## Plan | ||
|
|
||
| Use per-stream filters (`-filter:v:0`, `-filter:v:1`), scaled to 720p and | ||
| 144p to match `hls`. Scaling the 720p source up to 1080p couldn't encode in | ||
| real time on a dev machine. The recipe body moves to `sh/demo/serve-hls.sh` | ||
| when the [tooling line](/quest/m1/tooling/README.md) lands; fix it wherever it | ||
| lives. Check it by fetching `master.m3u8` and comparing the two renditions' | ||
| `RESOLUTION` attributes. |
Uh oh!
There was an error while loading. Please reload this page.