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:
parent
03fcc154eb
commit
819eb422b3
2 changed files with 45 additions and 1 deletions
|
@ -100,6 +100,7 @@ public:
|
||||||
int setFormat(V4L2DeviceFormat *format);
|
int setFormat(V4L2DeviceFormat *format);
|
||||||
|
|
||||||
int exportBuffers(BufferPool *pool);
|
int exportBuffers(BufferPool *pool);
|
||||||
|
int importBuffers(BufferPool *pool);
|
||||||
int releaseBuffers();
|
int releaseBuffers();
|
||||||
|
|
||||||
int queueBuffer(Buffer *buffer);
|
int queueBuffer(Buffer *buffer);
|
||||||
|
|
|
@ -642,6 +642,36 @@ int V4L2Device::createPlane(Buffer *buffer, unsigned int planeIndex,
|
||||||
return 0;
|
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
|
* \brief Release all internally allocated buffers
|
||||||
*/
|
*/
|
||||||
|
@ -680,7 +710,20 @@ int V4L2Device::queueBuffer(Buffer *buffer)
|
||||||
buf.memory = memoryType_;
|
buf.memory = memoryType_;
|
||||||
buf.field = V4L2_FIELD_NONE;
|
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.length = buffer->planes().size();
|
||||||
buf.m.planes = planes;
|
buf.m.planes = planes;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue