[libcamera-devel] [PATCH v1] v4l2: V4L2CameraProxy: Add support for DMABUF buffer I/O in REQBUF ioctl
Vedant Paranjape
vedantparanjape160201 at gmail.com
Tue Nov 30 07:50:30 CET 2021
Hi Laurent,
On Tue, Nov 30, 2021 at 5:27 AM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> 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
There's a bug in checkstyle, that's why I had to ignore it on this
one. Checkstyle was changing some irrelevant part of the code too.
So, I manually tried to fix this, but checkstyle still won't budge. I
have setup the script long back :)
>
> > }
> >
> > 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.
Okay, I'll do so.
>
> > +
> > buffers_[i] = buf;
> > }
> >
>
> --
> Regards,
>
> Laurent Pinchart
Regards,
Vedant Paranjape
More information about the libcamera-devel
mailing list