From 82904833f083a68f704037b983ce15355d40def4 Mon Sep 17 00:00:00 2001 From: oiupoyt Date: Wed, 2 Sep 2026 07:47:18 +0530 Subject: [PATCH] fix: Resolve Wayland EIO (-5) DMA-BUF to VAAPI mapping crash by passing DRM format modifiers --- src/capture/mod.rs | 2 +- src/capture/wayland_stream.rs | 3 ++- src/encoder.rs | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/capture/mod.rs b/src/capture/mod.rs index da4a777..0edaec7 100644 --- a/src/capture/mod.rs +++ b/src/capture/mod.rs @@ -12,7 +12,7 @@ pub enum Frame { DmaBuf { width: u32, height: u32, - format: u32, + format: u32, modifier: u64, fd: RawFd, stride: u32, offset: u32, diff --git a/src/capture/wayland_stream.rs b/src/capture/wayland_stream.rs index 6edbe0b..a2448d4 100644 --- a/src/capture/wayland_stream.rs +++ b/src/capture/wayland_stream.rs @@ -78,7 +78,8 @@ impl PipeWireStream { let frame = Frame::DmaBuf { width: user_data.format.size().width, height: user_data.format.size().height, - format: 0x34325241, // DRM_FORMAT_ARGB8888 + format: 0x34325241, // DRM_FORMAT_ARGB8888 + modifier: user_data.format.modifier(), fd: data.fd(), stride: data.chunk().stride() as u32, offset: data.chunk().offset(), diff --git a/src/encoder.rs b/src/encoder.rs index c8e861e..b3913ef 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -140,13 +140,13 @@ impl VaapiEncoder { av_frame_free(&mut nv12_frame); av_frame_free(&mut bgra_frame); } - Frame::DmaBuf { width: dma_width, height: dma_height, format, fd, stride, offset } => { + Frame::DmaBuf { width: dma_width, height: dma_height, format, modifier, fd, stride, offset } => { let mut drm_desc = AVDRMFrameDescriptor { nb_objects: 1, objects: [AVDRMObjectDescriptor { fd: *fd, size: 0, // usually ignored or mapped by driver - format_modifier: 0, // DRM_FORMAT_MOD_LINEAR (or read from PipeWire format) + format_modifier: *modifier, }, std::mem::zeroed(), std::mem::zeroed(), std::mem::zeroed()], nb_layers: 1, layers: [AVDRMLayerDescriptor {