[4/5] libcamera: simple: Avoid incorrect arithmetic in AWB
diff mbox series

Message ID 20250821134141.83236-5-mzamazal@redhat.com
State New
Headers show
Series
  • Fix stats related problems in software ISP
Related show

Commit Message

Milan Zamazal Aug. 21, 2025, 1:41 p.m. UTC
The R/G/B sums computed in AWB simple IPA may be zero or perhaps even
negative.  Let's make sure the sums are always positive, to prevent
division by zero or completely nonsense results.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 src/ipa/simple/algorithms/awb.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
index cf567e894..9509129e9 100644
--- a/src/ipa/simple/algorithms/awb.cpp
+++ b/src/ipa/simple/algorithms/awb.cpp
@@ -7,6 +7,7 @@ 
 
 #include "awb.h"
 
+#include <algorithm>
 #include <numeric>
 #include <stdint.h>
 
@@ -69,9 +70,10 @@  void Awb::process(IPAContext &context,
 	const uint64_t nPixels = std::accumulate(
 		histogram.begin(), histogram.end(), 0);
 	const uint64_t offset = blackLevel * nPixels;
-	const uint64_t sumR = stats->sumR_ - offset / 4;
-	const uint64_t sumG = stats->sumG_ - offset / 2;
-	const uint64_t sumB = stats->sumB_ - offset / 4;
+	const uint64_t minValid = 1;
+	const uint64_t sumR = std::max(stats->sumR_ - offset / 4, minValid);
+	const uint64_t sumG = std::max(stats->sumG_ - offset / 2, minValid);
+	const uint64_t sumB = std::max(stats->sumB_ - offset / 4, minValid);
 
 	/*
 	 * Calculate red and blue gains for AWB.