Running AddressSanitizer on a dlopened GStreamer plugin with LD_PRELOAD of libasan

ASan on a GStreamer Plugin When the Host Binary Has No ASan

You built your GStreamer plugin with -fsanitize=address and gst-launch-1.0 says the element doesn’t exist. The runtime has to be in the process before anything else. One LD_PRELOAD fixes it, and one repeated -D flag quietly turns ASan off in colcon builds.

October 20, 2026 · 6 min · Pavel Guzenfeld
Converting a GStreamer buffer PTS plus base_time into a std::chrono::steady_clock time point

From GStreamer PTS to std::chrono::steady_clock

A buffer’s PTS is running time, not wall time. Add the pipeline’s base time and you get the clock time the frame was captured at. With the monotonic system clock that is a std::chrono::steady_clock time point you can compare to IMU or telemetry timestamps directly.

October 20, 2026 · 7 min · Pavel Guzenfeld
Mounting a Google Drive folder on Linux with rclone mount and a systemd user service

Mounting a Google Drive Folder on Linux with rclone and a systemd User Service

A Google Drive folder that shows up as a normal directory every time I log in, using rclone mount, FUSE and a systemd user service. No root, no fstab, and a unit file that passes systemd-analyze verify.

October 20, 2026 · 5 min · Pavel Guzenfeld
Terminal stack rebuilt from scratch: wezterm, zsh, starship prompt, fzf and zoxide

Rebuilding My Terminal From Scratch — wezterm, zsh, starship, fzf, zoxide

Two days of rebuilding my shell setup on Ubuntu — the tools, the zshrc, the gotchas (fdfind/batcat names, starship install path, losing a zshrc to a bad paste) and the drills I used to make it stick.

October 20, 2026 · 5 min · Pavel Guzenfeld
Hunting an undocumented AHRS on the serial bus

Which tty Is the AHRS? Hunting an Undocumented Serial Device on a Jetson

A small AHRS was wired to a Jetson over USB, but nobody wrote down which serial port. Here’s how I tracked it down by its protocol instead of its name, fell into the classic dialout permissions trap, and decoded its orientation stream into human-readable numbers.

June 1, 2026 · 12 min · Pavel Guzenfeld
H.264 vs H.265 vs AV1 end-to-end latency on Jetson Orin — grouped bar chart

H.264, H.265, and AV1 on Jetson Orin: A Real Hardware Latency Benchmark

A rigorous per-stage latency benchmark across H.264, H.265, and AV1 hardware codecs on NVIDIA Jetson Orin (JetPack 6), measuring encode, wire, and decode separately at FHD and HD resolutions. AV1 wins end-to-end at 104 ms FHD / 86 ms HD. H.264 is the worst choice despite being the oldest: its nvv4l2decoder holds ~4 frames in an internal DPB buffer, adding 130–170 ms of hidden latency. Wire latency is governed by parse-element lookahead, not byte volume. Clock sync achieves ±234 µs via chrony. Full pipeline source, CSVs, and reproduction steps included.

May 12, 2026 · 33 min · Pavel Guzenfeld
Cross-process zero-copy NVMM IPC on Jetson — dma-buf fd passing, NvBufSurfaceImport, lock-free pool

Cross-Process Zero-Copy on Jetson: dma-buf fds, NvBufSurfaceImport, and a Cache-Line-Padded Pool

Two processes on a Jetson, one camera frame in NVMM (GPU memory), no copies. The kernel does the heavy lifting via dma-buf fds; SCM_RIGHTS carries the fd across the process boundary; NvBufSurfaceImport reconstructs the surface on the consumer side; a cache-line-padded ring of atomic ref-counts keeps fan-out coherent without locks. With benchmark numbers and a Godbolt-runnable demo of the SCM_RIGHTS pattern.

April 25, 2026 · 22 min · Pavel Guzenfeld
Cleaning Up, Pipelining, and Bake-Testing the STM32H750 Tracker

Cleaning Up, Pipelining, and Bake-Testing the STM32H750 Tracker

A sequel to the first STM32H750 tracker post. After the C++ port was proven in production, I spent a week of evenings cutting dead vendor code, splitting the algorithm out to host for unit tests, wiring the LCD SPI through DMA to let the CPU run the tracker in parallel with the blit, unlocking the camera’s real frame rate, chasing a subtle BB-drift bug back to a too-wide SAD search, and finally building an offline A/B harness that compares SAD, NCC, and MOSSE on four synthetic scenarios so the next tracker port is a data decision, not a vibes one.

April 23, 2026 · 18 min · Pavel Guzenfeld
Building a Template-Matching Tracker on an STM32H750

Building a Template-Matching Tracker on an STM32H750: What Worked, What Didn't

A long, honest retrospective on turning a WeAct STM32H750 board, a cheap OV7725 IR camera, and an Xbox controller into a live template-matching tracker. Every dead end, every wrong assumption, every fix — and what I’d do differently next time.

April 21, 2026 · 23 min · Pavel Guzenfeld
Persistent SMB Shares on Linux

Persistent SMB Shares on Linux — From Manual Mount to Automount on Access

A step-by-step guide to mounting SMB/CIFS network shares on Linux — from one-off access in a file manager to persistent fstab entries with systemd automount that connect only when needed and gracefully handle VPN disconnects.

March 24, 2026 · 7 min · Pavel Guzenfeld