From 025d69b4d0df05f54d7bfcb3a4a2b35b48b83d82 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Fri, 14 Jun 2024 07:59:09 +0200 Subject: [PATCH] PipeWire video capture: mmap() PipeWire buffers with MAP_SHARED Some DMAbuf types don't properly implement MAP_PRIVATE as it requires copy-on-write support. As we don't need to write to these buffers, we can switch to MAP_SHARED instead, making it work reliably on current kernels without having any drawbacks in this context. Tested and confirmed with libcamera software ISP on Thinkpad X13 with an arm processor. Bug: webrtc:42225999 Change-Id: Ic47b8c90456cccf3742e8274945dbd64fb8aac6d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354623 Commit-Queue: Jan Grulich Reviewed-by: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/main@{#42484} --- modules/video_capture/linux/video_capture_pipewire.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/video_capture/linux/video_capture_pipewire.cc b/modules/video_capture/linux/video_capture_pipewire.cc index d7cd50df66..9ff4fdb9b1 100644 --- a/modules/video_capture/linux/video_capture_pipewire.cc +++ b/modules/video_capture/linux/video_capture_pipewire.cc @@ -418,7 +418,7 @@ void VideoCaptureModulePipeWire::ProcessBuffers() { ScopedBuf frame; frame.initialize( static_cast( - mmap(nullptr, spaBuffer->datas[0].maxsize, PROT_READ, MAP_PRIVATE, + mmap(nullptr, spaBuffer->datas[0].maxsize, PROT_READ, MAP_SHARED, spaBuffer->datas[0].fd, spaBuffer->datas[0].mapoffset)), spaBuffer->datas[0].maxsize, spaBuffer->datas[0].fd, spaBuffer->datas[0].type == SPA_DATA_DmaBuf);