summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi')
-rw-r--r--src/ipa/raspberrypi/controller/rpi/agc.cpp20
-rw-r--r--src/ipa/raspberrypi/controller/rpi/agc.h9
2 files changed, 14 insertions, 15 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp
index f438cab8..e6fb7b8d 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp
@@ -31,17 +31,12 @@ LOG_DEFINE_CATEGORY(RPiAgc)
int AgcMeteringMode::read(const libcamera::YamlObject &params)
{
const YamlObject &yamlWeights = params["weights"];
- if (yamlWeights.size() != AgcStatsSize) {
- LOG(RPiAgc, Error) << "AgcMeteringMode: Incorrect number of weights";
- return -EINVAL;
- }
- unsigned int num = 0;
for (const auto &p : yamlWeights.asList()) {
auto value = p.get<double>();
if (!value)
return -EINVAL;
- weights[num++] = *value;
+ weights.push_back(*value);
}
return 0;
@@ -248,6 +243,14 @@ int Agc::read(const libcamera::YamlObject &params)
if (ret)
return ret;
+ const Size &size = getHardwareConfig().agcZoneWeights;
+ for (auto const &modes : config_.meteringModes) {
+ if (modes.second.weights.size() != size.width * size.height) {
+ LOG(RPiAgc, Error) << "AgcMeteringMode: Incorrect number of weights";
+ return -EINVAL;
+ }
+ }
+
/*
* Set the config's defaults (which are the first ones it read) as our
* current modes, until someone changes them. (they're all known to
@@ -585,9 +588,12 @@ void Agc::fetchAwbStatus(Metadata *imageMetadata)
}
static double computeInitialY(StatisticsPtr &stats, AwbStatus const &awb,
- double weights[], double gain)
+ std::vector<double> &weights, double gain)
{
constexpr uint64_t maxVal = 1 << Statistics::NormalisationFactorPow2;
+
+ ASSERT(weights.size() == stats->agcRegions.numRegions());
+
/*
* Note how the calculation below means that equal weights give you
* "average" metering (i.e. all pixels equally important).
diff --git a/src/ipa/raspberrypi/controller/rpi/agc.h b/src/ipa/raspberrypi/controller/rpi/agc.h
index 4fa9b8de..4e5f272f 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.h
+++ b/src/ipa/raspberrypi/controller/rpi/agc.h
@@ -17,17 +17,10 @@
/* This is our implementation of AGC. */
-/*
- * This is the number actually set up by the firmware, not the maximum possible
- * number (which is 16).
- */
-
-constexpr unsigned int AgcStatsSize = 15;
-
namespace RPiController {
struct AgcMeteringMode {
- double weights[AgcStatsSize];
+ std::vector<double> weights;
int read(const libcamera::YamlObject &params);
};