DeepStream nvdsnmosbin / NMOS receiver: ST 2022-7 activation causes crash (segfault), and constraints only allow one interface_ip

Hi NVIDIA team,

I’m testing NMOS Receiver control with DeepStream (using the nvdsnmosbin + nvdsudpsrc path) and I’m trying to enable SMPTE ST 2022-7 (redundant streams). I’m facing two issues:

  1. constraints does not allow selecting the expected interfaces (looks auto-decided)

When I query receiver constraints, I get something like:

[
  {
    "destination_port": {},
    "interface_ip": { "enum": ["192.168.2.3"] },
    "multicast_ip": {},
    "rtp_enabled": {},
    "source_ip": {}
  }
]

Even though the container has multiple media interfaces (e.g. 192.168.1.3 and 192.168.2.3), interface_ip is constrained to a single IP. It feels like the selection is made internally (maybe by nvdsudpsrc / Rivermax) and cannot be controlled via NMOS Connection API.

Also, when I PATCH with an IP not listed in the constraint, schema validation fails:

curl -v -X PATCH \
  "http://<nmos_host>:<port>/x-nmos/connection/v1.1/single/receivers/<receiver_id>/staged" \
  -H "Content-Type: application/json" \
  --data-binary '{
    "master_enable": true,
    "activation": { "mode": "activate_immediate" },
    "transport_params": [
      {
        "interface_ip": "192.168.1.3",
        "multicast_ip": "239.0.0.1",
        "destination_port": 5004,
        "rtp_enabled": true
      }
    ]
  }'

Response example:

{"code":400,"error":"Bad Request","debug":"schema validation failed at /transport_params/0/interface_ip ..."}
  1. Activating the staged parameters crashes the process (segfault)

If I stage parameters using the allowed interface_ip, the PATCH returns 200 OK.

But when I send activation, the HTTP connection returns “Empty reply from server”, and the container / python process crashes. Docker shows exit code 139 and host dmesg shows a segfault in python3 / libc.so.6. Core dumps are generated.

• Hardware Platform: GPU
• DeepStream Version: 8.0
• JetPack Version: none
• TensorRT Version: none
• NVIDIA GPU Driver Version: 570.172.08
• Issue Type: questions
• How to reproduce the issue ? (This is for bugs. Including which sample app is using, the configuration files content, the command line used and other details for reproducing)

  1. Run a DeepStream container that exposes NMOS Node API and Connection API via nvdsnmosbin (receiver) using nvdsudpsrc (Rivermax path).

  2. Confirm receivers exist via the Node API:

    • GET http://<nmos_host>:<port>/x-nmos/node/v1.3/receivers/
  3. Check constraints for a receiver:

    • GET http://<nmos_host>:<port>/x-nmos/connection/v1.1/single/receivers/<receiver_id>/constraints

    • Observed: interface_ip.enum contains only one IP even though the container has two media NIC IPs (for ST 2022-7).

  4. Stage transport parameters (using the allowed interface_ip) and confirm it returns 200 OK:

    • PATCH .../staged with master_enable=true and transport_params[0] (interface_ip, multicast_ip, destination_port, rtp_enabled).
  5. Trigger activation:

    • PATCH .../staged with {"activation":{"mode":"activate_immediate"}}

    • Observed: HTTP client gets “Empty reply from server”, then the container crashes (exit code 139 / segfault). Core dump is generated on the host.

(Additional observation) If we PATCH interface_ip not listed in constraints, the API returns 400 Bad Request (schema validation error at /transport_params/0/interface_ip).

• Requirement details( This is for new requirement. Including the module name-for which plugin or for which sample application, the function description)

This might be a bug, but we also want to confirm if it’s supported / correct usage.

We want to control a SMPTE ST 2022-7 redundant receiver via the NMOS Connection API.

  • Expected: constraints should allow selecting the correct NIC/IPs (and ideally two paths) for ST 2022-7.

  • Expected: activation should apply staged parameters safely without crashing.

  • Question: Is ST 2022-7 via NMOS Connection API supported in nvdsnmosbin/nvdsudpsrc? If yes, what is the correct schema/transport_params shape and workflow?

regarding “s ST 2022-7 via NMOS Connection API supported nvdsudpsrc”, yes, please refer to the doc, SMPTE 2022-7 feature is supported. Please refer to the sample /opt/nvidia/deepstream/deepstream-8.0/sources/apps/sample_apps/deepstream-nmos for how to use nvdsudpsrc.

Hi @morikawa3

can you please share your pipeline and sdp file?

If using python please export LC_ALL=C before running.

Hi hasinha.

pipeline(from the debugging message of the python script):

Receiver pipeline: nvdsnmosbin name=receiver http-port=8001 hostname=python-receiver.local seed=python-receiver
src_0::session-name="Receiver_0" src_0::nvdsudpsrc-desc="nvdsudpsrc local-iface-ip=192.168.1.3,192.168.2.3 st2022-7-streams=239.0.0.1:5004,239.0.0.2:5004 header-size=20 payload-size=1200 gpu-id=0"
src_0::rtp-caps="application/x-rtp, media=video, payload=96, clock-rate=90000, encoding-name=raw, depth=(string)10, sampling=YCbCr-4:2:2, width=(string)960, height=(string)540, exactframerate=(string)30, colorimetry=BT709, PM=(string)2110GPM, SSN=(string)ST2110-20:2017, TP=(string)2110TPN"
src_1::session-name="Receiver_1" src_1::nvdsudpsrc-desc="nvdsudpsrc local-iface-ip=192.168.1.3,192.168.2.3 st2022-7-streams=239.0.0.1:5004,239.0.0.2:5004 header-size=20 payload-size=1200 gpu-id=0"
src_1::rtp-caps="application/x-rtp, media=video, payload=96, clock-rate=90000, encoding-name=raw, depth=(string)10, sampling=YCbCr-4:2:2, width=(string)960, height=(string)540, exactframerate=(string)30, colorimetry=BT709, PM=(string)2110GPM, SSN=(string)ST2110-20:2017, TP=(string)2110TPN"

receiver.src_0 ! capsfilter caps="video/x-raw(memory:NVMM),format=UYVP,width=960,height=540,framerate=30/1" ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! tee name=main_tee_0 allow-not-linked=true
main_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! tee name=video_tee_0 allow-not-linked=true
main_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! capsfilter caps="video/x-raw(memory:SystemMemory),format=UYVP" ! waveform name=waveform_0 wfm-fg-color=4279399698 wfm-bg-color=3796431688 ! nvvideoconvert ! tee name=waveform_tee_0 allow-not-linked=true
main_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! capsfilter caps="video/x-raw(memory:SystemMemory),format=UYVP" ! vector name=vector_0 ! nvvideoconvert ! tee name=vector_tee_0 allow-not-linked=true

video_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nvv4l2h264enc bitrate=2000000 control-rate=constant_bitrate profile=0 idrinterval=30 ! h264parse name=h264parse_video_0 config-interval=1 ! valve name=valve_video_0 drop=false ! flvmux name=flvmux_video_0 streamable=true ! queue name=qout_video_0 leaky=2 max-size-buffers=0 max-size-time=1000000000 ! identity name=seg_video_0 single-segment=true ! rtmpsink name=rtmpsink_video_0 async=false sync=false location=rtmp://stream-gw:1935/stream1
waveform_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nvv4l2h264enc bitrate=2000000 control-rate=constant_bitrate profile=0 idrinterval=30 ! h264parse name=h264parse_waveform_0 config-interval=1 ! valve name=valve_waveform_0 drop=false ! flvmux name=flvmux_waveform_0 streamable=true ! queue name=qout_waveform_0 leaky=2 max-size-buffers=0 max-size-time=1000000000 ! identity name=seg_waveform_0 single-segment=true ! rtmpsink name=rtmpsink_waveform_0 async=false sync=false location=rtmp://stream-gw:1935/stream2
video_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nveglglessink sync=false
waveform_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nveglglessink sync=false
vector_tee_0. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nveglglessink sync=false

receiver.src_1 ! capsfilter caps="video/x-raw(memory:NVMM),format=UYVP,width=960,height=540,framerate=30/1" ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! tee name=main_tee_1 allow-not-linked=true
main_tee_1. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! tee name=video_tee_1 allow-not-linked=true
main_tee_1. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! capsfilter caps="video/x-raw(memory:SystemMemory),format=UYVP" ! waveform name=waveform_1 wfm-fg-color=4279399698 wfm-bg-color=3796431688 ! nvvideoconvert ! tee name=waveform_tee_1 allow-not-linked=true
main_tee_1. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! capsfilter caps="video/x-raw(memory:SystemMemory),format=UYVP" ! vector name=vector_1 ! nvvideoconvert ! tee name=vector_tee_1 allow-not-linked=true

video_tee_1. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nvv4l2h264enc bitrate=2000000 control-rate=constant_bitrate profile=0 idrinterval=30 ! h264parse name=h264parse_video_1 config-interval=1 ! valve name=valve_video_1 drop=false ! flvmux name=flvmux_video_1 streamable=true ! queue name=qout_video_1 leaky=2 max-size-buffers=0 max-size-time=1000000000 ! identity name=seg_video_1 single-segment=true ! rtmpsink name=rtmpsink_video_1 async=false sync=false location=rtmp://stream-gw:1935/stream3
waveform_tee_1. ! queue leaky=2 max-size-buffers=10 max-size-time=2000000000 ! nvvideoconvert ! nvv4l2h264enc bitrate=2000000 control-rate=constant_bitrate profile=0 idrinterval=30 ! h264parse name=h264parse_waveform_1 config-interval=1 ! valve name=valve_waveform_1 drop=false ! flvmux name=flvmux_waveform_1 streamable=true ! queue name=qout_waveform_1 leaky=2 max-size-buffers=0 max-size-time=1000000000 ! identity name=seg_waveform_1 single-segment=true ! rtmpsink name=rtmpsink_waveform_1 async=false sync=false location=rtmp://stream-gw:1935/stream4

SDP(from “docker logs”):

0:02:31.904274892     1 0x7b6d0c009910 DEBUG             nvdssdpsrc sdp_helpers.cpp:524:parse_sdp: Parse result:
SDP {
    address: 192.168.2.3,
    source-filter: <missing>,
    local-iface-ip: 192.168.2.3,
    port: 5004,
    x-nvnmos-src-port: <missing>,
    rtp-caps: application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)RAW, depth=(string)10, sampling=(string)YCbCr-4:2:2, width=(string)960, height=(int)540, exactframerate=(string)30, colorimetry=(string)BT709, pm=(string)2110GPM, ssn=(string)ST2110-20:2017, tp=(string)2110TPN, x-nvnmos-id=(string)src_0,
    raw-content-caps: video/x-raw(memory:NVMM), format=(string)UYVP, width=(int)960, height=(int)540, framerate=(fraction)30/1, interlace-mode=(string)progressive,
    st2022-7-iface-ip: 192.168.2.3,
    st2022-7-connection-address: 192.168.2.3:5004,
    enable-st2022-7: false
}

Hi,

Of cource I’ve already reviewed the nvdsudpsrc documentation.

I also checked the sample app source.
but I couldn’t find a ST 2022-7 (redundant streams) example there.

Thanks.

hi @morikawa3

i think you are using a normal 2110-20 SDP in this sender.

Here is an example SDP that we have tested for 2022-7

v=0
o=- 123456 2 IN IP4 192.168.20.89
s=SMPTE ST2022-7 DUP streams
i=Includes 1080p60
t=0 0
a=recvonly
a=group:DUP one other
m=video 50020 RTP/AVP 96
c=IN IP4 225.1.1.2/64
a=source-filter: incl IN IP4 225.1.1.2 192.168.20.89
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=mid:one
m=video 50120 RTP/AVP 96
c=IN IP4 225.1.1.3/64
a=source-filter: incl IN IP4 225.1.1.3 192.168.120.65
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=mid:other

The overall GStreamer pipeline for a 22-7 sender remains the same the changes are in the SDP file, that is the addition of the DUP attribute followed by another media section.

we use GitHub - NVIDIA/nvnmos: NVIDIA NMOS (Networked Media Open Specifications) Library for our NMOS implementation

LOCAL_IFACE_IP is an environment var that sets ips Gst-nvdsudpsink — DeepStream documentation

We need to either provide IPs for all media sections via x-nvnmos-iface-ip (which can either be the IP or the interface name) or provide for none of them in which case the following priority is used for IP resolution.

  1. LOCAL_IFACE_IP which is supposed to be a comma separated string of IPs is used and placed in the media sections in the same order as provided.
  2. LOCAL_IFACE_NAME which is supposed to be a comma separated string the interface names and placed in the media sections in the same order as provided.
  3. Any resolvable Mellanox iface ip

examples of valid sdp:

v=0
o=- 123456 2 IN IP4 192.168.20.89
s=SMPTE ST2022-7 DUP streams
i=Includes 1080i@29.97 Hz video, one stereo pair of PCM audio, and ANC
t=0 0
a=recvonly
a=group:DUP one other
m=video 50020 RTP/AVP 96
c=IN IP4 225.1.1.2/64
a=source-filter: incl IN IP4 225.1.1.2 192.168.20.89
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=x-nvnmos-iface-ip:net1
a=mid:one
m=video 50120 RTP/AVP 96
c=IN IP4 225.1.1.3/64
a=source-filter: incl IN IP4 225.1.1.3 192.168.120.65
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=x-nvnmos-iface-ip:net2
a=mid:other

or

v=0
o=- 123456 2 IN IP4 192.168.20.89
s=SMPTE ST2022-7 DUP streams
i=Includes 1080i@29.97 Hz video, one stereo pair of PCM audio, and ANC
t=0 0
a=recvonly
a=group:DUP one other
m=video 50020 RTP/AVP 96
c=IN IP4 225.1.1.2/64
a=source-filter: incl IN IP4 225.1.1.2 192.168.20.89
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=mid:one
m=video 50120 RTP/AVP 96
c=IN IP4 225.1.1.3/64
a=source-filter: incl IN IP4 225.1.1.3 192.168.120.65
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=mid:other

with set LOCAL_IFACE_IP="192.168.20.19,192.168.20.30"

Hi hasinha,

Thanks.

To clarify, I want to ask about the behavior of the receiver.

But the SDP is produced by the DeepStream pipeline during NMOS activation and then consumed by nvdsudpsrc.

However, as you said, the SDP shown in the logs still looks like a normal ST 2110-20 SDP.
Is nvdsudpsrc-desc in DeepStream 8.0 supported 22-7?
If yes, could you share how to make the SDP with the DUP attribute by using it?
We use the nvds-nmos-bin-0.6.0 as is.

Best Regards,

yes we need to add sdp for the receiver as well in nvds-nmos-bin

here is an example for 1080p60 video receiver:

pipeline:

receiver.src_0 ! video/x-raw(memory:NVMM),width=1920,height=1080,format=UYVP,framerate=60/1 ! queue max-size-buffers=4 leaky=downstream ! nvvideoconvert ! queue max-size-buffers=4 ! nvv4l2h264enc ! queue max-size-buffers=4 ! mpegtsmux alignment=7 ! srtsink uri=srt://:9000 sync=0 async=0 nvdsnmosbin name=receiver hostname=2207receiver.local src_0::nvdsudpsrc-desc="nvdsudpsrc header-size=20 payload-size=1200 gpu-id=0" src_0::sdp="file:///sdps/video"

sdp:

v=0
o=- 123456 2 IN IP4 0.0.0.0
s=SMPTE ST2022-7 DUP streams
i=Includes 1080i@29.97 Hz video, one stereo pair of PCM audio, and ANC
t=0 0
a=recvonly
a=group:DUP one other
m=video 50020 RTP/AVP 96
c=IN IP4 225.1.1.2/64
a=source-filter: incl IN IP4 225.1.1.2 0.0.0.0
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=x-nvnmos-iface-ip:net1
a=mid:one
m=video 50120 RTP/AVP 96
c=IN IP4 225.1.1.3/64
a=source-filter: incl IN IP4 225.1.1.3 0.0.0.0
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; TP=2110TPN; SSN=ST2110-20:2017
a=ts-refclk:ptp=IEEE1588-2008:traceable
a=mediaclk:direct=0
a=x-nvnmos-iface-ip:net2
a=mid:other

There is no update from you for a period, assuming this is not an issue anymore. Hence we are closing this topic. If need further support, please open a new one. Thanks.