[libcamera-devel] [PATCH v4 01/32] libcamera: request: remove prepare()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jan 12 14:40:29 CET 2020


Hi Niklas,

Thank you for the patch.

On Sun, Jan 12, 2020 at 02:01:41AM +0100, Niklas Söderlund wrote:
> 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 at ragnatech.se>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  include/libcamera/request.h |  2 --
>  src/libcamera/buffer.cpp    |  4 ++--
>  src/libcamera/camera.cpp    | 11 +++++------
>  src/libcamera/request.cpp   | 26 ++------------------------
>  4 files changed, 9 insertions(+), 34 deletions(-)
> 
> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
> index 2d5a5964e99eb75f..728f380de4f010c3 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 960eeb8f7d193ddd..5305e3c391da6a69 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 e810fb725d81350d..5d294b10647db8da 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 c14ed1a4d3ce55d0..84a5f55879ccf5b5 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;
> @@ -203,30 +205,6 @@ Buffer *Request::findBuffer(Stream *stream) const
>   * 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
>   *

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list