diff --git a/Cargo.lock b/Cargo.lock index 402a4c6..64f16a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -527,26 +527,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bindgen" -version = "0.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" -dependencies = [ - "bitflags 2.13.2", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex 1.3.0", - "syn 2.0.119", -] - [[package]] name = "bindgen" version = "0.72.1" @@ -1361,7 +1341,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "035c801dc4b418e1d857a6536dc88b4d1929c7a1fd163389766e18d322d34a84" dependencies = [ - "bindgen 0.72.1", + "bindgen", "cc", "pkg-config", "rustversion", @@ -3588,6 +3568,7 @@ name = "kio" version = "0.6.2" dependencies = [ "crossbeam-epoch", + "futures", "kio-macros", "rand", "serde", @@ -3795,7 +3776,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b6e17bdaf63ed0d5e4144022624032b41fd9733112e8c74ac26fc9bf1291924" dependencies = [ - "bindgen 0.72.1", + "bindgen", "cc", "system-deps", ] @@ -4155,7 +4136,6 @@ dependencies = [ "roxmltree", "rustc-hash 2.1.3", "scuffle-av1", - "scuffle-h265", "serde", "serde_json", "serde_with", @@ -4457,17 +4437,13 @@ dependencies = [ [[package]] name = "moq-vaapi" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb08b9dab1b19b21fe0e909755a9c17601d6dcb0ced2b325fda0f0a8ba594cb8" +version = "0.2.1" dependencies = [ "anyhow", - "bindgen 0.70.1", "bitflags 2.13.2", - "libloading 0.8.9", - "log", - "regex", - "thiserror 1.0.69", + "libloading 0.9.0", + "thiserror 2.0.21", + "tracing", ] [[package]] @@ -4508,7 +4484,6 @@ dependencies = [ "openh264", "openh264-sys2", "pipewire", - "scuffle-h265", "thiserror 2.0.21", "tokio", "tracing", @@ -4886,15 +4861,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "nutype-enum" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e13adea6de269faa0724df58f43f6fe2a81af7094f1dcb8b5b968eb2103cb3" -dependencies = [ - "scuffle-workspace-hack", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -5712,7 +5678,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce653f53e63e5b93853218092ee9a8906a5d082c92f3f1db26316955dd63ce0" dependencies = [ - "bindgen 0.72.1", + "bindgen", "libspa-sys", "system-deps", ] @@ -6731,31 +6697,6 @@ dependencies = [ "scuffle-workspace-hack", ] -[[package]] -name = "scuffle-expgolomb" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d21330974c941e4c0aedc1e7255ea809e8cbac51e135209f6d67843ad1b94d" -dependencies = [ - "scuffle-bytes-util", - "scuffle-workspace-hack", -] - -[[package]] -name = "scuffle-h265" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b04b276c2f79846b7968abe6f87cedf951e06fd2a2b72d99c457e85d7e40f3fb" -dependencies = [ - "bitflags 2.13.2", - "byteorder", - "bytes", - "nutype-enum", - "scuffle-bytes-util", - "scuffle-expgolomb", - "scuffle-workspace-hack", -] - [[package]] name = "scuffle-workspace-hack" version = "0.1.0" diff --git a/js/join/src/index.ts b/js/join/src/index.ts index 38b0911..09b416e 100644 --- a/js/join/src/index.ts +++ b/js/join/src/index.ts @@ -74,8 +74,8 @@ function join(link: Link): () => void { const show = new Watch.Player({ origin: connection.origin, name: Feed.path(link.name, link.generation), - // The guest's receive rate, so the player drops to the half size their link can carry. - probe: connection.probe, + // Claim the guest's receive rate, so the player drops to the half size their link can carry. + viewer: { viewers: connection.viewers }, video: { canvas: element("show") }, }); signals.cleanup(() => show.close()); diff --git a/moq b/moq index d018198..079a646 160000 --- a/moq +++ b/moq @@ -1 +1 @@ -Subproject commit d01819803e3e93e52d20366febfe9eaca9c8e232 +Subproject commit 079a6460fc6bff54ec48d98a8f0bbd509b69fc52 diff --git a/quest/m0/README.md b/quest/m0/README.md index 464469e..386168d 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -108,7 +108,6 @@ repository. - [moq-video's browser backends are pinned](/quest/m0/pin-browser-video.md) - the web studio's video slice and browser composition - [moq-audio's browser backends are pinned](/quest/m0/pin-browser-audio.md) - the web studio's audio slice - [moq-audio's source tap is pinned](/quest/m0/pin-audio-tap.md) - the samples clap-to-measure sync times a clap from -- [moq-audio's strip pan is pinned](/quest/m0/pin-audio-pan.md) - the bus strip pan the studio's pan sets - [A replayed media file never repeats a timestamp](/quest/m0/media-replay-timestamps.md) - a media source that starts over publishes strictly increasing timestamps, and its flaky test passes every run ## Related diff --git a/quest/m0/audio-pan.md b/quest/m0/audio-pan.md index 3283185..507e6e1 100644 --- a/quest/m0/audio-pan.md +++ b/quest/m0/audio-pan.md @@ -17,7 +17,7 @@ the rest of audio scenes: moq-audio; the studio only sets it and saves it. Rejected: a pan per audio scene a sound is sent to. - ✅ Settled moq-side in - [Pan a bus source](https://github.com/moq-dev/moq/blob/main/quest/m3/audio-strip-pan.md): + [Pan a bus source](https://github.com/moq-dev/moq/pull/8180): a constant-power law, -3 dB at center; a stereo source is balanced, the far side attenuated and each channel kept where it is; a bus that is not stereo refuses a pan other than center. @@ -25,7 +25,3 @@ the rest of audio scenes: is. - Both panels draw a sound's mute, gain, and delay with `strip_controls` in `rs/moq-studio/src/ui.rs`; a pan added there shows in both. - -## Required - -- [moq-audio's strip pan is pinned](/quest/m0/pin-audio-pan.md) - the `Strip` pan the studio sets diff --git a/quest/m0/pin-audio-pan.md b/quest/m0/pin-audio-pan.md deleted file mode 100644 index 3c0f538..0000000 --- a/quest/m0/pin-audio-pan.md +++ /dev/null @@ -1,13 +0,0 @@ -# [XS] moq-audio's strip pan is pinned - -## Goal - -The `moq` submodule includes a pan on moq-audio's bus `Strip`, from -[Pan a bus source](https://github.com/moq-dev/moq/blob/main/quest/m3/audio-strip-pan.md). - -## Plan - -The pan landed upstream in -[moq-dev/moq#8180](https://github.com/moq-dev/moq/pull/8180) -(`Strip::set_pan` and `Strip::pan` on moq's `main`). Advance the gitlink with -`just upgrade-moq` in its own PR, fixing whatever the new API breaks here. diff --git a/rs/moq-scene/src/publish.rs b/rs/moq-scene/src/publish.rs index 1ca698a..ca34bc4 100644 --- a/rs/moq-scene/src/publish.rs +++ b/rs/moq-scene/src/publish.rs @@ -514,10 +514,7 @@ impl<'a> Video<'a> { config.color = color; config.kind = listing.kind.clone(); let rendition = config.probe().await?; - let reserved = listing - .catalog - .reserve() - .with_interval(config.gop.duration(config.framerate)); + let reserved = listing.catalog.reserve().with_interval(config.effective_join()); let producer = moq_video::encode::Producer::new(listing.broadcast.clone(), reserved, rendition)?; Ok(Self { track: Encoding::new(producer, listing.sessions.clone()), diff --git a/rs/moq-scene/src/replay.rs b/rs/moq-scene/src/replay.rs index 5469a7f..9f8cc74 100644 --- a/rs/moq-scene/src/replay.rs +++ b/rs/moq-scene/src/replay.rs @@ -364,7 +364,7 @@ fn copy_held( let copied: Vec = held.into_keys().collect(); for pair in copied.windows(2) { if pair[1] > pair[0] + 1 { - track.drop_groups(pair[0] + 1..pair[1], moq_net::StreamError::NotFound); + track.skip_groups(pair[0] + 1..pair[1]); } } Ok(media.then_some(covered)) @@ -406,7 +406,7 @@ mod tests { .unwrap(); for sequence in 0..groups { match lost == Some(sequence) { - true => track.drop_groups(sequence..sequence + 1, moq_net::StreamError::Cancel), + true => track.skip_groups(sequence..sequence + 1), false => write(&track, sequence, &second(sequence)), } } diff --git a/rs/moq-scene/src/source.rs b/rs/moq-scene/src/source.rs index a670137..44b8ca1 100644 --- a/rs/moq-scene/src/source.rs +++ b/rs/moq-scene/src/source.rs @@ -2159,7 +2159,7 @@ pub(crate) mod test { let mut config = moq_video::encode::Config::new(64, 64, moq_video::FrameRate::new(30, 1).unwrap()); config.kind = moq_video::encode::Kind::Software; let rendition = config.probe().await.unwrap(); - let reserved = catalog.reserve().with_interval(config.gop.duration(config.framerate)); + let reserved = catalog.reserve().with_interval(config.effective_join()); let mut producer = moq_video::encode::Producer::new(broadcast.clone(), reserved, rendition).unwrap(); let mut encoder = moq_video::encode::Encoder::new(&config).unwrap(); let gray = vec![0x80; 64 * 64 * 4]; @@ -2616,7 +2616,7 @@ mod tests { let mut config = moq_video::encode::Config::new(64, 64, moq_video::FrameRate::new(30, 1).unwrap()); config.kind = moq_video::encode::Kind::Software; let rendition = config.probe().await.unwrap(); - let reserved = timebase.reserve().with_interval(config.gop.duration(config.framerate)); + let reserved = timebase.reserve().with_interval(config.effective_join()); let video = moq_video::encode::Producer::new(broadcast.clone(), reserved, rendition).unwrap(); (video, moq_video::encode::Encoder::new(&config).unwrap()) } diff --git a/rs/moq-studio/src/engine.rs b/rs/moq-studio/src/engine.rs index ed13e8d..66b4834 100644 --- a/rs/moq-studio/src/engine.rs +++ b/rs/moq-studio/src/engine.rs @@ -1993,7 +1993,7 @@ impl Renditions { video, } = probed; let (broadcast, timebase) = (&self.broadcast, &self.timebase); - let reserved = timebase.reserve().with_interval(config.gop.duration(config.framerate)); + let reserved = timebase.reserve().with_interval(config.effective_join()); let suffix = match &video.codec { hang::catalog::VideoCodec::H264(_) => ".avc3", hang::catalog::VideoCodec::H265(_) => ".hev1", diff --git a/rs/moq-studio/src/record.rs b/rs/moq-studio/src/record.rs index 9eef9a4..f7a775c 100644 --- a/rs/moq-studio/src/record.rs +++ b/rs/moq-studio/src/record.rs @@ -643,7 +643,9 @@ impl Run { None => Reading { source: self.program.clone(), format: CatalogFormat::Hang, - pick: Box::new(|studio: hang::Catalog| Some(largest_video(studio.media()))), + pick: Box::new(|studio: hang::Catalog| { + Some(largest_video(studio.without_ext())) + }), closing: Some(self.closing.clone()), }, Some(name) => { diff --git a/rs/moq-studio/src/replay.rs b/rs/moq-studio/src/replay.rs index 717bc69..4e4dd54 100644 --- a/rs/moq-studio/src/replay.rs +++ b/rs/moq-studio/src/replay.rs @@ -201,7 +201,7 @@ mod tests { let mut config = moq_video::encode::Config::new(64, 64, moq_video::FrameRate::new(30, 1).unwrap()); config.kind = moq_video::encode::Kind::Software; let rendition = config.probe().await.unwrap(); - let reserved = catalog.reserve().with_interval(config.gop.duration(config.framerate)); + let reserved = catalog.reserve().with_interval(config.effective_join()); let mut producer = moq_video::encode::Producer::new(broadcast.clone(), reserved, rendition).unwrap(); let mut encoder = moq_video::encode::Encoder::new(&config).unwrap(); let gray = vec![0x80; 64 * 64 * 4];