Raspberry Pi ZeroW Camera Focus with libcamera-vid

Several years ago I was trying to play with a camera on a Raspberry Pi Zero and was using FFMPEG to stream video to my PC. Now that I’m trying out the Bullseye release of Raspian, I’m attempting to use the camera tools that are installed by default.

I’ve got an Arducam with 160° lens connected to my Pi Zero.

pi@WimPiZeroCamera:~ $ libcamera-vid --list-cameras
[0:01:26.600607679] [701]  INFO Camera camera_manager.cpp:293 libcamera v0.0.0+3544-22656360
[0:01:26.690670361] [702] ERROR CameraSensor camera_sensor.cpp:591 'ov5647 10-0036': Camera sensor does not support test pattern modes.
[0:01:26.842438396] [702]  INFO RPI raspberrypi.cpp:1356 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0
Available cameras
-----------------
0 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@1/ov5647@36)
    Modes: 'SGBRG10_CSI2P' : 640x480 1296x972 1920x1080 2592x1944 

First I ran the previous command to see that the camera is recognized, then I run the following command to set up the port on the Pi. The program produces no output in the terminal until I connect from my PC.

pi@WimPiZeroCamera:~ $ libcamera-vid --timeout 0 --nopreview --listen --output tcp://0.0.0.0:5000

On the PC, I run VLC

Open Network Stream
tcp/h264://192.168.0.63:5000
View from the camera

looking back at the console output, you can see that it’s defaulting to 640×480 resolution.

pi@WimPiZeroCamera:~ $ libcamera-vid --timeout 0 --nopreview --listen --output tcp://0.0.0.0:5000
[2:02:18.390718603] [16931]  INFO Camera camera_manager.cpp:293 libcamera v0.0.0+3544-22656360
[2:02:18.502791615] [17031] ERROR CameraSensor camera_sensor.cpp:591 'ov5647 10-0036': Camera sensor does not support test pattern modes.
[2:02:18.636067629] [17031]  INFO RPI raspberrypi.cpp:1356 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0
[2:02:18.641028629] [16931]  INFO Camera camera.cpp:1029 configuring streams: (0) 640x480-YUV420
[2:02:18.644508629] [17031]  INFO RPI raspberrypi.cpp:760 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 640x480-SGBRG10_1X10 - Selected unicam format: 640x480-pGAA

When I stop the video on the PC, libcamera-vid exits on the Pi.

I can specify the width and height of the output at the Pi, but it seems to be having problems delivering data.

libcamera-vid --timeout 0 --nopreview --width 1920 --height 1080 --inline --listen -o tcp://0.0.0.0:5000
the video starts, but rapidly freezes.
pi@WimPiZeroCamera:~ $ libcamera-vid --timeout 0 --nopreview --width 1920 --height 1080 --inline --listen -o tcp://0.0.0.0:5000 
[0:01:23.973536453] [670]  INFO Camera camera_manager.cpp:293 libcamera v0.0.0+3544-22656360
[0:01:24.087323064] [704] ERROR CameraSensor camera_sensor.cpp:591 'ov5647 10-0036': Camera sensor does not support test pattern modes.
[0:01:24.241746679] [704]  INFO RPI raspberrypi.cpp:1356 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0
[0:01:24.247247304] [670]  INFO Camera camera.cpp:1029 configuring streams: (0) 1920x1080-YUV420
[0:01:24.250886379] [704]  INFO RPI raspberrypi.cpp:760 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 1920x1080-SGBRG10_1X10 - Selected unicam format: 1920x1080-pGAA

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.204113] Internal error: Oops: 80000005 [#1] ARM

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.205952] Process libcamera-vid (pid: 704, stack limit = 0x5546931d)

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.205993] Stack: (0xc2d2de10 to 0xc2d2e000)

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206027] de00:                                     c2d2de3b c1b70ea0 c2d2de5c 00000000

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206068] de20: 00000000 00000000 00000000 00000000 c3b2ed20 b58bc074 00c9c038 00000003

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206104] de40: 00000002 00278d00 00004002 00000001 00000000 00000056 00000000 000180b5

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206140] de60: 00000000 00000000 00000000 00000000 00000000 00000000 00000004 0000001d

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206178] de80: 00278d00 00000000 00000000 c2d2de98 c0046c80 c000b100 c13b6014 c1b70ea0

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206216] dea0: c0c2b2c0 c1888ea0 00000000 c41df8c0 c2d2dedc c2d2dec0 c0013798 0a121acf

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206253] dec0: 00000000 bf1d1d50 c3b2ed21 00000000 c3b2ed20 c0c1f028 b58bc074 0000000e

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206292] dee0: c2d2defc c2d2def0 bf1d1d6c bf1d17b4 c2d2df14 c2d2df00 bf1c9148 bf1d1d5c

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206330] df00: c044560f c3b2ed21 c2d2dfa4 c2d2df18 c021fda0 bf1c9108 00000000 c0c1f028

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206369] df20: c0008ff0 00c5387d c2d2df6c c2d2df38 c0014720 c001377c 00000000 00000000

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206406] df40: 00000000 00000000 c0c9c038 60000010 c0008ff0 00c5387d 00000000 c0009104

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206444] df60: c2d2df94 c2d2df70 c00f8f20 c00fa1fc b6968a5c 0a121acf ffffffff b58bc074

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206481] df80: b4f11558 b4f0ba30 00000036 c00083e4 c2d2c000 00000000 00000000 c2d2dfa8

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206518] dfa0: c0008260 c021fc98 b58bc074 b4f11558 0000000e c044560f b58bc074 b6dfb788

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206555] dfc0: b58bc074 b4f11558 b4f0ba30 00000036 0bde9f08 00000014 b6ad9124 01167c88

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206595] dfe0: b6aabe94 b58bc04c b6a354a0 b6bcb1ac 60000010 0000000e 00000000 00000000

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206625] Backtrace: 

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.206653] [<bf1d17a8>] (video_usercopy [videodev]) from [<bf1d1d6c>] (video_ioctl2+0x1c/0x24 [videodev])

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.207763]  r10:0000000e r9:b58bc074 r8:c0c1f028 r7:c3b2ed20 r6:00000000 r5:c3b2ed21

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.207800]  r4:bf1d1d50

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.207820] [<bf1d1d50>] (video_ioctl2 [videodev]) from [<bf1c9148>] (v4l2_ioctl+0x4c/0x64 [videodev])

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.208594] [<bf1c90fc>] (v4l2_ioctl [videodev]) from [<c021fda0>] (sys_ioctl+0x114/0x9b0)

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209024]  r5:c3b2ed21 r4:c044560f

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209047] [<c021fc8c>] (sys_ioctl) from [<c0008260>] (ret_fast_syscall+0x0/0x1c)

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209094] Exception stack(0xc2d2dfa8 to 0xc2d2dff0)

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209128] dfa0:                   b58bc074 b4f11558 0000000e c044560f b58bc074 b6dfb788

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209167] dfc0: b58bc074 b4f11558 b4f0ba30 00000036 0bde9f08 00000014 b6ad9124 01167c88

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209202] dfe0: b6aabe94 b58bc04c b6a354a0 b6bcb1ac

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209233]  r10:00000000 r9:c2d2c000 r8:c00083e4 r7:00000036 r6:b4f0ba30 r5:b4f11558

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209261]  r4:b58bc074

Message from syslogd@WimPiZeroCamera at Jun  3 21:06:16 ...
 kernel:[   86.209294] Code: bad PC value

I’m including the output of dmesg here in case anyone has a solution to my problem. Most likely I’m going to switch back to the Buster release of raspian and see if everything works properly there.

pi@WimPiZeroCamera:~ $ dmesg 
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.15.32+ (dom@buildbot) (arm-linux-gnueabihf-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1538 Thu Mar 31 19:37:58 BST 2022
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] OF: fdt: Machine model: Raspberry Pi Zero W Rev 1.1
[    0.000000] random: fast init done
[    0.000000] Memory policy: Data cache writeback
[    0.000000] Reserved memory: created CMA memory pool at 0x0bc00000, size 256 MiB
[    0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x000000001bffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000001bffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000001bffffff]
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 113680
[    0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=0 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 video=Composite-1:720x480@60i smsc95xx.macaddr=B8:27:EB:B0:8B:F5 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000  console=ttyS0,115200 console=tty1 root=PARTUUID=fb77dacb-02 rootfstype=ext4 fsck.repair=yes rootwait
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 177232K/458752K available (8994K kernel code, 1338K rwdata, 2932K rodata, 436K init, 546K bss, 19376K reserved, 262144K cma-reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] ftrace: allocating 31774 entries in 94 pages
[    0.000000] ftrace: allocated 94 pages with 5 groups
[    0.000000] trace event string verifier disabled
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] random: get_random_bytes called from start_kernel+0x474/0x6d8 with crng_init=1
[    0.000006] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 2147483647500ns
[    0.000103] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275 ns
[    0.000218] bcm2835: system timer (irq = 27)
[    0.001053] Console: colour dummy device 80x30
[    0.001743] printk: console [tty1] enabled
[    0.001850] Calibrating delay loop... 697.95 BogoMIPS (lpj=3489792)
[    0.060393] pid_max: default: 32768 minimum: 301
[    0.060674] LSM: Security Framework initializing
[    0.060954] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.061048] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.063506] cgroup: Disabling memory control group subsystem
[    0.064019] CPU: Testing write buffer coherency: ok
[    0.066192] Setting up static identity map for 0x8220 - 0x8258
[    0.067811] devtmpfs: initialized
[    0.083783] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[    0.084268] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.084378] futex hash table entries: 256 (order: -1, 3072 bytes, linear)
[    0.127092] pinctrl core: initialized pinctrl subsystem
[    0.129535] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.134406] DMA: preallocated 1024 KiB pool for atomic coherent allocations
[    0.142234] audit: initializing netlink subsys (disabled)
[    0.143981] thermal_sys: Registered thermal governor 'step_wise'
[    0.145036] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[    0.145154] hw-breakpoint: maximum watchpoint size is 4 bytes.
[    0.145493] Serial: AMBA PL011 UART driver
[    0.151112] audit: type=2000 audit(0.140:1): state=initialized audit_enabled=0 res=1
[    0.160187] bcm2835-mbox 2000b880.mailbox: mailbox enabled
[    0.191113] raspberrypi-firmware soc:firmware: Attached to firmware from 2022-03-24T13:20:54, variant start
[    0.201153] raspberrypi-firmware soc:firmware: Firmware hash is e5a963efa66a1974127860b42e913d2374139ff5
[    0.262032] Kprobes globally optimized
[    0.272466] bcm2835-dma 20007000.dma: DMA legacy API manager, dmachans=0x1
[    0.276096] SCSI subsystem initialized
[    0.276738] usbcore: registered new interface driver usbfs
[    0.276920] usbcore: registered new interface driver hub
[    0.277084] usbcore: registered new device driver usb
[    0.277674] usb_phy_generic phy: supply vcc not found, using dummy regulator
[    0.278596] pps_core: LinuxPPS API ver. 1 registered
[    0.278672] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.278771] PTP clock support registered
[    0.281877] clocksource: Switched to clocksource timer
[    0.370365] VFS: Disk quotas dquot_6.6.0
[    0.370608] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    0.370926] FS-Cache: Loaded
[    0.371393] CacheFiles: Loaded
[    0.372730] simple-framebuffer 1eaa9000.framebuffer: framebuffer at 0x1eaa9000, 0x151800 bytes
[    0.372839] simple-framebuffer 1eaa9000.framebuffer: format=a8r8g8b8, mode=720x480x32, linelength=2880
[    2.316040] Console: switching to colour frame buffer device 90x30
[    2.325233] simple-framebuffer 1eaa9000.framebuffer: fb0: simplefb registered!
[    2.350708] NET: Registered PF_INET protocol family
[    2.354867] IP idents hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    2.360331] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
[    2.367949] TCP established hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    2.371976] TCP bind hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    2.375979] TCP: Hash tables configured (established 4096 bind 4096)
[    2.380172] UDP hash table entries: 256 (order: 0, 4096 bytes, linear)
[    2.384369] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes, linear)
[    2.388971] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    2.394705] RPC: Registered named UNIX socket transport module.
[    2.398827] RPC: Registered udp transport module.
[    2.402805] RPC: Registered tcp transport module.
[    2.406660] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    2.412559] armv6-pmu arm-pmu: hw perfevents: no irqs for PMU, sampling events not supported
[    2.420478] hw perfevents: enabled with armv6_1176 PMU driver, 3 counters available
[    2.429866] Initialise system trusted keyrings
[    2.434734] workingset: timestamp_bits=14 max_order=17 bucket_order=3
[    2.454069] zbud: loaded
[    2.461621] FS-Cache: Netfs 'nfs' registered for caching
[    2.467344] NFS: Registering the id_resolver key type
[    2.471447] Key type id_resolver registered
[    2.475469] Key type id_legacy registered
[    2.479543] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    2.483449] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    2.489597] Key type asymmetric registered
[    2.493540] Asymmetric key parser 'x509' registered
[    2.497458] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
[    2.501169] io scheduler mq-deadline registered
[    2.504848] io scheduler kyber registered
[    2.524068] bcm2835-rng 20104000.rng: hwrng registered
[    2.528560] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB)
[    2.538148] gpiomem-bcm2835 20200000.gpiomem: Initialised: Registers at 0x20200000
[    2.566824] brd: module loaded
[    2.585348] loop: module loaded
[    2.590544] Loading iSCSI transport class v2.0-870.
[    2.597691] usbcore: registered new interface driver smsc95xx
[    2.601558] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[    3.334020] Core Release: 2.80a
[    3.337668] Setting default values for core params
[    3.341198] Finished setting default values for core params
[    3.545225] Using Buffer DMA mode
[    3.548723] Periodic Transfer Interrupt Enhancement - disabled
[    3.552244] Multiprocessor Interrupt Enhancement - disabled
[    3.555760] OTG VER PARAM: 0, OTG VER FLAG: 0
[    3.559326] Dedicated Tx FIFOs mode

[    3.564631] WARN::dwc_otg_hcd_init:1074: FIQ DMA bounce buffers: virt = cbd04000 dma = 0x8bd04000 len=9024
[    3.575023] FIQ FSM acceleration enabled for :
               Non-periodic Split Transactions
               Periodic Split Transactions
               High-Speed Isochronous Endpoints
               Interrupt/Control Split Transaction hack enabled
[    3.591752] dwc_otg: Microframe scheduler enabled

[    3.592119] WARN::hcd_init_fiq:457: FIQ on core 0

[    3.598562] WARN::hcd_init_fiq:458: FIQ ASM at c0685988 length 36

[    3.604610] WARN::hcd_init_fiq:497: MPHI regs_base at dc810000
[    3.610870] dwc_otg 20980000.usb: DWC OTG Controller
[    3.614171] dwc_otg 20980000.usb: new USB bus registered, assigned bus number 1
[    3.617505] dwc_otg 20980000.usb: irq 56, io mem 0x00000000
[    3.620707] Init: Port Power? op_state=1
[    3.623880] Init: Power Port (0)
[    3.627538] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    3.633926] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.637264] usb usb1: Product: DWC OTG Controller
[    3.640556] usb usb1: Manufacturer: Linux 5.15.32+ dwc_otg_hcd
[    3.643942] usb usb1: SerialNumber: 20980000.usb
[    3.648695] hub 1-0:1.0: USB hub found
[    3.652208] hub 1-0:1.0: 1 port detected
[    3.656876] dwc_otg: FIQ enabled
[    3.656917] dwc_otg: NAK holdoff enabled
[    3.656934] dwc_otg: FIQ split-transaction FSM enabled
[    3.656969] Module dwc_common_port init
[    3.657671] usbcore: registered new interface driver usb-storage
[    3.661498] mousedev: PS/2 mouse device common for all mice
[    3.669132] sdhci: Secure Digital Host Controller Interface driver
[    3.672648] sdhci: Copyright(c) Pierre Ossman
[    3.676899] sdhci-pltfm: SDHCI platform and OF driver helper
[    3.681762] ledtrig-cpu: registered to indicate activity on CPUs
[    3.686524] hid: raw HID events driver (C) Jiri Kosina
[    3.690276] usbcore: registered new interface driver usbhid
[    3.693802] usbhid: USB HID core driver
[    3.705200] Initializing XFRM netlink socket
[    3.709139] NET: Registered PF_PACKET protocol family
[    3.712860] Key type dns_resolver registered
[    3.717207] registered taskstats version 1
[    3.720496] Loading compiled-in X.509 certificates
[    3.742539] uart-pl011 20201000.serial: cts_event_workaround enabled
[    3.746175] 20201000.serial: ttyAMA0 at MMIO 0x20201000 (irq = 81, base_baud = 0) is a PL011 rev2
[    3.757468] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
[    3.761772] bcm2835-power bcm2835-power: Broadcom BCM2835 power domains driver
[    3.768052] mmc-bcm2835 20300000.mmcnr: mmc_debug:0 mmc_debug2:0
[    3.771535] mmc-bcm2835 20300000.mmcnr: DMA channel allocated
[    3.803125] sdhost: log_buf @ (ptrval) (8bd03000)
[    3.855698] mmc0: sdhost-bcm2835 loaded - DMA enabled (>1)
[    3.883185] of_cfs_init
[    3.887392] of_cfs_init: OK
[    3.893814] Waiting for root device PARTUUID=fb77dacb-02...
[    3.963217] mmc0: host does not support reading read-only switch, assuming write-enable
[    3.969841] mmc0: new high speed SDHC card at address aaaa
[    3.975484] mmcblk0: mmc0:aaaa SU32G 29.7 GiB 
[    3.985296]  mmcblk0: p1 p2
[    3.990746] mmcblk0: mmc0:aaaa SU32G 29.7 GiB
[    4.021138] mmc1: new high speed SDIO card at address 0001
[    4.025652] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem
[    4.029180] EXT4-fs (mmcblk0p2): write access will be enabled during recovery
[    4.645008] EXT4-fs (mmcblk0p2): recovery complete
[    4.652774] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[    4.659908] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[    4.672891] devtmpfs: mounted
[    4.683522] Freeing unused kernel image (initmem) memory: 436K
[    4.687220] Kernel memory protection not selected by kernel config.
[    4.690800] Run /sbin/init as init process
[    4.694317]   with arguments:
[    4.694341]     /sbin/init
[    4.694360]   with environment:
[    4.694373]     HOME=/
[    4.694388]     TERM=linux
[    5.343914] systemd[1]: System time before build time, advancing clock.
[    5.519817] NET: Registered PF_INET6 protocol family
[    5.526214] Segment Routing with IPv6
[    5.529914] In-situ OAM (IOAM) with IPv6
[    5.645623] systemd[1]: systemd 247.3-7+rpi1 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +ZSTD +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=unified)
[    5.658634] systemd[1]: Detected architecture arm.
[    5.697216] systemd[1]: Set hostname to <WimPiZeroCamera.WimsWorld>.
[    8.823552] systemd[1]: Queued start job for default target Multi-User System.
[    8.832343] random: systemd: uninitialized urandom read (16 bytes read)
[    8.845466] systemd[1]: Created slice system-getty.slice.
[    8.855414] random: systemd: uninitialized urandom read (16 bytes read)
[    8.862590] systemd[1]: Created slice system-modprobe.slice.
[    8.871824] random: systemd: uninitialized urandom read (16 bytes read)
[    8.879006] systemd[1]: Created slice system-systemd\x2dfsck.slice.
[    8.890763] systemd[1]: Created slice User and Session Slice.
[    8.901199] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[    8.911716] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[    8.924537] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
[    8.939726] systemd[1]: Reached target Local Encrypted Volumes.
[    8.950927] systemd[1]: Reached target Paths.
[    8.961450] systemd[1]: Reached target Slices.
[    8.971718] systemd[1]: Reached target Swap.
[    8.992662] systemd[1]: Listening on Syslog Socket.
[    9.004199] systemd[1]: Listening on fsck to fsckd communication Socket.
[    9.014989] systemd[1]: Listening on initctl Compatibility Named Pipe.
[    9.027787] systemd[1]: Listening on Journal Audit Socket.
[    9.039590] systemd[1]: Listening on Journal Socket (/dev/log).
[    9.051807] systemd[1]: Listening on Journal Socket.
[    9.064158] systemd[1]: Listening on udev Control Socket.
[    9.075266] systemd[1]: Listening on udev Kernel Socket.
[    9.086732] systemd[1]: Condition check resulted in Huge Pages File System being skipped.
[    9.105301] systemd[1]: Mounting POSIX Message Queue File System...
[    9.142938] systemd[1]: Mounting RPC Pipe File System...
[    9.196885] systemd[1]: Mounting Kernel Debug File System...
[    9.263061] systemd[1]: Mounting Kernel Trace File System...
[    9.283089] systemd[1]: Condition check resulted in Kernel Module supporting RPCSEC_GSS being skipped.
[    9.326171] systemd[1]: Starting Restore / save the current clock...
[    9.375407] systemd[1]: Starting Set the console keyboard layout...
[    9.444206] systemd[1]: Starting Create list of static device nodes for the current kernel...
[    9.573546] systemd[1]: Starting Load Kernel Module configfs...
[    9.644045] systemd[1]: Starting Load Kernel Module drm...
[    9.715011] systemd[1]: Starting Load Kernel Module fuse...
[    9.772720] systemd[1]: Condition check resulted in Set Up Additional Binary Formats being skipped.
[    9.883008] systemd[1]: Starting File System Check on Root Device...
[    9.959381] fuse: init (API version 7.34)
[   10.056397] systemd[1]: Starting Journal Service...
[   10.173562] systemd[1]: Starting Load Kernel Modules...
[   10.293577] systemd[1]: Starting Coldplug All udev Devices...
[   10.497717] systemd[1]: Mounted POSIX Message Queue File System.
[   10.568086] systemd[1]: Mounted RPC Pipe File System.
[   10.656644] systemd[1]: Mounted Kernel Debug File System.
[   10.735604] systemd[1]: Mounted Kernel Trace File System.
[   10.825311] systemd[1]: Finished Restore / save the current clock.
[   10.894803] systemd[1]: Finished Create list of static device nodes for the current kernel.
[   10.961170] systemd[1]: modprobe@configfs.service: Succeeded.
[   11.025586] systemd[1]: Finished Load Kernel Module configfs.
[   11.079411] systemd[1]: modprobe@drm.service: Succeeded.
[   11.132309] systemd[1]: Finished Load Kernel Module drm.
[   11.185670] systemd[1]: modprobe@fuse.service: Succeeded.
[   11.242902] systemd[1]: Finished Load Kernel Module fuse.
[   11.312343] systemd[1]: Finished Load Kernel Modules.
[   11.428197] systemd[1]: Mounting FUSE Control File System...
[   11.602844] systemd[1]: Mounting Kernel Configuration File System...
[   11.723998] systemd[1]: Started File System Check Daemon to report status.
[   11.863618] systemd[1]: Starting Apply Kernel Variables...
[   12.002325] systemd[1]: Finished File System Check on Root Device.
[   12.076580] systemd[1]: Mounted FUSE Control File System.
[   12.137696] systemd[1]: Mounted Kernel Configuration File System.
[   12.283330] systemd[1]: Starting Remount Root and Kernel File Systems...
[   12.454112] systemd[1]: Finished Apply Kernel Variables.
[   12.531005] systemd[1]: Started Journal Service.
[   13.322293] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null). Quota mode: none.
[   13.886004] systemd-journald[100]: Received client request to flush runtime journal.
[   13.928907] systemd-journald[100]: File /var/log/journal/68fa56d97f7c4ad18b377cc5780ee614/system.journal corrupted or uncleanly shut down, renaming and replacing.
[   18.180305] mc: Linux media interface: v0.10
[   18.288049] vc_sm_cma: module is from the staging directory, the quality is unknown, you have been warned.
[   18.290893] bcm2835_vc_sm_cma_probe: Videocore shared memory driver
[   18.290953] [vc_sm_connected_init]: start
[   18.343502] [vc_sm_connected_init]: installed successfully
[   18.492369] videodev: Linux video capture interface: v2.00
[   18.606837] bcm2835_mmal_vchiq: module is from the staging directory, the quality is unknown, you have been warned.
[   18.610017] bcm2835_mmal_vchiq: module is from the staging directory, the quality is unknown, you have been warned.
[   18.622220] bcm2835_mmal_vchiq: module is from the staging directory, the quality is unknown, you have been warned.
[   18.648452] bcm2835_isp: module is from the staging directory, the quality is unknown, you have been warned.
[   18.651155] bcm2835_v4l2: module is from the staging directory, the quality is unknown, you have been warned.
[   18.707824] bcm2835-isp bcm2835-isp: Device node output[0] registered as /dev/video13
[   18.723636] bcm2835-isp bcm2835-isp: Device node capture[0] registered as /dev/video14
[   18.726664] bcm2835-isp bcm2835-isp: Device node capture[1] registered as /dev/video15
[   18.736682] bcm2835-isp bcm2835-isp: Device node stats[2] registered as /dev/video16
[   18.738200] bcm2835-isp bcm2835-isp: Register output node 0 with media controller
[   18.738293] bcm2835-isp bcm2835-isp: Register capture node 1 with media controller
[   18.738336] bcm2835-isp bcm2835-isp: Register capture node 2 with media controller
[   18.738374] bcm2835-isp bcm2835-isp: Register capture node 3 with media controller
[   18.740160] bcm2835_codec: module is from the staging directory, the quality is unknown, you have been warned.
[   18.758906] snd_bcm2835: module is from the staging directory, the quality is unknown, you have been warned.
[   18.782242] bcm2835-isp bcm2835-isp: Device node output[0] registered as /dev/video20
[   18.803152] bcm2835_audio bcm2835_audio: there is not valid maps for state default
[   18.806862] bcm2835-isp bcm2835-isp: Device node capture[0] registered as /dev/video21
[   18.809409] bcm2835-isp bcm2835-isp: Device node capture[1] registered as /dev/video22
[   18.823238] bcm2835-isp bcm2835-isp: Device node stats[2] registered as /dev/video23
[   18.823323] bcm2835-isp bcm2835-isp: Register output node 0 with media controller
[   18.823374] bcm2835-isp bcm2835-isp: Register capture node 1 with media controller
[   18.823412] bcm2835-isp bcm2835-isp: Register capture node 2 with media controller
[   18.823447] bcm2835-isp bcm2835-isp: Register capture node 3 with media controller
[   18.825769] bcm2835-isp bcm2835-isp: Loaded V4L2 bcm2835-isp
[   18.840766] bcm2835-codec bcm2835-codec: Device registered as /dev/video10
[   18.840912] bcm2835-codec bcm2835-codec: Loaded V4L2 decode
[   18.871541] bcm2835-codec bcm2835-codec: Device registered as /dev/video11
[   18.871647] bcm2835-codec bcm2835-codec: Loaded V4L2 encode
[   18.907048] bcm2835-codec bcm2835-codec: Device registered as /dev/video12
[   18.907151] bcm2835-codec bcm2835-codec: Loaded V4L2 isp
[   18.924107] bcm2835-codec bcm2835-codec: Device registered as /dev/video18
[   18.924213] bcm2835-codec bcm2835-codec: Loaded V4L2 image_fx
[   18.947826] bcm2835-codec bcm2835-codec: Device registered as /dev/video31
[   18.947931] bcm2835-codec bcm2835-codec: Loaded V4L2 encode_image
[   19.858213] i2c i2c-11: Added multiplexed i2c bus 0
[   19.859223] i2c 10-0036: Fixing up cyclic dependency with 20801000.csi
[   19.860015] i2c i2c-11: Added multiplexed i2c bus 10
[   21.188839] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   21.706164] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[   21.750115] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
[   22.412389] brcmfmac: F1 signature read @0x18000000=0x1541a9a6
[   22.561652] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[   22.563589] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.bin failed with error -2
[   22.572818] usbcore: registered new interface driver brcmfmac
[   22.885833] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[   22.886140] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[   22.899684] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Jul 19 2021 03:24:18 version 7.45.98 (TOB) (56df937 CY) FWID 01-8e14b897
[   23.403642] checking generic (1eaa9000 151800) vs hw (0 ffffffff)
[   23.403700] fb0: switching to vc4 from simple
[   23.460836] Console: switching to colour dummy device 80x30
[   23.502302] vc4-drm soc:gpu: bound 20400000.hvs (ops vc4_hvs_ops [vc4])
[   23.572366] Registered IR keymap rc-cec
[   23.572797] rc rc0: vc4 as /devices/platform/soc/20902000.hdmi/rc/rc0
[   23.573285] input: vc4 as /devices/platform/soc/20902000.hdmi/rc/rc0/input0
[   28.080722] 8021q: 802.1Q VLAN Support v1.8
[   29.503575] uart-pl011 20201000.serial: no DMA platform data
[   29.815882] Adding 102396k swap on /var/swap.  Priority:-2 extents:4 across:249856k SSFS
[   30.952146] random: crng init done
[   30.952182] random: 7 urandom warning(s) missed due to ratelimiting
[   33.878808] Bluetooth: Core ver 2.22
[   33.878983] NET: Registered PF_BLUETOOTH protocol family
[   33.879004] Bluetooth: HCI device and connection manager initialized
[   33.879041] Bluetooth: HCI socket layer initialized
[   33.879065] Bluetooth: L2CAP socket layer initialized
[   33.879109] Bluetooth: SCO socket layer initialized
[   33.898769] Bluetooth: HCI UART driver ver 2.3
[   33.898816] Bluetooth: HCI UART protocol H4 registered
[   33.898969] Bluetooth: HCI UART protocol Three-wire (H5) registered
[   33.899327] Bluetooth: HCI UART protocol Broadcom registered
[   34.402009] cam-dummy-reg: disabling
[   34.922194] vc4-drm soc:gpu: bound 20400000.hvs (ops vc4_hvs_ops [vc4])
[   34.942692] Registered IR keymap rc-cec
[   34.942995] rc rc0: vc4 as /devices/platform/soc/20902000.hdmi/rc/rc0
[   34.943342] input: vc4 as /devices/platform/soc/20902000.hdmi/rc/rc0/input1
[   34.951397] vc4-drm soc:gpu: bound 20902000.hdmi (ops vc4_hdmi_ops [vc4])
[   34.962416] vc4-drm soc:gpu: bound 20004000.txp (ops vc4_txp_ops [vc4])
[   34.963176] vc4-drm soc:gpu: bound 20206000.pixelvalve (ops vc4_crtc_ops [vc4])
[   34.963844] vc4-drm soc:gpu: bound 20207000.pixelvalve (ops vc4_crtc_ops [vc4])
[   34.964501] vc4-drm soc:gpu: bound 20807000.pixelvalve (ops vc4_crtc_ops [vc4])
[   34.965047] vc4-drm soc:gpu: bound 20c00000.v3d (ops vc4_v3d_ops [vc4])
[   35.004689] [drm] Initialized vc4 0.0.0 20140616 for soc:gpu on minor 0
[   35.005276] vc4-drm soc:gpu: [drm] Cannot find any crtc or sizes
[   36.267635] ov5647 10-0036: Consider updating driver ov5647 to match on endpoints
[   37.037078] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   37.037123] Bluetooth: BNEP filters: protocol multicast
[   37.037157] Bluetooth: BNEP socket layer initialized
[   37.216575] NET: Registered PF_ALG protocol family
[   39.103893] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   40.789395] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[   42.261353] ICMPv6: process `dhcpcd' is using deprecated sysctl (syscall) net.ipv6.neigh.wlan0.retrans_time - use net.ipv6.neigh.wlan0.retrans_time_ms instead
[   45.282398] vc4-drm soc:gpu: [drm] Cannot find any crtc or sizes
[   86.203912] 8<--- cut here ---
[   86.203998] Unable to handle kernel paging request at virtual address bfa0dc9c
[   86.204036] pgd = 4ed01598
[   86.204067] [bfa0dc9c] *pgd=00000000
[   86.204113] Internal error: Oops: 80000005 [#1] ARM
[   86.204142] Modules linked in: cmac algif_hash aes_arm aes_generic ecb algif_skcipher af_alg bnep ov5647 snd_soc_hdmi_codec hci_uart btbcm bluetooth ecdh_generic ecc libaes 8021q garp stp llc vc4 brcmfmac cec brcmutil sha256_generic libsha256 drm_kms_helper cfg80211 snd_soc_core snd_compress snd_pcm_dmaengine syscopyarea rfkill sysfillrect i2c_mux_pinctrl sysimgblt raspberrypi_hwmon fb_sys_fops i2c_mux bcm2835_unicam v4l2_dv_timings v4l2_fwnode v4l2_async snd_bcm2835(C) bcm2835_codec(C) i2c_bcm2835 bcm2835_v4l2(C) v4l2_mem2mem bcm2835_isp(C) bcm2835_mmal_vchiq(C) snd_pcm videobuf2_vmalloc videobuf2_dma_contig videobuf2_memops videobuf2_v4l2 snd_timer videobuf2_common snd vc_sm_cma(C) videodev mc uio_pdrv_genirq fixed uio fuse drm drm_panel_orientation_quirks backlight ip_tables x_tables ipv6
[   86.204627] CPU: 0 PID: 704 Comm: libcamera-vid Tainted: G         C        5.15.32+ #1538
[   86.204667] Hardware name: BCM2835
[   86.204687] PC is at 0xbfa0dc9c
[   86.204718] LR is at video_usercopy+0x4e8/0x5a8 [videodev]
[   86.205310] pc : [<bfa0dc9c>]    lr : [<bf1d1c90>]    psr: 60000013
[   86.205338] sp : c2d2de10  ip : c2d2de10  fp : c2d2deec
[   86.205362] r10: c0c1f028  r9 : 00000000  r8 : 00000000
[   86.205386] r7 : c2d2de3c  r6 : 00000000  r5 : c044560f  r4 : c050560f
[   86.205411] r3 : 00000000  r2 : bf1f3a40  r1 : 0a121acf  r0 : c399c2e8
[   86.205437] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   86.205467] Control: 00c5387d  Table: 059d0008  DAC: 00000055
[   86.205490] Register r0 information: slab kmalloc-8k start c399c000 pointer offset 744 size 8192
[   86.205564] Register r1 information: non-paged memory
[   86.205597] Register r2 information: 58-page vmalloc region starting at 0xbf1c9000 allocated at load_module+0xa74/0x25f8
[   86.205667] Register r3 information: NULL pointer
[   86.205696] Register r4 information: non-slab/vmalloc memory
[   86.205727] Register r5 information: non-slab/vmalloc memory
[   86.205755] Register r6 information: NULL pointer
[   86.205780] Register r7 information: non-slab/vmalloc memory
[   86.205809] Register r8 information: NULL pointer
[   86.205834] Register r9 information: NULL pointer
[   86.205862] Register r10 information: non-slab/vmalloc memory
[   86.205896] Register r11 information: non-slab/vmalloc memory
[   86.205924] Register r12 information: non-slab/vmalloc memory
[   86.205952] Process libcamera-vid (pid: 704, stack limit = 0x5546931d)
[   86.205993] Stack: (0xc2d2de10 to 0xc2d2e000)
[   86.206027] de00:                                     c2d2de3b c1b70ea0 c2d2de5c 00000000
[   86.206068] de20: 00000000 00000000 00000000 00000000 c3b2ed20 b58bc074 00c9c038 00000003
[   86.206104] de40: 00000002 00278d00 00004002 00000001 00000000 00000056 00000000 000180b5
[   86.206140] de60: 00000000 00000000 00000000 00000000 00000000 00000000 00000004 0000001d
[   86.206178] de80: 00278d00 00000000 00000000 c2d2de98 c0046c80 c000b100 c13b6014 c1b70ea0
[   86.206216] dea0: c0c2b2c0 c1888ea0 00000000 c41df8c0 c2d2dedc c2d2dec0 c0013798 0a121acf
[   86.206253] dec0: 00000000 bf1d1d50 c3b2ed21 00000000 c3b2ed20 c0c1f028 b58bc074 0000000e
[   86.206292] dee0: c2d2defc c2d2def0 bf1d1d6c bf1d17b4 c2d2df14 c2d2df00 bf1c9148 bf1d1d5c
[   86.206330] df00: c044560f c3b2ed21 c2d2dfa4 c2d2df18 c021fda0 bf1c9108 00000000 c0c1f028
[   86.206369] df20: c0008ff0 00c5387d c2d2df6c c2d2df38 c0014720 c001377c 00000000 00000000
[   86.206406] df40: 00000000 00000000 c0c9c038 60000010 c0008ff0 00c5387d 00000000 c0009104
[   86.206444] df60: c2d2df94 c2d2df70 c00f8f20 c00fa1fc b6968a5c 0a121acf ffffffff b58bc074
[   86.206481] df80: b4f11558 b4f0ba30 00000036 c00083e4 c2d2c000 00000000 00000000 c2d2dfa8
[   86.206518] dfa0: c0008260 c021fc98 b58bc074 b4f11558 0000000e c044560f b58bc074 b6dfb788
[   86.206555] dfc0: b58bc074 b4f11558 b4f0ba30 00000036 0bde9f08 00000014 b6ad9124 01167c88
[   86.206595] dfe0: b6aabe94 b58bc04c b6a354a0 b6bcb1ac 60000010 0000000e 00000000 00000000
[   86.206625] Backtrace: 
[   86.206653] [<bf1d17a8>] (video_usercopy [videodev]) from [<bf1d1d6c>] (video_ioctl2+0x1c/0x24 [videodev])
[   86.207763]  r10:0000000e r9:b58bc074 r8:c0c1f028 r7:c3b2ed20 r6:00000000 r5:c3b2ed21
[   86.207800]  r4:bf1d1d50
[   86.207820] [<bf1d1d50>] (video_ioctl2 [videodev]) from [<bf1c9148>] (v4l2_ioctl+0x4c/0x64 [videodev])
[   86.208594] [<bf1c90fc>] (v4l2_ioctl [videodev]) from [<c021fda0>] (sys_ioctl+0x114/0x9b0)
[   86.209024]  r5:c3b2ed21 r4:c044560f
[   86.209047] [<c021fc8c>] (sys_ioctl) from [<c0008260>] (ret_fast_syscall+0x0/0x1c)
[   86.209094] Exception stack(0xc2d2dfa8 to 0xc2d2dff0)
[   86.209128] dfa0:                   b58bc074 b4f11558 0000000e c044560f b58bc074 b6dfb788
[   86.209167] dfc0: b58bc074 b4f11558 b4f0ba30 00000036 0bde9f08 00000014 b6ad9124 01167c88
[   86.209202] dfe0: b6aabe94 b58bc04c b6a354a0 b6bcb1ac
[   86.209233]  r10:00000000 r9:c2d2c000 r8:c00083e4 r7:00000036 r6:b4f0ba30 r5:b4f11558
[   86.209261]  r4:b58bc074
[   86.209294] Code: bad PC value
[   86.209325] ---[ end trace 573ed3b4c982bd9e ]---

Adding the verbose option gets some interesting information.

pi@WimPiZeroCamera:~ $ libcamera-vid --verbose --timeout 0 --nopreview --listen --output tcp://0.0.0.0:5000
Options:
    verbose: 1
    info_text:#%frame (%fps fps) exp %exp ag %ag dg %dg
    timeout: 0
    width: 640
    height: 480
    output: tcp://0.0.0.0:5000
    post_process_file: 
    rawfull: 0
    preview: none
    qt-preview: 0
    transform: identity
    roi: all
    metering: centre
    exposure: normal
    ev: 0
    awb: auto
    flush: false
    wrap: 0
    brightness: 0
    contrast: 1
    saturation: 1
    sharpness: 1
    framerate: 30
    denoise: auto
    viewfinder-width: 0
    viewfinder-height: 0
    tuning-file: (libcamera)
    lores-width: 0
    lores-height: 0
    mode: unspecified
    viewfinder-mode: unspecified
    bitrate: 0
    profile: 
    level:  
    intra: 0
    inline: 0
    save-pts: 
    codec: h264
    quality (for MJPEG): 50
    keypress: 0
    signal: 0
    initial: record
    split: 0
    segment: 0
    circular: 0
Waiting for client to connect...
Client connection accepted
Running without preview window
Opening camera...
[0:01:26.152722968] [676]  INFO Camera camera_manager.cpp:293 libcamera v0.0.0+3544-22656360
[0:01:26.265051532] [688] ERROR CameraSensor camera_sensor.cpp:591 'ov5647 10-0036': Camera sensor does not support test pattern modes.
[0:01:26.418635710] [688]  INFO RPI raspberrypi.cpp:1356 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0
Acquired camera /base/soc/i2c0mux/i2c@1/ov5647@36
Configuring video...
[0:01:26.426674609] [676]  INFO Camera camera.cpp:1029 configuring streams: (0) 640x480-YUV420
[0:01:26.430277012] [688]  INFO RPI raspberrypi.cpp:760 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 640x480-SGBRG10_1X10 - Selected unicam format: 640x480-pGAA
Camera streams configured
Buffers allocated and mapped
Video setup complete
Opened H264Encoder on /dev/video11 as fd 25
Got 6 output buffers
Got 12 capture buffers
Codec streaming started
Requests created
Camera started!
Viewfinder frame 0
NetOutput: output buffer 0xb3463000 size 10770
Viewfinder frame 1
NetOutput: output buffer 0xb33e3000 size 5366
Viewfinder frame 2
NetOutput: output buffer 0xb3363000 size 5147
Viewfinder frame 3
NetOutput: output buffer 0xb32e3000 size 8520
Viewfinder frame 4
NetOutput: output buffer 0xb3263000 size 14873
Viewfinder frame 5
NetOutput: output buffer 0xb31e3000 size 17447
Viewfinder frame 6
NetOutput: output buffer 0xb3163000 size 17869
Viewfinder frame 7
NetOutput: output buffer 0xb30e3000 size 17804
Viewfinder frame 8
NetOutput: output buffer 0xb3063000 size 18022
Viewfinder frame 9
NetOutput: output buffer 0xb2fe3000 size 17997
Viewfinder frame 10
NetOutput: output buffer 0xb2f63000 size 17849
Viewfinder frame 11
NetOutput: output buffer 0xb2ee3000 size 17926
Viewfinder frame 12
NetOutput: output buffer 0xb3463000 size 18017
Viewfinder frame 13
NetOutput: output buffer 0xb33e3000 size 18010
Viewfinder frame 14
NetOutput: output buffer 0xb3363000 size 18047

Each time I try higher resolution, the pi program crashes, and sometimes it leaves the pi completely nonresponsive on the network, requiring a power cycle to recover it.

Using FFMPEG to Concatenate and Embed Subtitles

I recently upgraded my drone to a DJI Mavic Air 2. Among other things, it can create h.265 videos directly. It still uses the MP4 container format and the separate SRT format for storing video subtitles, the flight data. Following most camera standards, it creates video files that are individually smaller than 4 GB, which works out to be about five minutes in 4k video.

If I want to upload a longer raw video to social media, the video files need to be concatenated before uploading.

Concatenating the video with FFMPEG has been something I’ve known how to do for a long time using either of two methods. Today I learned how to properly embed the subtitles in either the MKV or MP4 container format.

The MP4 format is more widely supported than the MKV format, but is less flexible as to what it can contain.  The MKV (Matroska Multimedia Container) container format can hold almost any type of media, and so I’m able to copy the SRT format directly. The MP4 (MPEG-4 Part 14) container format only supports a limited selection of subtitle formats, so I’m required to have FFMPEG convert the SRT stream to a MP4 compatible stream.  If you are interested in video container formats, these tables are very helpful.

I’ll give several examples using the two video files and their associated subtitle files created by the drone named DJI00001.MP4, DJI00002.MP4, DJI00001.SRT, and DJI00002.SRT. The method I’m using should work for any number of files, up to the largest filesize you can store on your filesystem.

To simply concatenate the video files, create a text input file (I’m using mp4files.txt) with the contents as follows

file DJI00001.MP4
file DJI00001.MP4

then use the ffmpeg command to create a new concatenated file.

ffmpeg -f concat -safe 0 -i mp4files.txt -c copy ConcatenatedVideo.MP4

If you want to embed the subtitles, you need to create a second text file, do some stream mapping, and specify what format the subtitles should be. In this case I’m using srtfiles.txt

file DJI00001.SRT
file DJI00002.SRT

My FFMPEG command to create an MP4 file gets a lot more involved because now I’m specifying multiple inputs and have to specify the subtitle format.

ffmpeg -f concat -safe 0 -i mp4files.txt -f concat -safe 0 -i srtfiles.txt -map 0:v -map 1 -c:v copy -c:s mov_text ConcatenatedVideo.MP4

The FFMPEG command to create an MKV command is only a tiny bit different, and the resulting file is only a tiny bit smaller.

ffmpeg -f concat -safe 0 -i mp4files.txt -f concat -safe 0 -i srtfiles.txt -map 0:v -map 1 -c:v copy -c:s copy ConcatenatedVideo.MKV

When playing the ConcatenatedVideo files on my local machine, I can now enable or disable the closed caption track properly in the player for either format. Unfortunately in my initial testing with YouTube, neither format maintains the second stream of subtitles.

This is not all a waste of time and effort, because an advantage of embedding the subtitles into the container format is that the timing has been matched to the video, and can now be extracted in a concatenated form for use with YouTube.

ffmpeg -i ConcatenatedVideo.MKV -c copy ConcatenatedVideo.SRT

You can exclude the “-c copy” when extracting the subtitles and FFMPEG fill run it through its subrip codec and produce nearly identical results. It will only work with the MKV file because the subtitle format stored in the MP4 file is not easily converted to a SRT file.

Using the -f concat option invokes the concat demuxer in FFMPEG, which has the limitation that the format needs to be exactly the same for each file. If there are any changes between files you want to concatenate, you must use a more involved command invoking the concat filter. In a different project I ran into a command issue with the concat filter command when the command got to be much over 900 characters long.

 

Raspberry Pi ZeroW Camera Focus with FFMPEG

I wanted a quick and dirty method to test my camera module installation on my Raspberry Pi ZeroW installation. I don’t have a monitor connected to the Raspberry, and explicitly did not install the desktop version of the operating system. This is especially important because the camera itself may not be properly focused after installation in the case, and the only way to easily focus the camera is with a video stream allowing you to make small adjustments and see them nearly real time.

I’ve used FFMPEG for years as it handles almost any kind of video or audio I can throw at it. I use VLC on my desktop machine for similar reasons.

I did a quick install of ffmpeg on my Pi with the following command, allowing it to install all the requirements, adding up to almost 126 new packages and 56MB that needed to be downloaded and installed.

sudo apt-get install ffmpeg -y

After it finished installing, I was able to run the following command with the 192.168.0.16 address being my desktop computer.

ffmpeg -f video4linux2 -input_format h264 -video_size 1280x720 -framerate 30 -i /dev/video0 -vcodec copy -an -f mpegts udp://192.168.0.16:5000?pkt_size=1316

On my desktop computer I ran VLC, under the Media menu, selected Open Network Stream, and opened:

udp://@0.0.0.0:5000

2019-09-23 (1)2019-09-23 (2)

What I’m doing is to use FFMPEG to pull video from the device and push it using UDP datagrams at my desktop on port 5000. Then VLC opens a port on the local machine at port 5000 to receive the datagrams and it decodes and displays the video. An interesting thing about this method is that I can stop transmitting from the raspberry, then restart it, and VLC will accept the packets since UDP is a connectionless protocol.

What really surprised me was that when I logged in a second time to my Raspberry Pi to view the CPU usage for streaming, it was only running around 12% of the CPU. I was interested in knowing what native formats the camera supported..

ffmpeg -f v4l2 -list_formats all -i /dev/video0
ffmpeg version 4.1.4-1+rpt1~deb10u1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8 (Raspbian 8.3.0-6+rpi1)
  configuration: --prefix=/usr --extra-version='1+rpt1~deb10u1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
[video4linux2,v4l2 @ 0x2367e40] Raw       :     yuv420p :     Planar YUV 4:2:0 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :     yuyv422 :           YUYV 4:2:2 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :       rgb24 :     24-bit RGB 8-8-8 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Compressed:       mjpeg :            JFIF JPEG : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Compressed:        h264 :                H.264 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Compressed:       mjpeg :          Motion-JPEG : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       : Unsupported :           YVYU 4:2:2 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       : Unsupported :           VYUY 4:2:2 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :     uyvy422 :           UYVY 4:2:2 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :        nv12 :         Y/CbCr 4:2:0 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :       bgr24 :     24-bit BGR 8-8-8 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :     yuv420p :     Planar YVU 4:2:0 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       : Unsupported :         Y/CrCb 4:2:0 : {32-3280, 2}x{32-2464, 2}
[video4linux2,v4l2 @ 0x2367e40] Raw       :        bgr0 : 32-bit BGRA/X 8-8-8-8 : {32-3280, 2}x{32-2464, 2}
/dev/video0: Immediate exit requested

That output leads me to believe that the camera module could output either h264 or mjpeg without significant CPU overhead. What it doesn’t do is tell me efficient frame sizes. It seems to say that horizontal and vertical sizes can be anything between 32 to 3280 and 32 to 2464. I know that the specs on the camera say that it will run still frames at the high resolution, but video is significantly less.

Two Video4Linux commands that return interesting and similar results are:

pi@WimPiZeroCamera:~ $ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'YU12' (Planar YUV 4:2:0)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [2]: 'RGB3' (24-bit RGB 8-8-8)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [3]: 'JPEG' (JFIF JPEG, compressed)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [4]: 'H264' (H.264, compressed)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [5]: 'MJPG' (Motion-JPEG, compressed)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [6]: 'YVYU' (YVYU 4:2:2)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [7]: 'VYUY' (VYUY 4:2:2)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [8]: 'UYVY' (UYVY 4:2:2)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [9]: 'NV12' (Y/CbCr 4:2:0)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [10]: 'BGR3' (24-bit BGR 8-8-8)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [11]: 'YV12' (Planar YVU 4:2:0)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [12]: 'NV21' (Y/CrCb 4:2:0)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
        [13]: 'BGR4' (32-bit BGRA/X 8-8-8-8)
                Size: Stepwise 32x32 - 3280x2464 with step 2/2
pi@WimPiZeroCamera:~ $ v4l2-ctl -L

User Controls

                     brightness 0x00980900 (int)    : min=0 max=100 step=1 default=50 value=50 flags=slider
                       contrast 0x00980901 (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                     saturation 0x00980902 (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                    red_balance 0x0098090e (int)    : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
                   blue_balance 0x0098090f (int)    : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
                horizontal_flip 0x00980914 (bool)   : default=0 value=0
                  vertical_flip 0x00980915 (bool)   : default=0 value=0
           power_line_frequency 0x00980918 (menu)   : min=0 max=3 default=1 value=1
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
                                3: Auto
                      sharpness 0x0098091b (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                  color_effects 0x0098091f (menu)   : min=0 max=15 default=0 value=0
                                0: None
                                1: Black & White
                                2: Sepia
                                3: Negative
                                4: Emboss
                                5: Sketch
                                6: Sky Blue
                                7: Grass Green
                                8: Skin Whiten
                                9: Vivid
                                10: Aqua
                                11: Art Freeze
                                12: Silhouette
                                13: Solarization
                                14: Antique
                                15: Set Cb/Cr
                         rotate 0x00980922 (int)    : min=0 max=360 step=90 default=0 value=0 flags=modify-layout
             color_effects_cbcr 0x0098092a (int)    : min=0 max=65535 step=1 default=32896 value=32896

Codec Controls

             video_bitrate_mode 0x009909ce (menu)   : min=0 max=1 default=0 value=0 flags=update
                                0: Variable Bitrate
                                1: Constant Bitrate
                  video_bitrate 0x009909cf (int)    : min=25000 max=25000000 step=25000 default=10000000 value=10000000
         repeat_sequence_header 0x009909e2 (bool)   : default=0 value=0
            h264_i_frame_period 0x00990a66 (int)    : min=0 max=2147483647 step=1 default=60 value=60
                     h264_level 0x00990a67 (menu)   : min=0 max=11 default=11 value=11
                                0: 1
                                1: 1b
                                2: 1.1
                                3: 1.2
                                4: 1.3
                                5: 2
                                6: 2.1
                                7: 2.2
                                8: 3
                                9: 3.1
                                10: 3.2
                                11: 4
                   h264_profile 0x00990a6b (menu)   : min=0 max=4 default=4 value=4
                                0: Baseline
                                1: Constrained Baseline
                                2: Main
                                4: High

Camera Controls

                  auto_exposure 0x009a0901 (menu)   : min=0 max=3 default=0 value=0
                                0: Auto Mode
                                1: Manual Mode
         exposure_time_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=1000 value=1000
     exposure_dynamic_framerate 0x009a0903 (bool)   : default=0 value=0
             auto_exposure_bias 0x009a0913 (intmenu): min=0 max=24 default=12 value=12
                                0: -4000 (0xfffffffffffff060)
                                1: -3667 (0xfffffffffffff1ad)
                                2: -3333 (0xfffffffffffff2fb)
                                3: -3000 (0xfffffffffffff448)
                                4: -2667 (0xfffffffffffff595)
                                5: -2333 (0xfffffffffffff6e3)
                                6: -2000 (0xfffffffffffff830)
                                7: -1667 (0xfffffffffffff97d)
                                8: -1333 (0xfffffffffffffacb)
                                9: -1000 (0xfffffffffffffc18)
                                10: -667 (0xfffffffffffffd65)
                                11: -333 (0xfffffffffffffeb3)
                                12: 0 (0x0)
                                13: 333 (0x14d)
                                14: 667 (0x29b)
                                15: 1000 (0x3e8)
                                16: 1333 (0x535)
                                17: 1667 (0x683)
                                18: 2000 (0x7d0)
                                19: 2333 (0x91d)
                                20: 2667 (0xa6b)
                                21: 3000 (0xbb8)
                                22: 3333 (0xd05)
                                23: 3667 (0xe53)
                                24: 4000 (0xfa0)
      white_balance_auto_preset 0x009a0914 (menu)   : min=0 max=9 default=1 value=1
                                0: Manual
                                1: Auto
                                2: Incandescent
                                3: Fluorescent
                                4: Fluorescent H
                                5: Horizon
                                6: Daylight
                                7: Flash
                                8: Cloudy
                                9: Shade
            image_stabilization 0x009a0916 (bool)   : default=0 value=0
                iso_sensitivity 0x009a0917 (intmenu): min=0 max=4 default=0 value=0
                                0: 0 (0x0)
                                1: 100000 (0x186a0)
                                2: 200000 (0x30d40)
                                3: 400000 (0x61a80)
                                4: 800000 (0xc3500)
           iso_sensitivity_auto 0x009a0918 (menu)   : min=0 max=1 default=1 value=1
                                0: Manual
                                1: Auto
         exposure_metering_mode 0x009a0919 (menu)   : min=0 max=2 default=0 value=0
                                0: Average
                                1: Center Weighted
                                2: Spot
                     scene_mode 0x009a091a (menu)   : min=0 max=13 default=0 value=0
                                0: None
                                8: Night
                                11: Sports

JPEG Compression Controls

            compression_quality 0x009d0903 (int)    : min=1 max=100 step=1 default=30 value=30

 

 

USPS Informed Delivery Daily Digest and Netflix DVDs

I use the USPS service Informed Delivery and highly recommend it. I get a daily email from USPS with a scanned picture of most of the mail that will arrive in my mailbox that day. Occasionally the email will say that there were items that could not be scanned, but it’s very useful since I don’t check my mailbox on a daily basis, but don’t want to have important items sit for extended times.

My mailbox is fairly secure, but I’ve also read that Informed Delivery has both good and bad features for people related to mail theft or identity theft.

I’ve been getting Netflix DVDs in the mail since 2000.  I’ve always been slightly fascinated with the efficiencies the post office and Netflix have worked out. If I take a DVD mailer to my local post office here in Seattle, Netflix recognizes it has been returned the next business day. If I drop a DVD at the local post office on Tuesday, Netflix acknowledges it on Wednesday, and I’ve usually got the next DVD delivered Thursday.

Until recently the Netflix DVDs were scanned like all other mail.

2019-09-13 (3)

It appears to have changed at the beginning of September. Now there’s a pair of fixed images arriving with a link that will take you directly to Netflix.

2019-09-13 (2)

The new behavior isn’t bad since all the Netflix disk scans look very similar, but are interesting to note. I wouldn’t be surprised that the new full color image reduces bandwidth over individual scans along with added benefit of the link to Netflix.

Part 3 of ROAV Dash Cam C1 Pro

After getting the video files from my dashcam strung together at high speed I realized I was just as interested in the GPS data that was stored in .info files alongside each .mp4 file.

Some digging around in forums led me to believe that the files were fairly simple comma separated files with the headers working out to be Datetime, Latitude, Longitude, FixType, SatCount, Altitude, SpeedKph, Heading, AccelerometerX, AccelerometerY, AccelerometerZ. The Datetime field is it’s own special format, but easy enough to interpret.

Because I’ve written a GPS data app in the past, I’d learned how to write Keyhole Markup Language (KML) files, as well as learning to use ZIP routines to package them into KMZ files. My original code had hard coded the KML tags because I didn’t want to rely on an external library requirement on a limited platform. In re-using the code I updated to use the XMLLite API. Microsoft may be discontinuing support for this API as well, but at least now it’s still included with current operating systems. The advantage of using the XML API to create the XML is knowing that all of the tags are properly and consistently formed and closed. A secondary feature was that it made it much simpler to explore different data formatting options for the folders in the KML structure.

ROAV-ConCatStructureI worked on the basic idea that the most interesting data from the source files was based on speed and altitude. Then I broke the data into segments by the day, so if I store multiple days worth of files the kml will automatically have reasonable breaks in it. I create a Placemark that includes a LineString with all the GPS coordinates for the day. I calculate the distance by multiplying the reported speed by the time between points.

The calculated distance isn’t as accurate as I’d like, but the code I had from years ago didn’t seem to get more accurate distances. My web references from years ago no longer work, which is the frustrating thing about pointing to documentation on the web. The code I’d used years before was used in a bicycle gps program, which meant that the speeds were slower and the distance traveled between points may have been smaller. The data the ROAV is writing to the log file may not have as many significant digits as the raw data available from the the GPS chip itself.

I create three more Placemarks for each day, each with a simple Point defined. Max Speed, Max Altitude, and Min Altitude. Each of those data points is selected from a simple scan of the input data.

ROAV-ConCatVideo

By creating a large KML file and then converting it to a KMZ, it becomes a manageable size. KMZ files load into google earth significantly faster then KML files. One of the interesting things that you can do in Google Earth is display the elevation profile of a path.

ROAV-ConCatVideoElevation

On this day you can see that I started at just under 4500 feet, drove over 6000 feet, then down to 1733 feet before ending the day near 2500 feet. When playing with the desktop app, you can drag a marker along the path and it will coordinate a marker along the elevation profile.

I’ve added this code to my ROAV-Concat program, as well as parameters that can tell the program to not output KML or MP4. this allows me to run the program and just generate the KMZ or MP4 file, though beyond during debugging I can’t think of a reason I’d not want both files generated.

I’m hoping that understanding all of this data will allow me to generate text to overlay the video with GPS data beyond what was embedded by the original dashcam.

Part 2 of FFMPEG and ROAV Dash Cam C1 Pro

While writing my software to concatenate and speed up the video files from my ROAV Dashcam I ran into an interesting issue with FFMPEG.

The -filter_complex option seems to stop parsing it’s parameters somewhere above 960 characters on the command line. I didn’t narrow down the exact point, or go digging in the FFMPEG source code to find the size. I expect this is an arbitrary buffer size in FFMPEG. I may contribute to the source code since it fails with no explanation, even when generating a report file. Learning the FFMPEG source structure in itself is a large task, meaning that I’ve not found time to do anything beyond find a workaround.

My workaround was to recognize when the command size will get long and fall back to using the -f concat option with a temporary file listing the input files instead of using the complex filtergraph.

The advantage of the complex filtergraph is twofold. It does not require a secondary input file or any cleanup. It can deal with input files that change resolution if necessary.

Here’s an example of the complex filtergraph:

ffmpeg.exe -report -i 2018_0705_101335_006.MP4 -i 2018_0705_101635_007.MP4 -i 2018_0705_101935_008.MP4 -i 2018_0705_102235_009.MP4 -i 2018_0705_102535_010.MP4 -i 2018_0705_102835_011.MP4 -i 2018_0705_103135_012.MP4 -i 2018_0705_103435_013.MP4 -i 2018_0705_103613_014A.MP4 -i 2018_0705_103615_015A.MP4 -i 2018_0705_104449_016A.MP4 -i 2018_0705_104750_017A.MP4 -i 2018_0705_105050_018A.MP4 -i 2018_0705_105350_019A.MP4 -i 2018_0705_105650_020A.MP4 -i 2018_0705_105950_021A.MP4 -i 2018_0705_110250_022A.MP4 -i 2018_0705_110550_023A.MP4 -i 2018_0705_110850_024A.MP4 -i 2018_0705_143415_025.MP4 -i 2018_0705_143716_026.MP4 -i 2018_0705_144016_027.MP4 -i 2018_0705_144316_028.MP4 -i 2018_0705_144616_029.MP4 -i 2018_0705_144916_030.MP4 -i 2018_0705_145216_031.MP4 -i 2018_0705_145516_032.MP4 -i 2018_0705_145816_033.MP4 -i 2018_0705_150116_034.MP4 -i 2018_0705_150416_035.MP4 -i 2018_0705_150716_036.MP4 -i 2018_0705_151016_037.MP4 -i 2018_0705_151316_038.MP4 -i 2018_0705_151616_039.MP4 -i 2018_0705_151916_040.MP4 -i 2018_0705_152216_041.MP4 -i 2018_0705_152516_042.MP4 -i 2018_0705_152816_043.MP4 -i 2018_0705_153116_044.MP4 -i 2018_0705_153416_045.MP4 -i 2018_0705_153716_046.MP4 -i 2018_0705_154016_047.MP4 -i 2018_0705_154316_048.MP4 -i 2018_0705_154616_049.MP4 -i 2018_0705_154916_050.MP4 -i 2018_0705_155216_051.MP4 -i 2018_0705_155516_052.MP4 -i 2018_0705_155816_053.MP4 -i 2018_0705_160116_054.MP4 -i 2018_0705_160416_055.MP4 -i 2018_0705_160716_056.MP4 -i 2018_0705_161016_057.MP4 -i 2018_0705_161316_058.MP4 -i 2018_0705_161616_059.MP4 -i 2018_0705_161916_060.MP4 -i 2018_0705_162216_061.MP4 -i 2018_0705_162516_062.MP4 -i 2018_0705_162816_063.MP4 -i 2018_0705_163116_064.MP4 -i 2018_0705_163416_065.MP4 -i 2018_0705_163716_066.MP4 -i 2018_0705_164016_067.MP4 -i 2018_0705_164316_068.MP4 -i 2018_0705_164616_069.MP4 -i 2018_0705_164916_070.MP4 -i 2018_0705_165215_071.MP4 -i 2018_0705_165516_072.MP4 -i 2018_0705_165815_073.MP4 -i 2018_0705_170115_074.MP4 -i 2018_0705_170415_075.MP4 -i 2018_0705_170715_076.MP4 -i 2018_0705_171015_077.MP4 -i 2018_0705_171315_078.MP4 -i 2018_0705_171615_079.MP4 -i 2018_0705_171915_080.MP4 -i 2018_0705_172216_081.MP4 -i 2018_0705_172515_082.MP4 -i 2018_0705_172815_083.MP4 -i 2018_0705_173115_084.MP4 -i 2018_0705_173415_085.MP4 -i 2018_0705_173715_086.MP4 -i 2018_0705_174015_087.MP4 -i 2018_0705_174315_088.MP4 -i 2018_0705_174615_089.MP4 -i 2018_0705_174915_090.MP4 -i 2018_0705_175215_091.MP4 -i 2018_0705_175515_092.MP4 -i 2018_0705_175815_093.MP4 -i 2018_0705_180115_094.MP4 -i 2018_0705_180415_095.MP4 -i 2018_0705_180715_096.MP4 -i 2018_0705_181015_097.MP4 -i 2018_0705_181315_098.MP4 -i 2018_0705_181615_099.MP4 -i 2018_0705_181915_100.MP4 -i 2018_0705_182215_101.MP4 -i 2018_0705_182515_102.MP4 -i 2018_0705_182815_103.MP4 -i 2018_0705_183115_104.MP4 -i 2018_0705_183415_105.MP4 -i 2018_0705_183715_106.MP4 -i 2018_0705_184015_107.MP4 -i 2018_0705_184315_108.MP4 -i 2018_0705_184615_109.MP4 -i 2018_0705_184915_110.MP4 -i 2018_0705_185215_111.MP4 -i 2018_0705_185515_112.MP4 -i 2018_0705_185815_113.MP4 -i 2018_0705_190115_114.MP4 -i 2018_0705_190415_115.MP4 -filter_complex [0:v][1:v][2:v][3:v][4:v][5:v][6:v][7:v][8:v][9:v][10:v][11:v][12:v][13:v][14:v][15:v][16:v][17:v][18:v][19:v][20:v][21:v][22:v][23:v][24:v][25:v][26:v][27:v][28:v][29:v][30:v][31:v][32:v][33:v][34:v][35:v][36:v][37:v][38:v][39:v][40:v][41:v][42:v][43:v][44:v][45:v][46:v][47:v][48:v][49:v][50:v][51:v][52:v][53:v][54:v][55:v][56:v][57:v][58:v][59:v][60:v][61:v][62:v][63:v][64:v][65:v][66:v][67:v][68:v][69:v][70:v][71:v][72:v][73:v][74:v][75:v][76:v][77:v][78:v][79:v][80:v][81:v][82:v][83:v][84:v][85:v][86:v][87:v][88:v][89:v][90:v][91:v][92:v][93:v][94:v][95:v][96:v][97:v][98:v][99:v][100:v][101:v][102:v][103:v][104:v][105:v][106:v][107:v][108:v][109:v]concat=n=110:v=1[v];[v]setpts=(1/60)*PTS,drawtext=fontfile=C\\:/WINDOWS/Fonts/consola.ttf:fontcolor=white:fontsize=80:y=main_h-text_h-50:x=50:text=WimsWorld[o] -map [o] -c:v libx265 -crf 23 -preset veryfast -movflags +faststart -bf 2 -g 15 -pix_fmt yuv420p -y “Output.mp4”

Here’s an example of the command where all the input files are defined in the temporary file:

ffmpeg.exe -report -f concat -safe 0 -i C:\Users\Wim\AppData\Local\Temp\Wim4BD3.tmp -vf setpts=(1/60)*PTS,drawtext=fontfile=C\\:/WINDOWS/Fonts/consola.ttf:fontcolor=white:fontsize=80:y=main_h-text_h-50:x=50:text=WimsWorld -an -c:v libx265 -crf 23 -preset veryfast -movflags +faststart -bf 2 -g 15 -pix_fmt yuv420p -y “Output.mp4”

 

FFMPEG and ROAV Dash Cam C1 Pro

I recently purchased a dedicated dashcam on sale to replace my GoPro setup for trip videos. This gives me a new need to understand a new file format.

2018-05-18

The Roav Dashcam stores sequential mp4 files. When configuring the camera it’s possible to set the loop time, which is the duration of each mp4. There’s also an option to watermark the files. I have it turned on, and the only thing I’ve noticed is the ROAV logo, timestamp, and speed in the bottom right. It does not appear to have a way of adjusting the size of the text.

My initial recordings were set to run at 1080p 60 fps. I wanted to concatenate multiple files, add some text of my own, and speed up the video. This was my first experience using the -filter_complex option of FFMPEG. Here’s what I came up with to put together three files, speed the output up by a factor of 60, and add some text. I’m dropping the audio completely. The ROAV can record audio inside the car, but I configured it not to, as I don’t want to hear what I was listening to on the radio or what I might be saying if I make a phone call..

ffmpeg.exe -hide_banner -i 2018_0512_130537_050A.MP4 -i 2018_0512_131537_051A.MP4 -i 2018_0512_132537_052A.MP4 -filter_complex "[0:v] [1:v] [2:v] concat=n=3:v=1 [v];[v]setpts=0.01666*PTS,drawtext=fontfile=C\\:/WINDOWS/Fonts/consola.ttf:fontcolor=white:fontsize=80:y=main_h-text_h-50:x=50:text=WimsWorld[o]" -map "[o]" -c:v libx265 -crf 23 -preset veryfast -movflags +faststart -bf 2 -g 15 -pix_fmt yuv420p  FirstMixSpeed60Concat.mp4

This first video was recorded at 1080p60. The camera can record at 1440p30 which I will be trying soon to see if things like license plates are more legible. The setpts factor that I’m currently using was 1/60, so that 1 minute of real time was compressed to 1 second of video, and just dropping the extra frames. I expect to need to change the setpts factor to 1/30 because of the decreased frame rate at the higher resolution.

FFMPEG and h.265

I’ve noticed that YouTube transcodes my videos after I upload them and wanted to know more. It turns out that they are internally using a form of h.265 video encoding, which reduces the data size significantly without reducing perceived quality over h.264 video compression.

I decided to run some tests using my GoPro time lapse program to see how much compression I’d get versus how much extra time for encoding.

First I had to read up on the settings for using h.265 in FFmpeg. According to https://trac.ffmpeg.org/wiki/Encode/H.265, If I add -c:v libx265 into my existing FFmpeg command line without changing anything, I’ll get an h.265 output with the defaults of -crf 23 and -preset medium.

The -preset value effects how much work is done in the compression, but shouldn’t affect the perceived quality. It will effect both time to create and output file size.

The -crf value effects the perceived quality. I’ve been using the defaults in my previous h.264 mp4 files, which should be approximately -crf 23 and supposedly -crf 28 in h.265 is equivalent to the lower h.264 value. A -crf 0 would be a completely lossless conversion. For my tests, I left crf at the default 23.

I ran all of these tests on a set of 7,129 photos I’d captured while sailboat racing on March 24th using my GoPro Hero 3+ Black. Each input image was 4000×3000 and I’m creating an output video with resolution 3840×2160 by cropping it at 3/4 of the height and scaling to fit.

The original h.264 conversion took 28:36 minutes to create and was 1,162,079,866 bytes long.

Here’s a trimmed down and sorted file listing. The first column is the time it took to create, second is filesize, and third is filename.

28:36 1,162,079,866 20180324-2160p30-cropped-h264.mp4
30:25 1,006,292,960 20180324-veryfast-2160p30-cropped-h265-crf20.mp4
21:35   328,700,100 20180324-ultrafast-2160p30-cropped-crf28.mp4
21:59   339,438,778 20180324-superfast-2160p30-cropped-crf28.mp4
25:12   350,085,434 20180324-veryfast-2160p30-cropped-crf28.mp4
25:17   349,720,030 20180324-faster-2160p30-cropped-crf28.mp4
27:24   348,582,310 20180324-fast-2160p30-cropped-crf28.mp4
52:07   365,050,252 20180324-medium-2160p30-cropped-crf28.mp4

I created a single test at -crf 20 because I was interested in seeing a higher quality video and how different it would be in size. It took slightly longer than the original h.264 compression and had a slight improvement in size.

Two things became obvious to me from this test. More time spent in compression doesn’t always mean better compression. For my application, running preset medium actually hurts the performance, both in file size and time taken.

I ran all of these tests only a single time on my desktop computer with an Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz, 3501 Mhz, 4 Core(s), 8 Logical Processor(s) running the latest version of Windows Version 10.0.16299 Build 16299. I was running FFmpeg version N-88668-g723b6baaf8 from https://ffmpeg.zeranoe.com/builds/. The variations in time could be related to background tasks running on the machine, and I should have run a more comprehensive battery of tests, averaging time and with more accurate timekeeping.

Odd Wildcard Matching in Windows 10

I recently ran into an odd behavior of more files matching a pattern than I expected. I’d used exiftool to modify the dates on files my GoPro produced. It creates backup files of the original images when it modifies the tags. Here’s the command I ran.

exiftool.exe -r "-AllDates+=4:7:6 17:40:00" -ext jpg f:\GoPro\20170807

Now I had about 4000 files with the .JPG extension and another 4000 files with a .JPG_original extension.

I ran my program that parses the directory structure and turns all those images into a time lapse movie, and it seemed to be including both the file extensions, making a very disjointed movie.

I loaded my source code in the debugger and it seemed to be doing a findfirst / findnext specifically looking for .JPG files, and not some other extension, but it was definitely retrieving files both with .JPG and .JPG_original extensions.

I then ran a couple of commands at the windows command prompt and was surprised to find the same results there.

dir F:\GoPro\20170807\372GOPRO\G*.JPG /p
dir F:\GoPro\20170807\372GOPRO\G???????.JPG /p

Each command returned both the JPG and JPG_original files.

dir F:\GoPro\20170807\372GOPRO\G*.JPG_original /p

returned just the JPG_original files.

dir F:\GoPro\20170807\372GOPRO\G??????.JPG /p

had one less question mark and correctly returned no files.

This is all unexpected behavior, though I’m glad to see that it was consistent with the operating system and not something specific to the C runtime. I’d love an explanation of what’s going on.

exiftool to manage DJI media files

DJI Drones don’t seem to remember the image count between formats of a media card. This creates a problem for me when I’m trying to backup and maintain my images and video.

Because the dates are all correct in the media files, retrieved from GPS data, organizing the files by naming them based on the date works for me.

Using ExifTool by Phil Harvey is a great solution for pulling the metadata from the files and renaming the files.

The command line that I was initially using is:

exiftool "-FileName<${CreateDate}.$filetype" -d %Y%m%d-%H%M%S%%-c -ext mp4 -ext dng -ext jpg dji*

It’s problem is that it orphans the SRT subtitle files from my videos that I’d like to keep matching the video files.

I’ve tried this variation to do it in one step but it doesn’t work, because the SRT files get renamed as MP4 files.

exiftool -verbose "-FileName<${CreateDate}" -d %Y%m%d-%H%M%S%%-c.%%le -ext mp4 -ext dng -ext jpg dji* -srcfile %f.srt

If anyone has a suggestion for how to rename all the media files in one directory I’d appreciate it. Even running two commands in sequence would be fine.

Update:

I’ve figured out that running these two commands in sequence will get me the results I am looking for:

exiftool "-FileName<${CreateDate}" -d %Y%m%d-%H%M%S%%-c.srt -ext mp4 -srcfile %f.srt dji*
exiftool "-FileName<${CreateDate}" -d %Y%m%d-%H%M%S%%-c.%%le -ext mp4 -ext dng -ext jpg dji*

I’m still looking for a way of doing it in a single command that may leave less room for error, but this is working for now.