[v2,03/10] ipa: ipu3: Move CameraHelper to context
diff mbox series

Message ID 20251028-exposure-limits-v2-3-a8b5a318323e@ideasonboard.com
State New
Headers show
Series
  • libipa: agc: Calculate exposure limits
Related show

Commit Message

Jacopo Mondi Oct. 28, 2025, 9:31 a.m. UTC
Move the CameraHelper sensor to the Context so that it can be
used by the algorithms directly.

Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 src/ipa/ipu3/ipa_context.cpp |  3 +++
 src/ipa/ipu3/ipa_context.h   |  3 +++
 src/ipa/ipu3/ipu3.cpp        | 15 ++++++---------
 3 files changed, 12 insertions(+), 9 deletions(-)

Comments

Laurent Pinchart Nov. 2, 2025, 7:53 p.m. UTC | #1
On Tue, Oct 28, 2025 at 10:31:49AM +0100, Jacopo Mondi wrote:
> Move the CameraHelper sensor to the Context so that it can be
> used by the algorithms directly.
> 
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/ipa/ipu3/ipa_context.cpp |  3 +++
>  src/ipa/ipu3/ipa_context.h   |  3 +++
>  src/ipa/ipu3/ipu3.cpp        | 15 ++++++---------
>  3 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp
> index 3b22f7917650d9e400d5368c2f890d6b2dc846a0..5d0ebaaec454fca823851228614a3eb229f0132b 100644
> --- a/src/ipa/ipu3/ipa_context.cpp
> +++ b/src/ipa/ipu3/ipa_context.cpp
> @@ -54,6 +54,9 @@ namespace libcamera::ipa::ipu3 {
>   *
>   * \var IPAContext::ctrlMap
>   * \brief A ControlInfoMap::Map of controls populated by the algorithms
> + *
> + * \var IPAContext::camHelper
> + * \brief The camera sensor helper
>   */
>  
>  /**
> diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h
> index 97fcf06cd4ac9ac6d64c4933fcea80ace0e572df..4544d663642fb6fde1cf69a32f1c0fbb2fbd98f6 100644
> --- a/src/ipa/ipu3/ipa_context.h
> +++ b/src/ipa/ipu3/ipa_context.h
> @@ -15,6 +15,7 @@
>  #include <libcamera/controls.h>
>  #include <libcamera/geometry.h>
>  
> +#include <libipa/camera_sensor_helper.h>
>  #include <libipa/fc_queue.h>
>  
>  namespace libcamera {
> @@ -95,6 +96,8 @@ struct IPAContext {
>  	FCQueue<IPAFrameContext> frameContexts;
>  
>  	ControlInfoMap::Map ctrlMap;
> +
> +	std::unique_ptr<CameraSensorHelper> camHelper;
>  };
>  
>  } /* namespace ipa::ipu3 */
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 1cae08bf255f6f53a0ebee02ba3aadda5a650ae3..36d8f0da430a3d4f94e2a3f760850519742ea992 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -179,9 +179,6 @@ private:
>  
>  	IPACameraSensorInfo sensorInfo_;
>  
> -	/* Interface to the Camera Helper */
> -	std::unique_ptr<CameraSensorHelper> camHelper_;
> -
>  	/* Local parameter storage */
>  	struct IPAContext context_;
>  };
> @@ -222,8 +219,8 @@ void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
>  	 */
>  	context_.configuration.agc.minExposureTime = minExposure * context_.configuration.sensor.lineDuration;
>  	context_.configuration.agc.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration;
> -	context_.configuration.agc.minAnalogueGain = camHelper_->gain(minGain);
> -	context_.configuration.agc.maxAnalogueGain = camHelper_->gain(maxGain);
> +	context_.configuration.agc.minAnalogueGain = context_.camHelper->gain(minGain);
> +	context_.configuration.agc.maxAnalogueGain = context_.camHelper->gain(maxGain);
>  }
>  
>  /**
> @@ -301,8 +298,8 @@ int IPAIPU3::init(const IPASettings &settings,
>  		  const ControlInfoMap &sensorControls,
>  		  ControlInfoMap *ipaControls)
>  {
> -	camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> -	if (camHelper_ == nullptr) {
> +	context_.camHelper = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> +	if (context_.camHelper == nullptr) {
>  		LOG(IPAIPU3, Error)
>  			<< "Failed to create camera sensor helper for "
>  			<< settings.sensorModel;
> @@ -597,7 +594,7 @@ void IPAIPU3::processStats(const uint32_t frame,
>  	IPAFrameContext &frameContext = context_.frameContexts.get(frame);
>  
>  	frameContext.sensor.exposure = sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
> -	frameContext.sensor.gain = camHelper_->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
> +	frameContext.sensor.gain = context_.camHelper->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
>  
>  	ControlList metadata(controls::controls);
>  
> @@ -643,7 +640,7 @@ void IPAIPU3::queueRequest(const uint32_t frame, const ControlList &controls)
>  void IPAIPU3::setControls(unsigned int frame)
>  {
>  	int32_t exposure = context_.activeState.agc.exposure;
> -	int32_t gain = camHelper_->gainCode(context_.activeState.agc.gain);
> +	int32_t gain = context_.camHelper->gainCode(context_.activeState.agc.gain);
>  
>  	ControlList ctrls(sensorCtrls_);
>  	ctrls.set(V4L2_CID_EXPOSURE, exposure);
Stefan Klug Nov. 5, 2025, 6:02 a.m. UTC | #2
Quoting Jacopo Mondi (2025-10-28 10:31:49)
> Move the CameraHelper sensor to the Context so that it can be
> used by the algorithms directly.
> 
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> 

Regards,
Stefan

> ---
>  src/ipa/ipu3/ipa_context.cpp |  3 +++
>  src/ipa/ipu3/ipa_context.h   |  3 +++
>  src/ipa/ipu3/ipu3.cpp        | 15 ++++++---------
>  3 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp
> index 3b22f7917650d9e400d5368c2f890d6b2dc846a0..5d0ebaaec454fca823851228614a3eb229f0132b 100644
> --- a/src/ipa/ipu3/ipa_context.cpp
> +++ b/src/ipa/ipu3/ipa_context.cpp
> @@ -54,6 +54,9 @@ namespace libcamera::ipa::ipu3 {
>   *
>   * \var IPAContext::ctrlMap
>   * \brief A ControlInfoMap::Map of controls populated by the algorithms
> + *
> + * \var IPAContext::camHelper
> + * \brief The camera sensor helper
>   */
>  
>  /**
> diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h
> index 97fcf06cd4ac9ac6d64c4933fcea80ace0e572df..4544d663642fb6fde1cf69a32f1c0fbb2fbd98f6 100644
> --- a/src/ipa/ipu3/ipa_context.h
> +++ b/src/ipa/ipu3/ipa_context.h
> @@ -15,6 +15,7 @@
>  #include <libcamera/controls.h>
>  #include <libcamera/geometry.h>
>  
> +#include <libipa/camera_sensor_helper.h>
>  #include <libipa/fc_queue.h>
>  
>  namespace libcamera {
> @@ -95,6 +96,8 @@ struct IPAContext {
>         FCQueue<IPAFrameContext> frameContexts;
>  
>         ControlInfoMap::Map ctrlMap;
> +
> +       std::unique_ptr<CameraSensorHelper> camHelper;
>  };
>  
>  } /* namespace ipa::ipu3 */
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 1cae08bf255f6f53a0ebee02ba3aadda5a650ae3..36d8f0da430a3d4f94e2a3f760850519742ea992 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -179,9 +179,6 @@ private:
>  
>         IPACameraSensorInfo sensorInfo_;
>  
> -       /* Interface to the Camera Helper */
> -       std::unique_ptr<CameraSensorHelper> camHelper_;
> -
>         /* Local parameter storage */
>         struct IPAContext context_;
>  };
> @@ -222,8 +219,8 @@ void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
>          */
>         context_.configuration.agc.minExposureTime = minExposure * context_.configuration.sensor.lineDuration;
>         context_.configuration.agc.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration;
> -       context_.configuration.agc.minAnalogueGain = camHelper_->gain(minGain);
> -       context_.configuration.agc.maxAnalogueGain = camHelper_->gain(maxGain);
> +       context_.configuration.agc.minAnalogueGain = context_.camHelper->gain(minGain);
> +       context_.configuration.agc.maxAnalogueGain = context_.camHelper->gain(maxGain);
>  }
>  
>  /**
> @@ -301,8 +298,8 @@ int IPAIPU3::init(const IPASettings &settings,
>                   const ControlInfoMap &sensorControls,
>                   ControlInfoMap *ipaControls)
>  {
> -       camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> -       if (camHelper_ == nullptr) {
> +       context_.camHelper = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> +       if (context_.camHelper == nullptr) {
>                 LOG(IPAIPU3, Error)
>                         << "Failed to create camera sensor helper for "
>                         << settings.sensorModel;
> @@ -597,7 +594,7 @@ void IPAIPU3::processStats(const uint32_t frame,
>         IPAFrameContext &frameContext = context_.frameContexts.get(frame);
>  
>         frameContext.sensor.exposure = sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
> -       frameContext.sensor.gain = camHelper_->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
> +       frameContext.sensor.gain = context_.camHelper->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
>  
>         ControlList metadata(controls::controls);
>  
> @@ -643,7 +640,7 @@ void IPAIPU3::queueRequest(const uint32_t frame, const ControlList &controls)
>  void IPAIPU3::setControls(unsigned int frame)
>  {
>         int32_t exposure = context_.activeState.agc.exposure;
> -       int32_t gain = camHelper_->gainCode(context_.activeState.agc.gain);
> +       int32_t gain = context_.camHelper->gainCode(context_.activeState.agc.gain);
>  
>         ControlList ctrls(sensorCtrls_);
>         ctrls.set(V4L2_CID_EXPOSURE, exposure);
> 
> -- 
> 2.51.0
>

Patch
diff mbox series

diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp
index 3b22f7917650d9e400d5368c2f890d6b2dc846a0..5d0ebaaec454fca823851228614a3eb229f0132b 100644
--- a/src/ipa/ipu3/ipa_context.cpp
+++ b/src/ipa/ipu3/ipa_context.cpp
@@ -54,6 +54,9 @@  namespace libcamera::ipa::ipu3 {
  *
  * \var IPAContext::ctrlMap
  * \brief A ControlInfoMap::Map of controls populated by the algorithms
+ *
+ * \var IPAContext::camHelper
+ * \brief The camera sensor helper
  */
 
 /**
diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h
index 97fcf06cd4ac9ac6d64c4933fcea80ace0e572df..4544d663642fb6fde1cf69a32f1c0fbb2fbd98f6 100644
--- a/src/ipa/ipu3/ipa_context.h
+++ b/src/ipa/ipu3/ipa_context.h
@@ -15,6 +15,7 @@ 
 #include <libcamera/controls.h>
 #include <libcamera/geometry.h>
 
+#include <libipa/camera_sensor_helper.h>
 #include <libipa/fc_queue.h>
 
 namespace libcamera {
@@ -95,6 +96,8 @@  struct IPAContext {
 	FCQueue<IPAFrameContext> frameContexts;
 
 	ControlInfoMap::Map ctrlMap;
+
+	std::unique_ptr<CameraSensorHelper> camHelper;
 };
 
 } /* namespace ipa::ipu3 */
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 1cae08bf255f6f53a0ebee02ba3aadda5a650ae3..36d8f0da430a3d4f94e2a3f760850519742ea992 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -179,9 +179,6 @@  private:
 
 	IPACameraSensorInfo sensorInfo_;
 
-	/* Interface to the Camera Helper */
-	std::unique_ptr<CameraSensorHelper> camHelper_;
-
 	/* Local parameter storage */
 	struct IPAContext context_;
 };
@@ -222,8 +219,8 @@  void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
 	 */
 	context_.configuration.agc.minExposureTime = minExposure * context_.configuration.sensor.lineDuration;
 	context_.configuration.agc.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration;
-	context_.configuration.agc.minAnalogueGain = camHelper_->gain(minGain);
-	context_.configuration.agc.maxAnalogueGain = camHelper_->gain(maxGain);
+	context_.configuration.agc.minAnalogueGain = context_.camHelper->gain(minGain);
+	context_.configuration.agc.maxAnalogueGain = context_.camHelper->gain(maxGain);
 }
 
 /**
@@ -301,8 +298,8 @@  int IPAIPU3::init(const IPASettings &settings,
 		  const ControlInfoMap &sensorControls,
 		  ControlInfoMap *ipaControls)
 {
-	camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
-	if (camHelper_ == nullptr) {
+	context_.camHelper = CameraSensorHelperFactoryBase::create(settings.sensorModel);
+	if (context_.camHelper == nullptr) {
 		LOG(IPAIPU3, Error)
 			<< "Failed to create camera sensor helper for "
 			<< settings.sensorModel;
@@ -597,7 +594,7 @@  void IPAIPU3::processStats(const uint32_t frame,
 	IPAFrameContext &frameContext = context_.frameContexts.get(frame);
 
 	frameContext.sensor.exposure = sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
-	frameContext.sensor.gain = camHelper_->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
+	frameContext.sensor.gain = context_.camHelper->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
 
 	ControlList metadata(controls::controls);
 
@@ -643,7 +640,7 @@  void IPAIPU3::queueRequest(const uint32_t frame, const ControlList &controls)
 void IPAIPU3::setControls(unsigned int frame)
 {
 	int32_t exposure = context_.activeState.agc.exposure;
-	int32_t gain = camHelper_->gainCode(context_.activeState.agc.gain);
+	int32_t gain = context_.camHelper->gainCode(context_.activeState.agc.gain);
 
 	ControlList ctrls(sensorCtrls_);
 	ctrls.set(V4L2_CID_EXPOSURE, exposure);