Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 124 additions & 42 deletions Cargo.lock

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ moq-json = { path = "moq/rs/moq-json" }
moq-mux = { path = "moq/rs/moq-mux" }
moq-net = { path = "moq/rs/moq-net" }
moq-relay = { path = "moq/rs/moq-relay", default-features = false }
moq-room = { path = "moq/rs/moq-room" }
moq-scene = { path = "rs/moq-scene" }
moq-stats = { path = "moq/rs/moq-stats" }
moq-tokio = { path = "moq/rs/moq-tokio", default-features = false }
Expand All @@ -57,6 +56,8 @@ toml = "1.1"
tracing = "0.1"
url = "2"
usage-rs = "7.1.0"
# moq-video's release, so its textures and the compositor's are one type.
wgpu = "30"

# wgpu-core 30.0.1 with Surface::configure holding command indices across its
# wait and the hal configure, so a submit from the compositor or encoder on the
Expand Down
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -306,11 +306,15 @@ A broadcast source, a guest's included, plays on its publisher's timestamps,
so its sound and picture stay in sync through network jitter. It plays as far
behind what arrives as the network's jitter needs, measured as it goes as
`moq play --delay auto` does, plus 50 ms to hand its sound to the mix, up to
2 s in all. Sound and picture each
keep that schedule on their own: a sound stall leaves the picture playing,
and the sound comes back on the clock, skipping what it missed; a picture
stall leaves the sound playing, with the canvas showing the last picture
meanwhile. Without audio, the picture plays 100 ms behind. Sources shows how
2 s in all. When that delay moves, the sound speeds up or slows down by about
a tenth until it is back on schedule, as `moq play`'s does, rather than
skipping or falling silent: a move of 100 ms takes about a second. A move
earlier by more than 200 ms skips, and one later by more than about 130 ms
falls silent until the sound is due. Sound and picture each keep that
schedule on their own: a sound stall leaves the picture playing, and the
sound comes back on the clock, skipping what it missed by more than 200 ms
and speeding up through the rest; a picture stall leaves the sound playing,
with the canvas showing the last picture meanwhile. Without audio, the picture plays 100 ms behind. Sources shows how
far behind each broadcast plays.

### Audio scenes
Expand Down Expand Up @@ -481,7 +485,7 @@ no sound has no strip in the Audio panel.
Guests and phones join a room the studio owns on its relay, from a web page,
and their camera and screen appear as broadcast sources. The page plays the
show back to them, without their own voice. The room follows
[moq-room](https://github.com/moq-dev/moq/tree/main/rs/moq-room): a guest
[`@moq/room`](https://github.com/moq-dev/moq/tree/main/js/room): a guest
named `alice` publishes `alice/camera.hang` and `alice/screen.hang` under it.
Guests need a relay that verifies tokens, so run your own with
[`moq auth serve`](https://doc.moq.dev/bin/cli) behind it, and a key that can
Expand Down Expand Up @@ -1227,8 +1231,8 @@ own viewers:
published scene lists the program's audio, graded where the program writes
it. Latency compares the two hosts' wall
clocks, so keep both synced.
- **Viewers**: each viewer that reports, with its round trip, latency, and
playout delay. The studio reads 64 at most per broadcast, a sample the grades
- **Viewers**: each viewer that reports, with its round trip and latency.
The studio reads 64 at most per broadcast, a sample the grades
rest on: it counts the rest, and a reader one frees goes to the next viewer
to arrive.

Expand Down
116 changes: 78 additions & 38 deletions bun.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion moq
Submodule moq updated 2599 files
2 changes: 1 addition & 1 deletion quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Decided 2026-10-22 with the maintainer (/quest-plan):
WASM support on 2026-10-31, its browser-backend quests are deferred with
no other consumer, and nothing plans a browser WebTransport session for
moq-net.
- **Guests:** guests and phone cameras join a moq-room prefix the studio
- **Guests:** guests and phone cameras join a room prefix the studio
owns, through a web join link or QR code.
- **Naming:** quests name no streaming platforms; ingest requirements are
written as generic constraints.
Expand Down
22 changes: 22 additions & 0 deletions quest/m0/cef-quiet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# [S] The browser helper reaches no Google service again

## Goal

`the_helper_requests_only_its_pages` (`rs/moq-studio/tests/browser.rs`), run
by `just render-sw`, passes again: a browser source's helper opens no
connection a page did not ask for.

## Plan

Found by [moq-dev/studio#163](https://github.com/moq-dev/studio/pull/163)
on 2026-11-14. On `main` (`5a74c18`), with the CEF runtime at
`cef-156.0.15` from the dev shell's `CEF_PATH`, the test fails every run:
the helper sends `CONNECT clients2.google.com:443` twice. The switches in
`rs/moq-scene/src/browser/host.rs` already point the component updater at
`data:` and disable the features that phoned home when the test was written,
so something else in this CEF release reaches `clients2.google.com`.

Find the feature or service behind the request, such as with
`--log-net-log` or by bisecting the `--disable-features` list, and turn it
off with a switch the way `host.rs` turns off the others. Never loosen the
test's assertion.
9 changes: 2 additions & 7 deletions quest/m0/packaging/macos.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,7 @@ The certificate (`6WWG279G9M`, G2) expires 2027-12-11, and the profile with it;
see [renewal](/quest/m0/signing-renew.md).

A Mac camera renders only once AVFoundation asks for NV12 instead of `2vuy`,
which [moq-dev/moq#8251](https://github.com/moq-dev/moq/pull/8251) did on moq's
`main` (`2be959ba9`) after the studio's pin; [pin-main](/quest/m0/pin-main.md)
brings it here. Check by hand on a Mac that a camera shows its picture in
which [moq-dev/moq#8251](https://github.com/moq-dev/moq/pull/8251) did; the
studio's pin includes it. Check by hand on a Mac that a camera shows its picture in
program, since the launch check only lists devices and hosted runners have no
camera.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - brings moq-dev/moq#8251's NV12 camera fix
4 changes: 0 additions & 4 deletions quest/m0/pin-aac-encode.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,3 @@ fixing whatever the new API breaks here.
merged on moq's `main`, deleting their files, and moq-audio's AAC encoders
are there. A quest file that moved, or went away without its work landing,
does not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
4 changes: 0 additions & 4 deletions quest/m0/pin-audio-filters.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,3 @@ fixing whatever the new API breaks here.
merged on moq's `main`, deleting its file, and moq-audio's filter chain is
there. A quest file that moved, or went away without its work landing, does
not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
4 changes: 0 additions & 4 deletions quest/m0/pin-audio-tap.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,3 @@ fixing whatever the new API breaks here.
merged on moq's `main`, deleting its file, and `moq_audio::bus` there offers
a tap of a source's samples with bus positions. A quest file that moved, or
went away without its work landing, does not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
38 changes: 0 additions & 38 deletions quest/m0/pin-bus-stretch.md

This file was deleted.

4 changes: 0 additions & 4 deletions quest/m0/pin-capture-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,3 @@ the new API breaks in `rs/moq-studio/src/devices.rs`.
## Waiting

- moq-dev/moq: [the capture listing quest](https://github.com/moq-dev/moq/blob/main/quest/m3/capture-list.md) lands on moq's `main`. Check that quest's PR has merged.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
6 changes: 1 addition & 5 deletions quest/m0/pin-egress-dial.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

The `moq` submodule includes the two moq changes destinations dial through:
moq-rtmp's `rtmps://` dial keeps the URL-derived `tcUrl`, from
[RTMPS keeps `tcUrl`](https://github.com/moq-dev/moq/blob/main/quest/m3/rtmp-rtmps-tcurl.md),
[RTMPS keeps `tcUrl`](https://github.com/moq-dev/moq/blob/main/quest/m2/rtmp-rtmps-tcurl.md),
and a dial takes a policy its caller supplies, so a host can refuse private
and loopback addresses, from
[a caller-supplied dial policy](https://github.com/moq-dev/moq/blob/main/quest/m3/webrtc-dial-policy.md).
Expand All @@ -26,7 +26,3 @@ fixing whatever the new API breaks here.
moq-rtmp's TLS dial sends the URL-derived `tcUrl`, and a dial takes the
caller's policy. A quest file that moved, or went away without its work
landing, does not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
39 changes: 0 additions & 39 deletions quest/m0/pin-main.md

This file was deleted.

21 changes: 0 additions & 21 deletions quest/m0/pin-portal-token.md

This file was deleted.

11 changes: 4 additions & 7 deletions quest/m0/wayland-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ sources capture only X11 and XWayland.

Decided 2026-10-26 (maintainer):

- **Token:** the portal restore token is persisted, which
[Linux capture parity](https://github.com/moq-dev/moq/blob/main/quest/m3/capture-linux.md) makes possible in
moq-video. This quest consumes it.
- **Token:** the portal restore token is persisted, through moq-video's
`capture::portal::Selection::restore_token` and `with_restore_token`
([moq-dev/moq#8562](https://github.com/moq-dev/moq/pull/8562)), which the
studio's pin includes.
- **Storage:** the token lives in per-machine state (the XDG state directory,
keyed by scene collection and source), never in the scene file, so the scene
file stays portable and diffable. On another machine, or when the portal
Expand All @@ -26,10 +27,6 @@ Add portal-picked display and window sources beside the id-selected
the Sources and Devices panels and guided setup, and update `README.md`, which says display and window sources are
X11-only.

## Required

- [The persistable portal restore token is pinned](/quest/m0/pin-portal-token.md) - the token this quest stores

## Related

- [Adding a source by picking a picture](/quest/m0/ux/add.md) - the Add page whose Apps and Screens sections open this picker
4 changes: 0 additions & 4 deletions quest/m1/pin-capture-exclude.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,3 @@ Planned 2026-11-09 (maintainer, /quest-plan) for
## Waiting

- moq-dev/moq: [the capture exclusion quest](https://github.com/moq-dev/moq/blob/main/quest/m4/capture-exclude.md) lands on moq's `main`. Check that quest's PR has merged.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
4 changes: 0 additions & 4 deletions quest/m1/pin-capture-foreground.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,3 @@ Planned 2026-11-09 (maintainer, /quest-plan) for
## Waiting

- moq-dev/moq: [the foreground app quest](https://github.com/moq-dev/moq/blob/main/quest/m4/capture-foreground.md) lands on moq's `main`. Check that quest's PR has merged.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
1 change: 0 additions & 1 deletion quest/m2/compose/hang-layers.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,3 @@ layer layout track and are replanned in moq's tree.

- [The studio publishes a composition](/quest/m2/compose/layout.md) - the prototype hang's spec starts from
- [Viewer controls](/quest/m2/compose/controls.md) - toggles and priorities the spec carries
- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
4 changes: 0 additions & 4 deletions quest/m2/pin-browser-audio.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,3 @@ Moved to m2 with the [web studio](/quest/m2/web.md) on 2026-11-09
merged on moq's `main`, deleting its file, and moq-audio's browser backends
are there. A quest file that moved, or went away without its work landing,
does not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
4 changes: 0 additions & 4 deletions quest/m2/pin-browser-video.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,3 @@ Moved to m2 with the [web studio](/quest/m2/web.md) on 2026-11-09
merged on moq's `main`, deleting its file, and moq-video's browser backends
are there. A quest file that moved, or went away without its work landing,
does not count.

## Required

- [The studio is caught up to moq's main](/quest/m0/pin-main.md) - moq's breaking changes since moq-dev/moq#8272, so this pin takes only its own
2 changes: 2 additions & 0 deletions rs/moq-scene/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ tracing = { workspace = true }
# it builds wherever the studio does with no runtime library to download.
tract-onnx = { version = "0.23.10", default-features = false }
url = { workspace = true }
# The compositor's device; moq-video's release, so its decoded textures share it.
wgpu = { workspace = true }
vello = "0.11"
# Decompresses an overlay's WOFF and WOFF2 fonts to check them. Already in the
# graph through Blitz's `woff` feature.
Expand Down
1 change: 0 additions & 1 deletion rs/moq-scene/src/browser/import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
use std::os::fd::OwnedFd;

use super::protocol::Texture;
use crate::wgpu;

/// Copy the DMA-BUF `texture` describes, whose plane descriptors are `fds`,
/// into a texture of the studio's own on `device`, waiting until the copy is
Expand Down
3 changes: 1 addition & 2 deletions rs/moq-scene/src/browser/layers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
//! apart from it, such as a `<select>`'s list, drawn over it.

use super::protocol::{Area, Layer};
use crate::wgpu;
use crate::wgpu::util::DeviceExt;
use wgpu::util::DeviceExt;

/// The formats a page arrives in: CEF's shared textures, and the uploads.
const FORMATS: [wgpu::TextureFormat; 2] = [wgpu::TextureFormat::Rgba8Unorm, wgpu::TextureFormat::Bgra8Unorm];
Expand Down
2 changes: 0 additions & 2 deletions rs/moq-scene/src/browser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ use std::sync::{Arc, Mutex};

use serde::{Deserialize, Serialize};

use crate::wgpu;

#[cfg(target_os = "linux")]
mod layers;
#[cfg(target_os = "linux")]
Expand Down
1 change: 0 additions & 1 deletion rs/moq-scene/src/browser/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use super::protocol::{Area, Channel, Command, Event, Id, Layer, Open, Raster, St
use super::{ARG, Helper, Page, Paint};
use crate::Error;
use crate::source::{Mailbox, Picture, Status};
use crate::wgpu;

/// Run the page `open` describes until it fails or its helper stops,
/// delivering pictures to `picture` and sound to `sound`. Dropping the future
Expand Down
Loading