forked from marfrit/libva-v4l2-request-fourier
ca4dd88007
V4L2 CAPTURE buffers are V4L2_MEMORY_MMAP and mapped cached. Kernel DMA writes don't propagate to CPU cache observer; reading destination_data[] without DMA_BUF_IOCTL_SYNC(START|READ) returns stale data on RK3399 — observed as Bug 4 (H.264 partial-fill) and Bug 5 (HEVC all-zero) when libva goes through cached-mmap readback while kdirect ffmpeg-v4l2request + DRM_PRIME-mmap reads cleanly via implicit sync. Per Tomasz Figa's 2024 linaro-mm-sig discussion + feedback_rfc_v2_ vb2_dma_resv_scope.md: userspace responsibility for cache sync on cached-mmap'd V4L2 buffers. RFC v2 fence work doesn't engage this path; this ioctl pair does. Just-in-time EXPBUF + SYNC + close per copy. Per-call cost is one ioctl pair + one fd lifecycle per plane. Could cache the EXPBUF fd on cap_pool slot but doing it transient keeps lifecycle simple. Closing the EXPBUF fd is a no-op on V4L2 buffer memory. If EXPBUF or SYNC fails, fall through to existing memcpy path — preserves pre-iter13 behavior on the error branch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>