[libcamera-devel] [PATCH v2 06/10] pipeline: raspberrypi: Reorder startup drop frame initialisation

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Dec 2 14:52:58 CET 2022


Hi Naush,

Thank you for the patch.

On Tue, Nov 29, 2022 at 01:45:30PM +0000, Naushir Patuck via libcamera-devel wrote:
> Reorder the code such that the IPA requested startup drop frames count is
> available before the pipeline handler allocates any stream buffers.
> 
> This will be used in a subsequent change to stop Unicam buffer allocations if
> there are no startup drop frames required.

Do you mean "if there are no startup drop frames required and the
application has configured a raw stream and always provides buffers for
it" ?

Why is that related ? Can't you avoid allocating internal raw buffers
even without startup frames being dropped ? Can't you use the raw buffer
from the first request to capture all the dropped frames and the first
useful frame ?

> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 30 +++++++++----------
>  1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 86eb43a3a3c5..742521927780 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1044,21 +1044,6 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>  	RPiCameraData *data = cameraData(camera);
>  	int ret;
>  
> -	for (auto const stream : data->streams_)
> -		stream->resetBuffers();
> -
> -	if (!data->buffersAllocated_) {
> -		/* Allocate buffers for internal pipeline usage. */
> -		ret = prepareBuffers(camera);
> -		if (ret) {
> -			LOG(RPI, Error) << "Failed to allocate buffers";
> -			data->freeBuffers();
> -			stop(camera);
> -			return ret;
> -		}
> -		data->buffersAllocated_ = true;
> -	}
> -
>  	/* Check if a ScalerCrop control was specified. */
>  	if (controls)
>  		data->applyScalerCrop(*controls);
> @@ -1075,6 +1060,21 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>  	/* Configure the number of dropped frames required on startup. */
>  	data->dropFrameCount_ = startConfig.dropFrameCount;
>  
> +	for (auto const stream : data->streams_)
> +		stream->resetBuffers();
> +
> +	if (!data->buffersAllocated_) {
> +		/* Allocate buffers for internal pipeline usage. */
> +		ret = prepareBuffers(camera);
> +		if (ret) {
> +			LOG(RPI, Error) << "Failed to allocate buffers";
> +			data->freeBuffers();
> +			stop(camera);
> +			return ret;
> +		}
> +		data->buffersAllocated_ = true;
> +	}
> +
>  	/* We need to set the dropFrameCount_ before queueing buffers. */
>  	ret = queueAllBuffers(camera);
>  	if (ret) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list