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
7 changes: 7 additions & 0 deletions .github/pages/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ screenshots and captured reports there; the code branch links to the

Large recordings and graph images are release assets:

- [Current mixer media](https://github.com/amagimedia/avplumber/releases/tag/mixer-demo-media-2026-10)
- [Replay media](https://github.com/amagimedia/avplumber/releases/tag/replay-demo-media-2026-09)
- [DMA-BUF media](https://github.com/amagimedia/avplumber/releases/tag/dmabuf-demo-media-2026-09)

Expand All @@ -19,3 +20,9 @@ GPU correctness tests, capacity measurements and actual deployment state.
Keep historical measurements attached to their workload and revision; a code
review or small smoke test does not refresh a capacity benchmark. Publish
sanitized textual evidence without private host or storage paths.

The October mixer demo is a 10-second recording of the real main UI, with
Program/Preview and dirty Program viewers, four keys and direct cuts. Its
`capture-20261009.json` describes the observed 192-input L4 configuration;
it does not replace historical capacity or latency measurements. September
mixer graph images and recordings remain historical release assets.
12 changes: 11 additions & 1 deletion demos/mixer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,20 @@
Mix video and browser sources on a CUDA canvas, with Preview/Program,
Cut/Fade/media wipes, downstream keys and AUX monitors. Video only.

[Watch the demo](https://amagimedia.github.io/avplumber/demos/mixer/docs/) ·
[![192-input mixer: Program/Preview and dirty Program with four downstream keys](https://amagimedia.github.io/avplumber/demos/mixer/docs/mixer-demo-poster.jpg)](https://amagimedia.github.io/avplumber/demos/mixer/docs/)

[Watch the 10-second demo](https://amagimedia.github.io/avplumber/demos/mixer/docs/) ·
[MP4](https://github.com/amagimedia/avplumber/releases/download/mixer-demo-media-2026-10/mixer-192-input-demo.mp4) ·
[HTML cookbook](https://amagimedia.github.io/avplumber/demos/mixer/docs/cookbook/) ·
[Configuration](docs/config.md) · [Run manually](docs/guide.md)

Recorded 2026-10-09 from the real two-viewer interface on an NVIDIA L4:
192 inputs (120 NVDEC, 36 browser scene sources, 32 raw NV12 and four browser
keys), 256 scenes and 26 encoded outputs at 1920×1080p25 SDR. It shows direct
cuts with all four keys enabled. Setup counts the 188 scene sources separately
from the keys. This short recording demonstrates the interface; see
[capacity measurements](docs/capacity.md) for qualification scope.

## Run

Use a Linux NVIDIA host with NVDEC/NVENC, Docker Compose, NVIDIA Container
Expand Down
15 changes: 15 additions & 0 deletions demos/mixer/docs/capacity.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@ runs; raw evidence and caveats remain linked below.
[Source-limit cookbook](https://amagimedia.github.io/avplumber/demos/mixer/docs/cookbook/source-limits.html) ·
[HTML cookbook](https://amagimedia.github.io/avplumber/demos/mixer/docs/cookbook/)

## Current demo recording: 2026-10-09

The [10-second UI recording](https://amagimedia.github.io/avplumber/demos/mixer/docs/)
shows a running `nvidia_l4_cuarray` show on one NVIDIA L4 / 16-vCPU host:
192 inputs, 256 scenes and 26 outputs at 1920×1080p25 SDR. The input total is
120 NVDEC + 36 browser scene sources + 32 raw NV12 + four browser keys;
Setup reports 188 catalogue sources before adding the keys. Outputs are
Program, clean Program and 24 AUX buses, including the Program/Preview monitor
and source multiviewer.

The capture uses two WebRTC viewers, four enabled keys and direct cuts through
several scene types. It is an interface demonstration, not a new capacity,
latency or soak benchmark. The [capture metadata](https://amagimedia.github.io/avplumber/demos/mixer/docs/capture-20261009.json)
records its scope; the historical qualification results below remain separate.

## T4

16 GiB T4, 16 vCPUs, 1080p inputs; totals include four browser keys.
Expand Down
16 changes: 15 additions & 1 deletion demos/mixer/docs/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ The Compose stack starts the web UI. With a standalone backend:
python3 -m pyplumber.mixer.gui --host 127.0.0.1 --port 7777 --http-port 7681
```

For the [recorded two-viewer layout](https://amagimedia.github.io/avplumber/demos/mixer/docs/),
select **Viewers 2**, then **Program preview** in one viewer and **Program dirty**
in the other. The first contains PVW, PGM and eight scene slots; the second
shows the program with its enabled keys. Viewer selection is local to the
browser. Scene takes, key buttons, AUX paging and AUX layout controls operate
the running mixer. In Direct mode, selecting a scene takes it immediately
using the selected transition; select Cut for the cut-only workflow.

Each viewer must support its output codec. The recorded L4 show uses HEVC for
Program preview and H.264 for dirty Program; an H.264-capable browser alone
cannot display both. Setup can change output codecs, but applying Setup
restarts the mixer. The downloadable demonstration MP4 is H.264.

For the optional terminal UI:

```sh
Expand Down Expand Up @@ -81,7 +94,8 @@ Fedora image); the manual mixer needs no neural models.
## Behind a reverse proxy

Serve controls at `/` and the preview server at `/preview/`, stripping that
prefix. Set `MIXER_PREVIEW_BASE=/preview/` (or `webui.py --preview-base /preview/`).
prefix. Set `MIXER_PREVIEW_BASE=/preview/` (or pass `--preview-base /preview/`
to `python3 -m pyplumber.mixer.gui`).
Forward WebSocket upgrades for the preview's Janus path as well as normal HTTP.
The [L4 proxy template](../../../docker-compose/mixer/deploy/l4/nginx.conf.template) is a complete example.
WebRTC also needs the configured UDP range reachable from the viewer.
Expand Down
8 changes: 7 additions & 1 deletion docker-compose/mixer/deploy/l4/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Portable L4 mixer

[Quick start](../../../../demos/mixer/README.md) · [Capacity](../../../../demos/mixer/docs/capacity.md#nvidia-l4-nvidia_l4) ·
[Quick start](../../../../demos/mixer/README.md) · [Capacity](../../../../demos/mixer/docs/capacity.md#nvidia-l4-linear-and-cuarray-profiles) ·
[HTML cookbook](https://amagimedia.github.io/avplumber/demos/mixer/docs/cookbook/)

Requires a Linux L4 host with working NVIDIA DRM/GBM/EGL, R615+ driver,
Expand All @@ -24,6 +24,12 @@ Allow the public proxy port and `JANUS_RTP_PORT_RANGE` (UDP 20000–20100 by
default). Set `MIXER_HTPASSWD` or use an authenticated reverse proxy.
The included proxy forwards HTTP and WebSocket paths.

The [current demo recording](https://amagimedia.github.io/avplumber/demos/mixer/docs/)
shows this profile at 192 inputs / 256 scenes / 26 outputs, 1080p25 SDR.
Its two viewers show Program/Preview and dirty Program with four keys. The
Program/Preview and Multiviewer outputs in that show use HEVC; use a browser
with HEVC WebRTC reception support to view them. The recording itself is H.264.

First start seeds [settings.json](settings.json) and generates media. Later
starts preserve saved settings; change an existing show through Setup.
Keep the writable media directory, including `.nv-cache`, across restarts.
Expand Down
Loading