[v2,31/35] pipeline: rkisp1: Load dewarp parameters from tuning file
diff mbox series

Message ID 20251023144841.403689-32-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • Full dewarper support on imx8mp
Related show

Commit Message

Stefan Klug Oct. 23, 2025, 2:48 p.m. UTC
Load the dewarp parameters from the tuning file.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

---

Changes in v2:
- Dropped unused variable
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 33 +++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index eaf82d0f1097..2280a5554f5a 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -125,6 +125,11 @@  public:
 	 */
 	MediaPipeline pipe_;
 
+	struct DewarpParms {
+		Matrix<double, 3, 3> cm;
+		std::vector<double> coeffs;
+	};
+	std::optional<DewarpParms> dewarpParams_;
 	bool canUseDewarper_;
 	bool usesDewarper_;
 
@@ -458,8 +463,30 @@  int RkISP1CameraData::loadTuningFile(const std::string &path)
 
 	const auto &algos = (*data)["algorithms"].asList();
 	for (const auto &algo : algos) {
-		if (algo.contains("Dewarp"))
+		const auto &params = algo["Dewarp"];
+		if (params) {
 			canUseDewarper_ = true;
+			DewarpParms dp;
+			if (params["cm"]) {
+				const auto &cm = params["cm"].get<Matrix<double, 3, 3>>();
+				if (!cm) {
+					LOG(RkISP1, Error) << "Dewarp parameters are missing 'cm' value";
+					return -EINVAL;
+				}
+				dp.cm = *cm;
+			}
+
+			if (params["coefficients"]) {
+				const auto &coeffs = params["coefficients"].getList<double>();
+				if (!coeffs) {
+					LOG(RkISP1, Error) << "Dewarp parameters 'coefficients' value is not a list";
+					return -EINVAL;
+				}
+				dp.coeffs = *coeffs;
+			}
+
+			dewarpParams_ = dp;
+		}
 	}
 
 	return 0;
@@ -1050,6 +1077,10 @@  int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
 				auto &vertexMap = dewarper_->vertexMap(cfg.stream());
 				vertexMap.setSensorCrop(sensorCrop);
 				vertexMap.setTransform(config->combinedTransform());
+				if (data->dewarpParams_) {
+					vertexMap.setDewarpParams(data->dewarpParams_->cm,
+								  data->dewarpParams_->coeffs);
+				}
 				data->properties_.set(properties::ScalerCropMaximum, sensorCrop);
 
 				/*