Framerate capture limitation with nvarguscamerasrc

Hi, we are currently working with Jetson AGX Orin with R36.3 and IMX477 trying to reach high framerates when capturing with nvarguscamerasrc .

We can get high framerate (480fps) when using v4l2-ctl and capturing Bayer frames as shown below:

v4l2-ctl --set-fmt-video=width=692,height=520,pixelformat=RG10 -c override_enable=0 -c bypass_mode=0 -c sensor_mode=5 -c frame_rate=480 --stream-mmap -d /dev/video0

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 480.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 480.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 480.03 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<^C

When moving to use the ISP to get YUV format using the nvarguscamerasrc element we get ~350fps, even after using clocks.sh to max out clocks VI/ISP/NVCSI/EMC/VIC, jetson_clocks and nvpmodel. Here is the pipeline we tried out:

user@orin:~$ gst-launch-1.0 -v nvarguscamerasrc sensor-mode=5 ! ‘video/x-raw(memory:NVMM),format=NV12,framerate=480/1,width=692,height=520’ ! fpsdisplaysink video-sink=fakesink text-overlay=true sync=false -e
Setting pipeline to PAUSED …
Pipeline is live and does not need PREROLL …
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
Pipeline is PREROLLED …
Setting pipeline to PLAYING …
New clock: GstSystemClock
/GstPipeline:pipeline0/GstNvArgusCameraSrc:nvarguscamerasrc0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay.GstPad:src: caps = video/x-raw(memory:NVMM, meta:GstVideoOverlayComposition), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-raw(memory:NVMM, meta:GstVideoOverlayComposition), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay.GstPad:video_sink: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)692, height=(int)520, format=(string)NV12, framerate=(fraction)480/1
GST_ARGUS: Creating output stream
CONSUMER: Waiting until producer is connected…
GST_ARGUS: Available Sensor modes :
GST_ARGUS: 4056 x 3040 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 62000, max 250000000;

GST_ARGUS: 3840 x 2160 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 60000, max 250000000;

GST_ARGUS: 2028 x 1520 FR = 160.000000 fps Duration = 6250000 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 31000, max 250000000;

GST_ARGUS: 1920 x 1080 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 43000, max 250000000;

GST_ARGUS: 1348 x 750 FR = 240.000038 fps Duration = 4166666 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 28000, max 200000000;

GST_ARGUS: 692 x 520 FR = 480.000077 fps Duration = 2083333 ; Analog Gain range min 1.000000, max 16.000000; Exposure Range min 28000, max 200000000;

GST_ARGUS: Running with following settings:
Camera index = 0
Camera mode = 5
Output Stream W = 692 H = 520
seconds to Run = 0
Frame Rate = 480.000077
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
Redistribute latency…
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 174, dropped: 0, current: 346.15, average: 346.15
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 174, dropped: 0, current: 346.15, average: 346.15
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 355, dropped: 0, current: 361.39, average: 353.75
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 355, dropped: 0, current: 361.39, average: 353.75
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 546, dropped: 0, current: 380.23, average: 362.58
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 546, dropped: 0, current: 380.23, average: 362.58
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 720, dropped: 0, current: 345.69, average: 358.35
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 720, dropped: 0, current: 345.69, average: 358.35
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 893, dropped: 0, current: 344.57, average: 355.60
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 893, dropped: 0, current: 344.57, average: 355.60
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1067, dropped: 0, current: 347.64, average: 354.28
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1067, dropped: 0, current: 347.64, average: 354.28
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1240, dropped: 0, current: 344.71, average: 352.91
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1240, dropped: 0, current: 344.71, average: 352.91
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1426, dropped: 0, current: 371.98, average: 355.28
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1426, dropped: 0, current: 371.98, average: 355.28
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1608, dropped: 0, current: 362.71, average: 356.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1608, dropped: 0, current: 362.71, average: 356.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1787, dropped: 0, current: 357.77, average: 356.27
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1787, dropped: 0, current: 357.77, average: 356.27
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 1966, dropped: 0, current: 356.63, average: 356.31
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 1966, dropped: 0, current: 356.63, average: 356.31
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 2149, dropped: 0, current: 365.96, average: 357.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 2149, dropped: 0, current: 365.96, average: 357.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 2331, dropped: 0, current: 363.91, average: 357.63
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 2331, dropped: 0, current: 363.91, average: 357.63

Is there any known limitation in the Jetson Orin AGX regarding framerate? How can we reach higher framerates using nvarguscamerasrc so we can match what we get with v4l2-ctl?

To give a better idea, here are some general guidelines on the maximum framerates achievable on Jetson AGX Orin using nvarguscamerasrc:

  • 692x520 resolution: up to 350-400 fps (as you’ve already achieved)

  • 1920x1080 resolution: up to 120-150 fps

  • 3840x2160 resolution: up to 60-90 fps

Hi @ShaneCCC Thanks for your input.

That said:

  1. Can you confirm the Orin (and specifically the ISP) can not go beyond 400fps even when it is possible to capture at higher framerates using V4L2 only?
  2. Is this a official hardware limitation in the ISP path (given that the sensor can achieve higher fps)?
  3. Is it possible to provide a calculation based on the ISP throughput to support this?

Best regards

The HW able to handle it without problem. It could be software reltaive.

Hi @ShaneCCC ,

Thanks for your answer. Given we already validated that the capture can go up to 480fps using V4L2 it kind of demonstrates the driver functionality and the HW capability to capture at this frame rate. When passing through the ISP with Argus it goes down. So I have some questions, also related with the previous ones (not answered):

  1. Can you confirm that going through the ISP using argus can follows this frame rate? From you first comment you said there is a limitation in frame rate (“692x520 resolution: up to 350-400 fps (as you’ve already achieved)“) but from your latest comment you seems to said the contrary.
  2. Given the provided evidence using v4l2-ctl and the provided GStreamer pipeline using argus, can you point to any reasons for this issue?
  3. Have you validated high frame rates with the devkit?

Thanks!

  1. ISP pipeline have involve much features and we don’t confirm if able to archive it.
  2. The same with above v4l2-ctl is much simple pipeline but involve ISP.
  3. Current only verified 240fps

Hi @ShaneCCC ,

Thanks for your answer, so to your original comment: “The HW able to handle it without problem. It could be software reltaive.“ Based on your answer on #1, there is no guarantee the Orin AGX supports it.

Regarding your answer #3, what camera, format, and resolution did you test?

Should be test by imx219 by 640x480@240