Repository navigation
quest: plan the small follow-ups from the 2026-10-15 merge batch #5584
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
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
055a853
quest: plan the small follow-ups from the 2026-10-15 merge batch
kixelated 4d378b8
quest: keep the draft-19 0x06 guard, record catalog abort API, hedge AV1
kixelated 32033ef
quest: refuse draft-14 END_OF_TRACK properties in js/net too
kixelated 3e5289c
quest: count passthrough's m2ts track as declared
kixelated 72959db
quest: match the m1 index entry to the servable-track rule
kixelated 133f126
Merge remote-tracking branch 'origin/main' into quest/plan-follow-ups…
kixelated File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| # [S] A browser follows a renamed track | ||
|
|
||
| ## Goal | ||
|
|
||
| A real browser keeps playing across both renames | ||
| [#5552](https://github.com/moq-dev/moq/pull/5552) introduced: a codec change, | ||
| and a `Video.Encoder` growing past its coded-size ceiling. In both cases | ||
| `@moq/publish` mints a new `track` for the same rendition, and `js/watch` | ||
| follows it without a stall. The check runs at least nightly in CI. | ||
|
|
||
| ## Plan | ||
|
|
||
| #5552 landed with unit tests only and listed this check as a follow-up. Unit | ||
| tests do not show what WebCodecs and the watch path do across the switch. | ||
|
|
||
| Extend the browser media QA (`just test media`) rather than building a new | ||
| harness. Fail on a stall, a decode error, or a frame from the old track after | ||
| the switch. Check that it fails with the rename disabled. | ||
|
|
||
| Public API: none. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [Rust identity enforcement](/quest/m1/catalog-identity-rs.md) - the same contract for the Rust publishers | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # [XS] Refuse properties on a draft-14 END_OF_TRACK | ||
|
|
||
| ## Goal | ||
|
|
||
| In Rust and JS, a draft-14 END_OF_TRACK object that carries Object | ||
| Properties is refused instead of having its properties silently dropped. An END_OF_TRACK without | ||
| properties ends the track cleanly, as today. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided with the maintainer on 2026-10-15: refuse it, don't carry it. | ||
| Carrying it would mean storing terminal fields on the track rather than the | ||
| group. The project's rule is supported or refused. | ||
|
|
||
| Context from [#5494](https://github.com/moq-dev/moq/pull/5494): | ||
|
|
||
| - END_OF_TRACK stays a track-level Location. | ||
| - Only draft 14 allows properties on it. | ||
| - From draft 15, a status object carrying properties is already refused at | ||
| ingest. | ||
|
|
||
| Draft 14 permits these properties, so a session `PROTOCOL_VIOLATION` would be | ||
| wrong. End the subscription with an error that names it unsupported. | ||
|
|
||
| `js/net/src/ietf/object.ts` drops them the same way: it reads past the | ||
| extension block and returns the END_OF_TRACK frame without them. Fix both, and | ||
| add a regression test in each language that fails without the change. | ||
|
|
||
| Public API: none. Wire: a draft-14 publisher that puts properties on | ||
| END_OF_TRACK now gets an error instead of a clean end. | ||
|
|
||
| ## Related | ||
|
|
||
| - [moq-transport passthrough](/quest/m1/ietf-extension/README.md) - carries END_OF_GROUP status objects with their properties |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| # [XS] Read only the current LOC Timestamp ID | ||
|
|
||
| ## Goal | ||
|
|
||
| Rust and JS read a moq-transport object's Timestamp only from the current LOC | ||
| property ID (0x10). Property 0x06 is opaque on every draft, never read as the | ||
| draft-ietf-moq-loc-03 Timestamp. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided with the maintainer on 2026-10-15: we support only the latest LOC | ||
| Timestamp ID. LOC and moq-transport are versioned independently, so a LOC ID | ||
| must not depend on the transport draft. Today 0x06 is read as the loc-03 | ||
| Timestamp only before draft 19, keyed on the transport version, because | ||
| draft 19 reassigns 0x06 to SUBGROUP_DELIVERY_TIMEOUT. | ||
|
|
||
| Delete the loc-03 decode and everything that exists only for it: | ||
|
|
||
| - `PROP_TIMESTAMP_DRAFT03` and its decode in `rs/moq-net/src/ietf/`. | ||
| - The unit conversion of 0x06 when relaying into an egress with different | ||
| units, and its drop for a unitless egress (from | ||
| [#5494](https://github.com/moq-dev/moq/pull/5494)). | ||
| - `hasDraft03Timestamp` in `js/net/src/ietf/object.ts`. | ||
| - The tests for these paths. | ||
|
|
||
| Keep the draft-19 boundary guard: a mutable 0x06 is dropped and a sealed one | ||
| refused when relaying between drafts 18 and earlier and drafts 19 and later. | ||
| That guard is about moq-transport reassigning the ID, not about LOC. Without | ||
| it, a draft-18 publisher's 0x06 would arrive downstream as | ||
| SUBGROUP_DELIVERY_TIMEOUT. Below and above the boundary, 0x06 is forwarded | ||
| like any other unknown property. | ||
|
|
||
| Public API: none. Wire: a peer still writing 0x06 Timestamps reads as untimed. | ||
|
kixelated marked this conversation as resolved.
Resolved
|
||
|
|
||
| ## Related | ||
|
|
||
| - [moq-transport passthrough](/quest/m1/ietf-extension/README.md) - carries object properties through relays | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| # [S] Every importer announces only once it has a track | ||
|
|
||
| ## Goal | ||
|
|
||
| Every `moq import` input follows one rule for when it has declared a track: | ||
| the broadcast is announced once its catalog names at least one servable track, | ||
| and an input that ends before then exits non-zero without announcing. A | ||
| servable track is a rendition, or an extension track such as `--passthrough`'s | ||
| `m2ts` multiplex, which publishes no rendition. Today a TS | ||
| input carrying only program tables can still announce an empty catalog at end | ||
| of input and exit 0. | ||
|
|
||
| The rule covers the stdin path, TS (including `--program all`), fMP4, FLV, | ||
| Annex-B/avc3, and HLS. | ||
|
|
||
| Non-goals, both declined in [#5517](https://github.com/moq-dev/moq/pull/5517): | ||
|
|
||
| - HLS holding the announce until every discovered rendition is ready. A dead | ||
| variant is left out of the first catalog, as moq-hls intends. | ||
| - FLV waiting for every track type its header flags declare. | ||
|
|
||
| ## Plan | ||
|
|
||
| [#5517](https://github.com/moq-dev/moq/pull/5517) made the stdin path wait for | ||
| the catalog's first snapshot and bail with "input ended before it declared a | ||
| track". Each importer still decides on its own when to release that snapshot: | ||
|
|
||
| - TS releases at its first PES with a PTS. The `Pending` doc in | ||
| `rs/moq-cli/src/publish.rs` says the first PMT, so the doc and the code | ||
| disagree. | ||
| - End of input releases every reservation. A program whose PMT never | ||
| arrived is announced anyway. | ||
| - fMP4 releases at the moov, and FLV at its first media frame. | ||
|
|
||
| Recommended definition: a PMT or header entry alone does not count. A track | ||
| counts once the catalog names it: a rendition with a known codec config, or an | ||
| extension track. Settle it in one place that every importer shares, rather than per | ||
| importer. Fix the `Pending` doc to match. | ||
|
|
||
| Tests: a TS input with a PAT and PMT but no PES, an FLV with no frames, and | ||
| an avc3 input with no SPS each fail unannounced. Each importer's normal | ||
| fixture still announces, and so does `--passthrough`. | ||
|
|
||
| Update `doc/bin/cli.md` inline if it describes the exit behavior. | ||
|
|
||
| Public API: none expected. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [No made-up Dropped](/quest/m1/dropped-internal.md) - covers the same imports' failure path, which drops its catalog instead of aborting it with the cause | ||
| - [Same-epoch importers](/quest/m1/hop-aligned-import.md) - same-epoch importers publish identical tracks |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| # [S] Every video importer reports the display aspect | ||
|
|
||
| ## Goal | ||
|
|
||
| A video rendition with non-square samples gets the catalog display aspect | ||
| from its bitstream, whichever importer reads it: | ||
|
|
||
| - H.264 (the VUI sample aspect) | ||
| - H.265 from both Annex-B and an `hvcC` record | ||
| - AV1, if it carries a stream-level signal | ||
|
|
||
| A square-sample stream still leaves the fields unset, as the encode hint does | ||
| today. | ||
|
|
||
| ## Plan | ||
|
|
||
| [#5574](https://github.com/moq-dev/moq/pull/5574) fixed the H.265 Annex-B path | ||
| (`config_from_sps`, `rs/moq-mux/src/codec/h265/import.rs`). The remaining | ||
| gaps: | ||
|
|
||
| - `config_from_hvcc` sets only the coded size and description. Share the | ||
| Annex-B path's VUI read rather than duplicating it. | ||
| - The H.264 SPS parser skips `sar_width`/`sar_height`. | ||
| - AV1 has no sample aspect in its sequence header. Check whether | ||
| `render_size` should count as a display aspect before adding it. If not, | ||
| record why and leave AV1 out. | ||
| - `MoqVideo.display_aspect` (and `coded`) in `rs/moq-ffi/src/media.rs` have | ||
| no doc line. | ||
|
|
||
| Keep #5574's choice that an encode hint fills in only square samples. | ||
|
|
||
| Tests: a non-square fixture per codec path, and a square one that stays | ||
| unset. | ||
|
|
||
| Not planned: an upstream scuffle_h265 issue for the unchecked arithmetic in | ||
| `cropped_width()`/`cropped_height()`. We never call them, since our SPS | ||
| reader crops with checked math. | ||
|
|
||
| Public API: doc only. Wire: the catalog's existing display aspect fields are | ||
| populated in more cases. | ||
|
|
||
| ## Related | ||
|
|
||
| - [Catalog colour](/quest/m2/color-catalog.md) - parses the same H.264/H.265 VUI for colour |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| # [M] moqsrc keeps audio and video in sync through real sinks | ||
|
|
||
| ## Goal | ||
|
|
||
| A test plays a broadcast through `moqsrc` into clock-synchronized audio and | ||
| video sinks and measures the A/V skew of what they render. It fails when the | ||
| skew exceeds the bound that `just test media` holds the browser to. It runs | ||
| at least nightly in CI. | ||
|
|
||
| ## Plan | ||
|
|
||
| [#5556](https://github.com/moq-dev/moq/pull/5556) fixed `moqsrc` alignment and | ||
| tested it at the source pads: buffer timestamps and segment events, not | ||
| decoded playback. | ||
|
|
||
| - Reuse the browser media QA's tone/frame pattern fixture | ||
| (`test/interop/clients/js/media.ts`, `src/pattern.ts`) rather than | ||
| inventing a new marker scheme. | ||
| - Read the markers back after decode on a synced pipeline. Today the interop | ||
| gst cell runs `moqsrc ! filesink` with no sync. | ||
| - Cover a cold start and a mid-stream join. | ||
| - Check that the test fails with #5556 reverted. | ||
|
|
||
| Public API: none. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [moqsrc reconnect](/quest/m1/moqsrc-reconnect.md) - redials and resumes on the same pads, a natural second scenario for this check | ||
| - [A/V clock](/quest/m1/av-clock.md) - the browser side of A/V sync |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P2] Match the browser check to the landed resize contract
#5552 deliberately excluded codedWidth/codedHeight from track identity.
js/publish/src/video/encoder.test.ts:1483–1520explicitly requires ceiling growth to keep its track when the codec string stays unchanged. Requiring both cases here to rename would reject the intended behavior. Split the QA expectations: a decoder-identity change must rename and preserve decoded playback; unchanged-codec growth must keep the track and present the new dimensions. Require a growth-triggered rename only when re-probing changes the codec string, and update the milestone summary accordingly.