diff options
-rw-r--r-- | include/libcamera/buffer.h | 6 | ||||
-rw-r--r-- | src/libcamera/buffer.cpp | 25 | ||||
-rw-r--r-- | src/libcamera/request.cpp | 3 |
3 files changed, 33 insertions, 1 deletions
diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index 0c844d12..8f9b42e3 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -13,6 +13,7 @@ namespace libcamera { class BufferPool; +class Request; class Plane final { @@ -52,14 +53,18 @@ public: unsigned int sequence() const { return sequence_; } Status status() const { return status_; } std::vector<Plane> &planes() { return planes_; } + Request *request() const { return request_; } private: friend class BufferPool; friend class PipelineHandler; + friend class Request; friend class V4L2Device; void cancel(); + void setRequest(Request *request) { request_ = request; } + unsigned int index_; unsigned int bytesused_; uint64_t timestamp_; @@ -67,6 +72,7 @@ private: Status status_; std::vector<Plane> planes_; + Request *request_; }; class BufferPool final 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(); } |