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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
[]
= "lvqr-cli"
= "LVQR single binary entry point"
= true
= true
= true
= true
= true
= true
= ["streaming", "server", "quic", "moq"]
= ["multimedia", "network-programming", "command-line-utilities"]
[]
= "lvqr_cli"
= "src/lib.rs"
[[]]
= "lvqr"
= "src/main.rs"
[]
= ["rtmp", "quinn-transport", "cluster"]
= ["rtmp", "quinn-transport", "cluster", "c2pa", "whisper", "transcode", "jwks", "webhook"]
# PLAN row 120: JWKS dynamic key discovery. Adds `--jwks-url` + companion
# flags to `lvqr serve` and pulls reqwest + tokio::spawn into the auth
# layer via `lvqr-auth/jwks`. Off by default so `cargo install lvqr-cli`
# stays lean; operators opt in via `--features jwks` or `--features full`.
= ["lvqr-auth/jwks"]
# PLAN Phase D: webhook auth provider. Adds `--webhook-auth-url` + companion
# TTL / timeout flags and pulls reqwest + tokio::spawn into the auth layer
# via `lvqr-auth/webhook`. Off by default; included in `--features full`.
= ["lvqr-auth/webhook"]
= ["lvqr-ingest/rtmp"]
= ["lvqr-relay/quinn-transport"]
# Enables cluster-mode CLI flags + bootstrap in `start()`. Disabled
# deployments fall back to the single-node path.
= ["dep:lvqr-cluster"]
# Tier 4 item 4.3 session B3: enables the `/playback/verify/{broadcast}`
# admin route, plumbs `C2paConfig` through `ServeConfig`, and wires
# `lvqr_archive::provenance::finalize_broadcast_signed` into the drain-
# task termination path. Default off so operators without a provenance
# requirement do not link the c2pa-rs transitive closure.
= ["lvqr-archive/c2pa", "dep:c2pa"]
# Tier 4 item 4.5 session D: enables the `--whisper-model <PATH>` CLI
# flag, plumbs the model path through `ServeConfig`, and installs a
# `WhisperCaptionsFactory` + `AgentRunner` on the shared fragment
# registry inside `start()`. Default off so `cargo install lvqr-cli`
# does not pull `whisper-rs` (bindgen + cmake against whisper.cpp) or
# `symphonia` into the default build path.
= [
"dep:lvqr-agent",
"dep:lvqr-agent-whisper",
"lvqr-agent-whisper/whisper",
"lvqr-test-utils/whisper",
]
# Tier 4 item 4.6 session 105 B: pulls `lvqr-transcode/transcode` into the
# build. `lvqr-cli` does not yet wire `SoftwareTranscoderFactory` into the
# composition root (that lands in session 106 C together with the
# `--transcode-rendition` flag and the LL-HLS master playlist composition);
# the feature lives here in 105 B so `cargo build -p lvqr-cli --features full`
# exercises the GStreamer dep graph on CI the moment an operator opts in.
# Session 113 also activates `lvqr-whep/aac-opus` so the AAC-to-Opus
# encoder factory is available to the composition root when the operator
# opts into the same GStreamer runtime dep.
= [
"dep:lvqr-transcode",
"lvqr-transcode/transcode",
"lvqr-test-utils/transcode",
"lvqr-whep/aac-opus",
]
# Tier 4 item 4.6 session 156: forwards the `hw-videotoolbox` feature
# from `lvqr-transcode` so a binary built with this flag exposes the
# `--transcode-encoder videotoolbox` CLI value. Implies `transcode`
# (the new module reuses gstreamer-rs); macOS-only by element
# requirement (`vtenc_h264_hw` lives in `applemedia` from gst-plugins-bad).
= ["transcode", "lvqr-transcode/hw-videotoolbox"]
# Linux + Nvidia GPU HW encoder backend. Implies `transcode`; the
# `nvh264enc` element comes from the `nvcodec` plugin in
# `gst-plugins-bad` and probes the CUDA runtime + driver at element-
# factory load time.
= ["transcode", "lvqr-transcode/hw-nvenc"]
# Linux + Intel iGPU / AMD HW encoder backend via VA-API. Implies
# `transcode`; the `vah264enc` element comes from the modern `va`
# plugin in `gst-plugins-bad` and probes libva + a usable DRI device
# at element-factory load time.
= ["transcode", "lvqr-transcode/hw-vaapi"]
# Linux + Intel Quick Sync HW encoder backend. Implies `transcode`;
# the `qsvh264enc` element comes from the `qsv` plugin in
# `gst-plugins-bad` and probes Intel Media SDK / oneVPL at element-
# factory load time.
= ["transcode", "lvqr-transcode/hw-qsv"]
[]
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true, = ["jwt"] }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true, = true }
= { = true }
= { = true }
# Feature-gated on `c2pa`; exposes `c2pa::Reader` in the admin verify
# route. Inherited from the workspace so the lockfile-level pin tracks
# lvqr-archive's.
= { = true, = true }
# Feature-gated on `whisper`; `start()` builds a
# `WhisperCaptionsFactory` + `AgentRunner` on the shared fragment
# registry so the captions track the HLS subtitle rendition consumes
# has a live producer. Without the feature neither dep links at all
# and the `--whisper-model` flag is absent from the CLI.
= { = true, = true }
= { = true, = true }
# Feature-gated on `transcode`. Adding the dep here lets the `full`
# meta-feature activate `lvqr-transcode/transcode` from a single flag;
# `start()` does not yet install a `TranscodeRunner` (session 106 C).
= { = true, = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true, = ["full", "signal"] }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
# Mutex for ConfigReloadHandle's last-reload state (session 147).
# parking_lot avoids std-Mutex poisoning + matches the rest of the
# workspace's locking conventions.
= { = true }
# Swappable handles for hot config reload v2 (session 148): the mesh
# ICE list and HMAC playback secret are atomically replaced via
# `ArcSwap` so the signal callback and live-playback middleware can
# `load_full` per call without holding a lock.
= { = true }
# Signed playback URLs (PLAN row 121). hmac + sha2 implement the
# HMAC-SHA256 primitive; base64 encodes the signature for the
# query string; subtle gives constant-time comparison so verify
# has no timing oracle.
= { = true }
= { = true }
= { = true }
= { = true }
[]
# Real RTMP client for the RTMP -> WS E2E test.
= { = true }
# WebSocket client for the RTMP -> WS E2E test.
= "0.24"
# SRT client for the SRT -> HLS E2E test.
= "0.4"
= "0.3"
= { = true }
= { = true }
= "1"
# Full-stack TestServer for auth_integration.rs. The `c2pa` feature
# is opt-in from the `lvqr-cli/c2pa` feature union: Tier 4 item 4.3
# session B3's `c2pa_verify_e2e.rs` test uses `TestServerConfig::
# with_c2pa(..)`, which is gated on `lvqr-test-utils/c2pa`. Activating
# it here keeps the dev-dep feature unified with the lvqr-cli feature
# flag when `cargo test -p lvqr-cli --features c2pa` runs, and is a
# no-op in default builds because dev-dependencies only resolve during
# test target compilation.
= { = true, = ["c2pa"] }
# JWT minting in auth_integration.rs. Matches the version pulled in
# transitively through `lvqr-auth/jwt`.
= { = true }
= { = true }
= "3"
# Federation two-cluster E2E test opens a real MoQ client against the
# second TestServer and reads announcements; it also names
# `FederationLink` to construct the config. Both are dev-only.
= { = true }
= { = true }
= { = true }
# Session 114 row 1: WHIP->HLS E2E test drives a real str0m client
# against the CLI-hosted WHIP surface. Dev-only; matches the pin in
# `lvqr-whep`'s dependency graph (0.18).
= "0.18"