[libcamera-devel] [PATCH v2] v4l2: V4L2CameraProxy: Add EXPBUF as one of the supported ioctl

Vedant Paranjape vedantparanjape160201 at gmail.com
Sun Nov 28 20:10:33 CET 2021


>From the docs
> * @fd: for non-multiplanar buffers with memory == V4L2_MEMORY_DMABUF;
> * a userspace file descriptor associated with this buffer

My guess is since memory is not equal to V4L2_MEMORY_DMABUF yet, this
won't work.

On Sun, Nov 28, 2021 at 10:07 PM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> On Sun, Nov 28, 2021 at 03:31:40PM +0200, Laurent Pinchart wrote:
> > Hi Vedant,
> >
> > Thank you for the patch.
> >
> > On Sun, Nov 28, 2021 at 11:45:56AM +0530, Vedant Paranjape wrote:
> > > To support DMABUF as one of the memory buffer, we need to implement
> > > EXPBUF in the v4l2 compat layer.
> > >
> > > This patch implements vidioc_expbuf as one of the supported ioctls.
> > >
> > > 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 | 37 ++++++++++++++++++++++++++++++++++
> > >  src/v4l2/v4l2_camera_proxy.h   |  1 +
> > >  2 files changed, 38 insertions(+)
> > >
> > > diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> > > index 3610e63cade3..cb2f93631ab9 100644
> > > --- a/src/v4l2/v4l2_camera_proxy.cpp
> > > +++ b/src/v4l2/v4l2_camera_proxy.cpp
> > > @@ -624,6 +624,39 @@ int V4L2CameraProxy::vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg,
> > >     return 0;
> > >  }
> > >
> > > +int V4L2CameraProxy::vidioc_expbuf(V4L2CameraFile *file, struct v4l2_exportbuffer *arg)
> > > +{
> > > +   LOG(V4L2Compat, Debug) << "Servicing vidioc_expbuf fd = " << file->efd();
> > > +
> > > +   if (!hasOwnership(file))
> > > +           return -EBUSY;
> > > +
> > > +   /* \todo Verify that the memory type is MMAP when adding DMABUF support */
> > > +   if (!validateBufferType(arg->type))
> > > +           return -EINVAL;
> > > +
> > > +   if (arg->index >= bufferCount_)
> > > +           return -EINVAL;
> > > +
> > > +   if (arg->flags & ~(O_CLOEXEC | O_ACCMODE))
> > > +           return -EINVAL;
> > > +
> > > +   LOG(V4L2Compat, Debug) << arg->index << " : index of the buffer";
> >
> > I'd either drop this, or combine it with the message at the top of the
> > function.
> >
> > > +
> > > +   if (file->priority() < maxPriority())
> > > +           return -EBUSY;
> >
> > Why is this chech needed ?
> >
> > > +
> > > +   memset(arg->reserved, 0, sizeof(arg->reserved));
> > > +
> > > +   arg->fd = fcntl(buffers_[arg->index].m.fd,
> > > +                   arg->flags & O_CLOEXEC ? F_DUPFD_CLOEXEC : F_DUPFD, 0);
>
> Actually I don't think this is correct. .m.fd is for importing dmabufs,
> it's always 0 at the moment.
>
> If this has passed v4l2-compliance, it means EXPBUF isn't properly
> tested by it.
>
> > > +   arg->fd = fcntl(arg->fd, F_SETFL, 0);
> >
> > 0 isn't the right value.
> >
> > > +
> > > +   LOG(V4L2Compat, Debug) << "Exported buffer at index: " << arg->index;
> >
> > I'd drop this too.
> >
> > > +
> > > +   return 0;
> > > +}
> > > +
> > >  int V4L2CameraProxy::vidioc_streamon(V4L2CameraFile *file, int *arg)
> > >  {
> > >     LOG(V4L2Compat, Debug) << "Servicing vidioc_streamon fd = " << file->efd();
> > > @@ -685,6 +718,7 @@ const std::set<unsigned long> V4L2CameraProxy::supportedIoctls_ = {
> > >     VIDIOC_QUERYBUF,
> > >     VIDIOC_QBUF,
> > >     VIDIOC_DQBUF,
> > > +   VIDIOC_EXPBUF,
> > >     VIDIOC_STREAMON,
> > >     VIDIOC_STREAMOFF,
> > >  };
> > > @@ -755,6 +789,9 @@ int V4L2CameraProxy::ioctl(V4L2CameraFile *file, unsigned long request, void *ar
> > >     case VIDIOC_DQBUF:
> > >             ret = vidioc_dqbuf(file, static_cast<struct v4l2_buffer *>(arg), &locker);
> > >             break;
> > > +   case VIDIOC_EXPBUF:
> > > +           ret = vidioc_expbuf(file, static_cast<struct v4l2_exportbuffer *>(arg));
> > > +           break;
> > >     case VIDIOC_STREAMON:
> > >             ret = vidioc_streamon(file, static_cast<int *>(arg));
> > >             break;
> > > diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
> > > index fccec241879d..81ef7788e9fe 100644
> > > --- a/src/v4l2/v4l2_camera_proxy.h
> > > +++ b/src/v4l2/v4l2_camera_proxy.h
> > > @@ -58,6 +58,7 @@ private:
> > >     int vidioc_qbuf(V4L2CameraFile *file, struct v4l2_buffer *arg);
> > >     int vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg,
> > >                      libcamera::MutexLocker *locker);
> > > +   int vidioc_expbuf(V4L2CameraFile *file, struct v4l2_exportbuffer *arg);
> > >     int vidioc_streamon(V4L2CameraFile *file, int *arg);
> > >     int vidioc_streamoff(V4L2CameraFile *file, int *arg);
> > >
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list