libcamera: request: Add request completion status

Add a new field to the Request class to report its completion status,
and a new complete() method to update the status.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-02-28 17:45:58 +02:00
parent fca7602c3c
commit 1accc258cc
2 changed files with 51 additions and 1 deletions

View file

@ -18,9 +18,16 @@ class Buffer;
class Camera;
class Stream;
class Request
{
public:
enum Status {
RequestPending,
RequestComplete,
RequestCancelled,
};
explicit Request(Camera *camera);
Request(const Request &) = delete;
Request &operator=(const Request &) = delete;
@ -28,15 +35,20 @@ public:
int setBuffers(const std::map<Stream *, Buffer *> &streamMap);
Buffer *findBuffer(Stream *stream) const;
Status status() const { return status_; }
private:
friend class Camera;
int prepare();
void complete(Status status);
void bufferCompleted(Buffer *buffer);
Camera *camera_;
std::map<Stream *, Buffer *> bufferMap_;
std::unordered_set<Buffer *> pending_;
Status status_;
};
} /* namespace libcamera */

View file

@ -23,6 +23,17 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(Request)
/**
* \enum Request::Status
* Request completion status
* \var Request::RequestPending
* The request hasn't completed yet
* \var Request::RequestComplete
* The request has completed
* \var Request::RequestCancelled
* The request has been cancelled due to capture stop
*/
/**
* \class Request
* \brief A frame capture request
@ -36,7 +47,7 @@ LOG_DEFINE_CATEGORY(Request)
* \param[in] camera The camera that creates the request
*/
Request::Request(Camera *camera)
: camera_(camera)
: camera_(camera), status_(RequestPending)
{
}
@ -82,6 +93,19 @@ Buffer *Request::findBuffer(Stream *stream) const
return it->second;
}
/**
* \fn Request::status()
* \brief Retrieve the request completion status
*
* The request status indicates whether the request has completed successfully
* or with an error. When requests are created and before they complete the
* request status is set to RequestPending, and is updated at completion time
* to RequestComplete. If a request is cancelled at capture stop before it has
* completed, its status is set to RequestCancelled.
*
* \return The request completion status
*/
/**
* \brief Prepare the resources for the completion handler
*/
@ -96,6 +120,18 @@ int Request::prepare()
return 0;
}
/**
* \brief Complete a queued request
* \param[in] status The request completion status
*
* Mark the request as complete by updating its status to \a status.
*/
void Request::complete(Status status)
{
ASSERT(pending_.empty());
status_ = status;
}
/**
* \brief Slot for the buffer completed signal
*
@ -117,6 +153,8 @@ void Request::bufferCompleted(Buffer *buffer)
if (!pending_.empty())
return;
complete(RequestComplete);
std::map<Stream *, Buffer *> buffers(std::move(bufferMap_));
camera_->requestCompleted.emit(this, buffers);
delete this;