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 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 */

View file

@ -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;