libcamera: v4l2_device: importBuffers support

Provide the ability to import a BufferPool into the V4L2Device allowing
external dmabuf backed buffers to be queued.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Kieran Bingham 2019-01-30 12:52:00 +00:00
parent 03fcc154eb
commit 819eb422b3
2 changed files with 45 additions and 1 deletions

View file

@ -100,6 +100,7 @@ public:
int setFormat(V4L2DeviceFormat *format);
int exportBuffers(BufferPool *pool);
int importBuffers(BufferPool *pool);
int releaseBuffers();
int queueBuffer(Buffer *buffer);

View file

@ -642,6 +642,36 @@ int V4L2Device::createPlane(Buffer *buffer, unsigned int planeIndex,
return 0;
}
/**
* \brief Import the externally allocated \a pool of buffers
* \param[in] pool BufferPool of buffers to import
* \return 0 on success or a negative error code otherwise
*/
int V4L2Device::importBuffers(BufferPool *pool)
{
unsigned int allocatedBuffers;
int ret;
memoryType_ = V4L2_MEMORY_DMABUF;
ret = requestBuffers(pool->count());
if (ret < 0)
return ret;
allocatedBuffers = ret;
if (allocatedBuffers < pool->count()) {
LOG(V4L2, Error)
<< "Not enough buffers provided by V4L2Device";
requestBuffers(0);
return -ENOMEM;
}
LOG(V4L2, Debug) << "provided pool of " << pool->count() << "buffers";
bufferPool_ = pool;
return 0;
}
/**
* \brief Release all internally allocated buffers
*/
@ -680,7 +710,20 @@ int V4L2Device::queueBuffer(Buffer *buffer)
buf.memory = memoryType_;
buf.field = V4L2_FIELD_NONE;
if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) {
bool multiPlanar = V4L2_TYPE_IS_MULTIPLANAR(buf.type);
if (buf.memory == V4L2_MEMORY_DMABUF) {
if (multiPlanar) {
for (unsigned int p = 0;
p < buffer->planes().size();
p++)
planes[p].m.fd = buffer->planes()[p].dmabuf();
} else {
buf.m.fd = buffer->planes()[0].dmabuf();
}
}
if (multiPlanar) {
buf.length = buffer->planes().size();
buf.m.planes = planes;
}