ipa: raspberrypi: Generalise the agc algorithm

Remove any hard-coded assumptions about the target hardware platform
from the AGC algorithm. Instead, use the "target" string provided by
the camera tuning config and generalised statistics structures to
determing parameters such as grid and region sizes.

This change replaces all hard-coded arrays with equivalent std::vector
types.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-03-27 13:20:28 +01:00 committed by Kieran Bingham
parent e145decf36
commit e51a9f7b94
2 changed files with 14 additions and 15 deletions

View file

@ -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).

View file

@ -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);
};