mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-19 10:25:05 +03:00
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:
parent
fca7602c3c
commit
1accc258cc
2 changed files with 51 additions and 1 deletions
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue