[8/8] ipa: rkisp1: agc: Add debug controls for statistic values
diff mbox series

Message ID 20250411130423.2164577-9-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • Implement WDR algorithm
Related show

Commit Message

Stefan Klug April 11, 2025, 1:04 p.m. UTC
Add debug controls for AWB stats and exposure means.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
---
 src/ipa/rkisp1/algorithms/agc.cpp    | 16 +++++++++++++++
 src/ipa/rkisp1/algorithms/awb.cpp    |  3 +++
 src/libcamera/control_ids_debug.yaml | 29 ++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+)

Comments

Paul Elder May 12, 2025, 9:41 p.m. UTC | #1
Quoting Stefan Klug (2025-04-11 15:04:15)
> Add debug controls for AWB stats and exposure means.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> ---
>  src/ipa/rkisp1/algorithms/agc.cpp    | 16 +++++++++++++++
>  src/ipa/rkisp1/algorithms/awb.cpp    |  3 +++
>  src/libcamera/control_ids_debug.yaml | 29 ++++++++++++++++++++++++++++
>  3 files changed, 48 insertions(+)
> 
> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
> index a2c8d5403ba2..6dc8b9fc0a31 100644
> --- a/src/ipa/rkisp1/algorithms/agc.cpp
> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
> @@ -400,8 +400,10 @@ void Agc::fillMetadata(IPAContext &context, IPAFrameContext &frameContext,
>  {
>         utils::Duration exposureTime = context.configuration.sensor.lineDuration
>                                      * frameContext.sensor.exposure;
> +       utils::Duration exposureTimeCorrected = exposureTime * frameContext.awb.additionalGain;
>         metadata.set(controls::AnalogueGain, frameContext.sensor.gain);
>         metadata.set(controls::ExposureTime, exposureTime.get<std::micro>());
> +       metadata.set<float>(controls::debug::ExposureTimeCorrected, exposureTimeCorrected.get<std::micro>());
>         metadata.set(controls::FrameDuration, frameContext.agc.frameDuration.get<std::micro>());
>         metadata.set(controls::ExposureTimeMode,
>                      frameContext.agc.autoExposureEnabled
> @@ -574,6 +576,20 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
>                                frameContext.agc.exposureMode,
>                                hist, effectiveExposureValue);
>  
> +       auto &debugMeta = context.debugMetadata;
> +       std::vector<int32_t> histMeta;
> +       for (unsigned i = 0; i < context.hw->numHistogramBins; i++)
> +               histMeta.push_back(params->hist.hist_bins[i] >> 4);
> +       debugMeta.set<Span<const int32_t>>(controls::debug::StatsHistogram, histMeta);
> +
> +       double meanExposure = 0;
> +       for (uint8_t expMean : expMeans_)
> +               meanExposure += expMean;
> +       meanExposure = meanExposure / expMeans_.size() / 255.0;
> +       debugMeta.set<const float>(controls::debug::StatsExpMean, meanExposure);
> +
> +       debugMeta.set<Span<const uint8_t>>(controls::debug::StatsExpMeans, expMeans_);
> +
>         LOG(RkISP1Agc, Debug)
>                 << "Divided up exposure time, analogue gain and digital gain are "
>                 << newExposureTime << ", " << aGain << " and " << dGain;
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index cc78136a22c8..be08458e45e3 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -310,6 +310,9 @@ void Awb::process(IPAContext &context,
>  
>         RGB<double> rgbMeans = calculateRgbMeans(frameContext, awb);
>  
> +       context.debugMetadata.set<Span<const float>>(controls::debug::RgbMeans, Vector<float, 3>(rgbMeans).data());
> +       context.debugMetadata.set<int>(controls::debug::AwbCount, awb->awb_mean[0].cnt);
> +
>         /*
>          * If the means are too small we don't have enough information to
>          * meaningfully calculate gains. Freeze the algorithm in that case.
> diff --git a/src/libcamera/control_ids_debug.yaml b/src/libcamera/control_ids_debug.yaml
> index 9489e677402e..d0f9329187f7 100644
> --- a/src/libcamera/control_ids_debug.yaml
> +++ b/src/libcamera/control_ids_debug.yaml
> @@ -1,9 +1,38 @@
>  # SPDX-License-Identifier: LGPL-2.1-or-later
>  #
> +# This file was generated by utils/gen-debug-controls.py
> +#
>  %YAML 1.1
>  ---
>  vendor: debug
>  controls:
> +- AwbCount:
> +    type: int
> +    direction: out
> +    description: Debug control AwbCount found in src/ipa/rkisp1/algorithms/awb.cpp
> +- ExposureTimeCorrected:
> +    type: float
> +    direction: out
> +    description: Debug control ExposureTimeCorrected found in src/ipa/rkisp1/algorithms/agc.cpp
> +- RgbMeans:
> +    type: float
> +    direction: out
> +    description: Debug control RgbMeans found in src/ipa/rkisp1/algorithms/awb.cpp
> +    size: '[n]'
> +- StatsExpMean:
> +    type: const float
> +    direction: out
> +    description: Debug control StatsExpMean found in src/ipa/rkisp1/algorithms/agc.cpp
> +- StatsExpMeans:
> +    type: uint8_t
> +    direction: out
> +    description: Debug control StatsExpMeans found in src/ipa/rkisp1/algorithms/agc.cpp
> +    size: '[n]'
> +- StatsHistogram:
> +    type: int32_t
> +    direction: out
> +    description: Debug control StatsHistogram found in src/ipa/rkisp1/algorithms/agc.cpp
> +    size: '[n]'
>  - WdrCurve:
>      type: Point
>      direction: out
> -- 
> 2.43.0
>

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index a2c8d5403ba2..6dc8b9fc0a31 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -400,8 +400,10 @@  void Agc::fillMetadata(IPAContext &context, IPAFrameContext &frameContext,
 {
 	utils::Duration exposureTime = context.configuration.sensor.lineDuration
 				     * frameContext.sensor.exposure;
+	utils::Duration exposureTimeCorrected = exposureTime * frameContext.awb.additionalGain;
 	metadata.set(controls::AnalogueGain, frameContext.sensor.gain);
 	metadata.set(controls::ExposureTime, exposureTime.get<std::micro>());
+	metadata.set<float>(controls::debug::ExposureTimeCorrected, exposureTimeCorrected.get<std::micro>());
 	metadata.set(controls::FrameDuration, frameContext.agc.frameDuration.get<std::micro>());
 	metadata.set(controls::ExposureTimeMode,
 		     frameContext.agc.autoExposureEnabled
@@ -574,6 +576,20 @@  void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
 			       frameContext.agc.exposureMode,
 			       hist, effectiveExposureValue);
 
+	auto &debugMeta = context.debugMetadata;
+	std::vector<int32_t> histMeta;
+	for (unsigned i = 0; i < context.hw->numHistogramBins; i++)
+		histMeta.push_back(params->hist.hist_bins[i] >> 4);
+	debugMeta.set<Span<const int32_t>>(controls::debug::StatsHistogram, histMeta);
+
+	double meanExposure = 0;
+	for (uint8_t expMean : expMeans_)
+		meanExposure += expMean;
+	meanExposure = meanExposure / expMeans_.size() / 255.0;
+	debugMeta.set<const float>(controls::debug::StatsExpMean, meanExposure);
+
+	debugMeta.set<Span<const uint8_t>>(controls::debug::StatsExpMeans, expMeans_);
+
 	LOG(RkISP1Agc, Debug)
 		<< "Divided up exposure time, analogue gain and digital gain are "
 		<< newExposureTime << ", " << aGain << " and " << dGain;
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index cc78136a22c8..be08458e45e3 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -310,6 +310,9 @@  void Awb::process(IPAContext &context,
 
 	RGB<double> rgbMeans = calculateRgbMeans(frameContext, awb);
 
+	context.debugMetadata.set<Span<const float>>(controls::debug::RgbMeans, Vector<float, 3>(rgbMeans).data());
+	context.debugMetadata.set<int>(controls::debug::AwbCount, awb->awb_mean[0].cnt);
+
 	/*
 	 * If the means are too small we don't have enough information to
 	 * meaningfully calculate gains. Freeze the algorithm in that case.
diff --git a/src/libcamera/control_ids_debug.yaml b/src/libcamera/control_ids_debug.yaml
index 9489e677402e..d0f9329187f7 100644
--- a/src/libcamera/control_ids_debug.yaml
+++ b/src/libcamera/control_ids_debug.yaml
@@ -1,9 +1,38 @@ 
 # SPDX-License-Identifier: LGPL-2.1-or-later
 #
+# This file was generated by utils/gen-debug-controls.py
+#
 %YAML 1.1
 ---
 vendor: debug
 controls:
+- AwbCount:
+    type: int
+    direction: out
+    description: Debug control AwbCount found in src/ipa/rkisp1/algorithms/awb.cpp
+- ExposureTimeCorrected:
+    type: float
+    direction: out
+    description: Debug control ExposureTimeCorrected found in src/ipa/rkisp1/algorithms/agc.cpp
+- RgbMeans:
+    type: float
+    direction: out
+    description: Debug control RgbMeans found in src/ipa/rkisp1/algorithms/awb.cpp
+    size: '[n]'
+- StatsExpMean:
+    type: const float
+    direction: out
+    description: Debug control StatsExpMean found in src/ipa/rkisp1/algorithms/agc.cpp
+- StatsExpMeans:
+    type: uint8_t
+    direction: out
+    description: Debug control StatsExpMeans found in src/ipa/rkisp1/algorithms/agc.cpp
+    size: '[n]'
+- StatsHistogram:
+    type: int32_t
+    direction: out
+    description: Debug control StatsHistogram found in src/ipa/rkisp1/algorithms/agc.cpp
+    size: '[n]'
 - WdrCurve:
     type: Point
     direction: out