summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi/agc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/agc.cpp')
-rw-r--r--src/ipa/raspberrypi/controller/rpi/agc.cpp20
1 files changed, 13 insertions, 7 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).