libcamera, android, cam, gstreamer, qcam, v4l2: Reuse Request

Allow reuse of the Request object by implementing reuse(). This means
the applications now have the responsibility of freeing the Request
objects, so make all libcamera users (cam, qcam, v4l2-compat, gstreamer,
android) do so.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Paul Elder
2020-10-12 11:32:40 +09:00
parent 05cdef27ab
commit c753223ad6
15 changed files with 163 additions and 109 deletions
+38
View File
@@ -37,6 +37,15 @@ LOG_DEFINE_CATEGORY(Request)
* The request has been cancelled due to capture stop
*/
/**
* \enum Request::ReuseFlag
* Flags to control the behavior of Request::reuse()
* \var Request::Default
* Don't reuse buffers
* \var Request::ReuseBuffers
* Reuse the buffers that were previously added by addBuffer()
*/
/**
* \typedef Request::BufferMap
* \brief A map of Stream to FrameBuffer pointers
@@ -85,6 +94,35 @@ Request::~Request()
delete validator_;
}
/**
* \brief Reset the request for reuse
* \param[in] flags Indicate whether or not to reuse the buffers
*
* Reset the status and controls associated with the request, to allow it to
* be reused and requeued without destruction. This function shall be called
* prior to queueing the request to the camera, in lieu of constructing a new
* request. The application can reuse the buffers that were previously added
* to the request via addBuffer() by setting \a flags to ReuseBuffers.
*/
void Request::reuse(ReuseFlag flags)
{
pending_.clear();
if (flags & ReuseBuffers) {
for (auto pair : bufferMap_) {
pair.second->request_ = this;
pending_.insert(pair.second);
}
} else {
bufferMap_.clear();
}
status_ = RequestPending;
cancelled_ = false;
controls_->clear();
metadata_->clear();
}
/**
* \fn Request::controls()
* \brief Retrieve the request's ControlList