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

Message ID 20200326160819.4088361-6-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • libcamera: ipa_manager: Proxy open-source IPAs to a thread
Related show

Commit Message

Niklas Söderlund March 26, 2020, 4:08 p.m. UTC
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@ragnatech.se>
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

Comments

Laurent Pinchart March 26, 2020, 9:27 p.m. UTC | #1
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@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@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);

Patch

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;
+	}
+
 	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);