@@ -406,7 +406,7 @@ bool Af::afIsOutOfFocus(IPAContext context)
/**
* \brief Determine the max contrast image and lens position.
* \param[in] context The IPA context.
- * \param[in] frameContext The current frame context
+ * \param[in] frame The frame number in consideration
* \param[in] stats The statistics buffer of IPU3.
*
* Ideally, a clear image also has a relatively higher contrast. So, every
@@ -420,7 +420,7 @@ bool Af::afIsOutOfFocus(IPAContext context)
*
* [1] Hill Climbing Algorithm, https://en.wikipedia.org/wiki/Hill_climbing
*/
-void Af::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
const ipu3_uapi_stats_3a *stats)
{
/* Evaluate the AF buffer length */
@@ -32,7 +32,7 @@ public:
void prepare(IPAContext &context, ipu3_uapi_params *params) override;
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
- void process(IPAContext &context, IPAFrameContext *frameContext,
+ void process(IPAContext &context, uint32_t frame,
const ipu3_uapi_stats_3a *stats) override;
private:
@@ -180,14 +180,16 @@ utils::Duration Agc::filterExposure(utils::Duration exposureValue)
/**
* \brief Estimate the new exposure and gain values
* \param[inout] frameContext The shared IPA frame Context
+ * \param [in] frame The frame number in consideration
* \param[in] yGain The gain calculated based on the relative luminance target
* \param[in] iqMeanGain The gain calculated based on the relative luminance target
*/
-void Agc::computeExposure(IPAContext &context, IPAFrameContext *frameContext,
- double yGain, double iqMeanGain)
+void Agc::computeExposure(IPAContext &context, uint32_t frame, double yGain,
+ double iqMeanGain)
{
const IPASessionConfiguration &configuration = context.configuration;
/* Get the effective exposure and gain applied on the sensor. */
+ IPAFrameContext *frameContext = context.frameContexts.get(frame);
uint32_t exposure = frameContext->sensor.exposure;
double analogueGain = frameContext->sensor.gain;
@@ -317,14 +319,13 @@ double Agc::estimateLuminance(IPAActiveState &activeState,
/**
* \brief Process IPU3 statistics, and run AGC operations
* \param[in] context The shared IPA context
- * \param[in] frameContext The current frame context
+ * \param[in] frame The frame number in consideration
* \param[in] stats The IPU3 statistics and ISP results
*
* Identify the current image brightness, and use that to estimate the optimal
* new exposure and gain for the scene.
*/
-void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
- const ipu3_uapi_stats_3a *stats)
+void Agc::process(IPAContext &context, uint32_t frame, const ipu3_uapi_stats_3a *stats)
{
/*
* Estimate the gain needed to have the proportion of pixels in a given
@@ -359,7 +360,7 @@ void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameCo
break;
}
- computeExposure(context, frameContext, yGain, iqMeanGain);
+ computeExposure(context, frame, yGain, iqMeanGain);
frameCount_++;
}
@@ -28,14 +28,14 @@ public:
~Agc() = default;
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
- void process(IPAContext &context, IPAFrameContext *frameContext,
+ void process(IPAContext &context, uint32_t frame,
const ipu3_uapi_stats_3a *stats) override;
private:
double measureBrightness(const ipu3_uapi_stats_3a *stats,
const ipu3_uapi_grid_config &grid) const;
utils::Duration filterExposure(utils::Duration currentExposure);
- void computeExposure(IPAContext &context, IPAFrameContext *frameContext,
+ void computeExposure(IPAContext &context, uint32_t frame,
double yGain, double iqMeanGain);
double estimateLuminance(IPAActiveState &activeState,
const ipu3_uapi_grid_config &grid,
@@ -17,8 +17,8 @@ namespace libcamera {
namespace ipa::ipu3 {
-using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
- IPAConfigInfo, ipu3_uapi_params,
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,
+ ipu3_uapi_params,
ipu3_uapi_stats_3a>;
} /* namespace ipa::ipu3 */
@@ -387,7 +387,7 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
/**
* \copydoc libcamera::ipa::Algorithm::process
*/
-void Awb::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
const ipu3_uapi_stats_3a *stats)
{
calculateWBGains(stats);
@@ -40,7 +40,7 @@ public:
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void prepare(IPAContext &context, ipu3_uapi_params *params) override;
- void process(IPAContext &context, IPAFrameContext *frameContext,
+ void process(IPAContext &context, uint32_t frame,
const ipu3_uapi_stats_3a *stats) override;
private:
@@ -72,13 +72,13 @@ void ToneMapping::prepare([[maybe_unused]] IPAContext &context,
/**
* \brief Calculate the tone mapping look up table
* \param context The shared IPA context
- * \param frameContext The current frame context
+ * \param frame The frame number in consideration
* \param stats The IPU3 statistics and ISP results
*
* The tone mapping look up table is generated as an inverse power curve from
* our gamma setting.
*/
-void ToneMapping::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void ToneMapping::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
[[maybe_unused]] const ipu3_uapi_stats_3a *stats)
{
/*
@@ -20,7 +20,7 @@ public:
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void prepare(IPAContext &context, ipu3_uapi_params *params) override;
- void process(IPAContext &context, IPAFrameContext *frameContext,
+ void process(IPAContext &context, uint32_t frame,
const ipu3_uapi_stats_3a *stats) override;
private:
@@ -582,7 +582,7 @@ void IPAIPU3::processStatsBuffer(const uint32_t frame,
ControlList ctrls(controls::controls);
for (auto const &algo : algorithms_)
- algo->process(context_, frameContext, stats);
+ algo->process(context_, frame, stats);
setControls(frame);
@@ -64,7 +64,7 @@ namespace ipa {
* \fn Algorithm::process()
* \brief Process ISP statistics, and run algorithm operations
* \param[in] context The shared IPA context
- * \param[in] frameContext The current frame's context
+ * \param[in] frame The frame number in consideration
* \param[in] stats The IPA statistics and ISP results
*
* This function is called while camera is running for every frame processed by
@@ -10,8 +10,8 @@ namespace libcamera {
namespace ipa {
-template<typename Context, typename FrameContext, typename Config,
- typename Params, typename Stats>
+template<typename Context, typename Config, typename Params, typename Stats>
+
class Algorithm
{
public:
@@ -29,7 +29,7 @@ public:
}
virtual void process([[maybe_unused]] Context &context,
- [[maybe_unused]] FrameContext *frameContext,
+ [[maybe_unused]] uint32_t frame,
[[maybe_unused]] const Stats *stats)
{
}
@@ -280,8 +280,7 @@ double Agc::measureBrightness(const rkisp1_cif_isp_hist_stat *hist) const
* Identify the current image brightness, and use that to estimate the optimal
* new exposure and gain for the scene.
*/
-void Agc::process(IPAContext &context,
- [[maybe_unused]] IPAFrameContext *frameContext,
+void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
const rkisp1_stat_buffer *stats)
{
const rkisp1_cif_isp_stat *params = &stats->params;
@@ -29,7 +29,7 @@ public:
int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
- void process(IPAContext &context, IPAFrameContext *frameContext,
+ void process(IPAContext &context, uint32_t frame,
const rkisp1_stat_buffer *stats) override;
private:
@@ -19,9 +19,8 @@ namespace libcamera {
namespace ipa::rkisp1 {
-using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
- IPACameraSensorInfo, rkisp1_params_cfg,
- rkisp1_stat_buffer>;
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo,
+ rkisp1_params_cfg, rkisp1_stat_buffer>;
} /* namespace ipa::rkisp1 */
@@ -120,7 +120,7 @@ void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params)
* \copydoc libcamera::ipa::Algorithm::process
*/
void Awb::process([[maybe_unused]] IPAContext &context,
- [[maybe_unused]] IPAFrameContext *frameCtx,
+ [[maybe_unused]] uint32_t frame,
const rkisp1_stat_buffer *stats)
{
const rkisp1_cif_isp_stat *params = &stats->params;
@@ -23,7 +23,7 @@ public:
int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
- void process(IPAContext &context, IPAFrameContext *frameCtx,
+ void process(IPAContext &context, uint32_t frame,
const rkisp1_stat_buffer *stats) override;
private:
@@ -272,7 +272,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId
unsigned int aeState = 0;
for (auto const &algo : algorithms_)
- algo->process(context_, nullptr, stats);
+ algo->process(context_, frame, stats);
setControls(frame);