[libcamera-devel] [PATCH] cam: Fail capture if to few Requests asked for

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Feb 8 12:36:39 CET 2021


Hi Niklas,

Thank you for the patch.

On Mon, Feb 08, 2021 at 10:44:16AM +0100, Niklas Söderlund wrote:
> Running cam with the --capture=N option only queues N Requests to the
> camera. If N is less then the number of requests needed by the camera to
> operate cam may deadlock waiting for the camera to complete requests
> while the camera waits for the application to give it more buffers.
> 
> Fix this by adding a check in cam to no attempt a capture session if to
> few requests are requested.
> 
> Reported-by: Sebastian Fricke <sebastian.fricke at posteo.net>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  src/cam/capture.cpp | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp
> index 7b55fc6770225e2a..18aa97c7cdb55dcc 100644
> --- a/src/cam/capture.cpp
> +++ b/src/cam/capture.cpp
> @@ -90,6 +90,13 @@ int Capture::capture(FrameBufferAllocator *allocator)
>  		nbuffers = std::min(nbuffers, allocated);
>  	}
>  
> +	if (captureLimit_ && captureLimit_ < nbuffers) {
> +		std::cerr << "Camera requiers at least " << nbuffers
> +			  << " reqests to function, " << captureLimit_
> +			  << " requested" << std::endl;
> +		return -EINVAL;
> +	}

I'm afraid this isn't right. The pipeline handler may not require
nbuffers to be queued to operate properly, and this also won't handle
the end of stream case where some drivers will require enqueing more
buffers to push the last buffers out.

We need a more complex solution for this, involving an explicit queue
depth.

> +
>  	/*
>  	 * TODO: make cam tool smarter to support still capture by for
>  	 * example pushing a button. For now run all streams all the time.

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list