libcamera: request: remove prepare()
The association of buffers to a request can be done directly in addBuffer() instead of when the request is queued to the camera. Keep the check that a request contains buffers by moving it to Camera::queueRequest() where prepare() was previously called. As a bonus we can remove a friend statement in Request. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
96eaad1238
commit
856a4a2527
4 changed files with 9 additions and 34 deletions
|
@ -48,10 +48,8 @@ public:
|
||||||
bool hasPendingBuffers() const { return !pending_.empty(); }
|
bool hasPendingBuffers() const { return !pending_.empty(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Camera;
|
|
||||||
friend class PipelineHandler;
|
friend class PipelineHandler;
|
||||||
|
|
||||||
int prepare();
|
|
||||||
void complete();
|
void complete();
|
||||||
|
|
||||||
bool completeBuffer(Buffer *buffer);
|
bool completeBuffer(Buffer *buffer);
|
||||||
|
|
|
@ -360,7 +360,7 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)
|
||||||
* The intended callers of this method are buffer completion handlers that
|
* The intended callers of this method are buffer completion handlers that
|
||||||
* need to associate a buffer to the request it belongs to.
|
* need to associate a buffer to the request it belongs to.
|
||||||
*
|
*
|
||||||
* A Buffer is associated to a request by Request::prepare() and the
|
* A Buffer is associated to a request by Request::addBuffer() and the
|
||||||
* association is valid until the buffer completes. The returned request
|
* association is valid until the buffer completes. The returned request
|
||||||
* pointer is valid only during that interval.
|
* pointer is valid only during that interval.
|
||||||
*
|
*
|
||||||
|
@ -397,7 +397,7 @@ void Buffer::cancel()
|
||||||
* \fn Buffer::setRequest()
|
* \fn Buffer::setRequest()
|
||||||
* \brief Set the request this buffer belongs to
|
* \brief Set the request this buffer belongs to
|
||||||
*
|
*
|
||||||
* The intended callers are Request::prepare() and Request::completeBuffer().
|
* The intended callers are Request::addBuffer() and Request::completeBuffer().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
} /* namespace libcamera */
|
} /* namespace libcamera */
|
||||||
|
|
|
@ -810,6 +810,11 @@ int Camera::queueRequest(Request *request)
|
||||||
if (!stateIs(CameraRunning))
|
if (!stateIs(CameraRunning))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
|
if (request->buffers().empty()) {
|
||||||
|
LOG(Camera, Error) << "Request contains no buffers";
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto const &it : request->buffers()) {
|
for (auto const &it : request->buffers()) {
|
||||||
Stream *stream = it.first;
|
Stream *stream = it.first;
|
||||||
Buffer *buffer = it.second;
|
Buffer *buffer = it.second;
|
||||||
|
@ -832,12 +837,6 @@ int Camera::queueRequest(Request *request)
|
||||||
buffer->mem_ = &stream->buffers()[buffer->index_];
|
buffer->mem_ = &stream->buffers()[buffer->index_];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = request->prepare();
|
|
||||||
if (ret) {
|
|
||||||
LOG(Camera, Error) << "Failed to prepare request";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pipe_->queueRequest(this, request);
|
return pipe_->queueRequest(this, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,8 @@ int Request::addBuffer(std::unique_ptr<Buffer> buffer)
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer->setRequest(this);
|
||||||
|
pending_.insert(buffer.get());
|
||||||
bufferMap_[stream] = buffer.release();
|
bufferMap_[stream] = buffer.release();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -203,30 +205,6 @@ Buffer *Request::findBuffer(Stream *stream) const
|
||||||
* otherwise
|
* otherwise
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Validate the request and prepare it for the completion handler
|
|
||||||
*
|
|
||||||
* Requests that contain no buffers are invalid and are rejected.
|
|
||||||
*
|
|
||||||
* \return 0 on success or a negative error code otherwise
|
|
||||||
* \retval -EINVAL The request is invalid
|
|
||||||
*/
|
|
||||||
int Request::prepare()
|
|
||||||
{
|
|
||||||
if (bufferMap_.empty()) {
|
|
||||||
LOG(Request, Error) << "Invalid request due to missing buffers";
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto const &pair : bufferMap_) {
|
|
||||||
Buffer *buffer = pair.second;
|
|
||||||
buffer->setRequest(this);
|
|
||||||
pending_.insert(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Complete a queued request
|
* \brief Complete a queued request
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue