[libcamera-devel] [PATCH v1 8/8] ipa: rkisp1: agc: Configure the number of cells used by HW
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Fri Nov 19 12:35:22 CET 2021
On 19/11/2021 12:29, Kieran Bingham wrote:
> Quoting Jean-Michel Hautbois (2021-11-19 11:16:54)
>> The ISP can use 25 or 81 cells depending on its revision. Remove the
>> cached value in IPARkISP1 and use IPASessionConfiguration to store it
>> and pass it to AGC.
>>
>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
>> ---
>> src/ipa/ipu3/ipa_context.cpp | 3 +++
>> src/ipa/rkisp1/algorithms/agc.cpp | 4 +++-
>> src/ipa/rkisp1/algorithms/agc.h | 2 ++
>> src/ipa/rkisp1/ipa_context.h | 1 +
>> src/ipa/rkisp1/rkisp1.cpp | 5 ++---
>> 5 files changed, 11 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp
>> index 99caf9ad..71a8619b 100644
>> --- a/src/ipa/ipu3/ipa_context.cpp
>> +++ b/src/ipa/ipu3/ipa_context.cpp
>> @@ -84,6 +84,9 @@ namespace libcamera::ipa::ipu3 {
>> *
>> * \var IPASessionConfiguration::grid.maxAnalogueGain
>> * \brief Maximum analogue gain supported with the configured sensor
>> + *
>> + * \var IPASessionConfiguration::agc.numCells
>> + * \brief Number of cells used by the ISP to store the Y means
>> */
>>
>> /**
>> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
>> index 2b7c6fda..471cf584 100644
>> --- a/src/ipa/rkisp1/algorithms/agc.cpp
>> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
>> @@ -82,6 +82,8 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
>> context.frameContext.agc.gain = minAnalogueGain_;
>> context.frameContext.agc.exposure = 10ms / lineDuration_;
>>
>> + numCells_ = context.configuration.agc.numCells;
>
> Does the AGC need to store this? or can it always access the context
> when it needs it?
>
>> +
>> return 0;
>> }
>>
>> @@ -195,7 +197,7 @@ double Agc::computeInitialY(const rkisp1_cif_isp_ae_stat *ae, double currentYGai
>> double ySum = 0.0;
>> unsigned int num = 0;
>>
>> - for (unsigned int aeCell = 0; aeCell < RKISP1_CIF_ISP_AE_MEAN_MAX_V10; aeCell++) {
>> + for (unsigned int aeCell = 0; aeCell < numCells_; aeCell++) {
>
> Ah - ok that answers that - this function isn't being given the context.
> So this is fine for me.
You got me ! Yes, I will remove the cached value when AWB will be
introduced, as I will then pass the context to the function to get the
awb gains applied ;-).
>
>
>> ySum += ae->exp_mean[aeCell] * currentYGain;
>> num++;
>> }
>> diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h
>> index 934a455e..f4293035 100644
>> --- a/src/ipa/rkisp1/algorithms/agc.h
>> +++ b/src/ipa/rkisp1/algorithms/agc.h
>> @@ -45,6 +45,8 @@ private:
>> double minAnalogueGain_;
>> double maxAnalogueGain_;
>>
>> + uint32_t numCells_;
>> +
>> utils::Duration filteredExposure_;
>> utils::Duration currentExposure_;
>> };
>> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
>> index ca48ffc5..e8e1dc47 100644
>> --- a/src/ipa/rkisp1/ipa_context.h
>> +++ b/src/ipa/rkisp1/ipa_context.h
>> @@ -24,6 +24,7 @@ struct IPASessionConfiguration {
>> utils::Duration maxShutterSpeed;
>> double minAnalogueGain;
>> double maxAnalogueGain;
>> + uint32_t numCells;
>> } agc;
>> };
>>
>> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
>> index b1bfb8b6..cebf2c65 100644
>> --- a/src/ipa/rkisp1/rkisp1.cpp
>> +++ b/src/ipa/rkisp1/rkisp1.cpp
>> @@ -75,7 +75,6 @@ private:
>> uint32_t maxGain_;
>>
>> /* revision-specific data */
>> - unsigned int hwAeMeanMax_;
>> unsigned int hwHistBinNMax_;
>> unsigned int hwGammaOutMaxSamples_;
>> unsigned int hwHistogramWeightGridsSize_;
>> @@ -98,13 +97,13 @@ int IPARkISP1::init([[maybe_unused]] const IPASettings &settings,
>> /* \todo Add support for other revisions */
>> switch (hwRevision) {
>> case RKISP1_V10:
>> - hwAeMeanMax_ = RKISP1_CIF_ISP_AE_MEAN_MAX_V10;
>> + context_.configuration.agc.numCells = RKISP1_CIF_ISP_AE_MEAN_MAX_V10;
>> hwHistBinNMax_ = RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10;
>> hwGammaOutMaxSamples_ = RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10;
>> hwHistogramWeightGridsSize_ = RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10;
>
> I suspect each of those are going to move into the context too... the
> algorithms shouldn't have to dig into the top level class. But .. later
> ;-)
Each algorithm will remove the cached value which won't be needed anymore.
>
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>> break;
>> case RKISP1_V12:
>> - hwAeMeanMax_ = RKISP1_CIF_ISP_AE_MEAN_MAX_V12;
>> + context_.configuration.agc.numCells = RKISP1_CIF_ISP_AE_MEAN_MAX_V12;
>> hwHistBinNMax_ = RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12;
>> hwGammaOutMaxSamples_ = RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12;
>> hwHistogramWeightGridsSize_ = RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12;
>> --
>> 2.32.0
>>
More information about the libcamera-devel
mailing list