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

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Tue Nov 30 03:06:43 CET 2021


Hi Vedant,

On Tue, Nov 30, 2021 at 01:10:31AM +0530, Vedant Paranjape wrote:
> 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);

This is going to cause problems with expbuf if your memory type is
dmabuf.


Paul

>  }
>  
>  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