[libcamera-devel] [PATCH v2 1/1] pipeline: raspberrypi: Create empty control lists correctly

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Oct 5 11:28:23 CEST 2021


Hi David,

Thank you for the patch.

On Tue, Oct 05, 2021 at 09:57:00AM +0100, David Plowman wrote:
> When the pipeline handler start() method is supplied with a NULL list
> of controls, we send an empty control list to the IPA. When the IPA is
> running in isolated mode the control list goes through the data
> serializer, for which it must be marked correctly as a list of
> "controls::controls", otherwise the IPA process will abort.
> 
> The IPA has a similar problem returning a control list in its
> configure() method. We must be careful to initialise it properly even
> when empty.

Looks good to me. I'll wait another day before pushing this to let Paul
chime in if he wants to.

> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/ipa/raspberrypi/raspberrypi.cpp                | 13 +++++++++----
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  3 ++-
>  2 files changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 047123ab..fed82e22 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -389,21 +389,26 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
>  	/* Pass the camera mode to the CamHelper to setup algorithms. */
>  	helper_->SetCameraMode(mode_);
>  
> +	/*
> +	 * Initialise this ControlList correctly, even if empty, in case the IPA is
> +	 * running is isolation mode (passing the ControlList through the IPC layer).
> +	 */
> +	ControlList ctrls(sensorCtrls_);
> +
>  	if (firstStart_) {
>  		/* Supply initial values for frame durations. */
>  		applyFrameDurations(defaultMinFrameDuration, defaultMaxFrameDuration);
>  
>  		/* Supply initial values for gain and exposure. */
> -		ControlList ctrls(sensorCtrls_);
>  		AgcStatus agcStatus;
>  		agcStatus.shutter_time = defaultExposureTime;
>  		agcStatus.analogue_gain = defaultAnalogueGain;
>  		applyAGC(&agcStatus, ctrls);
> -
> -		ASSERT(controls);
> -		*controls = std::move(ctrls);
>  	}
>  
> +	ASSERT(controls);
> +	*controls = std::move(ctrls);
> +
>  	return 0;
>  }
>  
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 0bdfa727..1634ca98 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -825,7 +825,8 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>  
>  	/* Start the IPA. */
>  	ipa::RPi::StartConfig startConfig;
> -	data->ipa_->start(controls ? *controls : ControlList{}, &startConfig);
> +	data->ipa_->start(controls ? *controls : ControlList{ controls::controls },
> +			  &startConfig);
>  
>  	/* Apply any gain/exposure settings that the IPA may have passed back. */
>  	if (!startConfig.controls.empty())

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list