summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-04-09 11:27:29 +0200
committerJacopo Mondi <jacopo@jmondi.org>2019-04-18 15:37:59 +0200
commitee027781b4c265b378ed16f91eeded7b42f5dfe4 (patch)
tree70e4551115ab141c99f0625bf8c98a4cbc967b4f /src
parent0527ba92adb7d97941ec4b8cd861178634f632b6 (diff)
libcamera: buffer: Store Request reference in Buffer
Add to the Buffer class methods to set and retrieve a reference to the Request instance the buffer is part of. As buffers outlive the Request they are associated with, the reference is only temporary valid during the buffer completion interval (from when the buffer gets queued to Camera for processing, until it gets marked as completed). Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/buffer.cpp25
-rw-r--r--src/libcamera/request.cpp3
2 files changed, 27 insertions, 1 deletions
diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp
index e2d1cf04..21abdcce 100644
--- a/src/libcamera/buffer.cpp
+++ b/src/libcamera/buffer.cpp
@@ -196,7 +196,7 @@ void *Plane::mem()
*/
Buffer::Buffer()
- : index_(-1)
+ : index_(-1), request_(nullptr)
{
}
@@ -249,6 +249,22 @@ Buffer::Buffer()
*/
/**
+ * \fn Buffer::request()
+ * \brief Retrieve the request this buffer belongs to
+ *
+ * The intended callers of this method are buffer completion handlers that
+ * need to associate a buffer to the request it belongs to.
+ *
+ * A Buffer is associated to a request by Request::prepare() and the
+ * association is valid until the buffer completes. The returned request
+ * pointer is valid only during that interval.
+ *
+ * \return The Request the Buffer belongs to, or nullptr if the buffer is
+ * either completed or not associated with a request
+ * \sa Buffer::setRequest()
+ */
+
+/**
* \brief Mark a buffer as cancel by setting its status to BufferCancelled
*/
void Buffer::cancel()
@@ -260,6 +276,13 @@ void Buffer::cancel()
}
/**
+ * \fn Buffer::setRequest()
+ * \brief Set the request this buffer belongs to
+ *
+ * The intended callers are Request::prepare() and Request::completeBuffer().
+ */
+
+/**
* \class BufferPool
* \brief A pool of buffers
*
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 7088a479..433c6f83 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -141,6 +141,7 @@ int Request::prepare()
for (auto const &pair : bufferMap_) {
Buffer *buffer = pair.second;
+ buffer->setRequest(this);
pending_.insert(buffer);
}
@@ -177,6 +178,8 @@ bool Request::completeBuffer(Buffer *buffer)
int ret = pending_.erase(buffer);
ASSERT(ret == 1);
+ buffer->setRequest(nullptr);
+
return !hasPendingBuffers();
}