[PATCH v4 2/4] ipa: rkisp1: algorithms: awb: Check for correct stats type

Stefan Klug stefan.klug at ideasonboard.com
Fri Oct 18 18:06:31 CEST 2024


Sometimes the ISP produces statistics only with a subset of statistic
types being valid. It doesn't happen normally, but was observed in the
wild. Check for the RKISP1_CIF_ISP_STAT_AWB bit to prevent using invalid
or outdated data. As it doesn't happen regularly add an error message to
get notified when it happens.

For simpler code structure, the ColourTemperature metadata entry gets
written unconditionally and overwritten later if needed.

Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

---
Changes in v2:
- Added error message
- Made condition more readable
- Collected tags
---
 src/ipa/rkisp1/algorithms/awb.cpp | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index 955a9ff4a897..b3c00bef9b7e 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -215,6 +215,12 @@ void Awb::process(IPAContext &context,
 			static_cast<float>(frameContext.awb.gains.red),
 			static_cast<float>(frameContext.awb.gains.blue)
 		});
+	metadata.set(controls::ColourTemperature, activeState.awb.temperatureK);
+
+	if (!stats || !(stats->meas_type & RKISP1_CIF_ISP_STAT_AWB)) {
+		LOG(RkISP1Awb, Error) << "AWB data is missing in statistics";
+		return;
+	}
 
 	if (rgbMode_) {
 		greenMean = awb->awb_mean[0].mean_y_or_g;
@@ -270,10 +276,8 @@ void Awb::process(IPAContext &context,
 	 * meaningfully calculate gains. Freeze the algorithm in that case.
 	 */
 	if (redMean < kMeanMinThreshold && greenMean < kMeanMinThreshold &&
-	    blueMean < kMeanMinThreshold) {
-		metadata.set(controls::ColourTemperature, activeState.awb.temperatureK);
+	    blueMean < kMeanMinThreshold)
 		return;
-	}
 
 	activeState.awb.temperatureK = estimateCCT(redMean, greenMean, blueMean);
 
-- 
2.43.0



More information about the libcamera-devel mailing list