[RFC PATCH 5/7] pipeline: rkisp1: Apply initial controls

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jan 12 23:00:40 CET 2025


Hi Stefan,

Thank you for the patch.

On Fri, Dec 20, 2024 at 05:26:51PM +0100, Stefan Klug wrote:
> Controls passed to Camera::start() are not handled at the moment.
> Implement that by issuing a dummy queueRequest() to initialize the frame
> context and then returning the controls synchronously to the caller. In
> the pipeline the controls get passed to the sensor before the call to
> stremOn() to ensure the controls are applied right away. Passing the

s/stremOn/streamOn/

> controls to the pipeline using the setSensorControls signal is not
> appropriate because it is asynchronous and would reach the sensor too
> late (initial controls need to be applied before the sensor starts and
> before delayed controls initializes it's start condition.)
> 
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> ---
>  include/libcamera/ipa/rkisp1.mojom       |  7 ++++++-
>  src/ipa/rkisp1/rkisp1.cpp                | 15 ++++++++++-----
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 11 +++++++++--
>  3 files changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom
> index 043ad27ea199..86eae55cd530 100644
> --- a/include/libcamera/ipa/rkisp1.mojom
> +++ b/include/libcamera/ipa/rkisp1.mojom
> @@ -14,13 +14,18 @@ struct IPAConfigInfo {
>  	uint32 paramFormat;
>  };
>  
> +struct StartResult {
> +	libcamera.ControlList controls;
> +	int32 code;
> +};
> +
>  interface IPARkISP1Interface {
>  	init(libcamera.IPASettings settings,
>  	     uint32 hwRevision,
>  	     libcamera.IPACameraSensorInfo sensorInfo,
>  	     libcamera.ControlInfoMap sensorControls)
>  		=> (int32 ret, libcamera.ControlInfoMap ipaControls);
> -	start() => (int32 ret);
> +	start(libcamera.ControlList controls) => (StartResult result);
>  	stop();
>  
>  	configure(IPAConfigInfo configInfo,
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 45a539a61fb1..799fe0846635 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -55,7 +55,7 @@ public:
>  		 const IPACameraSensorInfo &sensorInfo,
>  		 const ControlInfoMap &sensorControls,
>  		 ControlInfoMap *ipaControls) override;
> -	int start() override;
> +	void start(const ControlList &controls, StartResult *result) override;
>  	void stop() override;
>  
>  	int configure(const IPAConfigInfo &ipaConfig,
> @@ -209,12 +209,17 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
>  	return 0;
>  }
>  
> -int IPARkISP1::start()
> +void IPARkISP1::start(const ControlList &controls, StartResult *result)
>  {
> -	ControlList ctrls = getSensorControls(0);
> -	setSensorControls.emit(0, ctrls);
> +	/*
> +	 * \todo: This feels a bit counter intuitive, as the queueRequest() for frame
> +	 * 0 will be called again when the actual request for frame 0 get's
> +	 * queued.
> +	 */

s/todo:/todo/

It's more than counterintuitive, I think it's an important design
problem. I'm OK with this dirty hack for now, but I think it should be
addressed sooner than later. Can you word the \todo comment a bit
stronger ?

> +	queueRequest(0, controls);
>  
> -	return 0;
> +	result->controls = getSensorControls(0);
> +	result->code = 0;
>  }
>  
>  void IPARkISP1::stop()
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 71a07c6027b9..ee6ed1b9c84a 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -1086,13 +1086,20 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL
>  		return ret;
>  	actions += [&]() { freeBuffers(camera); };
>  
> -	ret = data->ipa_->start();
> -	if (ret) {
> +	ControlList ctrls;
> +	if (!!controls)
> +		ctrls = *controls;
> +
> +	ipa::rkisp1::StartResult res;
> +	data->ipa_->start(ctrls, &res);
> +	if (res.code) {
>  		LOG(RkISP1, Error)
>  			<< "Failed to start IPA " << camera->id();
>  		return ret;
>  	}
>  	actions += [&]() { data->ipa_->stop(); };
> +	data->sensor_->setControls(&res.controls);
> +	data->delayedCtrls_->reset();

Resetting the delayed controls seems to be an important bug fix. It
should be mentioned in the commit message, or better split to a separate
commit.

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

>  
>  	data->frame_ = 0;
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list