MTL × MXL — Real-Time ST 2110 Media Ingest to Zero-Copy RDMA Delivery#
End-to-end demonstration of bridging SMPTE ST 2110-20/22 broadcast media into zero-copy RDMA (RoCEv2) — powered by Intel’s Media Transport Library (MTL) for DPDK-based ST 2110 processing and the MXL (Media eXchange Layer) Fabrics SDK for RDMA write delivery.
All three pipelines are designed to run concurrently on Intel® Ethernet Network Adapter E835/E810 200GbE NICs (ice driver with SR-IOV) on both source and destination servers, connected through a standard Ethernet switch with PFC-enabled RDMA links.
Performance Highlights#
On Intel® Xeon® 6 processors (Granite Rapids) with Intel® Ethernet Network Adapter E835/E810 200GbE NICs, running all three pipelines concurrently following results* were observed:
16× 1080p60 uncompressed ST 2110-20 streams bridged to MXL RDMA delivery
8K60 JPEG XS pipeline — RAW tiles → Intel® JPEG-XS Library encode → ST 2110-22 → MXL RDMA delivery
Zero-copy RDMA transport sustained across all pipelines
The combination of Intel Xeon 6 processors, Intel E835 NICs, and Intel® JPEG-XS Library delivers broadcast-grade latency and throughput for next-generation IP media workflows. All three pipelines sustain full frame rate with zero drops, demonstrating that ST 2110 broadcast media can be bridged to RDMA without sacrificing real-time performance.
Results may vary based on your specific hardware, software, network configuration, and workload.*
Pipelines#
poc — Single-Stream with ST 2022-7 Redundancy#
Bridges a single 1080p60 ST 2110-20 stream over RDMA with optional ST 2022-7 Class-A seamless protection switching (dual P+R paths).
flowchart LR
CAM[("🎥 Camera<br>1080p60")]
subgraph TX["TX Host"]
STX["st20_tx<br>(DPDK/MTL)"]
SND["mtl_to_mxl_sender<br>(MTL RX → MXL RDMA TX)"]
end
CAM --> STX
subgraph SW["Ethernet Switch"]
direction TB
MCP["Multicast<br>P-path"]
MCR["Multicast<br>R-path"]
RDMA_SW["RoCEv2<br>Forwarding"]
end
subgraph RX["RX Host"]
RCV["mxl_sink_receiver<br>(MXL RDMA RX)"]
THUMB[("JPEG<br>thumbnails")]
RCV --> THUMB
end
STX --> MCP --> SND
STX -.-> MCR -.-> SND
SND -- "RDMA Write<br>over RoCEv2" --> RDMA_SW --> RCV
When ST 2022-7 Class-A redundancy is enabled, the sender receives both P-path
and R-path streams via MTL and merges them into a single RDMA flow with
seamless switchover.
Control server (poc/scripts/control_server.py) provides an HTTP API
to toggle VF link state for failover testing.
poc_14 — 14-Stream Multi-Channel#
Bridges 14 concurrent 1080p60 ST 2110-20 streams, each with a dedicated MXL FlowWriter instance and zero-copy RDMA transport.
flowchart LR
subgraph TX["TX Host"]
YUV14[("YUV file")]
STX14["synthetic_st20_tx<br>(ST2110-20 TX)"]
SND14["mtl_to_mxl_bridge<br>(MTL RX → MXL RDMA TX)"]
YUV14 --> STX14
end
subgraph SW14["Ethernet Switch"]
direction TB
MC14["14× Multicast<br>Streams"]
RDMA14["RoCEv2<br>Forwarding"]
end
subgraph RX14["RX Host"]
RCV14["mxl_sink_receiver<br>(consumer threads)"]
THUMB14[("14× JPEG<br>thumbnails")]
RCV14 --> THUMB14
end
STX14 --> MC14 --> SND14
SND14 -- "14× RDMA Write<br>over RoCEv2" --> RDMA14 --> RCV14
Each stream gets a dedicated bridge worker thread with its own MXL FlowWriter. Bridge workers pass MTL RX framebuffers directly to RDMA with zero-copy.
poc_8k — 8K60 Compositor with ST 2110-22 Compressed Transport#
Composes a 7680×4320 output at 60 fps from 16 tiled 1080p60 input streams (sourced from poc and poc_14 multicast), encodes each tile with Intel® JPEG-XS Library (ISO/IEC 21122), and delivers the compressed 8K frame over RDMA.
flowchart LR
subgraph TX8K["TX Host"]
TILES["poc + poc_14<br>multicast streams"]
COMP["poc_8k_compositor<br>(16× tile RX → JPEG-XS encode)"]
SHM[("SHM ring<br>buffer")]
CTX["poc_8k_compositor_tx<br>(ST2110-22 TX)"]
S8K["poc_8k_bridge<br>(ST22 MTL RX → MXL RDMA TX)"]
TILES --> COMP --> SHM --> CTX
end
subgraph SW8K["Ethernet Switch"]
direction TB
MC8K["ST2110-22<br>Multicast"]
RDMA8K["RoCEv2<br>Forwarding"]
end
subgraph RX8K["RX Host"]
R8K["poc_8k_receiver<br>(RDMA RX → decode)"]
T8K[("8K JPEG<br>thumbnail")]
R8K --> T8K
end
CTX --> MC8K --> S8K
S8K -- "RDMA Write<br>over RoCEv2" --> RDMA8K --> R8K
Running All Pipelines Together#
All three pipelines can run concurrently on the same pair of servers using Intel® Ethernet Network Adapters E810/E835 with SR-IOV. Each pipeline uses dedicated VFs and disjoint DPDK lcores to avoid resource conflicts. On Intel Xeon 6 (Granite Rapids) with Intel E835 NICs, all 16 raw streams and the 8K JPEG XS pipeline run simultaneously without contention.
flowchart LR
CAM[("🎥 Camera<br>2× 1080p60")]
SRC[("📁 Synthetic<br>14× 1080p60")]
subgraph SW["Ethernet Switch"]
direction TB
MC20["ST 2110-20<br>multicast"]
MC22["ST 2110-22<br>multicast"]
end
subgraph TX["TX Server — Intel® E810/E835 NIC (SR-IOV)"]
direction TB
subgraph RAW["ST 2110-20 (uncompressed)"]
P1["poc<br>1× 1080p60 + ST 2022-7"]
P2["poc_14<br>14× 1080p60"]
end
subgraph COMP["ST 2110-22 (JPEG XS)"]
P3["poc_8k<br>16 tiles → JPEG-XS → 8K60"]
end
RDMA["MTL to MXL RoCEv2<br>RDMA Write"]
end
subgraph RX["RX Server — Intel® E810/E835 NIC (RDMA)"]
direction TB
R1["poc receiver"]
R2["poc_14 receiver<br>(14 streams)"]
R3["poc_8k receiver<br>(8K decode)"]
end
CAM -- "ST 2110-20" --> MC20
SRC -- "ST 2110-20" --> MC20
MC20 --> P1 & P2
MC20 --> P3
P3 -- "ST 2110-22" --> MC22
P1 & P2 --> RDMA
MC22 -.-> RDMA
RDMA --> R1 & R2 & R3
Each pipeline’s VFs, lcores, and multicast groups must be configured
without overlap. See the template configs in config/ for the full
set of parameters to fill in.
Prerequisites#
Dependency |
Notes |
|---|---|
Intel® E810/E835 NIC |
200GbE with ice driver (SR-IOV capable) |
DPDK |
System-wide, linked via pkg-config |
MTL |
Intel® Media Transport Library at commit |
Build from source with |
|
libfabric |
verbs provider required for RoCEv2 |
irdma |
Intel® OOT driver with |
Required for poc_8k compositor (ISO/IEC 21122) |
|
libcjson |
JSON config parser ( |
|
Thumbnail generation |
libcurl |
InfluxDB metrics push |
MXL SDK Patch#
The patches/mxl_sdk.patch file contains required modifications to the
MXL Fabrics SDK. Apply it before building the SDK:
cd /path/to/mxl-feature-fabrics-jonas-protocols
git apply /path/to/patches/mxl_sdk.patch
Then build the MXL SDK according to its own instructions.
MTL Patch#
The patches/mtl_disable_remap_lcore_ids.patch disables DPDK’s
--remap-lcore-ids flag, which causes lcore ID collisions in the
MtlManager table when multiple MTL processes run with disjoint CPU sets.
Apply it against MTL commit
c02b9f6e
before building MTL:
cd /path/to/Media-Transport-Library
git checkout c02b9f6e3169d213bc2130f5459b6c1176e5e2e7
git apply /path/to/patches/mtl_disable_remap_lcore_ids.patch
Then build and install MTL (meson build && ninja -C build && sudo ninja -C build install).
Building#
./build.sh -m /path/to/mxl-sdk/build/Linux-GCC-Release
Options:
-m <path>— MXL SDK build prefix (required)-t <type>— CMake build type (default:RelWithDebInfo)-j <N>— Parallel jobs (default:nproc)
Output binaries:
Pipeline |
Binary |
Description |
|---|---|---|
poc |
|
ST2110-20 test pattern TX (P+R) |
poc |
|
MTL RX → RDMA bridge |
poc |
|
RDMA RX → consumer sink |
poc_14 |
|
14-stream TX source |
poc_14 |
|
14-stream MTL→RDMA bridge |
poc_14 |
|
14-stream RDMA receiver |
poc_8k |
|
16-tile RX + Intel® JPEG-XS encode |
poc_8k |
|
SHM ring → ST2110-22 TX |
poc_8k |
|
ST22 MTL RX → RDMA TX |
poc_8k |
|
RDMA RX → decode → 8K thumbnail |
Configuration#
Template configs are in config/. Copy them and replace <PLACEHOLDER> values
with your deployment-specific IPs, VF BDFs, and lcore assignments.
poc Config (config/poc.json)#
Placeholder |
Description |
Example |
|---|---|---|
|
DPDK source IP for sender VF (P-path) |
|
|
DPDK source IP for sender VF (R-path) |
|
|
DPDK source IP for synth TX VF (P-path) |
|
|
DPDK source IP for synth TX VF (R-path) |
|
|
Multicast group for P-path |
|
|
Multicast group for R-path |
|
|
Kernel IP for RDMA sender NIC |
|
|
Kernel IP for RDMA receiver NIC |
|
|
DPDK EAL lcores for sender |
|
|
DPDK EAL lcores for synth TX |
|
poc_14 Config (config/streams_14_tx.json, config/streams_14_rx.json)#
Placeholder |
Description |
Example |
|---|---|---|
|
PCI BDF for sender MTL RX VF |
|
|
PCI BDF for synth TX VF |
|
|
DPDK source IP for sender |
|
|
DPDK source IP for synth TX |
|
|
RDMA sender IP (TX config) |
|
|
RDMA receiver IP (RX config) |
|
|
Multicast base (e.g. |
|
|
DPDK lcores for sender |
|
|
DPDK lcores for synth TX |
|
poc_8k Config (config/poc_8k.json)#
All <PLACEHOLDER> values in the 8K config follow the same pattern. The
compositor receives tiles from both poc and poc_14 multicast groups, so its
stream table references multicast IPs from both pipelines.
Running#
All binaries accept --help for full CLI options. The typical startup order:
Start receivers first (RDMA endpoints must be ready before senders connect)
Start senders (establish RDMA connections)
Start synth TX (begin data flow)
poc Example#
# Terminal 1 — Receiver (RX host)
FI_VERBS_IFACE=<RX_NIC> numactl --membind=1 \
./poc/build/mxl_sink_receiver --config config/poc.json
# Terminal 2 — Sender (TX host)
FI_VERBS_IFACE=<TX_NIC> numactl --membind=0 \
./poc/build/mtl_to_mxl_sender --config config/poc.json \
--port <VF_BDF> --lcores <LCORES>
# Terminal 3 — Synth TX (TX host)
numactl --membind=0 \
./poc/build/synthetic_st20_tx --config config/poc.json \
--port <VF_BDF> --lcores <LCORES>
Environment Variables#
Variable |
Purpose |
|---|---|
|
Pin libfabric to specific NIC (critical for multi-NIC hosts) |
|
InfluxDB endpoint for metrics (default: |
|
InfluxDB API token |
|
InfluxDB organization |
|
InfluxDB bucket |
NUMA Binding#
All TX-side processes should run with numactl --membind=<TX_NUMA_NODE> and
RX-side with numactl --membind=<RX_NUMA_NODE>. Without NUMA binding, DPDK
hugepage allocations may land on the wrong node, degrading performance.
Clock Synchronization#
For accurate end-to-end latency measurements across TX and RX hosts, synchronize clocks using PTP:
# On both hosts — sync NIC PHC to PTP grandmaster
ptp4l -i <NIC> -m -s
# On both hosts — sync system clock to NIC PHC
phc2sys -s <NIC> -c CLOCK_REALTIME -O 0 -m
Monitoring#
InfluxDB + Grafana (poc/monitoring/)#
cd poc/monitoring
source env.sh
docker compose up -d
Grafana:
http://localhost:3001(admin/admin)InfluxDB:
http://localhost:8086
Dashboards#
Dashboard |
Port |
Description |
|---|---|---|
|
8080 |
Animated ST 2022-7 pipeline diagram with live metrics |
|
8085 |
14-stream mosaic dashboard |
|
8089 |
8K pipeline dashboard |
Utility Scripts#
Script |
Description |
|---|---|
|
MJPEG thumbnail streaming server for poc |
|
HTTP API for VF link-state toggle (ST 2022-7 failover) |
|
Per-VF NIC stats → InfluxDB collector |
|
End-to-end latency monitoring |
|
NMOS flow descriptor generator |
|
Multi-stream MJPEG thumbnail server |
|
NMOS flow generator for all streams |
Network Requirements#
NICs: Intel® Ethernet Network Adapter E810 or E835 (200GbE) with ice driver and SR-IOV on both TX and RX servers
RDMA: RoCEv2 via Intel irdma driver (
roce_ena=1 dcqcn_enable=1) with DCQCN congestion controlPFC: Priority Flow Control enabled on RDMA links (priority 3 recommended)
Jumbo frames: MTU 9000 on RDMA NICs
SR-IOV: VFs bound to vfio-pci for DPDK
IGMP snooping: Recommended on switch to prevent multicast flooding
Key Tuning Parameters#
Parameter |
Location |
Description |
|---|---|---|
|
Source code (hardcoded) |
Bandwidth per MTL scheduler — controls scheduler count |
|
JSON config |
MTL RX framebuffer count (clamped to 2-8) |
|
JSON config |
MXL RDMA queue depth |
|
JSON config |
Sender-side framebuffer count |
|
poc_8k JSON |
Intel® JPEG-XS Library compression ratio (e.g. 8:1, 10:1) |
Directory Structure#
MTL_with_MXL/
├── build.sh # Build all pipelines
├── README.md
├── config/ # Template configs with <PLACEHOLDER> values
│ ├── poc.json
│ ├── poc_8k.json
│ ├── streams_14_tx.json
│ └── streams_14_rx.json
├── patches/
│ └── mxl_sdk.patch # Required MXL Fabrics SDK modifications
├── poc/ # Single-stream ST2110-20 (ST 2022-7)
│ ├── CMakeLists.txt
│ ├── src/
│ ├── scripts/ # Python monitoring utilities
│ └── monitoring/ # Dashboards, Grafana, Docker Compose
├── poc_14/ # 14-stream multi-channel
│ ├── CMakeLists.txt
│ ├── src/
│ ├── scripts/
│ └── monitoring/
└── poc_8k/ # 8K60 compositor
├── CMakeLists.txt
├── src/
└── monitoring/
License#
SPDX-License-Identifier: BSD-3-Clause
© Intel Corporation. Intel technologies may require enabled hardware, software or service activation. No product or component can be absolutely secure. Your costs and results may vary. Performance varies by use, configuration, and other factors. Learn more at intel.com/performanceindex. See our complete legal Notices and Disclaimers. Intel is committed to respecting human rights and avoiding causing or contributing to adverse impacts on human rights. See Intel’s Global Human Rights Principles.