mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-19 18:35:07 +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 Camera;
|
||||||
class Stream;
|
class Stream;
|
||||||
|
|
||||||
|
|
||||||
class Request
|
class Request
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum Status {
|
||||||
|
RequestPending,
|
||||||
|
RequestComplete,
|
||||||
|
RequestCancelled,
|
||||||
|
};
|
||||||
|
|
||||||
explicit Request(Camera *camera);
|
explicit Request(Camera *camera);
|
||||||
Request(const Request &) = delete;
|
Request(const Request &) = delete;
|
||||||
Request &operator=(const Request &) = delete;
|
Request &operator=(const Request &) = delete;
|
||||||
|
@ -28,15 +35,20 @@ public:
|
||||||
int setBuffers(const std::map<Stream *, Buffer *> &streamMap);
|
int setBuffers(const std::map<Stream *, Buffer *> &streamMap);
|
||||||
Buffer *findBuffer(Stream *stream) const;
|
Buffer *findBuffer(Stream *stream) const;
|
||||||
|
|
||||||
|
Status status() const { return status_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Camera;
|
friend class Camera;
|
||||||
|
|
||||||
int prepare();
|
int prepare();
|
||||||
|
void complete(Status status);
|
||||||
void bufferCompleted(Buffer *buffer);
|
void bufferCompleted(Buffer *buffer);
|
||||||
|
|
||||||
Camera *camera_;
|
Camera *camera_;
|
||||||
std::map<Stream *, Buffer *> bufferMap_;
|
std::map<Stream *, Buffer *> bufferMap_;
|
||||||
std::unordered_set<Buffer *> pending_;
|
std::unordered_set<Buffer *> pending_;
|
||||||
|
|
||||||
|
Status status_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace libcamera */
|
} /* namespace libcamera */
|
||||||
|
|
|
@ -23,6 +23,17 @@ namespace libcamera {
|
||||||
|
|
||||||
LOG_DEFINE_CATEGORY(Request)
|
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
|
* \class Request
|
||||||
* \brief A frame capture request
|
* \brief A frame capture request
|
||||||
|
@ -36,7 +47,7 @@ LOG_DEFINE_CATEGORY(Request)
|
||||||
* \param[in] camera The camera that creates the request
|
* \param[in] camera The camera that creates the request
|
||||||
*/
|
*/
|
||||||
Request::Request(Camera *camera)
|
Request::Request(Camera *camera)
|
||||||
: camera_(camera)
|
: camera_(camera), status_(RequestPending)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +93,19 @@ Buffer *Request::findBuffer(Stream *stream) const
|
||||||
return it->second;
|
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
|
* \brief Prepare the resources for the completion handler
|
||||||
*/
|
*/
|
||||||
|
@ -96,6 +120,18 @@ int Request::prepare()
|
||||||
return 0;
|
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
|
* \brief Slot for the buffer completed signal
|
||||||
*
|
*
|
||||||
|
@ -117,6 +153,8 @@ void Request::bufferCompleted(Buffer *buffer)
|
||||||
if (!pending_.empty())
|
if (!pending_.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
complete(RequestComplete);
|
||||||
|
|
||||||
std::map<Stream *, Buffer *> buffers(std::move(bufferMap_));
|
std::map<Stream *, Buffer *> buffers(std::move(bufferMap_));
|
||||||
camera_->requestCompleted.emit(this, buffers);
|
camera_->requestCompleted.emit(this, buffers);
|
||||||
delete this;
|
delete this;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue