Skip to content

chore(moq): pin moq with the encoder-free texture readback - #69

Merged
kixelated merged 6 commits into
mainfrom
quest/m0/pin-readback
Nov 7, 2026
Merged

kixelated merged 6 commits into
mainfrom
quest/m0/pin-readback

Conversation

@kixelated

@kixelated kixelated commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Bumps the moq submodule from moq-dev/moq@ffcb7cd97 to moq-dev/moq@d01819803, which includes moq_video::render::readback, the encoder-free texture readback from moq-dev/moq#8056. Finishes quest/m0/pin-readback.md and removes its links, which unblocks moq-dev/studio#9, the Linux virtual camera; that PR adopts the readback. This PR doesn't switch the camera to it.

Changes

The pin covers 232 moq commits. These breaking changes needed fixes in the studio:

  • moq-tokio no longer has an aws-lc-rs feature (moq-dev/moq#7873): native crypto now uses rind, so moq-studio enables only net.
  • One origin::Route replaces Publication (moq-dev/moq#7806). Code that called create_broadcast and then announce(Route) now calls route(path, RouteOptions::hidden()) and then announce(). close() becomes broadcast().close(), and unannounce() becomes withdraw().
    • The program used to mint its own instance. It now takes the instance from publication.instance(), which the route mints at creation.
    • The extra canvases' with_instance(Instance::random(), 0) was the default, so they now announce with the default instance.
    • The feeds' origin.requests(PROGRAM) becomes route_prefix(PROGRAM, ..) with requested().
  • Announcements report only whether a path is present or absent (moq-dev/moq#7678): Following::available() now returns an Option, and moq_mux::follow::Instances::new is gone.
    • Broadcast sources (moq-scene) and per-source recording now call origin.follow(path, None) directly. Some replaces Event::Start and None replaces Event::End.
    • Viewer feedback (health.rs) used to restart a viewer's reader on Restart. Each reader now follows its viewer's path, so a viewer that restarts under a new instance is read again from scratch. A refusal is recorded, and the reader waits for the route to change instead of stopping. A closed origin ends the reader, since a closed follow returns at once on every call. The new a_restarted_viewer_is_read_afresh and a_reader_stops_with_its_origin tests cover both cases.
  • Async wrappers are opt-in (moq-dev/moq#7607): moq-studio enables async on moq-json and moq-room, the crates it awaits. moq_json::snapshot::Consumer::new now takes the track and subscribes to it itself.
  • Tests: the failover test checks which instance wins per route, which the listing no longer reports. It now reads the hidden origin::Consumer::routes() stream, which moq's migration guide names for that use. The join page's renew.test.ts moves to origin.route(path, { hidden: true }).

Public API and wire impact

  • No public API change: moq-scene's exports are unchanged, and the studio's flags, scene file, and outputs are unchanged.
  • Wire behavior follows the pinned moq. The studio adds no protocol changes of its own.

Choices made without asking

  • Each feedback reader follows its own viewer's path rather than reading the hidden routes() stream in production code. The listing then decides only whether a viewer is present, as moq's migration guide recommends.
  • Production available() calls, whose first result is never None, call .expect("the first change is an instance"), as moq's migration guide does.

Validation

  • just ci (the just check lints, including every feature in clippy, plus just test): passed on b4e69b9. 265 Rust tests passed, and the 5 join-page tests passed.
  • cargo check --locked -p moq-scene, with and without --all-targets: passed, so the crate builds on its own without the workspace's feature unification.
  • quest check --base origin/main: passed.

Review

Codex (quest review), gpt-6.1-sol, medium effort. Round 2 reviewed head b4e69b9d9dc4d970da678f419243ba6ae1b692cc and found nothing. The current head b4237a2 adds only a conflict-free merge of main that touches quest files.

  • Round 1, against deae79c (medium), rs/moq-studio/src/health.rs: once the origin closed, the feedback reader spun on Following::available() returning Error::Closed. Fixed in b4e69b9: Closed now ends the reader. a_reader_stops_with_its_origin reproduced the bug as a 60s nextest TIMEOUT before the fix and passes after it.

(Written by Claude Opus 5.5)

Quest-Claim: d396efc2d6ee81f2
@pullfrog

pullfrog Bot commented Nov 7, 2026

Copy link
Copy Markdown

Pullfrog  | Review this ➔

kixelated and others added 3 commits November 6, 2026 17:02
Bump the moq submodule to moq-dev/moq@d01819803, which includes
moq-video's encoder-free texture readback (moq-dev/moq#8056).
moq-tokio dropped its aws-lc-rs feature when native cryptography moved
to rind (moq-dev/moq#7873), so the studio asks only for `net`.

Finishes quest/m0/pin-readback.md, unblocking the Linux virtual camera.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pinned moq replaces publications with one `origin::Route` handle,
announcements with a present/absent listing, and `moq_mux::follow::Instances`
with `origin::Consumer::follow`; async wrappers are opt-in per crate.

Viewer feedback now follows each viewer's path, so a viewer that restarts
under a new instance is read from it afresh, as the old Restart event did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title moq-video's program readback is pinned chore(moq): pin moq with the encoder-free texture readback Nov 7, 2026
kixelated and others added 2 commits November 6, 2026 18:08
A closed origin answers every later follow at once, so retrying spun.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review November 7, 2026 02:09
@coderabbitai

coderabbitai Bot commented Nov 7, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 20 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3ffb13ba-cc09-4b87-844f-1e39a8ca0450
Commits

Reviewing files that changed from the base of the PR and between c929c40 and b4237a2.

Files ignored due to path filters: 2

  • Cargo.lock is excluded by !**/*.lock
  • bun.lock is excluded by !**/*.lock
Files selected for processing: 13

  • js/join/src/renew.test.ts
  • moq
  • quest/m0/README.md
  • quest/m0/pin-readback.md
  • quest/m0/vcam/linux.md
  • rs/moq-scene/src/source.rs
  • rs/moq-studio/Cargo.toml
  • rs/moq-studio/src/engine.rs
  • rs/moq-studio/src/feed.rs
  • rs/moq-studio/src/guests.rs
  • rs/moq-studio/src/health.rs
  • rs/moq-studio/src/record.rs
  • rs/moq-studio/src/uplink.rs
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@kixelated kixelated left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head b4237a2 against base c929c40.

No actionable findings in the studio migration. Retaining Route handles preserves announcement ownership under the pinned API; hidden construction still lets tracks/catalogs be prepared before announcing. The program now reads the route's minted instance consistently. Prefix request handling, direct Following use, and first-available expectations match the pinned moq-net migration contract.

The feedback reader follows each viewer across instance changes, resets report history when a new broadcast arrives, and terminates on a closed origin rather than retrying an immediately-ready error. The restart and closed-origin tests cover those important migration paths. The pinned moq-video source includes the encoder-free Readback API, while this change correctly leaves virtual-camera adoption to its separate work.

Direction: the focused pin-and-consumer migration is consistent with the upstream ownership model; no code changes requested.

Verification limits: GitHub-only static review of the studio diff, repository guidance, pinned migration documentation, and readback API. I did not exhaustively audit all 232 upstream commits, execute quest context, build, run tests, verify reported CI, or measure frame time/GPU copies/encoder load. This is not a claim of runtime or platform validation.

(Written by review (OpenAI))

@kixelated
kixelated merged commit 299a97a into main Nov 7, 2026
4 checks passed
@kixelated
kixelated deleted the quest/m0/pin-readback branch November 7, 2026 02:49
kixelated added a commit that referenced this pull request Nov 7, 2026
Adapts the virtual camera to main: it reads the main canvas back through
moq-video's render::readback (pinned by #69) instead of a copy here, and
reopens when the canvas changes size or frame rate. The Devices panel leaves
out the camera while it is on. quest/m0/vcam/linux.md keeps what remains:
a camera per published scene.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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