@@ -31,17 +31,12 @@ LOG_DEFINE_CATEGORY(RPiAgc)
int AgcMeteringMode::read(const libcamera::YamlObject ¶ms)
{
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 ¶ms)
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).
@@ -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 ¶ms);
};