SegFault when enabling multiple sinks with different source id

Please provide complete information as applicable to your setup.

• Hardware Platform (Jetson / GPU) Tesla T4
• DeepStream Version Deepstream SDK 5.0
• Docker I am using Deepstream 5.0 docker image.

I am trying to run deepstream 5.0 example 5: deepstream-test5. After playing around with the config file, I decided to try and create 2 sinks for my 2 sources, which are rtsp stream, At first, [display tile] was enable, and the program run without problem. However, the output of the program is saved to 1 file (2 display window in the video). I want to separate the 2 output video, hence I disable display tile and create another sink. However, I got the error:

*** DeepStream: Launched RTSP Streaming at rtsp://localhost:8554/ds-test ***

 *** DeepStream: Launched RTSP Streaming at rtsp://localhost:8555/ds-test ***

(deepstream-test5-app:3674): GStreamer-CRITICAL **: 04:47:08.970: gst_element_get_static_pad: assertion 'GST_IS_ELEMENT (element)' failed
Segmentation fault (core dumped)

Here is my config file:

[application]
enable-perf-measurement=1
perf-measurement-interval-sec=5
#gie-kitti-output-dir=streamscl

[tiled-display]
enable=0
rows=1
columns=1
width=1280
height=720
gpu-id=0
nvbuf-memory-type=0

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP
type=4
uri=rtsp://my/link/
num-sources=1
gpu-id=0
nvbuf-memory-type=0
# smart record specific fields, valid only for source type=4
#smart-record=1
# 0 = mp4, 1 = mkv
#smart-rec-container=0
#smart-rec-file-prefix
#smart-rec-dir-path
# video cache size in seconds
#smart-rec-video-cache
# default duration of recording in seconds.
#smart-rec-default-duration
# duration of recording in seconds.
# this will override default value.
#smart-rec-duration
# seconds before the current time to start recording.
#smart-rec-start-time
# value in seconds to dump video stream.
#smart-rec-interval

[source1]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP
type=4
uri=rtsp://my/link/
num-sources=1
gpu-id=0
nvbuf-memory-type=0
# smart record specific fields, valid only for source type=4
#smart-record=1
# 0 = mp4, 1 = mkv
#smart-rec-container=0
#smart-rec-file-prefix
#smart-rec-dir-path
# video cache size in seconds
#smart-rec-video-cache

[sink0]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=4
codec=1
enc-type=0
sync=1
source-id=0
bitrate=12000000
rtsp-port=8554
udp-port=5400
width=1280
height=720

[sink1]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=4
codec=1
enc-type=0
sync=1
source-id=1
bitrate=12000000
rtsp-port=8555
udp-port=5401
width=1280
height=720

[sink2]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvoverlaysink 6=MsgConvBroker
type=6
msg-conv-config=dstest5_msgconv_sample_config.txt
#(0): PAYLOAD_DEEPSTREAM - Deepstream schema payload
#(1): PAYLOAD_DEEPSTREAM_MINIMAL - Deepstream schema payload minimal
#(256): PAYLOAD_RESERVED - Reserved type
#(257): PAYLOAD_CUSTOM   - Custom schema payload
msg-conv-payload-type=0
msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_kafka_proto.so
#Provide your msg-broker-conn-str here
msg-broker-conn-str=<host>;<port>;<topic>
topic=<topic>
#Optional:
#msg-broker-config=../../deepstream-test4/cfg_kafka.txt

[sink3]
enable=1
type=3
#1=mp4 2=mkv
container=2
#1=h264 2=h265 3=mpeg4
## only SW mpeg4 is supported right now.
codec=3
sync=1
bitrate=12000000
output-file=out_0.mkv
source-id=0

[sink4]
enable=1
type=3
container=2
codec=3
sync=1
bitrate=12000000
output-file=out_1.mkv
source-id=1

# sink type = 6 by default creates msg converter + broker.
# To use multiple brokers use this group for converter and use
# sink type = 6 with disable-msgconv = 1
[message-converter]
enable=0
msg-conv-config=dstest5_msgconv_sample_config.txt
#(0): PAYLOAD_DEEPSTREAM - Deepstream schema payload
#(1): PAYLOAD_DEEPSTREAM_MINIMAL - Deepstream schema payload minimal
#(256): PAYLOAD_RESERVED - Reserved type
#(257): PAYLOAD_CUSTOM   - Custom schema payload
msg-conv-payload-type=0
# Name of library having custom implementation.
#msg-conv-msg2p-lib=<val>
# Id of component in case only selected message to parse.
#msg-conv-comp-id=<val>

# Configure this group to enable cloud message consumer.
[message-consumer0]
enable=0
proto-lib=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_kafka_proto.so
conn-str=<host>;<port>
config-file=<broker config file e.g. cfg_kafka.txt>
subscribe-topic-list=<topic1>;<topic2>;<topicN>

[osd]
enable=1
gpu-id=0
border-width=1
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Arial
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;0
nvbuf-memory-type=0

[streammux]
gpu-id=0
##Boolean property to inform muxer that sources are live
live-source=1
batch-size=2
##time out in usec, to wait after the first buffer is available
##to push the batch even if the complete batch is not formed
batched-push-timeout=40000
## Set muxer output width and height
width=1920
height=1080
##Enable to maintain aspect ratio wrt source, and allow black borders, works
##along with width, height properties
enable-padding=0
nvbuf-memory-type=0
## If set to TRUE, system timestamp will be attached as ntp timestamp
## If set to FALSE, ntp timestamp from rtspsrc, if available, will be attached
# attach-sys-ts-as-ntp=1

# config-file property is mandatory for any gie section.
# Other properties are optional and if set will override the properties set in
# the infer config file.
[primary-gie]
enable=1
gpu-id=0
#Required to display the PGIE labels, should be added even when using config-file
#property
batch-size=2
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
interval=0
#Required by the app for SGIE, when used along with config-file property
gie-unique-id=1
nvbuf-memory-type=0
model-engine-file=../../../../../samples/models/tlt_pretrained_models/peoplenet/resnet34_peoplenet_pruned.etlt_b1_gpu0_fp16.engine
labelfile-path=../../../../../samples/models/tlt_pretrained_models/peoplenet/labels.txt
config-file=../../../../../samples/configs/tlt_pretrained_models/config_infer_primary_peoplenet.txt
#infer-raw-output-dir=../../../../../samples/primary_detector_raw_output/


[tracker]
enable=1
tracker-width=960
tracker-height=544
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_nvdcf.so
#ll-config-file required for DCF/IOU only
ll-config-file=/opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/tracker_config.yml
#ll-config-file=iou_config.txt
gpu-id=0
#enable-batch-process applicable to DCF only
enable-batch-process=0

[tests]
file-loop=0

Is there anything I can do to fix this? I have tried removing cache file at .cache/gstreamer-1.0/registry.x86_64.bin before running the program but I still encountered this error. Only when enabling [tiled-display] again would the program run without error.

For multiple sinks case, there is a little bug in Deepstream 5.0 sample codes. As a temporary workaround, can you modify the code and rebuild the test apps to make them work? The steps are as following:

  1. install gcc in your docker
  2. cd /opt/nvidia/deepstream/deepstream-5.0/sources/apps/sample_apps/deepstream-app/
  3. vi deepstream_app.c
  4. Edit line 1174 as following
    pipeline->instance_bins[i].sink_bin.sub_bins[i].sink, “sink”,
  5. Save the change
  6. cd /opt/nvidia/deepstream/deepstream-5.0/sources/apps/sample_apps/deepstream-test5/
  7. Run the command “make”, deepstream-test5-app file will be generated in the same directory.
  8. cp deepstream-test5-app …/…/…/…/bin/

Then you can run your case again.
It’s better to rebuild and replace all sample apps if you want to try other samples.

2 Likes

Thank you, this solve the problem