[libcamera-devel] [PATCH v1] v4l2: V4L2CameraProxy: Add support for DMABUF buffer I/O in REQBUF ioctl

Vedant Paranjape vedantparanjape160201 at gmail.com
Mon Nov 29 20:40:31 CET 2021


To support importing DMABUF, we need to reqbufs with DMABUF mode.

This patch enables using V4L2_MEMORY_DMABUF as one of the memory types
in vidioc_reqbuf to initialise DMA Buffer I/O

Bug: https://bugs.libcamera.org/show_bug.cgi?id=89

Signed-off-by: Vedant Paranjape <vedantparanjape160201 at gmail.com>
---
 src/v4l2/v4l2_camera_proxy.cpp | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
index f194e06345b7..c8861a531399 100644
--- a/src/v4l2/v4l2_camera_proxy.cpp
+++ b/src/v4l2/v4l2_camera_proxy.cpp
@@ -160,7 +160,8 @@ bool V4L2CameraProxy::validateBufferType(uint32_t type)
 
 bool V4L2CameraProxy::validateMemoryType(uint32_t memory)
 {
-	return memory == V4L2_MEMORY_MMAP;
+	return (memory == V4L2_MEMORY_MMAP) ||
+			  (memory == V4L2_MEMORY_DMABUF);
 }
 
 void V4L2CameraProxy::setFmtFromConfig(const StreamConfiguration &streamConfig)
@@ -468,7 +469,8 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf
 	if (!hasOwnership(file) && owner_)
 		return -EBUSY;
 
-	arg->capabilities = V4L2_BUF_CAP_SUPPORTS_MMAP;
+	arg->capabilities = V4L2_BUF_CAP_SUPPORTS_MMAP |
+						   V4L2_BUF_CAP_SUPPORTS_DMABUF;
 	memset(arg->reserved, 0, sizeof(arg->reserved));
 
 	if (arg->count == 0) {
@@ -511,11 +513,15 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf
 		struct v4l2_buffer buf = {};
 		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 		buf.length = v4l2PixFormat_.sizeimage;
-		buf.memory = V4L2_MEMORY_MMAP;
-		buf.m.offset = i * v4l2PixFormat_.sizeimage;
+		buf.memory = arg->memory;
 		buf.index = i;
 		buf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
+		if (arg->memory == V4L2_MEMORY_MMAP)
+			buf.m.offset = i * v4l2PixFormat_.sizeimage;
+		else if (arg->memory == V4L2_MEMORY_DMABUF)
+			buf.m.fd = vcam_->getBufferFd(i).fd();
+
 		buffers_[i] = buf;
 	}
 
-- 
2.25.1



More information about the libcamera-devel mailing list