Jetson Stream Freezes or Shows Frame Corruption
When to use this article
On NVIDIA Jetson platforms, a UVC camera stream may freeze, stop after several frames, or show frame corruption when streaming high-resolution or high-bandwidth video.
Why this happens
The issue can be caused by insufficient UVC transfer buffers in the uvcvideo kernel driver.
The solution is to rebuild the uvcvideo kernel module with larger UVC_URBS and UVC_MAX_PACKETS values, then replace the module on the Jetson system.
The following steps replace a Linux kernel module on the target system. Build and install the module on the same Jetson device and JetPack/L4T version where the camera will be used.
Tested JetPack releases
We verified this solution on JetPack 6.2.x. For other JetPack versions, use the same procedure but download the BSP source package that matches the Jetson Linux/L4T version installed on the target device.
| JetPack version | L4T version | BSP source package |
|---|---|---|
| JetPack 6.2 | R36.4.3 | https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.3/sources/public_sources.tbz2 |
| JetPack 6.2.1 | R36.4.4 | https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.4/sources/public_sources.tbz2 |
For other JetPack/L4T versions, go to the NVIDIA Jetson Linux Archive, open the page for the matching Jetson Linux release, and download Sources > Driver Package (BSP) Sources.
Rebuild and install the uvcvideo module
- Check the JetPack/L4T version.
$ cat /etc/nv_tegra_release
- Install build dependencies.
$ sudo apt-get update
$ sudo apt-get install -y libssl-dev build-essential pkg-config libncurses-dev lbzip2
- Download and extract the NVIDIA kernel source.
Replace <BSP_SOURCE_URL> with the BSP source URL that matches your L4T version.
$ mkdir -p ~/uvc_driver/build_dir
$ cd ~/uvc_driver
$ wget "<BSP_SOURCE_URL>" -O public_sources.tbz2
$ tar -xf public_sources.tbz2
$ cd Linux_for_Tegra/source/
$ tar -xf kernel_src.tbz2
$ cd kernel/kernel-jammy-src/
- Update the UVC driver buffer settings.
$ sed -i -e '/#define DRIVER_VERSION/ s/"\(.*\)"/"\1-tn1"/' drivers/media/usb/uvc/uvcvideo.h
$ sed -i -e 's/#define UVC_URBS.*/#define UVC_URBS 1000/' drivers/media/usb/uvc/uvcvideo.h
$ sed -i -e 's/#define UVC_MAX_PACKETS.*/#define UVC_MAX_PACKETS 64/' drivers/media/usb/uvc/uvcvideo.h
- Prepare the kernel build configuration.
$ if [ -f /proc/config.gz ]; then \
zcat /proc/config.gz > ~/uvc_driver/build_dir/.config; \
else \
cp /boot/config-$(uname -r) ~/uvc_driver/build_dir/.config; \
fi
$ make ARCH=arm64 O=~/uvc_driver/build_dir olddefconfig
$ make ARCH=arm64 O=~/uvc_driver/build_dir modules_prepare
- Build the UVC driver module.
$ make ARCH=arm64 O=~/uvc_driver/build_dir M=$PWD/drivers/media/usb/uvc modules
After the build completes, the new module should be available at:
drivers/media/usb/uvc/uvcvideo.ko
- Back up the original module and install the rebuilt module.
Make sure the camera application is stopped before replacing the driver.
$ sudo cp -av /lib/modules/$(uname -r)/kernel/drivers/media/usb/uvc/uvcvideo.ko \
/lib/modules/$(uname -r)/kernel/drivers/media/usb/uvc/uvcvideo.ko.backup
$ sudo install -m 0644 drivers/media/usb/uvc/uvcvideo.ko \
/lib/modules/$(uname -r)/kernel/drivers/media/usb/uvc/uvcvideo.ko
$ sudo depmod -a
$ sudo reboot
Check the result
After reboot, confirm that the installed uvcvideo module version includes the -tn1 suffix.
$ modinfo /lib/modules/$(uname -r)/kernel/drivers/media/usb/uvc/uvcvideo.ko | grep '^version:'
version: 1.1.1-tn1
Then run a camera streaming test again:
$ v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=100