Open-source broadcast media functions for MXL (Media eXchange Layer), the shared-memory media exchange of the EBU Dynamic Media Facility (DMF). Gateways (SMPTE ST 2110, SRT, SDI), a vision mixer, an audio mixer, replay, graphics, a multiviewer, scopes, monitoring, AV sync measurement and multi-host replication over MXL Fabrics. Every function is a container with AMWA NMOS IS-04/IS-05 (BCP-007-03) control, a web UI and Prometheus metrics.
This repository is the entry point. It holds no media code: it lists the function repositories, explains what a host needs, and gives Docker Compose examples and Kubernetes notes to run them together.
Each function repository stays the source of truth: its README and SPECIFICATION document every setting, port, metric and API. If this page and a function's README disagree, the README wins.
This is an independent community project. It is not part of, or endorsed by, the MXL project, the EBU or the Linux Foundation.
MXL lets media functions on one host exchange uncompressed video, audio and data through shared memory. A writer puts grains (frames) or samples into a ring buffer in a memory-backed file system (a tmpfs); readers map the same files. There is no copy and no network stack between functions on one host. Grain positions are derived from TAI time, so every host needs a disciplined clock. Between hosts, the MXL Fabrics API moves flows over RDMA (or TCP).
The functions here add the parts a facility needs around that: AMWA NMOS IS-04/IS-05 with the MXL transport (BCP-007-03) for discovery and routing, web UIs, Prometheus metrics, and WebRTC previews.
flowchart LR
subgraph host-a["host-a"]
direction LR
SDI[DeckLink SDI] --> MXLa
ST[ST 2110 network] <--> GW2110[st2110-gateway] <--> MXLa
SRT[SRT streams] <--> GWSRT[srt-gateway] <--> MXLa
TP[test-player] --> MXLa
BS[browser-source] --> MXLa
MXLa[(MXL domain<br/>tmpfs /Volumes/mxl)]
MXLa <--> MV[multiviewer]
MXLa <--> SC[scopes]
MXLa <--> AM[audio-mixer]
MXLa <--> RP[replay]
MXLa <--> CC[color-corrector]
MXLa <--> FX[FlowXer vision mixer]
MXLa --> MON[webrtc-monitor]
MXLa <--> FA[fabrics-agent]
end
FA <-->|RDMA / TCP| FB[fabrics-agent on host-b]
MON -->|RTSP| MTX[MediaMTX] -->|WebRTC| Browser
REG[NMOS registry<br/>IS-04] -.registration.- MXLa
CTRL[NMOS crosspoint<br/>IS-05 controller] -.routing.- REG
- Every function is one container and one NMOS node. It writes its own MXL domain and reads any other domain on the host.
- A controller connects a receiver to a sender with IS-05
(
mxl_domain_id,mxl_flow_id). If that flow lives on another host, the fabrics agent on the receiver's host mirrors it locally. - Browser previews are low-rate H.264 published to MediaMTX and played over WebRTC (WHEP).
The single-host example running: multiviewer, FlowXer vision mixer and audio mixer. Every function README has a screenshot of its web UI.
Examples of chains made from these functions. Each arrow is an IS-05 connection made in an NMOS controller.
| Workflow | Chain | Start from |
|---|---|---|
| A studio on one host | test-player or DeckLink → FlowXer (vision mixer) and audio-mixer → multiviewer, webrtc-monitor | compose/single-host |
| ST 2110 facility edge | ST 2110 sources → st2110-gateway → MXL functions → st2110-gateway → ST 2110 | mxl-st2110-gateway (needs an Intel E810) |
| Remote contribution | SRT in → srt-gateway → replay, browser-source graphics, audio-mixer → srt-gateway → SRT out | compose/single-host with --profile extras |
| Two hosts | functions on host-b read host-a's flows; the fabrics agent mirrors them over RDMA | compose/multi-host-rdma |
| Measure a chain | avsync generator → chain under test → avsync analyzer (AV offset, latency); scopes for levels | mxl-avsync |
Images are on GitHub Container Registry (ghcr.io/leeo86/<repo>). Release
tags are X.Y.Z, X.Y and X; most repos have no latest, so pin a version.
The badges show each repository's latest release. The Compose examples pin a
set that was run together; see CHANGELOG.md.
Status. All functions below have tagged releases, a container image and a changelog, are tested on real hardware, and several run continuously on a multi-host Kubernetes test platform. They are proofs of concept for MXL-based production, not certified products. Features a README marks as planned are not in the image yet.
| Function | What it does | Needs | License | Release |
|---|---|---|---|---|
| mxl-st2110-gateway | SMPTE ST 2110 (-20, -30, -40, 2022-7) ↔ MXL with MTL/DPDK; two NMOS nodes | Intel E810, DPDK, hugepages, PTP | MIT | |
| mxl-srt-gateway | SRT (MPEG-TS) ingest and egress to and from MXL | CPU; NVDEC/NVENC optional | MIT (image GPL-2.0+, x264/x265) | |
| mxl-decklink | Blackmagic DeckLink SDI input and output as MXL flows | DeckLink card, Desktop Video driver | MIT |
| Function | What it does | Needs | License | Release |
|---|---|---|---|---|
| mxl-test-player | TAI-locked test source: video, audio, timecode, fill/key | CPU | MIT | |
| mxl-browser-source | Offscreen Chromium (CEF) web page as MXL video, key and audio, frame-locked to TAI; OGraf graphics | CPU; NVIDIA GPU optional | MIT |
| Function | What it does | Needs | License | Release |
|---|---|---|---|---|
| FlowXer | Vision mixer: up to 4 MEs, keyers and DME boxes, clip players, stingers, tally (TSL), WebRTC preview, widgets | NVIDIA GPU | Apache-2.0 | tag 19.26.68 |
| mxl-audio-mixer | Broadcast audio engine: routable matrix, channel strips, DSP, loudness, control room, VCAs | CPU | MIT | |
| mxl-replay | Live slow-motion replay, clip player, shotbox and playlists | NVIDIA GPU recommended; records and plays clips without one | GPL-3.0 | |
| mxl-color-corrector | Colour correction (gain, pedestal, saturation, gamut clip), AVX2/AVX-512 | CPU | MIT |
FlowXer is developed in its own GitHub account; see its repository for releases and licensing.
| Function | What it does | Needs | License | Release |
|---|---|---|---|---|
| mxl-multiviewer | Multiviewer with up to 32 inputs, tally (TSL), as an MXL flow | CPU; CUDA optional | Apache-2.0 | |
| mxl-webrtc-monitor | Watch and listen to any MXL flow in a browser (WebRTC/HLS) | CPU; NVENC optional | MIT | |
| mxl-scopes | Video scopes (waveform, parades) as an MXL flow and a WebRTC widget | CPU (AVX2/AVX-512) | MIT | |
| mxl-avsync | AV sync and latency measurement: test signal generator and analyzer; phone apps in testing | CPU | MIT |
| Project | What it does | Needs | License | Release |
|---|---|---|---|---|
| mxl-fabrics-agent | Per-host agent that mirrors flows between hosts over MXL Fabrics, following NMOS connections | RDMA NIC (or TCP) | MIT | |
| mxl-nmos | Rust crate: NMOS node (IS-04, IS-05, BCP-007-03) for MXL media functions. Early, 0.x | — | Apache-2.0 |
| Component | Purpose | Image |
|---|---|---|
| nmos-cpp registry | NMOS IS-04 registry (registration and query) | docker.io/gemini2350/nmos-cpp-registry (pinned digest in the compose files) |
| dmf-app-nmos-crosspoint | NMOS controller with a crosspoint view; connects ST 2110 and BCP-007-03 MXL senders and receivers over IS-05. Fork of nmos-crosspoint_v3; see upstream for licensing | ghcr.io/qvest-digital/dmf-app-nmos-crosspoint:4.36 |
| MediaMTX | RTSP/WebRTC/HLS server for the browser previews | bluenviron/mediamtx:1.20.1 |
- Prepare the host: docs/requirements.md (tmpfs MXL root, TAI time, inotify limit, optional GPU).
- Run the single-host example: compose/single-host. It needs no special hardware: a Linux x86-64 host with Docker is enough for the test player, multiviewer, scopes, audio mixer, replay, browser source and WebRTC monitor.
- Two hosts over RDMA: compose/multi-host-rdma.
- Kubernetes notes: docs/kubernetes.md.
New to MXL itself? Start with the SDK documentation and the CBC/Radio-Canada hands-on workshop (below), then come back here.
Complementary open-source work around MXL, maintained by others:
- dmf-mxl/mxl: the MXL SDK, with documentation and the community list awesome-mxl.
- cbcrc/mxl-hands-on: MXL workshop
with example media functions; the
/Volumes/mxltmpfs convention comes from there. CBC/Radio-Canada also maintain an FFmpeg with MXL guide and a CSI driver for MXL on Kubernetes. - EASY MXL: a web UI that creates MXL domains and launches media functions from a catalog on a Docker host.
- qvest-digital/mxl-k8s: a Kubernetes control plane for MXL, including Fabrics across nodes.
- AMWA BCP-007-03: NMOS with MXL, the IS-04/IS-05 transport the functions here implement.
- obs-mxl-plugin: OBS Studio input and output plugins for MXL.
- Media Transport Library: ST 2110 over DPDK, used by the ST 2110 gateway.
The function APIs are unauthenticated by design: run them on a protected network only.
See CONTRIBUTING.md. Issues about one function belong in that function's repository.
MIT, see LICENSE. Each function repository and image has its own license and third-party notices (see the License column above).


