Kubernetes operator for Holoscan for Media that manages NMOS connections between media function endpoints with ST 2110 and MXL support.
NMOS Connections Operator
The NMOS Connections Operator is a Kubernetes operator for Holoscan for Media that manages NMOS (Networked Media Open Specifications) connections between media function endpoints. It provides declarative Custom Resources for establishing, monitoring, and tearing down IS-05 connections across ST 2110 and MXL media workloads.
The operator resolves source and destination endpoints dynamically via the NMOS registry (IS-04) or inline SDP, establishes connections using the NMOS Connection API (IS-05), and continuously monitors connection health with configurable retry and backoff strategies.
Custom Resources
| Custom Resource | Scope | Description |
|---|---|---|
NMOSConnections | Namespaced | Declares desired media connections between source and destination endpoints. |
MediaEndpoint | Namespaced | Represents an external media device with configurable inputs and outputs. Supports NMOS, inline SDP, or static MXL control. |
NMOSConnectionsOperatorConfig | Cluster | Cluster-wide operator configuration (singleton). Controls NMOS registry URL, retry limits, backoff, and polling intervals. |
Prerequisites
- A Kubernetes cluster supporting
apiextensions.k8s.io/v1CRDs and CEL validation rules - Helm 3
- An NMOS registry (IS-04) reachable from the operator pod when using NMOS-controlled endpoints
- Multus CNI and
default/media-a-rx-net-staticfor the packaged network defaults, or overridehighSpeedNetworksto use other attachments or only the default pod network
Installation
Install the operator using the associated Helm chart:
helm install nmos-connections-operator \
<url> \
--version 0.1.0 \
--namespace nmos-connections-operator --create-namespace \
--set image.imagePullSecrets[0].name=ngc-secret \
--set-string config.nmosUrl=http://registry.example.com:8010
Helm Values
| Value | Description | Default |
|---|---|---|
image.repository | Operator container image | nvcr.io/nvidia/holoscan-for-media/nmos-connections-operator |
image.tag | Operator image tag | "" (chart appVersion) |
image.imagePullSecrets | Existing Kubernetes image-pull secrets in the Helm release namespace | [] |
image.imageCredentials.registry | Registry for inline credential secret | nvcr.io |
image.imageCredentials.username | Registry username | $oauthtoken |
image.imageCredentials.password | Registry password (leave empty to skip secret creation) | "" |
resources.limits.cpu | CPU limit for the operator pod | 500m |
resources.limits.memory | Memory limit for the operator pod | 128Mi |
highSpeedNetworks | Additional Multus attachments; a list of {name, namespace, ip, resourceName} | One default/media-a-rx-net-static attachment |
config.nmosUrl | NMOS registry base URL | Not set; operator fallback is http://localhost:8010 |
For each network attachment, omit namespace to use the Helm release namespace,
or set it explicitly for a cross-namespace NAD. Set highSpeedNetworks to []
to use only the default pod network.
config.nmosUrl must be reachable using the operator pod's routing, and its
port is specified in the URL. Use the default pod network for management access,
or add another network attachment with suitable routing to a dedicated
out-of-band NMOS network.
Uninstallation
Remove all connection instances, then uninstall the operator:
kubectl delete nmosconnections --all -A
kubectl delete mediaendpoints --all -A
helm uninstall nmos-connections-operator -n nmos-connections-operator
Quick Start
Connecting Two Media Functions
The following Custom Resource connects a color pattern generator's video output to a video flipper's video input via NMOS:
apiVersion: nvidia.com/v1alpha1
kind: NMOSConnections
metadata:
name: color-pattern-to-video-flipper
namespace: default
spec:
connections:
- source:
kind: NvidiaColorPatternMediaFunction
name: nvidiacolorpatternmediafunction-sample
output: video_output
destination:
kind: NvidiaVideoFlipperMediaFunction
name: nvidiavideoflippermediafunction-sample
input: video_input
Apply the resource:
kubectl apply -f connection.yaml
Verify the connection status:
kubectl get nmosconnections color-pattern-to-video-flipper
The Phase transitions to Ready once all connections are established.
Connecting an External SDP Source
Use a MediaEndpoint to represent devices outside the cluster that use inline
SDP instead of NMOS discovery:
apiVersion: nvidia.com/v1alpha1
kind: MediaEndpoint
metadata:
name: external-camera
namespace: default
spec:
outputs:
video:
control:
sdp:
data: |
v=0
o=- 1443716955 1443716955 IN IP4 192.168.100.195
s=SMPTE ST2110-20 narrow gap 1080p60
t=0 0
m=video 50000 RTP/AVP 96
c=IN IP4 234.5.6.7/64
a=source-filter: incl IN IP4 234.5.6.7 192.168.100.195
a=rtpmap:96 raw/90000
a=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=60; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2021
a=ts-refclk:ptp=IEEE1588-2008:traceable
---
apiVersion: nvidia.com/v1alpha1
kind: NMOSConnections
metadata:
name: external-camera-to-video-flipper
namespace: default
spec:
connections:
- source:
kind: MediaEndpoint
name: external-camera
output: video
destination:
kind: NvidiaVideoFlipperMediaFunction
name: nvidiavideoflippermediafunction-sample
input: video_input
Spec Reference
NMOSConnections - spec.connections[]
| Field | Type | Description |
|---|---|---|
source.kind | string | Kubernetes kind of the source resource. |
source.name | string | Name of the source resource. |
source.namespace | string | Namespace of the source (defaults to CR namespace). |
source.output | string | Output port name on the source. |
destination.kind | string | Kubernetes kind of the destination resource. |
destination.name | string | Name of the destination resource. |
destination.namespace | string | Namespace of the destination (defaults to CR namespace). |
destination.input | string | Input port name on the destination. |
MediaEndpoint - spec
| Field | Type | Description |
|---|---|---|
outputs | map[string]EndpointPort | Sender endpoints keyed by output name. |
inputs | map[string]EndpointPort | Receiver endpoints keyed by input name. |
inputs/outputs.<name>.control.nmos | object | Select NMOS IS-04/IS-05 control using an empty object ({}). |
inputs/outputs.<name>.control.sdp.data | string | Inline SDP for RTP transport. |
inputs/outputs.<name>.control.mxl_static.mxl_domain_id | string | Static MXL domain identifier. |
inputs/outputs.<name>.control.mxl_static.mxl_flow_id | string | Static MXL flow identifier. |
Exactly one of nmos, sdp, or mxl_static must be configured for each input
or output.
NMOSConnectionsOperatorConfig - spec
| Field | Type | Default | Description |
|---|---|---|---|
nmosUrl | string | http://localhost:8010 | NMOS registry base URL. The built-in fallback normally must be overridden. |
nmosTimeout | duration | 5s | HTTP timeout for NMOS API calls. |
maxConnectionRetries | int | 20 | Max connection attempts before stopping. |
maxDisconnectionRetries | int | 10 | Max disconnection attempts before force-disconnect. |
pendingRequeueInterval | duration | 1s | Requeue interval while waiting for resources. |
requeueInterval | duration | 5s | Base retry interval for failed operations. |
connectionCheckInterval | duration | 5s | How often to verify established connections. |
disconnectedRetentionPeriod | duration | 5s | How long to keep disconnected connections in status. |
maxBackoffDuration | duration | 5m | Cap for exponential backoff. |
License
By downloading and using this software, you accept the terms and conditions of the NVIDIA AI Product Agreement.