Nvcompositor appears to only render lowest 8 zorder streams

Hi there!

I’m using R32.2.1 on Jetson Nano Production modules. My nvcompositor plug-in version is 1.8.3. gstreamer version is 1.14.4.

While working with nvcompositor to try to aggregate several video streams onto a single output I’ve noticed that it can only render 8 streams, and it will only render the 8 lowest zorder stream. I’ve tried pipelines with 9 and 16 and the result is the same, only 8 sinks seem to function.

Simplified standard example pipeline:

gst-launch-1.0 videotestsrc ! 'video/x-raw,width=640,height=360,format=UYVY' ! \
nvvidconv ! 'video/x-raw(memory:NVMM), width=(int)640, height=(int)360, framerate=(fraction)60/1' ! queue ! tee name=t \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
t. ! queue ! comp. \
nvcompositor name=comp \
sink_0::zorder=7 sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=360 \
sink_1::zorder=6 sink_1::xpos=640 sink_1::ypos=0 sink_1::width=640 sink_1::height=360 \
sink_2::zorder=5 sink_2::xpos=1280 sink_2::ypos=0 sink_2::width=640 sink_2::height=360 \
sink_3::zorder=4 sink_3::xpos=0 sink_3::ypos=360 sink_3::width=640 sink_3::height=360 \
sink_4::zorder=8 sink_4::xpos=640 sink_4::ypos=360 sink_4::width=640 sink_4::height=360 \
sink_5::zorder=3 sink_5::xpos=1280 sink_5::ypos=360 sink_5::width=640 sink_5::height=360 \
sink_6::zorder=2 sink_6::xpos=0 sink_6::ypos=720 sink_6::width=640 sink_6::height=360 \
sink_7::zorder=1 sink_7::xpos=640 sink_7::ypos=720 sink_7::width=640 sink_7::height=360 \
sink_8::zorder=0 sink_8::xpos=1280 sink_8::ypos=720 sink_8::width=640 sink_8::height=360 ! nvoverlaysink

In this case, the middle stream is black, even though it’s sink_4. If you rearrange the z-orders on the streams it always follows the highest zorder stream.

Is nvcompositor limited to 8 streams by design, or could future versions support more streams? Or is this a bug?

Ideally I’d like to see it support as many as possible, and only cpu performance and memory be the limiting factors to throughput and framerate. (I currently actually have an application for 4x4, 16 streams.)

Please advise. Thanks in advance!

It is hardware limitation. Here is a related post:

NvBufferComposite() in tegra_multimedia_api is identical to nvcompositor in gstreamer. Both utilize same hardware engine(VIC).