summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2023-03-27 13:20:28 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2023-03-31 13:29:18 +0100
commite51a9f7b94f29390514052096ef4a2f44b67fa56 (patch)
treeb7e585bbab3c2ee33117e0470611a70fae18c637
parente145decf36fe3d07a76ff702f5132fd87e9b574d (diff)
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>
-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);
};