Missing plugins from deepstream-l4t docker image

• Hardware Platform (Jetson / GPU)
Jetson
• DeepStream Version
nvcr.io/nvidia/deepstream-l4t:5.0-20.07-samples
• JetPack Version (valid for Jetson only)
4.4 GA

These are two elements my client absolutely needs for their app:

0:00:00.062168840    16     0x281e6a60 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "nvvidconv"!
0:00:00.065322471    16     0x281e6a60 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "nvjpegenc"!

Both of these are missing from the docker image but cannot be installed because:

  1. nvidia apt sources are not enabled in any l4t images (why?).
  2. even if this is hacked around, the preinst script in nvidia-l4t-gstreamer prevents the installation of the gstreamer plugins because it depends on nvidia-l4t-gstreamer which checks for /proc/device-tree/compatible that cannot exist at build time (/proc is not mounted during docker build).
Preparing to unpack .../nvidia-l4t-core_32.4.3-20200625213809_arm64.deb ...
/var/lib/dpkg/tmp.ci/preinst: line 40: /proc/device-tree/compatible: No such file or directory
dpkg: error processing archive /var/cache/apt/archives/nvidia-l4t-core_32.4.3-20200625213809_arm64.deb (--unpack):
 new nvidia-l4t-core package pre-installation script subprocess returned error exit status 1

Either an updated base image, a fixed nvidia-l4t-gstreamer package, or a workaround would be much appreciated.

I can use nvvideoconvert instead of nvvidconv (please unify these, it’s very confusing), but I can see no clean way to get jpegenc into the container.

Hi,
The two plugins, nvvidconv and nvjpegenc, are not compatible with plugins in DeepStream SDK. The plugins are implemented on the basis of NvBuffer APIs defined in

/usr/src/jetson_multimedia_api/include/nvbuf_utils.h

DS SDK is developed to be run on both dGPU platforms and Jetson platforms. The implementation is based on NvBufSurface APIs defined in

/opt/nvidia/deepstream/deepstream-5.0/sources/includes/nvbufsurface.h

For nvvidconv, you can use nvvideoconvert in DS SDK. However, there is no same plugin for nvjpegenc.

1 Like

Thanks @DaneLLL

Appreciate the prompt and thorough answer. Assuming my pipeline is separated in such a way the capture to jpeg is in a separate branch of a pipeline (after a tee), can I use it then?

Just a suggestion: even if this isn’t DeepStream specific, it would be nice if all the Nvidia GStreamer plugins were available in l4t-base and derived images. The inconsistency between the l4t rootfs and l4t-base makes it very difficult to use at times.

@DaneLLL

It seems the issue is related to this. None of the plugins are available when a DeepStream docker contaner is run as a user other than root.

Hi,
This topic should be relevant:

FYI.

1 Like

Thx, @DaneLLL.

I prefer adduser since I’ve wiped out users’ groups before by doing -G instead of -aG. Plus the order makes more sense to me. YMMV.

Re: original topic solution. It seems nvjpegenc and nvvidconv do work in Docker provided the --nvidia runtime is used and the user in the video group. Not sure about any Deepstream elements, since those haven’t been added yet, but the plan is to have them in a seperate branch of the pipeline, so I would assume it’s probably fine.