AVPlumber DMA-BUF browser

Code & setup guide

The current default captures sixteen 480×270@60 browser pages in four Electron workers and composes 1920×1080@60 output with the shared native mixer timing. Configure the page URL and dimensions at startup; this demo has no TUI.

The recording below is the earlier 1080p-input run. Its sources delivered about 39–40 new frames/s into a 60 fps output. It predates the current configuration, which delivered about 60 frames/s per source during validation.

Download the MP4 · 9.98 seconds · 8.6 MB · silent H.264 video · 1920×1080 at 60 fps. The original GPU-output recording is trimmed to 599 frames, with its leading black frame removed.

The complete processing graph

The current sixteen-source graph: DMA-BUF inputs, cached EGL import, CUDA grid composition, NVENC encoding, and RTP delivery to Janus. All 54 nodes and 53 queues are visible with orthogonal routes and directional arrows. This static capture shows the current 480×270, four-worker configuration; the video above is the earlier recording.

The current 480×270 four-worker Singular run delivered 59.91–59.99 fps per source, with zero browser capture drops over 12 seconds. Whole-device averages were 38.92% GPU and 576 MiB GPU memory; browser processes used 8.15 CPU cores and AVPlumber 0.30. These are workload-specific observations, not capacity guarantees. The setup guide documents the stage comparison.

With the cadence fix and the default two-frame buffer, 1/4/8-source checks each had 0 repeats and 0 discards per input over 1,800 output ticks (30 seconds): 0%. Three cold sixteen-source trials had worst-source repeats of 10/3,600 (0.278%, 60 seconds), 1/1,800 (0.056%, 30 seconds), and 4/1,800 (0.222%, 30 seconds). Every input had 0 discards (0%) and every trial had 0 missed output deadlines. Slightly late browser paints can still require repeats. The first 600 warmup ticks are excluded; the live mixer remained active. Per-input results and conditions.

Live AVPlumber web UI showing the sixteen DMA-BUF source branches, GPU compositor, encoder, RTP output, and routed queue connections.
Open the full processing graph in the HTML viewer to zoom and read every node. Edge colours and fill markers reflect queue state at capture time.