[RFC,v3,39/50] ipa: simple: agc: Use `Histogram`
diff mbox series

Message ID 20260803131435.153927-40-barnabas.pocze@ideasonboard.com
State Superseded
Headers show
Series
  • ipa: libipa: agc rework
Related show

Commit Message

Barnabás Pőcze Aug. 3, 2026, 1:14 p.m. UTC
Use the generic `Histogram` type. This is needed to decouple the
implementation from the software isp, in order to make this usable
by other components.

Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 src/ipa/simple/algorithms/agc.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

Comments

Milan Zamazal Aug. 4, 2026, 10:17 a.m. UTC | #1
Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:

> Use the generic `Histogram` type. This is needed to decouple the
> implementation from the software isp, in order to make this usable
> by other components.
>
> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>

Reviewed-by: Milan Zamazal <mzamazal@redhat.com>

> ---
>  src/ipa/simple/algorithms/agc.cpp | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp
> index b25c303835..cc33b269bf 100644
> --- a/src/ipa/simple/algorithms/agc.cpp
> +++ b/src/ipa/simple/algorithms/agc.cpp
> @@ -14,6 +14,8 @@
>  
>  #include <libcamera/base/log.h>
>  
> +#include <libipa/histogram.h>
> +
>  #include "control_ids.h"
>  
>  namespace libcamera {
> @@ -64,16 +66,16 @@ static constexpr float kExpMaxStep = 0.15;
>  
>  namespace {
>  
> -std::optional<float> calculateMSV(const SwIspStats::Histogram &histogram, uint8_t blackLevel)
> +std::optional<float> calculateMSV(const Histogram &histogram, uint8_t blackLevel)
>  {
>  	/*
>  	 * Calculate Mean Sample Value (MSV) according to formula from:
>  	 * https://www.araa.asn.au/acra/acra2007/papers/paper84final.pdf
>  	 */
>  	const unsigned int blackLevelHistIdx =
> -		blackLevel / (256 / SwIspStats::kYHistogramSize);
> +		blackLevel * histogram.bins() / 256;
>  	const unsigned int histogramSize =
> -		SwIspStats::kYHistogramSize - blackLevelHistIdx;
> +		histogram.bins() - blackLevelHistIdx;
>  	const unsigned int yHistValsPerBin = histogramSize / kExposureBinsCount;
>  	const unsigned int yHistValsPerBinMod =
>  		histogramSize / (histogramSize % kExposureBinsCount + 1);
> @@ -191,7 +193,7 @@ void Agc::process(IPAContext &context,
>  		return;
>  	}
>  
> -	auto exposureMSV = calculateMSV(stats->yHistogram, context.activeState.blc.level);
> +	auto exposureMSV = calculateMSV({ stats->yHistogram }, context.activeState.blc.level);
>  	if (!exposureMSV) {
>  		LOG(IPASoftExposure, Debug)
>  			<< "Not adjusting exposure due to insufficient histogram data";

Patch
diff mbox series

diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp
index b25c303835..cc33b269bf 100644
--- a/src/ipa/simple/algorithms/agc.cpp
+++ b/src/ipa/simple/algorithms/agc.cpp
@@ -14,6 +14,8 @@ 
 
 #include <libcamera/base/log.h>
 
+#include <libipa/histogram.h>
+
 #include "control_ids.h"
 
 namespace libcamera {
@@ -64,16 +66,16 @@  static constexpr float kExpMaxStep = 0.15;
 
 namespace {
 
-std::optional<float> calculateMSV(const SwIspStats::Histogram &histogram, uint8_t blackLevel)
+std::optional<float> calculateMSV(const Histogram &histogram, uint8_t blackLevel)
 {
 	/*
 	 * Calculate Mean Sample Value (MSV) according to formula from:
 	 * https://www.araa.asn.au/acra/acra2007/papers/paper84final.pdf
 	 */
 	const unsigned int blackLevelHistIdx =
-		blackLevel / (256 / SwIspStats::kYHistogramSize);
+		blackLevel * histogram.bins() / 256;
 	const unsigned int histogramSize =
-		SwIspStats::kYHistogramSize - blackLevelHistIdx;
+		histogram.bins() - blackLevelHistIdx;
 	const unsigned int yHistValsPerBin = histogramSize / kExposureBinsCount;
 	const unsigned int yHistValsPerBinMod =
 		histogramSize / (histogramSize % kExposureBinsCount + 1);
@@ -191,7 +193,7 @@  void Agc::process(IPAContext &context,
 		return;
 	}
 
-	auto exposureMSV = calculateMSV(stats->yHistogram, context.activeState.blc.level);
+	auto exposureMSV = calculateMSV({ stats->yHistogram }, context.activeState.blc.level);
 	if (!exposureMSV) {
 		LOG(IPASoftExposure, Debug)
 			<< "Not adjusting exposure due to insufficient histogram data";