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:
Niklas Söderlund 2020-01-12 01:10:51 +01:00
parent 96eaad1238
commit 856a4a2527
4 changed files with 9 additions and 34 deletions

View file

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

View file

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

View file

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

View file

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