Description
Hello everyone,
I am using a Raspberry Pi Zero W with camera module V2 and the official 5.1V/2.5A PSU (tried other PSUs too - same result), and I'm trying to capture hardware-accelerated H264 video at 720p/25fps, via gstreamer/omx/v4l2, and the stream is made available in web browsers via Janus WebRTC Gateway. All the software used is compiled at the latest version available on GitHub (or via apt-get dist-upgrade).
Things work fine until enough load is applied to the Pi Zero W device. For example, starting Octoprint server (consumes a lot of CPU while starting up) and opening a second stream session in an Android Firefox browser) is sure to consistently trigger the issue.
A kernel OOPS error is generated, always at the same function with the same stack. The system remains active but camera capture is not possible again until reboot. I am thinking that if it was a hardware failure of some sort it would happen at slightly different points in the source code. Below you can find the relevant kernel logs (I have also activated debug flag on the bcm2835_v4l2 driver):
...
rpi1 kernel: [ 102.133148] bcm2835-v4l2: Buffer has ts 102024919000
rpi1 kernel: [ 102.177035] bcm2835-v4l2: buffer_cb: status:0, buf:c431c800, length:1382400, flags 4, pts 105707068
rpi1 kernel: [ 102.177055] bcm2835-v4l2: Buffer time set as converted timestamp - 102064901000 = (pts [105707068 usec] - vc start time [79762446 usec]) + kernel start time [76120279000 nsec]
rpi1 kernel: [ 102.177061] bcm2835-v4l2: Buffer has ts 102064901000
rpi1 kernel: [ 102.218151] bcm2835-v4l2: buffer_cb: status:0, buf:c4323000, length:1382400, flags 4, pts 105747049
rpi1 kernel: [ 102.218172] bcm2835-v4l2: Buffer time set as converted timestamp - 102104882000 = (pts [105747049 usec] - vc start time [79762446 usec]) + kernel start time [76120279000 nsec]
rpi1 kernel: [ 102.218177] bcm2835-v4l2: Buffer has ts 102104882000
rpi1 kernel: [ 102.241227] bcm2835-v4l2: queue_setup: dev:d697b000
rpi1 kernel: [ 102.262073] Unable to handle kernel paging request at virtual address 313fb504
rpi1 kernel: [ 102.263862] pgd = d2164000
rpi1 kernel: [ 102.265522] [313fb504] *pgd=00000000
rpi1 kernel: [ 102.267233] Internal error: Oops: 805 [#1] ARM
rpi1 kernel: [ 102.268965] Modules linked in: cmac bnep hci_uart btbcm bluetooth brcmfmac brcmutil snd_bcm2835 snd_pcm snd_timer cfg80211 snd rfkill bcm2835_gpiomem uio_pdrv_genirq fixed uio bcm2835_v4l2 v4l2_common videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media ip_tables x_tables ipv6
rpi1 kernel: [ 102.278292] CPU: 0 PID: 553 Comm: v4l2src0:src Not tainted 4.9.79+ #1091
rpi1 kernel: [ 102.280255] Hardware name: BCM2835
rpi1 kernel: [ 102.282191] task: d11b9b40 task.stack: d11f4000
rpi1 kernel: [ 102.285425] PC is at __vb2_queue_alloc+0xc8/0x3dc [videobuf2_core]
rpi1 kernel: [ 102.287922] LR is at 0x0
rpi1 kernel: [ 102.289937] pc : [<bf0d89b0>] lr : [<00000000>] psr: 60000013
rpi1 kernel: [ 102.289937] sp : d11f5c70 ip : 00000000 fp : d11f5cbc
rpi1 kernel: [ 102.294044] r10: 00000001 r9 : 00000001 r8 : d6aa0020
rpi1 kernel: [ 102.296082] r7 : 00000002 r6 : d6aa0002 r5 : d697b4b0 r4 : d6aa0400
rpi1 kernel: [ 102.298124] r3 : 313fb4b8 r2 : 00000001 r1 : d11f5cd0 r0 : d6aa0420
rpi1 kernel: [ 102.300206] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
rpi1 kernel: [ 102.302350] Control: 00c5387d Table: 12164008 DAC: 00000055
rpi1 kernel: [ 102.304503] Process v4l2src0:src (pid: 553, stack limit = 0xd11f4188)
rpi1 kernel: [ 102.306673] Stack: (0xd11f5c70 to 0xd11f6000)
rpi1 kernel: [ 102.308804] 5c60: 00000000 d11f5c80 00000001 00000001
rpi1 kernel: [ 102.313386] 5c80: bf0dde00 00000020 00000003 00000001 bf0fe388 d697b4b0 00000001 c4255004
...
rpi1 kernel: [ 102.469149] 5fe0: 00000000 b1cfe7fc b678d15c b6bbb8ac 20000010 0000000b 00000000 00000000
rpi1 kernel: [ 102.475796] [<bf0d89b0>] (__vb2_queue_alloc [videobuf2_core]) from [<bf0d905c>] (vb2_core_create_bufs+0xe4/0x28c [videobuf2_core])
rpi1 kernel: [ 102.482011] [<bf0d905c>] (vb2_core_create_bufs [videobuf2_core]) from [<bf0e50f0>] (vb2_create_bufs+0xf0/0x180 [videobuf2_v4l2])
rpi1 kernel: [ 102.489470] [<bf0e50f0>] (vb2_create_bufs [videobuf2_v4l2]) from [<bf0e566c>] (vb2_ioctl_create_bufs+0x8c/0xa8 [videobuf2_v4l2])
rpi1 kernel: [ 102.495454] [<bf0e566c>] (vb2_ioctl_create_bufs [videobuf2_v4l2]) from [<bf0a2f58>] (v4l_create_bufs+0x60/0x7c [videodev])
rpi1 kernel: [ 102.501392] [<bf0a2f58>] (v4l_create_bufs [videodev]) from [<bf0a1ac8>] (__video_do_ioctl+0x2a0/0x320 [videodev])
rpi1 kernel: [ 102.507426] [<bf0a1ac8>] (__video_do_ioctl [videodev]) from [<bf0a14f8>] (video_usercopy+0x234/0x540 [videodev])
rpi1 kernel: [ 102.513990] [<bf0a14f8>] (video_usercopy [videodev]) from [<bf0a1820>] (video_ioctl2+0x1c/0x24 [videodev])
rpi1 kernel: [ 102.521205] [<bf0a1820>] (video_ioctl2 [videodev]) from [<bf09b688>] (v4l2_ioctl+0xd4/0xec [videodev])
rpi1 kernel: [ 102.529016] [<bf09b688>] (v4l2_ioctl [videodev]) from [<c0157a58>] (do_vfs_ioctl+0x9c/0x7d4)
rpi1 kernel: [ 102.534828] [<c0157a58>] (do_vfs_ioctl) from [<c01581d4>] (SyS_ioctl+0x44/0x6c)
rpi1 kernel: [ 102.537755] [<c01581d4>] (SyS_ioctl) from [<c000fe40>] (ret_fast_syscall+0x0/0x1c)
rpi1 kernel: [ 102.543332] Code: 1afffff9 e51b2030 e0853106 e3520001 (e583404c)
rpi1 kernel: [ 102.546442] ---[ end trace c017786695322689 ]---
My gstreamer pipeline looks like this:
gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true ! video/x-raw,width=1280,height=720,framerate=25/1 ! omxh264enc target-bitrate=1500000 control-rate=1 ! video/x-h264,profile=high ! h264parse ! rtph264pay name=pay0 config-interval=10 pt=96 ! udpsink host=0.0.0.0 port=5004
Thanks for looking into it !