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>
This commit is contained in:
Jacopo Mondi 2019-04-09 11:27:29 +02:00
parent 0527ba92ad
commit ee027781b4
3 changed files with 33 additions and 1 deletions

View file

@ -13,6 +13,7 @@
namespace libcamera { namespace libcamera {
class BufferPool; class BufferPool;
class Request;
class Plane final class Plane final
{ {
@ -52,14 +53,18 @@ public:
unsigned int sequence() const { return sequence_; } unsigned int sequence() const { return sequence_; }
Status status() const { return status_; } Status status() const { return status_; }
std::vector<Plane> &planes() { return planes_; } std::vector<Plane> &planes() { return planes_; }
Request *request() const { return request_; }
private: private:
friend class BufferPool; friend class BufferPool;
friend class PipelineHandler; friend class PipelineHandler;
friend class Request;
friend class V4L2Device; friend class V4L2Device;
void cancel(); void cancel();
void setRequest(Request *request) { request_ = request; }
unsigned int index_; unsigned int index_;
unsigned int bytesused_; unsigned int bytesused_;
uint64_t timestamp_; uint64_t timestamp_;
@ -67,6 +72,7 @@ private:
Status status_; Status status_;
std::vector<Plane> planes_; std::vector<Plane> planes_;
Request *request_;
}; };
class BufferPool final class BufferPool final

View file

@ -196,7 +196,7 @@ void *Plane::mem()
*/ */
Buffer::Buffer() Buffer::Buffer()
: index_(-1) : index_(-1), request_(nullptr)
{ {
} }
@ -248,6 +248,22 @@ Buffer::Buffer()
* \return The buffer status * \return The buffer status
*/ */
/**
* \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 * \brief Mark a buffer as cancel by setting its status to BufferCancelled
*/ */
@ -259,6 +275,13 @@ void Buffer::cancel()
status_ = BufferCancelled; status_ = BufferCancelled;
} }
/**
* \fn Buffer::setRequest()
* \brief Set the request this buffer belongs to
*
* The intended callers are Request::prepare() and Request::completeBuffer().
*/
/** /**
* \class BufferPool * \class BufferPool
* \brief A pool of buffers * \brief A pool of buffers

View file

@ -141,6 +141,7 @@ int Request::prepare()
for (auto const &pair : bufferMap_) { for (auto const &pair : bufferMap_) {
Buffer *buffer = pair.second; Buffer *buffer = pair.second;
buffer->setRequest(this);
pending_.insert(buffer); pending_.insert(buffer);
} }
@ -177,6 +178,8 @@ bool Request::completeBuffer(Buffer *buffer)
int ret = pending_.erase(buffer); int ret = pending_.erase(buffer);
ASSERT(ret == 1); ASSERT(ret == 1);
buffer->setRequest(nullptr);
return !hasPendingBuffers(); return !hasPendingBuffers();
} }