Exceeding 1.4 Gigapixels/sec if not using the ISP?

Hello, I have a few questions about the camera interface throughput specifications on the TX2.

We do not plan to use the ISP at all and prefer raw bayer images. The Camera interface offers a total of 40 Gbps of bandwidth, but we seem to be limited by, what I believe is the ISP.

e.g. We can run 2 x IMX378 cameras @ 12.3 MP (4056 x 3040) @ 30 fps @ 10 bit (4096 actual frame width) simultaneously, but we cannot run a 3rd. This would be 4096 x 3040 x 30 fps = 373 Mpix/sec * 2 cameras = 747 MPixels/sec. We should be able to run 3 cameras simultaneously at this resolution but if we do we see an I/O error on one of the cameras if we try. This testing was done using the tegra_multimedia_api/samples/v4l2cuda sample, with the CUDA processing removed and the following fields:

static const char *     dev_name        = "/dev/video0";
static io_method        io              = IO_METHOD_USERPTR;
static int              fd              = -1;
struct buffer *         buffers         = NULL;
static unsigned int     n_buffers       = 0;
static unsigned int     width           = 4056;
static unsigned int     height          = 3040;
static unsigned int     count           = 10;
static unsigned char *  cuda_out_buffer = NULL;
static bool             cuda_zero_copy = true;
static const char *     file_name       = "out.ppm";
static unsigned int     pixel_format    = V4L2_PIX_FMT_SBGGR10;
static unsigned int     field           = V4L2_FIELD_NONE;

If we run the same test using UHD resolution (3840 x 2160) @ 10 bit, we can run 3 cameras, but not 4.

I have 2 questions:

1.) Perhaps I am miscalculating this somehow or there are other factors of why I cannot get 1.4 Gpixels/second through the pipeline?

2.) Since we are not using the ISP, is it possible to bypass the ISP completely and achieve a higher throughput beyond the 1.4 Gigapixel/second threshhold? With 2 cameras running at 4056 x 3040 @ 30 fps @ 10 bit, we are only using about 12 Gbps. This leaves a lot of unused CSI bandwidth on the table if 40 Gbps is available.

  1. Could you try v4l2-ctl instead of the cuda sample code.
  2. The v4l2 sample code did skip ISP pipeline already. Where do you get 40 Gbps available?

Hi Shane,

1.) sure, did you have a particular command line in mind? Typically I’ve only used v4l2-ctl for simple single frame capture, not multi-frame capture

2.) Sorry, typo, should say 30 Gbps, up to 2.5 gbps/lane * 12 lanes = 30 Gbps. I wasn’t sure if we still go through the ISP (and it does nothing in the case of raw bayer data), or if we use a separate data path in which case there shouldn’t be a 1.4 Gpixel/sec limit.

Try below command

v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 &&
v4l2-ctl -d /dev/video1 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 &&
v4l2-ctl -d /dev/video2 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200

As requested, here are the results of the test. Each camera runs through its cycle in a serial manner as expected:

nvidia@tegra-ubuntu:~$ v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 &&

v4l2-ctl -d /dev/video1 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 &&
v4l2-ctl -d /dev/video2 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.15 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.07 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.05 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.15 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.07 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.05 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.15 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.07 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.05 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.02 fps
<<

If we push this a bit further and use max resolution:

v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200 &&

v4l2-ctl -d /dev/video1 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200 &&

v4l2-ctl -d /dev/video2 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps

We interestingly see the frame rate is higher at a higher resolution, but successful.
If I take this one step further for curiosity and we run each camera in an independent terminal window at the same time using the commands above:

nvidia@tegra-ubuntu:~$ v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<

nvidia@tegra-ubuntu:~$ v4l2-ctl -d /dev/video1 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200
<<<<VIDIOC_DQBUF: failed: Input/output error

nvidia@tegra-ubuntu:~$ v4l2-ctl -d /dev/video2 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=200 --set-fmt-video=width=4056,height=3040,pixelformat=RG10 --set-ctrl frame_length=3200
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.02 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.01 fps
<<<<<<<<<<<<<<<<<<

Cheers!