[libcamera-devel] [RFC PATCH v2 3/5] libcamera: v4l2 device: Store buffer info in planes
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Aug 21 23:28:16 CEST 2023
Quoting Vedant Paranjape (2023-08-21 15:43:55)
> Hello Gabby,
>
> Thanks for your patch. This patch looks good to me.
>
> On Mon, Aug 21, 2023 at 6:40 PM Gabby George <gabbymg94 at gmail.com> wrote:
> >
> > To perform a memory mapping using mmap, the MappedFrameBuffer class
> > needs the plane offset and file descriptor information of the frame
> > buffer's plane(s). This information is provided in the response to
> > REQBUF, which happens during buffer allocation. Store the plane offset
> > and file descriptor information in the buffer's plane at the time of
> > allocation.
> >
> > Currently, there is a metadata buffer type (metadata format UVCH) that
> > does not support exporting buffers using EXPBUF, so this should only
> > be done if the buffer type is metadata capture.
> >
> > Signed-off-by: Gabby George <gabbymg94 at gmail.com>
>
> Reviewed-by: Vedant Paranjape <vedantparanjape160201 at gmail.com>
>
> > ---
> > src/libcamera/v4l2_videodevice.cpp | 31 +++++++++++++++++++-----------
> > 1 file changed, 20 insertions(+), 11 deletions(-)
> >
> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> > index a72ef64d..e57cb131 100644
> > --- a/src/libcamera/v4l2_videodevice.cpp
> > +++ b/src/libcamera/v4l2_videodevice.cpp
> > @@ -1402,18 +1402,27 @@ std::unique_ptr<FrameBuffer> V4L2VideoDevice::createBuffer(unsigned int index)
> >
> > std::vector<FrameBuffer::Plane> planes;
> > for (unsigned int nplane = 0; nplane < numPlanes; nplane++) {
> > - UniqueFD fd = exportDmabufFd(buf.index, nplane);
> > - if (!fd.isValid())
> > - return nullptr;
> > -
> > FrameBuffer::Plane plane;
> > - plane.fd = SharedFD(std::move(fd));
> > - /*
> > - * V4L2 API doesn't provide dmabuf offset information of plane.
> > - * Set 0 as a placeholder offset.
> > - * \todo Set the right offset once V4L2 API provides a way.
> > - */
> > - plane.offset = 0;
> > +
> > + if (buf.type == V4L2_BUF_TYPE_META_CAPTURE) {
> > + /*
> > + * Dmabuf fd is not exported for metadata, so store
> > + * the offset from the querybuf call and this device's fd.
> > + */
> > + plane.fd = SharedFD(this->fd());
> > + plane.offset = buf.m.offset;
> > + } else {
> > + UniqueFD fd = exportDmabufFd(buf.index, nplane);
> > + if (!fd.isValid())
> > + return nullptr;
> > + plane.fd = SharedFD(std::move(fd));
> > + /*
> > + * V4L2 API doesn't provide dmabuf offset information of plane.
This indent is still incorrect.
/*
*
instead of
/*
*
> > + * Set 0 as a placeholder offset.
> > + * \todo Set the right offset once V4L2 API provides a way.
> > + */
> > + plane.offset = 0;
So are plane.offset's *always* zero ? Does anything else ever set it to
something else? That looks like it signals the same information as
'usePlaneOffset' to me in that case ?
> > + }
> > plane.length = multiPlanar ? buf.m.planes[nplane].length : buf.length;
> >
> > planes.push_back(std::move(plane));
> > --
> > 2.34.1
> >
More information about the libcamera-devel
mailing list