1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
[]
= "moq-cli"
= "Media over QUIC"
= ["Luke Curley <kixelated@gmail.com>"]
= "https://github.com/moq-dev/moq"
= "MIT OR Apache-2.0"
= "0.12.0"
= "2024"
# Depends on moq-relay, whose sysinfo 0.39 needs 1.95, above the 1.91 workspace
# floor. This binary is an application, so the bump stays here rather than
# raising the libraries others build on.
= "1.95"
= ["quic", "http3", "webtransport", "media", "live"]
= ["multimedia", "network-programming", "web-programming"]
# The package is `moq-cli`, but the binary it ships is `moq`.
[[]]
= "moq"
= "src/main.rs"
# `libmoq`'s staticlib is also named `moq`, so a `cargo doc` selecting both renders
# them to `target/doc/moq` and the two rustdoc processes race to clean it (#3094).
# This binary's page is the one to give up: nothing links it, and a bin target has
# no public API to render, whereas docs.rs/libmoq is the published C API reference.
= false
[]
= ["iroh", "cluster-lan", "noq", "websocket", "nvidia"]
= ["moq-tokio/iroh"]
# LAN discovery and meshing (`--cluster-lan`).
= ["moq-relay/cluster-lan"]
= ["moq-tokio/jemalloc"]
= ["moq-tokio/noq"]
# qlog trace capture (`--client-quic-qlog <DIR>`). Off by default: it compiles the
# qlog machinery into the enabled backends and is only wanted for debugging or
# congestion-control testing.
= ["moq-tokio/qlog"]
= ["moq-tokio/websocket"]
# Device capture (camera + microphone) + encode/publish. Off by default because
# it pulls in moq-video + moq-audio capture: on Linux the microphone needs
# ALSA/libasound at build time through cpal (the camera needs nothing, moq-v4l
# checks its bindings in), plus binary size. macOS/Windows use OS frameworks, no
# extra install. H.264 is vendored static (openh264), so no system ffmpeg/libav.
# Enable with `cargo build -p moq-cli --features capture`, adding `pipewire` for
# display capture on Linux.
= ["dep:moq-video", "dep:moq-audio", "moq-video/capture", "moq-audio/capture"]
# Just-in-time transcoding (`moq ... transcode`). Off by default because it pulls
# in moq-video and its codec dependencies. Enable with
# `cargo build -p moq-cli --features transcode`.
= ["dep:moq-transcode", "dep:moq-video"]
# Native playback (`moq ... play`): decode into a wgpu window and a cpal
# speaker. Off by default because it pulls both graphics and audio device stacks
# into a binary that may only be routing containers or serving gateways.
= ["dep:moq-video", "moq-video/render", "dep:moq-audio", "moq-audio/playback", "dep:pollster", "dep:winit"]
# NVIDIA hardware codecs (NVENC + NVDEC) on Linux, on by default. Just turns on
# the matching moq-video feature, so it only bites when something else pulls in
# moq-video: `capture`, `transcode`, or `play`. For a build with no CUDA
# dependencies, drop it:
# cargo build -p moq-cli --no-default-features --features "iroh,noq,websocket,capture"
= ["moq-video?/nvidia", "moq-transcode?/nvidia"]
# Compatibility aliases for the pre-consolidation names, kept so a manifest that
# already asks for the old split still resolves. Undocumented on purpose: the
# feature tables name only `nvidia`.
= ["nvidia"]
= ["nvidia"]
# Intel/AMD VAAPI hardware encoding (Linux), opt-in like the moq-video feature
# it turns on: libva is dlopen'd at runtime, but moq-vaapi's bindgen needs
# libclang on the build host. Only bites when `capture`, `transcode`, or `play`
# pulls in moq-video.
= ["moq-video?/vaapi", "moq-transcode?/vaapi"]
# The V4L2 M2M codecs of an ARM SoC (a Raspberry Pi's VideoCore and the like),
# opt-in like the moq-video feature it turns on. Costs the build nothing: moq-v4l
# checks its bindings in. Only applies when `capture`, `transcode`, or `play`
# pulls in moq-video.
= ["moq-video?/v4l2", "moq-transcode?/v4l2"]
# Screen capture for `capture --display` on Linux (xdg-desktop-portal + PipeWire),
# opt-in like moq-video's own `pipewire` because it links libpipewire-0.3 at
# build time. Only bites when `capture` pulls in moq-video and moq-audio.
# Also reaches audio, so `devices`, microphone capture and playback go through
# the sound server rather than its ALSA plugin on a machine running one.
= ["moq-video?/pipewire", "moq-audio?/pipewire"]
# The other Linux sound server. Off by default, unlike `pipewire`: PulseAudio is
# what a machine runs when it is not running PipeWire, so enabling both by
# default would link a client library most builds never reach for.
= ["moq-audio?/pulseaudio"]
[]
= { = true, = ["backtrace"] }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true, = true, = ["aac"] }
= { = true, = ["serve"] }
# `server` enables the HTTP egress server for `moq export hls`; the importer is always available.
= { = true, = ["server"] }
= { = true }
# Cluster, LAN mesh, and inbound `/.cluster` auth. default-features off so the
# CLI's own feature set (iroh, noq, cluster-lan) is what selects them.
= { = true }
= { = true }
= { = true }
= { = true }
# Raw qmux listeners are part of the CLI surface. `uds` compiles only on Unix.
= { = true, = false, = ["aws-lc-rs", "tcp", "uds"] }
= { = true, = true, = ["openh264"] }
= { = true, = true, = ["openh264"] }
= { = true, = true }
= { = true, = ["rustls", "json"] }
= { = "0.23", = ["aws-lc-rs"], = false }
= { = true }
= { = true }
= { = true, = ["full"] }
= { = true }
= { = true }
= { = true }
= { = true, = ["completions", "config"] }
= { = "0.30.13", = true }
[]
= { = true }
[]
# Authors an MSF-only catalog, which is the one shape that tells a completer reading
# the wrong catalog track apart from one reading the right one: `moq-mux`'s producer
# publishes hang and MSF from the same source, so both answer for an ordinary broadcast.
= { = true }
= { = true }
# `test-util` enables `tokio::time::pause` so the TS round-trip test simulates the
# exporter drain timeouts instantly instead of waiting on the wall clock.
= { = true, = ["test-util"] }