summaryrefslogtreecommitdiff
path: root/src/ipa
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa')
-rw-r--r--src/ipa/rkisp1/algorithms/agc.cpp27
-rw-r--r--src/ipa/rkisp1/algorithms/agc.h3
-rw-r--r--src/ipa/rkisp1/ipa_context.cpp30
-rw-r--r--src/ipa/rkisp1/ipa_context.h12
-rw-r--r--src/ipa/rkisp1/rkisp1.cpp36
5 files changed, 57 insertions, 51 deletions
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index f83a9ba1..da705b14 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -59,7 +59,7 @@ static constexpr double kEvGainTarget = 0.5;
static constexpr double kRelativeLuminanceTarget = 0.4;
Agc::Agc()
- : frameCount_(0), numCells_(0), numHistBins_(0), filteredExposure_(0s)
+ : frameCount_(0), filteredExposure_(0s)
{
supportsRaw_ = true;
}
@@ -82,19 +82,6 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
context.activeState.agc.autoEnabled = !context.configuration.raw;
/*
- * According to the RkISP1 documentation:
- * - versions < V12 have RKISP1_CIF_ISP_AE_MEAN_MAX_V10 entries,
- * - versions >= V12 have RKISP1_CIF_ISP_AE_MEAN_MAX_V12 entries.
- */
- if (context.configuration.hw.revision < RKISP1_V12) {
- numCells_ = RKISP1_CIF_ISP_AE_MEAN_MAX_V10;
- numHistBins_ = RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10;
- } else {
- numCells_ = RKISP1_CIF_ISP_AE_MEAN_MAX_V12;
- numHistBins_ = RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12;
- }
-
- /*
* Define the measurement window for AGC as a centered rectangle
* covering 3/4 of the image width and height.
*/
@@ -186,7 +173,10 @@ void Agc::prepare(IPAContext &context, const uint32_t frame,
/* Produce the luminance histogram. */
params->meas.hst_config.mode = RKISP1_CIF_ISP_HISTOGRAM_MODE_Y_HISTOGRAM;
/* Set an average weighted histogram. */
- Span<uint8_t> weights{ params->meas.hst_config.hist_weight, numHistBins_ };
+ Span<uint8_t> weights{
+ params->meas.hst_config.hist_weight,
+ context.hw->numHistogramBins
+ };
std::fill(weights.begin(), weights.end(), 1);
/* Step size can't be less than 3. */
params->meas.hst_config.histogram_predivider = 4;
@@ -414,8 +404,11 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
const rkisp1_cif_isp_stat *params = &stats->params;
ASSERT(stats->meas_type & RKISP1_CIF_ISP_STAT_AUTOEXP);
- Span<const uint8_t> ae{ params->ae.exp_mean, numCells_ };
- Span<const uint32_t> hist{ params->hist.hist_bins, numHistBins_ };
+ Span<const uint8_t> ae{ params->ae.exp_mean, context.hw->numAeCells };
+ Span<const uint32_t> hist{
+ params->hist.hist_bins,
+ context.hw->numHistogramBins
+ };
double iqMean = measureBrightness(hist);
double iqMeanGain = kEvGainTarget * hist.size() / iqMean;
diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h
index ce8594f3..fb82a33f 100644
--- a/src/ipa/rkisp1/algorithms/agc.h
+++ b/src/ipa/rkisp1/algorithms/agc.h
@@ -50,9 +50,6 @@ private:
uint64_t frameCount_;
- uint32_t numCells_;
- uint32_t numHistBins_;
-
utils::Duration filteredExposure_;
};
diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
index 9bbf3684..070834fa 100644
--- a/src/ipa/rkisp1/ipa_context.cpp
+++ b/src/ipa/rkisp1/ipa_context.cpp
@@ -15,6 +15,25 @@
namespace libcamera::ipa::rkisp1 {
/**
+ * \struct IPAHwSettings
+ * \brief RkISP1 version-specific hardware parameters
+ */
+
+/**
+ * \var IPAHwSettings::numAeCells
+ * \brief Number of cells in the AE exposure means grid
+ *
+ * \var IPAHwSettings::numHistogramBins
+ * \brief Number of bins in the histogram
+ *
+ * \var IPAHwSettings::numHistogramWeights
+ * \brief Number of weights in the histogram grid
+ *
+ * \var IPAHwSettings::numGammaOutSamples
+ * \brief Number of samples in the gamma out table
+ */
+
+/**
* \struct IPASessionConfiguration
* \brief Session configuration for the IPA module
*
@@ -33,14 +52,6 @@ namespace libcamera::ipa::rkisp1 {
*/
/**
- * \var IPASessionConfiguration::hw
- * \brief RkISP1-specific hardware information
- *
- * \var IPASessionConfiguration::hw.revision
- * \brief Hardware revision of the ISP
- */
-
-/**
* \var IPASessionConfiguration::awb
* \brief AWB parameters configuration of the IPA
*
@@ -337,6 +348,9 @@ namespace libcamera::ipa::rkisp1 {
* \struct IPAContext
* \brief Global IPA context data shared between all algorithms
*
+ * \var IPAContext::hw
+ * \brief RkISP1 version-specific hardware parameters
+ *
* \var IPAContext::configuration
* \brief The IPA session configuration, immutable during the session
*
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index b9b20653..10d8f38c 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -20,6 +20,13 @@ namespace libcamera {
namespace ipa::rkisp1 {
+struct IPAHwSettings {
+ unsigned int numAeCells;
+ unsigned int numHistogramBins;
+ unsigned int numHistogramWeights;
+ unsigned int numGammaOutSamples;
+};
+
struct IPASessionConfiguration {
struct {
struct rkisp1_cif_isp_window measureWindow;
@@ -45,10 +52,6 @@ struct IPASessionConfiguration {
Size size;
} sensor;
- struct {
- rkisp1_cif_isp_version revision;
- } hw;
-
bool raw;
};
@@ -143,6 +146,7 @@ struct IPAFrameContext : public FrameContext {
};
struct IPAContext {
+ const IPAHwSettings *hw;
IPASessionConfiguration configuration;
IPAActiveState activeState;
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 6544c925..44401af8 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -81,12 +81,6 @@ private:
ControlInfoMap sensorControls_;
- /* revision-specific data */
- rkisp1_cif_isp_version hwRevision_;
- unsigned int hwHistBinNMax_;
- unsigned int hwGammaOutMaxSamples_;
- unsigned int hwHistogramWeightGridsSize_;
-
/* Interface to the Camera Helper */
std::unique_ptr<CameraSensorHelper> camHelper_;
@@ -96,6 +90,20 @@ private:
namespace {
+const IPAHwSettings ipaHwSettingsV10{
+ RKISP1_CIF_ISP_AE_MEAN_MAX_V10,
+ RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10,
+ RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10,
+ RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10,
+};
+
+const IPAHwSettings ipaHwSettingsV12{
+ RKISP1_CIF_ISP_AE_MEAN_MAX_V12,
+ RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12,
+ RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12,
+ RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12,
+};
+
/* List of controls handled by the RkISP1 IPA */
const ControlInfoMap::Map rkisp1Controls{
{ &controls::AeEnable, ControlInfo(false, true) },
@@ -111,7 +119,7 @@ const ControlInfoMap::Map rkisp1Controls{
} /* namespace */
IPARkISP1::IPARkISP1()
- : context_({ {}, {}, { kMaxFrameContexts } })
+ : context_({ {}, {}, {}, { kMaxFrameContexts } })
{
}
@@ -128,14 +136,10 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
/* \todo Add support for other revisions */
switch (hwRevision) {
case RKISP1_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;
+ context_.hw = &ipaHwSettingsV10;
break;
case RKISP1_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;
+ context_.hw = &ipaHwSettingsV12;
break;
default:
LOG(IPARkISP1, Error)
@@ -146,9 +150,6 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
LOG(IPARkISP1, Debug) << "Hardware revision is " << hwRevision;
- /* Cache the value to set it in configure. */
- hwRevision_ = static_cast<rkisp1_cif_isp_version>(hwRevision);
-
camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
if (!camHelper_) {
LOG(IPARkISP1, Error)
@@ -232,9 +233,6 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,
context_.activeState = {};
context_.frameContexts.clear();
- /* Set the hardware revision for the algorithms. */
- context_.configuration.hw.revision = hwRevision_;
-
const IPACameraSensorInfo &info = ipaConfig.sensorInfo;
const ControlInfo vBlank = sensorControls_.find(V4L2_CID_VBLANK)->second;
context_.configuration.sensor.defVBlank = vBlank.def().get<int32_t>();