[libcamera-devel,v5,30/33] ipa: rkisp1: awb: Prevent RGB means from being negative
diff mbox series

Message ID 20220927023642.12341-31-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • ipa: Frame context queue, IPU3 & RkISP consolidation, and RkISP1 improvements
Related show

Commit Message

Laurent Pinchart Sept. 27, 2022, 2:36 a.m. UTC
Due to hardware rounding errors in the YCbCr means, the calculated RGB
means may be negative. This would lead to negative gains, messing up
calculation. Prevent this by clamping the means to positive values.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/ipa/rkisp1/algorithms/awb.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index 139c8239504f..59664d09b84c 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -242,6 +242,16 @@  void Awb::process(IPAContext &context,
 		redMean = 1.1636 * yMean - 0.0623 * cbMean + 1.6008 * crMean;
 		greenMean = 1.1636 * yMean - 0.4045 * cbMean - 0.7949 * crMean;
 		blueMean = 1.1636 * yMean + 1.9912 * cbMean - 0.0250 * crMean;
+
+		/*
+		 * Due to hardware rounding errors in the YCbCr means, the
+		 * calculated RGB means may be negative. This would lead to
+		 * negative gains, messing up calculation. Prevent this by
+		 * clamping the means to positive values.
+		 */
+		redMean = std::max(redMean, 0.0);
+		greenMean = std::max(greenMean, 0.0);
+		blueMean = std::max(blueMean, 0.0);
 	}
 
 	/*