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
2 changes: 2 additions & 0 deletions quest/m2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 37 additions & 0 deletions quest/m2/capture-alsa-link.md
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions quest/m2/capture-v4l-bindings.md
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions quest/m2/cli-packaging.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading