AVPlumber DMA-BUF browser
Code & setup guideThe 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.