summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 01:10:51 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 16:10:37 +0100
commit856a4a25278ce5e4b64497deaa3b20c4df16fdee (patch)
treea60c0e8d418e306db82db15668f3ea8033a11a72
parent96eaad1238131721207c6a9bde077f7f1aad5f60 (diff)
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>
-rw-r--r--include/libcamera/request.h2
-rw-r--r--src/libcamera/buffer.cpp4
-rw-r--r--src/libcamera/camera.cpp11
-rw-r--r--src/libcamera/request.cpp26
4 files changed, 9 insertions, 34 deletions
diff --git a/include/libcamera/request.h b/include/libcamera/request.h
index 2d5a5964..728f380d 100644
--- a/include/libcamera/request.h
+++ b/include/libcamera/request.h
@@ -48,10 +48,8 @@ public:
bool hasPendingBuffers() const { return !pending_.empty(); }
private:
- friend class Camera;
friend class PipelineHandler;
- int prepare();
void complete();
bool completeBuffer(Buffer *buffer);
diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp
index 960eeb8f..5305e3c3 100644
--- a/src/libcamera/buffer.cpp
+++ b/src/libcamera/buffer.cpp
@@ -360,7 +360,7 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)
* The intended callers of this method are buffer completion handlers that
* 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
* pointer is valid only during that interval.
*
@@ -397,7 +397,7 @@ void Buffer::cancel()
* \fn Buffer::setRequest()
* \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 */
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index e810fb72..5d294b10 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -810,6 +810,11 @@ int Camera::queueRequest(Request *request)
if (!stateIs(CameraRunning))
return -EACCES;
+ if (request->buffers().empty()) {
+ LOG(Camera, Error) << "Request contains no buffers";
+ return -EINVAL;
+ }
+
for (auto const &it : request->buffers()) {
Stream *stream = it.first;
Buffer *buffer = it.second;
@@ -832,12 +837,6 @@ int Camera::queueRequest(Request *request)
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);
}
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index c14ed1a4..84a5f558 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -139,6 +139,8 @@ int Request::addBuffer(std::unique_ptr<Buffer> buffer)
return -EEXIST;
}
+ buffer->setRequest(this);
+ pending_.insert(buffer.get());
bufferMap_[stream] = buffer.release();
return 0;
@@ -204,30 +206,6 @@ Buffer *Request::findBuffer(Stream *stream) const
*/
/**
- * \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
*
* Mark the request as complete by updating its status to RequestComplete,