Why is EGL required for nv* GStreamer pluigins when running headless?

I’m using the Xavier as a headless CCV2 ML platform terminating in a GStreamer udpsink.

Or rather, I’m trying to but cannot because key NV* plugins appear to require an EGL display.

I’d like to use nvinfer, but I keep getting the dreaded:

$ gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1920 height=1080 ! fakesink
nvbuf_utils: Could not get EGL display connection
No EGL Display
nvbufsurftransform: Could not get EGL display connection


Seems a bit odd that an EGL display would be required since I’m not even rendering the output.

How can I fix this (without writing my own TensorRT gstreamer plugin)?

This pipeline will be re-rendered as it’s own RTSPsink / UDPsink server, hence the headless operation.

(Note: This works fine if I run locally on the Xavier with an HDMI output, but that is not an option. Apparently an EGL display is installed on the local Xavier, but it still isn’t supported under VNC?!?)

We can run blow usecase. Please check if you can adapt it to yours:
1 Disable display manager after booting:

sudo systemctl stop gdm
sudo loginctl terminate-seat seat0

2 Apply the following change to deepstream-test3:

/* Finally render the osd output */
  transform = gst_element_factory_make ("<s>nvegltransform</s>queue", "nvegl-transform");
  sink = gst_element_factory_make ("<s>nveglglessink</s>fakesink", "nvvideo-renderer");

In this environment, we can run deepstream-test3 successfully.