ST 2110-20 Video Reception Demo#
Authors: XRlabs (XRlabs)
Supported platforms: x86_64, aarch64
Language: Python
Last modified: March 10, 2026
Latest version: 1.0.0
Minimum Holoscan SDK version: 3.7.0
Tested Holoscan SDK versions: 3.7.0, 3.10.0, 3.11.0
Contribution metric: Level 2 - Trusted

Demo application for receiving SMPTE ST 2110-20 uncompressed video streams over IP networks using the ST2110SourceOp operator.
Overview#
This application demonstrates ST 2110-20 video reception by:
- Receiving ST 2110-20 RTP packets via Linux UDP sockets (multicast)
- Reassembling packets into complete video frames
- Converting from YCbCr-4:2:2-10bit to RGBA and/or NV12 using CUDA kernels
- Displaying the video stream using Holoviz
Quick Start#
# Build and run with holohub CLI
./holohub run st2110_demo
# Or run a specific mode
./holohub run st2110_demo rgba # RGBA output only
./holohub run st2110_demo nv12 # NV12 output only
Before running, configure your network settings in the YAML config file (see Configuration below).
Prerequisites#
- CUDA-capable NVIDIA GPU
- Network interface with multicast support
- ST 2110-20 video source (see Testing with GStreamer for a software-based source)
Build Instructions#
# Build the demo application (includes the st2110_source operator)
./holohub build st2110_demo
Configuration#
Edit applications/st2110_demo/st2110_demo_config.yaml to match your network setup:
st2110_source:
# Network parameters - update these for your setup
multicast_address: "239.255.66.60" # Your ST 2110 multicast address
port: 16388 # Your ST 2110 UDP port
interface_name: "eth0" # Your network interface name
# Video parameters - match your ST 2110 source
width: 1920
height: 1080
framerate: 50
stream_format: "YCbCr-4:2:2-10bit"
# Output format options
enable_rgba_output: true # Enable RGBA conversion for display
enable_nv12_output: true # Enable NV12 conversion for encoding
Finding Your Network Interface#
# List network interfaces
ip link show
# Common interface names:
# eth0, ens1f0 - standard Ethernet
# mgbe0_0 - NVIDIA Thor AGX MGBE
# enp1s0f0np0 - ConnectX SmartNIC
Run Modes#
The application supports multiple run modes via the holohub CLI:
| Mode | Command | Description |
|---|---|---|
| default | ./holohub run st2110_demo |
Both RGBA and NV12 outputs displayed |
| rgba | ./holohub run st2110_demo rgba |
RGBA output only |
| nv12 | ./holohub run st2110_demo nv12 |
NV12 output only |
Network Setup#
Socket Buffer Size#
Increase the socket buffer size for high-bandwidth streams:
# Temporary (until reboot)
sudo sysctl -w net.core.rmem_max=268435456
sudo sysctl -w net.core.rmem_default=268435456
# Permanent (add to /etc/sysctl.conf)
echo "net.core.rmem_max=268435456" | sudo tee -a /etc/sysctl.conf
echo "net.core.rmem_default=268435456" | sudo tee -a /etc/sysctl.conf
Multicast Routing#
Ensure multicast traffic is routed to the correct interface:
# Replace <interface> with your network interface name
sudo ip route add 239.0.0.0/8 dev <interface>
# Verify multicast group membership
ip maddr show dev <interface>
Firewall#
Allow UDP traffic on your ST 2110 port:
sudo ufw allow 16388/udp
Testing with GStreamer#
You can test the operator without professional ST 2110 hardware by using GStreamer to generate a synthetic RTP video stream. This requires two machines (or two network namespaces) connected over a network.
Sender Setup#
On the sending machine, install GStreamer and start a test stream:
# Install GStreamer (Ubuntu/Debian)
sudo apt-get install -y gstreamer1.0-tools gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good
# Configure multicast routing on the sender's interface
sudo ip route add 239.0.0.0/8 dev <interface>
# Start a 1080p25 UYVY test pattern (bouncing ball)
gst-launch-1.0 videotestsrc pattern=ball ! \
"video/x-raw,format=UYVY,width=1920,height=1080,framerate=25/1" ! \
rtpvrawpay ! \
udpsink host=239.255.66.60 port=16388 \
multicast-iface=<interface> auto-multicast=true
Receiver Setup#
On the receiving machine, configure the network and update the demo config:
# Increase socket buffer
sudo sysctl -w net.core.rmem_max=268435456
sudo sysctl -w net.core.rmem_default=268435456
# Configure multicast routing
sudo ip route add 239.0.0.0/8 dev <interface>
Update st2110_demo_config.yaml to match the GStreamer sender:
st2110_source:
multicast_address: "239.255.66.60"
port: 16388
interface_name: "<interface>"
width: 1920
height: 1080
framerate: 25
stream_format: "YCbCr-4:2:2-8bit" # UYVY is 8-bit YCbCr-4:2:2
enable_rgba_output: true
enable_nv12_output: false
Then run the demo:
./holohub run st2110_demo rgba
Verifying Packet Reception#
To confirm multicast packets are arriving on the receiver:
sudo tcpdump -i <interface> dst 239.255.66.60 and udp port 16388 -c 10
Note: GStreamer's
rtpvrawpayproduces RFC 4175 RTP packets, which are similar but not identical to SMPTE ST 2110-20. For full end-to-end frame display, use a professional ST 2110 source (e.g., Blackmagic Design equipment).
Expected Behavior#
When working correctly with a compatible ST 2110 source:
- Holoviz windows open showing the video stream
- Console logs showing frame reception stats
- Frame rate matches your source (e.g., 50 FPS for 1080p50)
Press ESC or Ctrl+C to quit.
Troubleshooting#
No Video Displayed#
- Verify source is streaming:
sudo tcpdump -i <interface> dst 239.255.66.60 and udp port 16388 -c 10
-
Check interface name in config matches your system:
ip link show -
Verify multicast routing:
ip route show | grep 239 -
Disable reverse path filtering if packets appear in tcpdump but the app reports 0 packets:
sudo sysctl -w net.ipv4.conf.<interface>.rp_filter=0
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
Packet Drops / Frame Tearing#
- Increase socket buffer size (see Network Setup)
- Reduce other network traffic on the interface
- Check CPU load - ensure sufficient resources available
"Cannot import ST2110SourceOp" Error#
Ensure the demo has been built:
./holohub build st2110_demo
Color Issues#
- Verify
stream_formatin config matches your source (10-bit vs 8-bit) - The operator assumes BT.709 colorimetry