[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 08:04:58 CET 2021


On Tue, Nov 30, 2021 at 12:23:19PM +0530, Vedant Paranjape wrote:
> Hi Paul,
> 
> On Tue, Nov 30, 2021 at 7:36 AM <paul.elder 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);
> >
> > This is going to cause problems with expbuf if your memory type is
> > dmabuf.
> 
> I am not sure what needs to be done for importing dmabuf then, according to this
> https://www.kernel.org/doc/html/v5.3/media/uapi/v4l/dmabuf.html#example-queueing-dmabuf-using-single-plane-api

Well the issue with importing isn't here, it's the hunk below, which
Laurent has reviewed (and we're discussing now on irc).

The issue here is that the memory type validator needs to be expanded.
expbuf for example should error out if the device is configured for
dmabuf. You'll have to check the docs for the other ioctls.

> 
> What do you suggest ?

You can come up with a design/patch, and we can discuss it.


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