[v1,30/33] pipeline: rkisp1: Load dewarp parameters from tuning file
diff mbox series

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

Commit Message

Stefan Klug Sept. 30, 2025, 12:26 p.m. UTC
Load the dewarp parameters from the tuning file.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 30 ++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 07dd5dc8d99a..13d82c9957bc 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_;
 
@@ -462,6 +467,27 @@  int RkISP1CameraData::loadTuningFile(const std::string &path)
 			const auto &params = algo["Dewarp"];
 
 			canUseDewarper_ = true;
+			Matrix<double, 3, 3> m;
+			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;
 		}
 	}
 
@@ -1066,6 +1092,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);
 
 				/*