[libcamera-devel] [PATCH v2 1/2] libcamera: ipu3: Move Imgu configuration to IPU3CameraData

Jean-Michel Hautbois jeanmichel.hautbois at ideasonboard.com
Tue Mar 16 11:18:38 CET 2021


The IPU3 IPA needs to know the BayerDownScaler (BDS) configuration to
calculate the statistics grids.
This patch makes it possible for PipelineHandlerIPU3::start() to access
the BDS configuration and later pass the rectangle to the IPU3 IPA
configure method.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
---
v2:
- move pipe configuration calculation from validate to configure
- move ipa configuration from start to configure
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++---------------
 1 file changed, 20 insertions(+), 25 deletions(-)

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 2ea13ec9..3f49ded3 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -97,21 +97,23 @@ public:
 	Status validate() override;
 
 	const StreamConfiguration &cio2Format() const { return cio2Configuration_; }
-	const ImgUDevice::PipeConfig imguConfig() const { return pipeConfig_; }
 
 	/* Cache the combinedTransform_ that will be applied to the sensor */
 	Transform combinedTransform_;
 
+	/* Store the pipe configuration */
+	ImgUDevice::PipeConfig pipeConfig_;
+	ImgUDevice::Pipe pipe_{};
+
 private:
 	/*
 	 * The IPU3CameraData instance is guaranteed to be valid as long as the
 	 * corresponding Camera instance is valid. In order to borrow a
 	 * reference to the camera data, store a new reference to the camera.
 	 */
-	const IPU3CameraData *data_;
+	IPU3CameraData *data_;
 
 	StreamConfiguration cio2Configuration_;
-	ImgUDevice::PipeConfig pipeConfig_;
 };
 
 class PipelineHandlerIPU3 : public PipelineHandler
@@ -272,8 +274,7 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 
 	LOG(IPU3, Debug) << "CIO2 configuration: " << cio2Configuration_.toString();
 
-	ImgUDevice::Pipe pipe{};
-	pipe.input = cio2Configuration_.size;
+	pipe_.input = cio2Configuration_.size;
 
 	/*
 	 * Adjust the configurations if needed and assign streams while
@@ -349,15 +350,15 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 				cfg->setStream(const_cast<Stream *>(&data_->outStream_));
 				mainOutputAvailable = false;
 
-				pipe.main = cfg->size;
+				pipe_.main = cfg->size;
 				if (yuvCount == 1)
-					pipe.viewfinder = pipe.main;
+					pipe_.viewfinder = pipe_.main;
 
 				LOG(IPU3, Debug) << "Assigned " << cfg->toString()
 						 << " to the main output";
 			} else {
 				cfg->setStream(const_cast<Stream *>(&data_->vfStream_));
-				pipe.viewfinder = cfg->size;
+				pipe_.viewfinder = cfg->size;
 
 				LOG(IPU3, Debug) << "Assigned " << cfg->toString()
 						 << " to the viewfinder output";
@@ -373,16 +374,6 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 		}
 	}
 
-	/* Only compute the ImgU configuration if a YUV stream has been requested. */
-	if (yuvCount) {
-		pipeConfig_ = data_->imgu_->calculatePipeConfig(&pipe);
-		if (pipeConfig_.isNull()) {
-			LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
-					 << "unsupported resolutions.";
-			return Invalid;
-		}
-	}
-
 	return status;
 }
 
@@ -576,11 +567,15 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
 	 * stream has been requested: return here to skip the ImgU configuration
 	 * part.
 	 */
-	ImgUDevice::PipeConfig imguConfig = config->imguConfig();
-	if (imguConfig.isNull())
+
+	config->pipeConfig_ = imgu->calculatePipeConfig(&config->pipe_);
+	if (config->pipeConfig_.isNull()) {
+		LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
+				 << "unsupported resolutions.";
 		return 0;
+	}
 
-	ret = imgu->configure(imguConfig, &cio2Format);
+	ret = imgu->configure(config->pipeConfig_, &cio2Format);
 	if (ret)
 		return ret;
 
@@ -633,6 +628,10 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
 		return ret;
 	}
 
+	std::map<uint32_t, ControlInfoMap> entityControls;
+	entityControls.emplace(0, data->cio2_.sensor()->controls());
+	data->ipa_->configure(entityControls, config->pipeConfig_.bds);
+
 	return 0;
 }
 
@@ -717,7 +716,6 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)
 
 int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] const ControlList *controls)
 {
-	std::map<uint32_t, ControlInfoMap> entityControls;
 	IPU3CameraData *data = cameraData(camera);
 	CIO2Device *cio2 = &data->cio2_;
 	ImgUDevice *imgu = data->imgu_;
@@ -744,9 +742,6 @@ int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] const ControlLis
 	if (ret)
 		goto error;
 
-	entityControls.emplace(0, data->cio2_.sensor()->controls());
-	data->ipa_->configure(entityControls);
-
 	return 0;
 
 error:
-- 
2.27.0



More information about the libcamera-devel mailing list