summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi/af.h
diff options
context:
space:
mode:
authorNick Hollinghurst <nick.hollinghurst@raspberrypi.com>2023-03-27 13:20:29 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2023-03-31 13:29:18 +0100
commit43f57f26b44648e609f66770e43294a361bd6657 (patch)
tree8246999f1e8b418dbd675f853d8d1fd7f2dc49a8 /src/ipa/raspberrypi/controller/rpi/af.h
parente51a9f7b94f29390514052096ef4a2f44b67fa56 (diff)
ipa: raspberrypi: Generalise the autofocus algorithm
Remove any hard-coded assumptions about the target hardware platform from the autofocus 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. Additionally, PDAF statistics are represented by a generalised region statistics structure to be device agnostic. These changes also require the autofocus algorithm to initialise region weights on the first frame's prepare()/process() call rather than during initialisation. Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Tested-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/af.h')
-rw-r--r--src/ipa/raspberrypi/controller/rpi/af.h28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/af.h b/src/ipa/raspberrypi/controller/rpi/af.h
index 7959371b..b479feb8 100644
--- a/src/ipa/raspberrypi/controller/rpi/af.h
+++ b/src/ipa/raspberrypi/controller/rpi/af.h
@@ -12,12 +12,6 @@
#include "../pwl.h"
/*
- * \todo FOCUS_REGIONS is taken from bcm2835-isp.h, but should be made as a
- * generic RegionStats structure.
- */
-#define FOCUS_REGIONS 12
-
-/*
* This algorithm implements a hybrid of CDAF and PDAF, favouring PDAF.
*
* Whenever PDAF is available, it is used in a continuous feedback loop.
@@ -121,9 +115,20 @@ private:
double conf;
};
- void computeWeights();
- bool getPhase(PdafData const &data, double &phase, double &conf) const;
- double getContrast(const FocusRegions &focusStats) const;
+ struct RegionWeights {
+ unsigned rows;
+ unsigned cols;
+ uint32_t sum;
+ std::vector<uint16_t> w;
+
+ RegionWeights()
+ : rows(0), cols(0), sum(0), w() {}
+ };
+
+ void computeWeights(RegionWeights *wgts, unsigned rows, unsigned cols);
+ void invalidateWeights();
+ bool getPhase(PdafRegions const &regions, double &phase, double &conf);
+ double getContrast(const FocusRegions &focusStats);
void doPDAF(double phase, double conf);
bool earlyTerminationByPhase(double phase);
double findPeak(unsigned index) const;
@@ -143,9 +148,8 @@ private:
libcamera::Rectangle statsRegion_;
std::vector<libcamera::Rectangle> windows_;
bool useWindows_;
- uint8_t phaseWeights_[PDAF_DATA_ROWS][PDAF_DATA_COLS];
- uint16_t contrastWeights_[FOCUS_REGIONS];
- uint32_t sumWeights_;
+ RegionWeights phaseWeights_;
+ RegionWeights contrastWeights_;
/* Working state. */
ScanState scanState_;