[libcamera-devel] [PATCH] simple-cam: Reuse Requests

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Oct 16 11:04:58 CEST 2020


Hi Paul,

On 16/10/2020 06:51, Paul Elder wrote:
> Update simple-cam to reuse Request objects, and use the new API with
> unique pointers.
> 

Thank you for updating this.

> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
>  simple-cam.cpp | 35 ++++++++---------------------------
>  1 file changed, 8 insertions(+), 27 deletions(-)
> 
> diff --git a/simple-cam.cpp b/simple-cam.cpp
> index 3aa975e..727bb6d 100644
> --- a/simple-cam.cpp
> +++ b/simple-cam.cpp
> @@ -55,27 +55,8 @@ static void requestComplete(Request *request)
>  		 */
>  	}
>  
> -	/*
> -	 * Re-queue a Request to the camera.
> -	 *
> -	 * Create a new request and populate it with one buffer for each
> -	 * stream.
> -	 */
> -	request = camera->createRequest();
> -	if (!request)
> -	{
> -		std::cerr << "Can't create request" << std::endl;
> -		return;
> -	}
> -
> -	for (auto it = buffers.begin(); it != buffers.end(); ++it)
> -	{
> -		const Stream *stream = it->first;
> -		FrameBuffer *buffer = it->second;
> -
> -		request->addBuffer(stream, buffer);
> -	}
> -
> +	/* Re-queue the Request to the camera. */
> +	request->reuse(Request::ReuseBuffers);


Oh - now that reduces some code ;-)


>  	camera->queueRequest(request);
>  }
>  
> @@ -263,9 +244,9 @@ int main()
>  	 */
>  	Stream *stream = streamConfig.stream();
>  	const std::vector<std::unique_ptr<FrameBuffer>> &buffers = allocator->buffers(stream);
> -	std::vector<Request *> requests;
> +	std::vector<std::unique_ptr<Request>> requests;

I like this. Now 'we' own the requests.

>  	for (unsigned int i = 0; i < buffers.size(); ++i) {
> -		Request *request = camera->createRequest();
> +		std::unique_ptr<Request> request = camera->createRequest();
>  		if (!request)
>  		{
>  			std::cerr << "Can't create request" << std::endl;
> @@ -281,13 +262,13 @@ int main()
>  			return ret;
>  		}
>  
> -		requests.push_back(request);
> -
>  		/*
>  		 * Controls can be added to a request on a per frame basis.
>  		 */
>  		ControlList &controls = request->controls();
>  		controls.set(controls::Brightness, 0.5);
> +
> +		requests.push_back(std::move(request));
>  	}
>  
>  	/*
> @@ -323,8 +304,8 @@ int main()
>  	 * Camera::requestCompleted Signal is called.
>  	 */
>  	camera->start();
> -	for (Request *request : requests)
> -		camera->queueRequest(request);
> +	for (std::unique_ptr<Request> &request : requests)
> +		camera->queueRequest(request.get());

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

Thanks!

>  
>  	/*
>  	 * --------------------------------------------------------------------
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list