[libcamera-devel] [PATCH v1] v4l2: V4L2CameraProxy: Add support for DMABUF buffer I/O in REQBUF ioctl
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Nov 30 00:56:54 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);
https://git.libcamera.org/libcamera/libcamera.git/tree/Documentation/coding-style.rst#n421
> }
>
> 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();
This isn't right. Please test this patch with a V4L2 application that
uses the device in DMABUF mode.
> +
> buffers_[i] = buf;
> }
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list