[libcamera-devel] [PATCH v2 08/25] libcamera: v4l2_videodevice: Extract exportDmabufFd()
Niklas Söderlund
niklas.soderlund at ragnatech.se
Mon Dec 30 13:04:53 CET 2019
The part in createPlane() that exports a dma buffer from a video device
will be used directly by the FrameBuffer interface. Break it out to a
separate function.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
* Changes since v1
- Rename exportDmaBuffer() to exportDmabufFd()
---
src/libcamera/include/v4l2_videodevice.h | 1 +
src/libcamera/v4l2_videodevice.cpp | 41 +++++++++++++++---------
2 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h
index fdf11b3a6ec9b702..1f52fe0120831fa3 100644
--- a/src/libcamera/include/v4l2_videodevice.h
+++ b/src/libcamera/include/v4l2_videodevice.h
@@ -179,6 +179,7 @@ private:
int requestBuffers(unsigned int count);
int createPlane(BufferMemory *buffer, unsigned int index,
unsigned int plane, unsigned int length);
+ int exportDmabufFd(unsigned int index, unsigned int plane);
Buffer *dequeueBuffer();
void bufferAvailable(EventNotifier *notifier);
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 2e3f6d00d4aae6ff..7d585ce03ed9a45a 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -901,31 +901,22 @@ int V4L2VideoDevice::exportBuffers(BufferPool *pool)
int V4L2VideoDevice::createPlane(BufferMemory *buffer, unsigned int index,
unsigned int planeIndex, unsigned int length)
{
- struct v4l2_exportbuffer expbuf = {};
- int ret;
+ int fd;
LOG(V4L2, Debug)
<< "Buffer " << index
<< " plane " << planeIndex
<< ": length=" << length;
- expbuf.type = bufferType_;
- expbuf.index = index;
- expbuf.plane = planeIndex;
- expbuf.flags = O_RDWR;
-
- ret = ioctl(VIDIOC_EXPBUF, &expbuf);
- if (ret < 0) {
- LOG(V4L2, Error)
- << "Failed to export buffer: " << strerror(-ret);
- return ret;
- }
+ fd = exportDmabufFd(index, planeIndex);
+ if (fd < 0)
+ return fd;
FrameBuffer::Plane plane;
- plane.fd = FileDescriptor(expbuf.fd);
+ plane.fd = FileDescriptor(fd);
plane.length = length;
buffer->planes().emplace_back(plane);
- ::close(expbuf.fd);
+ ::close(fd);
return 0;
}
@@ -951,6 +942,26 @@ int V4L2VideoDevice::importBuffers(BufferPool *pool)
return 0;
}
+int V4L2VideoDevice::exportDmabufFd(unsigned int index, unsigned int plane)
+{
+ struct v4l2_exportbuffer expbuf = {};
+ int ret;
+
+ expbuf.type = bufferType_;
+ expbuf.index = index;
+ expbuf.plane = plane;
+ expbuf.flags = O_RDWR;
+
+ ret = ioctl(VIDIOC_EXPBUF, &expbuf);
+ if (ret < 0) {
+ LOG(V4L2, Error)
+ << "Failed to export buffer: " << strerror(-ret);
+ return ret;
+ }
+
+ return expbuf.fd;
+}
+
/**
* \brief Release all internally allocated buffers
*/
--
2.24.1
More information about the libcamera-devel
mailing list