Skip to content

Repository files navigation

Multiviewer

A hardware-accelerated, multi-protocol video multiviewer built in Rust. Drag, resize, and snap video sources on an interactive canvas with real-time compositing.

Version License Platforms Multiviewer App

📖 Full Documentation


🌟 Features

  • Multi-Protocol Video Sources — ingest from many video protocols or test patterns.
  • Hardware-Accelerated Compositor — wgpu-based pipeline with YUV→RGB conversion on the GPU, minimal CPU↔GPU copies.
  • Interactive Canvas — drag, resize, snap, and zoom layers intuitively.
  • Per-Source Settings — configure each source individually with persistent session state.
  • Real-Time Output — broadcast the composed view.
  • Cross-Platform — native desktop applications for macOS, Windows, and Linux.

🎥 Supported Protocols

Protocol Source Output Platforms Notes
Test Patterns ✅ — macOS, Windows, Linux SMPTE color bars and generative patterns
NDI ✅ ✅ macOS, Windows, Linux
OMT ✅ ✅ macOS, Windows, Linux Open Media Transport
Blackmagic DeckLink ✅ ✅ macOS, Windows, Linux Requires DeckLink Desktop Video installed
Syphon ✅ ✅ macOS only GPU-only, zero-copy texture sharing
Spout ✅ ✅ Windows only GPU-only, zero-copy texture sharing
AVFoundation ✅ — macOS only Webcams and capture devices
MediaFoundation ✅ — Windows only Webcams and capture devices
DirectShow ✅ — Windows only Webcams and WDM capture devices
macOS Screen Capture ✅ — macOS only Display and window screen capture
Windows Screen Capture ✅ — Windows only Display and window screen capture
VNC ✅ — macOS, Windows, Linux Remote Desktop over VNC/RFB
RDP ✅ — macOS, Windows, Linux Microsoft Remote Desktop

🛠️ Built Upon

Multiviewer is built with:

  • Rust (Edition 2024) — systems programming language with fearless concurrency
  • egui / eframe — immediate-mode GUI toolkit
  • wgpu — safe, portable WebGPU implementation for GPU compute and rendering

📦 Installation

Precompiled Binaries (Recommended)

Download ready-to-use binaries for macOS, Windows, and Linux from the Releases page.

Homebrew (macOS)

brew install patopesto/tap/multiviewer

Build from Source

git clone https://gitlab.com/patopest/multiviewer.git
cd multiviewer
cargo build --release

Note: The NDI SDK is required for NDI support. Run Setup environment first; the build uses the project-local SDK and fails if it is missing.


🚀 Development

Using go-task

Setup environment

task setup

Note: This downloads the NDI SDK to a local project directory (vendor/ndi/<os>/sdk), which is the only SDK the build uses; the build fails if it is missing. Get the SDK itself from NDI's website

Run the App

task run

Build the App

task package

Test

cargo test

📘 How It Works

Multiviewer ingests video from multiple protocols, composites them on a shared GPU canvas, and can broadcast the result back out over NDI, DeckLink, or Syphon.

  1. Source Threads — each protocol runs on its own thread, decoding frames and handing them off to the main thread via lock-free Arc swaps.
  2. GPU Compositing — a single WGSL shader handles passthrough (RGBA/BGRA) and UYVY→RGB conversion (BT.601 for SD, BT.709 for HD) directly on the GPU.
  3. Zero-Copy Paths — Syphon/Spout sources feed GPU textures directly with no CPU copy; NDI and DeckLink use shared CPU buffers uploaded via queue.write_texture().
  4. Interactive UI — the egui canvas lets you arrange sources freely, with snap-to-grid, zoom, and per-layer controls.

📚 References & Specifications


🐛 Contributing

Contributions are welcome! Whether it's bug reports, feature requests, or code contributions:

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Open a Pull Request

📄 License

This project is licensed under the MIT License. See the LICENSE file for details.


Made with ❤️ for live video production

Releases

Packages

Contributors

Languages