@@ -184,7 +184,8 @@ int Af::configure(IPAContext &context, const IPAConfigInfo &configInfo)
void Af::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- ipu3_uapi_params *params)
+ ipu3_uapi_params *params,
+ [[maybe_unused]] bool initialize)
{
const struct ipu3_uapi_grid_config &grid = context.configuration.af.afGrid;
params->acc_param.af.grid_cfg = grid;
@@ -33,7 +33,8 @@ public:
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- ipu3_uapi_params *params) override;
+ ipu3_uapi_params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const ipu3_uapi_stats_3a *stats,
@@ -109,7 +109,8 @@ void Agc::queueRequest(IPAContext &context, [[maybe_unused]] const uint32_t fram
*/
void Agc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- [[maybe_unused]] ipu3_uapi_params *params)
+ [[maybe_unused]] ipu3_uapi_params *params,
+ [[maybe_unused]] bool initialize)
{
agc_.prepare(context.configuration.agc, context.activeState.agc, frameContext.agc);
}
@@ -36,7 +36,8 @@ public:
IPAFrameContext &frameContext, const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- ipu3_uapi_params *params) override;
+ ipu3_uapi_params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const ipu3_uapi_stats_3a *stats,
@@ -249,7 +249,8 @@ constexpr uint16_t Awb::gainValue(double gain)
void Awb::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- ipu3_uapi_params *params)
+ ipu3_uapi_params *params,
+ [[maybe_unused]] bool initialize)
{
/*
* Green saturation thresholds are reduced because we are using the
@@ -43,7 +43,8 @@ public:
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- ipu3_uapi_params *params) override;
+ ipu3_uapi_params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const ipu3_uapi_stats_3a *stats,
@@ -40,6 +40,7 @@ BlackLevelCorrection::BlackLevelCorrection()
* \param[in] frame The frame context sequence number
* \param[in] frameContext The FrameContext for this frame
* \param[out] params The IPU3 parameters
+ * \param[in] initialize True if the ISP module should be reinitialzed
*
* Populate the IPU3 parameter structure with the correction values for each
* channel and enable the corresponding ImgU block processing.
@@ -47,7 +48,8 @@ BlackLevelCorrection::BlackLevelCorrection()
void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- ipu3_uapi_params *params)
+ ipu3_uapi_params *params,
+ [[maybe_unused]] bool initialize)
{
/*
* The Optical Black Level correction values
@@ -20,7 +20,8 @@ public:
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- ipu3_uapi_params *params) override;
+ ipu3_uapi_params *params,
+ bool initialize) override;
};
} /* namespace ipa::ipu3::algorithms */
@@ -53,6 +53,7 @@ int ToneMapping::configure(IPAContext &context,
* \param[in] frame The frame context sequence number
* \param[in] frameContext The FrameContext for this frame
* \param[out] params The IPU3 parameters
+ * \param[in] initialize True if the ISP module should be reinitialzed
*
* Populate the IPU3 parameter structure with our tone mapping look up table and
* enable the gamma control module in the processing blocks.
@@ -60,7 +61,8 @@ int ToneMapping::configure(IPAContext &context,
void ToneMapping::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- ipu3_uapi_params *params)
+ ipu3_uapi_params *params,
+ [[maybe_unused]] bool initialize)
{
/* Copy the calculated LUT into the parameters buffer. */
memcpy(params->acc_param.gamma.gc_lut.lut,
@@ -20,7 +20,8 @@ public:
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, ipu3_uapi_params *params) override;
+ IPAFrameContext &frameContext, ipu3_uapi_params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const ipu3_uapi_stats_3a *stats,
@@ -477,7 +477,7 @@ void IPAIPU3::computeParams(const uint32_t frame, const uint32_t bufferId)
ASSERT(frameContext);
for (const auto &algo : algorithms())
- algo->prepare(context_, frame, *frameContext, params);
+ algo->prepare(context_, frame, *frameContext, params, frame == 0);
paramsComputed.emit(frame);
}
@@ -99,6 +99,7 @@ namespace ipa {
* \param[in] frame The frame context sequence number
* \param[in] frameContext The FrameContext for this frame
* \param[out] params The ISP specific parameters
+ * \param[in] initialize True if the ISP module should be reinitialzed
*
* This function is called for every frame when the camera is running before it
* is processed by the ISP to prepare the ISP processing parameters and the
@@ -112,6 +113,11 @@ namespace ipa {
* necessary to configure the sensor. After prepare() the \a frameContext for
* this frame shall be treated read only.
*
+ * The \a initialize parameter indicates if the ISP module should be fully
+ * initialized. This is always set on the first frame and in rare cases when
+ * frame contexts were overwritten and the ISP module has to be reinitialized to
+ * guarantee a defined state.
+ *
* \todo: For offline ISPs there might be use cases where it is beneficial to
* separate the calculation of sensor parameters from the calculation of ISP
* paremeters. This is currently not supported.
@@ -48,7 +48,8 @@ public:
virtual void prepare([[maybe_unused]] typename Module::Context &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] typename Module::FrameContext &frameContext,
- [[maybe_unused]] typename Module::Params *params)
+ [[maybe_unused]] typename Module::Params *params,
+ [[maybe_unused]] bool initialize)
{
}
@@ -204,12 +204,13 @@ void Agc::fillWeightsArrayBuffer(MaliC55Params *params, const enum MaliC55Blocks
std::fill(weights.begin(), weights.end(), 1);
}
-void Agc::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, MaliC55Params *params)
+void Agc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ IPAFrameContext &frameContext, MaliC55Params *params,
+ bool initialize)
{
agc_.prepare(context.configuration.agc, context.activeState.agc, frameContext.agc);
- if (frame > 0)
+ if (!initialize)
return;
fillParamsBuffer(params, MaliC55Blocks::AexpHist);
@@ -57,7 +57,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- MaliC55Params *params) override;
+ MaliC55Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const mali_c55_stats_buffer *stats,
@@ -151,8 +151,9 @@ void Awb::fillConfigParamBlock(MaliC55Params *params)
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
-void Awb::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, MaliC55Params *params)
+void Awb::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ IPAFrameContext &frameContext, MaliC55Params *params,
+ bool initialize)
{
awbAlgo_.prepare(context.activeState.awb, frameContext.awb);
@@ -176,7 +177,7 @@ void Awb::prepare(IPAContext &context, const uint32_t frame,
block->gain11 = UQ<4, 8>(static_cast<float>(frameContext.awb.gains.b()))
.quantized();
- if (frame > 0)
+ if (!initialize)
return;
fillConfigParamBlock(params);
@@ -39,7 +39,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- MaliC55Params *params) override;
+ MaliC55Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const mali_c55_stats_buffer *stats,
@@ -83,11 +83,11 @@ int BlackLevelCorrection::configure(IPAContext &context,
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
- const uint32_t frame,
+ [[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- MaliC55Params *params)
+ MaliC55Params *params, bool initialize)
{
- if (frame > 0)
+ if (!initialize)
return;
if (!tuningParameters_)
@@ -23,7 +23,8 @@ public:
const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- MaliC55Params *params) override;
+ MaliC55Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const mali_c55_stats_buffer *stats,
@@ -128,7 +128,8 @@ void Ccm::setParameters(MaliC55Params *params, const IPAFrameContext &frameConte
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void Ccm::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, MaliC55Params *params)
+ IPAFrameContext &frameContext, MaliC55Params *params,
+ bool initialize)
{
if (!frameContext.awb.autoEnabled) {
setParameters(params, frameContext);
@@ -141,7 +142,7 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame,
* changes of a certain amount.
*/
float ct = frameContext.awb.colourTemperature * 1.0f;
- if (frame > 0 && (ct < lastCt_ * 1.2 && ct > lastCt_ * 0.8)) {
+ if (!initialize && (ct < lastCt_ * 1.2 && ct > lastCt_ * 0.8)) {
frameContext.ccm.ccm = context.activeState.ccm.automatic.ccm;
frameContext.ccm.offsets = context.activeState.ccm.automatic.offsets;
lastCt_ = ct;
@@ -39,7 +39,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- MaliC55Params *params) override;
+ MaliC55Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const mali_c55_stats_buffer *stats,
@@ -183,7 +183,7 @@ std::tuple<uint8_t, uint8_t> Lsc::findBankAndAlpha(uint32_t ct) const
void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- MaliC55Params *params)
+ MaliC55Params *params, bool initialize)
{
/*
* For each frame we assess the colour temperature of the **last** frame
@@ -208,7 +208,7 @@ void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
fillSelectionParamsBlock(params, bank, alpha);
- if (frame > 0)
+ if (!initialize)
return;
/*
@@ -36,7 +36,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- MaliC55Params *params) override;
+ MaliC55Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const mali_c55_stats_buffer *stats,
@@ -249,7 +249,8 @@ void IPAMaliC55::fillParams(unsigned int request,
ASSERT(frameContext);
for (const auto &algo : algorithms())
- algo->prepare(context_, request, *frameContext, ¶ms);
+ algo->prepare(context_, request, *frameContext, ¶ms,
+ frameContext->frame() == 0);
paramsComputed.emit(request, params.bytesused());
}
@@ -206,8 +206,9 @@ void Agc::queueRequest(IPAContext &context,
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
-void Agc::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, RkISP1Params *params)
+void Agc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ IPAFrameContext &frameContext, RkISP1Params *params,
+ bool initialize)
{
agc_.prepare(context.configuration.agc, context.activeState.agc, frameContext.agc);
@@ -216,7 +217,7 @@ void Agc::prepare(IPAContext &context, const uint32_t frame,
frameContext.compress.gain = frameContext.agc.quantizationGain;
}
- if (frame > 0 && !frameContext.agc.updateMetering)
+ if (!initialize && !frameContext.agc.updateMetering)
return;
/*
@@ -35,7 +35,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -122,8 +122,9 @@ void Awb::queueRequest(IPAContext &context, const uint32_t frame,
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
-void Awb::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, RkISP1Params *params)
+void Awb::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ IPAFrameContext &frameContext, RkISP1Params *params,
+ bool initialize)
{
awbAlgo_.prepare(context.activeState.awb, frameContext.awb);
@@ -136,7 +137,7 @@ void Awb::prepare(IPAContext &context, const uint32_t frame,
gainConfig->gain_green_r = std::clamp<int>(256 * frameContext.awb.gains.g(), 0, 0x3ff);
/* If we have already set the AWB measurement parameters, return. */
- if (frame > 0)
+ if (!initialize)
return;
auto awbConfig = params->block<BlockType::Awb>();
@@ -39,7 +39,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -127,14 +127,15 @@ int BlackLevelCorrection::configure(IPAContext &context,
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void BlackLevelCorrection::prepare(IPAContext &context,
- const uint32_t frame,
+ [[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
if (context.configuration.raw)
return;
- if (frame > 0)
+ if (!initialize)
return;
if (!supported_)
@@ -24,7 +24,8 @@ public:
const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -92,7 +92,8 @@ void Ccm::setParameters(RkISP1Params *params, IPAFrameContext &context)
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void Ccm::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, RkISP1Params *params)
+ IPAFrameContext &frameContext, RkISP1Params *params,
+ [[maybe_unused]] bool initialize)
{
if (frameContext.awb.autoEnabled)
ccmAlgo_.prepare(context.activeState.ccm, frameContext.ccm,
@@ -39,7 +39,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -67,7 +67,8 @@ int Compress::configure(IPAContext &context,
void Compress::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ [[maybe_unused]] bool initialize)
{
if (!context.configuration.compress.supported)
return;
@@ -23,7 +23,8 @@ public:
const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
};
} /* namespace ipa::rkisp1::algorithms */
@@ -198,10 +198,11 @@ void ColorProcessing::queueRequest(IPAContext &context,
void ColorProcessing::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
/* Check if the algorithm configuration has been updated. */
- if (!frameContext.cproc.update)
+ if (!frameContext.cproc.update && !initialize)
return;
auto config = params->block<BlockType::Cproc>();
@@ -29,7 +29,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -230,11 +230,12 @@ int DefectPixelClusterCorrection::init([[maybe_unused]] IPAContext &context,
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void DefectPixelClusterCorrection::prepare([[maybe_unused]] IPAContext &context,
- const uint32_t frame,
+ [[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
- if (frame > 0)
+ if (!initialize)
return;
auto config = params->block<BlockType::Dpcc>();
@@ -22,7 +22,8 @@ public:
int init(IPAContext &context, const ValueNode &tuningData) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
private:
rkisp1_cif_isp_dpcc_config config_;
@@ -217,10 +217,11 @@ void Dpf::queueRequest(IPAContext &context,
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
-void Dpf::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, RkISP1Params *params)
+void Dpf::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ IPAFrameContext &frameContext, RkISP1Params *params,
+ bool initialize)
{
- if (!frameContext.dpf.update && frame > 0)
+ if (!frameContext.dpf.update && !initialize)
return;
auto config = params->block<BlockType::Dpf>();
@@ -27,7 +27,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
private:
struct rkisp1_cif_isp_dpf_config config_;
@@ -115,10 +115,11 @@ void Filter::queueRequest(IPAContext &context,
*/
void Filter::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
- IPAFrameContext &frameContext, RkISP1Params *params)
+ IPAFrameContext &frameContext, RkISP1Params *params,
+ bool initialize)
{
/* Check if the algorithm configuration has been updated. */
- if (!frameContext.filter.update)
+ if (!frameContext.filter.update && !initialize)
return;
static constexpr uint16_t filt_fac_sh0[] = {
@@ -27,7 +27,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
};
} /* namespace ipa::rkisp1::algorithms */
@@ -99,12 +99,13 @@ void GammaOutCorrection::queueRequest(IPAContext &context, const uint32_t frame,
void GammaOutCorrection::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
ASSERT(context.hw.numGammaOutSamples ==
RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10);
- if (!frameContext.goc.update)
+ if (!frameContext.goc.update && !initialize)
return;
/*
@@ -28,7 +28,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -117,11 +117,12 @@ int GammaSensorLinearization::init([[maybe_unused]] IPAContext &context,
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void GammaSensorLinearization::prepare([[maybe_unused]] IPAContext &context,
- const uint32_t frame,
+ [[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
- if (frame > 0)
+ if (!initialize)
return;
auto config = params->block<BlockType::Sdg>();
@@ -22,7 +22,8 @@ public:
int init(IPAContext &context, const ValueNode &tuningData) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
private:
uint32_t gammaDx_[2];
@@ -206,13 +206,14 @@ void LensShadingCorrection::queueRequest(IPAContext &context,
void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ bool initialize)
{
uint32_t ct = frameContext.awb.colourTemperature;
unsigned int quantizedCt = quantize(ct, kColourTemperatureQuantization);
/* Check if we can skip the update. */
- if (!frameContext.lsc.update) {
+ if (!frameContext.lsc.update && !initialize) {
if (!frameContext.lsc.enabled)
return;
@@ -35,7 +35,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -51,7 +51,8 @@ int Lux::init([[maybe_unused]] IPAContext &context, const ValueNode &tuningData)
*/
void Lux::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- [[maybe_unused]] RkISP1Params *params)
+ [[maybe_unused]] RkISP1Params *params,
+ [[maybe_unused]] bool initialize)
{
frameContext.lux.lux = context.activeState.lux.lux;
}
@@ -25,7 +25,8 @@ public:
int init(IPAContext &context, const ValueNode &tuningData) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -394,7 +394,8 @@ void WideDynamicRange::queueRequest([[maybe_unused]] IPAContext &context,
void WideDynamicRange::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params)
+ RkISP1Params *params,
+ [[maybe_unused]] bool initialize)
{
if (!params) {
LOG(RkISP1Wdr, Warning) << "Params is null";
@@ -31,7 +31,8 @@ public:
const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
- RkISP1Params *params) override;
+ RkISP1Params *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
@@ -329,8 +329,10 @@ uint32_t IPARkISP1::computeParamsInternal(IPAFrameContext &frameContext, const u
RkISP1Params params(context_.configuration.paramFormat,
mappedBuffers_.at(bufferId).planes()[0]);
+ unsigned int frame = frameContext.frame();
for (const auto &algo : algorithms())
- algo->prepare(context_, frameContext.frame(), frameContext, ¶ms);
+ algo->prepare(context_, frame, frameContext,
+ ¶ms, frame == 0);
return params.bytesused();
}
@@ -95,7 +95,8 @@ void Adjust::applySaturation(Matrix<float, 3, 3> &matrix, float saturation)
void Adjust::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params)
+ DebayerParams *params,
+ [[maybe_unused]] bool initialize)
{
frameContext.gamma = context.activeState.knobs.gamma;
frameContext.contrast = context.activeState.knobs.contrast;
@@ -35,7 +35,8 @@ public:
void prepare(IPAContext &context,
const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params) override;
+ DebayerParams *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const SwIspStats *stats,
@@ -72,7 +72,9 @@ void Agc::queueRequest(IPAContext &context, [[maybe_unused]] const uint32_t fram
}
void Agc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
- IPAFrameContext &frameContext, [[maybe_unused]] DebayerParams *params)
+ IPAFrameContext &frameContext,
+ [[maybe_unused]] DebayerParams *params,
+ [[maybe_unused]] bool initialize)
{
agc_.prepare(context.configuration.agc, context.activeState.agc, frameContext.agc);
}
@@ -26,7 +26,8 @@ public:
IPAFrameContext &frameContext, const ControlList &controls) override;
void prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, DebayerParams *params) override;
+ IPAFrameContext &frameContext, DebayerParams *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
@@ -105,7 +105,8 @@ void Awb::queueRequest(IPAContext &context, const uint32_t frame,
void Awb::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params)
+ DebayerParams *params,
+ [[maybe_unused]] bool initialize)
{
awbAlgo_.prepare(context.activeState.awb, frameContext.awb);
@@ -40,7 +40,8 @@ public:
void prepare(IPAContext &context,
const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params) override;
+ DebayerParams *params,
+ bool initialize) override;
void process(IPAContext &context,
const uint32_t frame,
IPAFrameContext &frameContext,
@@ -62,7 +62,8 @@ int BlackLevel::configure(IPAContext &context,
void BlackLevel::prepare(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
- DebayerParams *params)
+ DebayerParams *params,
+ [[maybe_unused]] bool initialize)
{
/* Latch the blacklevel gain so GPUISP can apply. */
params->blackLevel = RGB<double>(context.activeState.blc.level / 255.0f);
@@ -27,7 +27,8 @@ public:
void prepare(IPAContext &context,
const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params) override;
+ DebayerParams *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const SwIspStats *stats,
@@ -53,7 +53,9 @@ void Ccm::queueRequest(IPAContext &context,
}
void Ccm::prepare(IPAContext &context, const uint32_t frame,
- IPAFrameContext &frameContext, [[maybe_unused]] DebayerParams *params)
+ IPAFrameContext &frameContext,
+ [[maybe_unused]] DebayerParams *params,
+ [[maybe_unused]] bool initialize)
{
if (frameContext.awb.autoEnabled)
ccmAlgo_.prepare(context.activeState.ccm, frameContext.ccm,
@@ -35,7 +35,8 @@ public:
void prepare(IPAContext &context,
const uint32_t frame,
IPAFrameContext &frameContext,
- DebayerParams *params) override;
+ DebayerParams *params,
+ bool initialize) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const SwIspStats *stats,
@@ -241,7 +241,7 @@ void IPASoftIsp::computeParams(const uint32_t frame)
ASSERT(frameContext);
for (const auto &algo : algorithms())
- algo->prepare(context_, frame, *frameContext, params_);
+ algo->prepare(context_, frame, *frameContext, params_, frame == 0);
params_->combinedMatrix = context_.activeState.combinedMatrix;
paramsComputed.emit(frame);
In prepare() the paremeters for the ISP block are assembled. Usually there is an initial step involved when enabling the ISP block for the first time which is often handled by checking if frame == 0. In cases of a FCQueue overflow we basically have the same condition as we don't know the last parameters that were applied to the ISP block. Add a initialize flag to the prepare function() that can be used to trigger a full initialization of an ISP block. For now it is only set in case of frame == 0. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> --- src/ipa/ipu3/algorithms/af.cpp | 3 ++- src/ipa/ipu3/algorithms/af.h | 3 ++- src/ipa/ipu3/algorithms/agc.cpp | 3 ++- src/ipa/ipu3/algorithms/agc.h | 3 ++- src/ipa/ipu3/algorithms/awb.cpp | 3 ++- src/ipa/ipu3/algorithms/awb.h | 3 ++- src/ipa/ipu3/algorithms/blc.cpp | 4 +++- src/ipa/ipu3/algorithms/blc.h | 3 ++- src/ipa/ipu3/algorithms/tone_mapping.cpp | 4 +++- src/ipa/ipu3/algorithms/tone_mapping.h | 3 ++- src/ipa/ipu3/ipu3.cpp | 2 +- src/ipa/libipa/algorithm.cpp | 6 ++++++ src/ipa/libipa/algorithm.h | 3 ++- src/ipa/mali-c55/algorithms/agc.cpp | 7 ++++--- src/ipa/mali-c55/algorithms/agc.h | 3 ++- src/ipa/mali-c55/algorithms/awb.cpp | 7 ++++--- src/ipa/mali-c55/algorithms/awb.h | 3 ++- src/ipa/mali-c55/algorithms/blc.cpp | 6 +++--- src/ipa/mali-c55/algorithms/blc.h | 3 ++- src/ipa/mali-c55/algorithms/ccm.cpp | 5 +++-- src/ipa/mali-c55/algorithms/ccm.h | 3 ++- src/ipa/mali-c55/algorithms/lsc.cpp | 4 ++-- src/ipa/mali-c55/algorithms/lsc.h | 3 ++- src/ipa/mali-c55/mali-c55.cpp | 3 ++- src/ipa/rkisp1/algorithms/agc.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/agc.h | 3 ++- src/ipa/rkisp1/algorithms/awb.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/awb.h | 3 ++- src/ipa/rkisp1/algorithms/blc.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/blc.h | 3 ++- src/ipa/rkisp1/algorithms/ccm.cpp | 3 ++- src/ipa/rkisp1/algorithms/ccm.h | 3 ++- src/ipa/rkisp1/algorithms/compress.cpp | 3 ++- src/ipa/rkisp1/algorithms/compress.h | 3 ++- src/ipa/rkisp1/algorithms/cproc.cpp | 5 +++-- src/ipa/rkisp1/algorithms/cproc.h | 3 ++- src/ipa/rkisp1/algorithms/dpcc.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/dpcc.h | 3 ++- src/ipa/rkisp1/algorithms/dpf.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/dpf.h | 3 ++- src/ipa/rkisp1/algorithms/filter.cpp | 5 +++-- src/ipa/rkisp1/algorithms/filter.h | 3 ++- src/ipa/rkisp1/algorithms/goc.cpp | 5 +++-- src/ipa/rkisp1/algorithms/goc.h | 3 ++- src/ipa/rkisp1/algorithms/gsl.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/gsl.h | 3 ++- src/ipa/rkisp1/algorithms/lsc.cpp | 5 +++-- src/ipa/rkisp1/algorithms/lsc.h | 3 ++- src/ipa/rkisp1/algorithms/lux.cpp | 3 ++- src/ipa/rkisp1/algorithms/lux.h | 3 ++- src/ipa/rkisp1/algorithms/wdr.cpp | 3 ++- src/ipa/rkisp1/algorithms/wdr.h | 3 ++- src/ipa/rkisp1/rkisp1.cpp | 4 +++- src/ipa/softisp/algorithms/adjust.cpp | 3 ++- src/ipa/softisp/algorithms/adjust.h | 3 ++- src/ipa/softisp/algorithms/agc.cpp | 4 +++- src/ipa/softisp/algorithms/agc.h | 3 ++- src/ipa/softisp/algorithms/awb.cpp | 3 ++- src/ipa/softisp/algorithms/awb.h | 3 ++- src/ipa/softisp/algorithms/blc.cpp | 3 ++- src/ipa/softisp/algorithms/blc.h | 3 ++- src/ipa/softisp/algorithms/ccm.cpp | 4 +++- src/ipa/softisp/algorithms/ccm.h | 3 ++- src/ipa/softisp/softisp.cpp | 2 +- 64 files changed, 157 insertions(+), 87 deletions(-)