We are trying to synchronize two imx477 cameras each attached to a separate jetson Nano 2gb dev board. We are using the drivers supplied by arducam with jetpack 4.5.1. When we start gstreamer on the slave first, then within ~100ms start the master, the synchronization works without any issues. The framerate of the slave correctly follows what the master is supplying and the xvs sync signal is visible with a scope.
If we start the slave > ~100ms before the master it seems that the ISP is failing. The kernel logs are full of entries, beginning with
fence timeout on [ffffffc016f53840] after 1500ms
This does not lead to nvargus-daemon crashing, but the following gstreamer pipeline fills the file with garbage:
gst-launch-1.0 -e nvarguscamerasrc wbmode=0 awblock=true gainrange='18 18' ispdigitalgainrange='4 4' exposuretimerange='500 500' aelock=true ! 'video/x-raw(memory:NVMM), width=1920, height=1080, framerate=60/1' ! omxh264enc bitrate=800000 ! qtmux ! filesink location=slave.mp4 -e
If we start the master at exactly the same time as the slave, we obtain a valid output file with the video in sync. If we start the master > 100ms before the slave, nvargus-daemon crashes with the log attached, log_master_01.txt (5.5 KB)
From these experiments I assume that if frames are either arriving too early, or too late, the ISP crashes. For our use case it would be sufficient if we could set the timeout of the ISP larger (ie. start slave first, then master). Would this somehow be possible in nvargus-daemon or in one of the device drivers (csi maybe) ?