diff --git a/quest/m2/README.md b/quest/m2/README.md index 544e5fd23d..bd14502768 100644 --- a/quest/m2/README.md +++ b/quest/m2/README.md @@ -205,6 +205,8 @@ before format-specific metadata. Unrelated areas can proceed in parallel. - [Runtime QA hosts](/quest/m2/runtime-qa-hosts.md) - run exact source snapshots on accessible Linux and device hosts with retrievable debug evidence - [Media QA on other engines](/quest/m2/browser-media-qa-engines.md) - the media harness measures a Firefox or WebKit player over the fallback and names what each engine lacks - [#1310](/quest/m2/1310-why-use-the-worklet-plugin.md) - why use the worklet plugin? +- [Capture without V4L2 bindgen](/quest/m2/capture-v4l-bindings.md) - moq-video capture builds on Linux without libclang or kernel headers +- [Audio capture without ALSA link](/quest/m2/capture-alsa-link.md) - moq-audio capture and playback build on Linux without linking libasound - [Ship capture and playback](/quest/m2/cli-packaging.md) - a released moq binary can capture and play, which no distribution currently enables - [Windows capture parity](/quest/m2/capture-windows.md) - system audio and screen cursor capture with a settled app-capture policy - [Linux capture parity](/quest/m2/capture-linux.md) - Wayland window/system-audio capture with explicit display-selection and app-capture limits diff --git a/quest/m2/capture-alsa-link.md b/quest/m2/capture-alsa-link.md new file mode 100644 index 0000000000..13721d6b41 --- /dev/null +++ b/quest/m2/capture-alsa-link.md @@ -0,0 +1,37 @@ +# [S] Audio capture without runtime system libraries + +## Goal + +A released moq-audio capture/playback build carries no runtime system +requirement on Linux: Nix provides everything needed at dev time to compile, +and the shipped binary starts and degrades cleanly on hosts without those +libraries. + +## Plan + +Nix already covers the dev-time side (alsa-lib, alsa-plugins, and pipewire +are in the dev shell). What remains is the runtime linkage: cpal 0.18's +`alsa` dependency is non-optional on Linux, so libasound becomes a load-time +requirement and the binary refuses to start where it is absent. Follow the +vaapi/nvidia pattern and load the system library at runtime instead, falling +through to the next host when it is missing, so a build with the feature on +still links and starts driverless. + +The current feature matrix is the contract to change: `capture` and +`playback` pull cpal with ALSA always linked, while +`pipewire = ["cpal/pipewire"]` and `pulseaudio = ["cpal/pulseaudio"]` activate +cpal without either. Make the host flags require `capture` or `playback` so +they never activate cpal alone, and document the supported combinations in +the moq-audio feature table with the same change. If cpal cannot load ALSA at +runtime in-tree, split that half into its own upstream quest holding the cpal +release as a plain-text `Required` condition, and this quest requires it. + +Verify by building in the Nix shell, then running the shipped binary on a +host without libasound: it starts, lists devices, and captures where a +backend exists. Inspect the binary to prove no load-time requirement on +libasound. The PR 3850 capture gate keeps the coverage. + +## Related + +- [Ship capture and playback](/quest/m2/cli-packaging.md) - the shippable capture milestone this work supports +- [Optional native compilation and opt-in rendering](/quest/m0/media-features.md) - the host-flag rule this aligns with diff --git a/quest/m2/capture-v4l-bindings.md b/quest/m2/capture-v4l-bindings.md new file mode 100644 index 0000000000..a68ea29819 --- /dev/null +++ b/quest/m2/capture-v4l-bindings.md @@ -0,0 +1,28 @@ +# [S] Capture without the V4L2 bindgen build dependency + +## Goal + +moq-video `capture` builds for every builder without libclang or kernel +headers at build time, and carries no runtime system requirement. + +## Plan + +The runtime side is already clean: the camera path drives the kernel through +ioctls, so no system library ships in the binary. What remains is build time. +Nix already covers in-tree builds (bindgenHook provides libclang), so vendor +or pin the `v4l` crate with checked-in bindings and drop its bindgen build +script, the way `moq-nvenc` does and +[VAAPI](/quest/m2/video-vaapi.md) plans. That covers every other builder too +(`cargo install`, Docker). Keep the `v4l` API so `capture/v4l2.rs` and the +`v4l2` codec backend need no logic changes; fixing `v4l` fixes both features +since both drive the same device node through it. + +Verify by building `just rs capture` with no libclang on PATH and by +inspecting the binary to prove no new runtime library requirement. The PR +3850 capture gate keeps the coverage. + +## Related + +- [Ship capture and playback](/quest/m2/cli-packaging.md) - the shippable capture milestone this work supports +- [VAAPI encode and decode](/quest/m2/video-vaapi.md) - same pre-generated bindings pattern for libva +- [Linux capture parity](/quest/m2/capture-linux.md) - the Linux capture milestone this work supports diff --git a/quest/m2/cli-packaging.md b/quest/m2/cli-packaging.md index be8a91fe7f..677d521666 100644 --- a/quest/m2/cli-packaging.md +++ b/quest/m2/cli-packaging.md @@ -28,3 +28,8 @@ dependencies present, and a Docker image without them fails at build rather than at run. Then verify the shipped artifact runs `moq devices` and `moq play` on each platform, since a feature that compiles into the binary and then fails to open a device is the same gap one layer down. + +## Required + +- [Capture without V4L2 bindgen](/quest/m2/capture-v4l-bindings.md) - the camera path must build without libclang before every distribution can ship it +- [Audio capture without runtime system libraries](/quest/m2/capture-alsa-link.md) - the microphone path must start without system audio libraries before every distribution can ship it