From c753223ad6b90550fae31aedd79fbedc13da2e75 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Wed, 23 Sep 2020 19:05:41 +0900 Subject: libcamera, android, cam, gstreamer, qcam, v4l2: Reuse Request MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/request.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/libcamera/request.cpp') diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 60b30692..ae8b1660 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -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 -- cgit v1.2.1