[libcamera-devel] [RFCv2 5/7] libcamera: pipeline: rkisp1: Call IPA start() and stop()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Mar 26 22:27:34 CET 2020


Hi Niklas,

Thank you for the patch.

On Thu, Mar 26, 2020 at 05:08:17PM +0100, Niklas Söderlund wrote:
> Call the IPA start()/stop() functions before/after the camera is
> started. This makes sure the IPA functions properly once thread
> management is moved into the start/stop interface.
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index f49b3a7f0945ac92..3287fd3a18204cbc 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -113,8 +113,8 @@ class RkISP1CameraData : public CameraData
>  {
>  public:
>  	RkISP1CameraData(PipelineHandler *pipe)
> -		: CameraData(pipe), sensor_(nullptr), frame_(0),
> -		  frameInfo_(pipe)
> +		: CameraData(pipe), running_(false), sensor_(nullptr),
> +		  frame_(0), frameInfo_(pipe)
>  	{
>  	}
>  
> @@ -125,6 +125,7 @@ public:
>  
>  	int loadIPA();
>  
> +	bool running_;
>  	Stream stream_;
>  	CameraSensor *sensor_;
>  	unsigned int frame_;
> @@ -394,6 +395,9 @@ int RkISP1CameraData::loadIPA()
>  void RkISP1CameraData::queueFrameAction(unsigned int frame,
>  					const IPAOperationData &action)
>  {
> +	if (!running_)
> +		return;
> +
>  	switch (action.operation) {
>  	case RKISP1_IPA_ACTION_V4L2_SET: {
>  		const ControlList &controls = action.controls[0];
> @@ -764,10 +768,19 @@ int PipelineHandlerRkISP1::start(Camera *camera)
>  	if (ret)
>  		return ret;
>  
> +	ret = data->ipa_->start();
> +	if (ret) {
> +		freeBuffers(camera);
> +		LOG(RkISP1, Error)
> +			<< "Failed to start IPA " << camera->name();
> +		return ret;
> +	}
> +

I wonder if it would simplify error handling if you moved this last (the
stop could go first at stop time then).

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

>  	data->frame_ = 0;
>  
>  	ret = param_->streamOn();
>  	if (ret) {
> +		data->ipa_->stop();
>  		freeBuffers(camera);
>  		LOG(RkISP1, Error)
>  			<< "Failed to start parameters " << camera->name();
> @@ -777,6 +790,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)
>  	ret = stat_->streamOn();
>  	if (ret) {
>  		param_->streamOff();
> +		data->ipa_->stop();
>  		freeBuffers(camera);
>  		LOG(RkISP1, Error)
>  			<< "Failed to start statistics " << camera->name();
> @@ -787,12 +801,14 @@ int PipelineHandlerRkISP1::start(Camera *camera)
>  	if (ret) {
>  		param_->streamOff();
>  		stat_->streamOff();
> +		data->ipa_->stop();
>  		freeBuffers(camera);
>  
>  		LOG(RkISP1, Error)
>  			<< "Failed to start camera " << camera->name();
>  	}
>  
> +	data->running_ = true;
>  	activeCamera_ = camera;
>  
>  	/* Inform IPA of stream configuration and sensor controls. */
> @@ -830,6 +846,10 @@ void PipelineHandlerRkISP1::stop(Camera *camera)
>  		LOG(RkISP1, Warning)
>  			<< "Failed to stop parameters " << camera->name();
>  
> +	data->running_ = false;
> +
> +	data->ipa_->stop();
> +
>  	data->timeline_.reset();
>  
>  	freeBuffers(camera);

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list