diff options
Diffstat (limited to 'src/ipa/libipa')
-rw-r--r-- | src/ipa/libipa/algorithms/af_hill_climbing.cpp | 8 | ||||
-rw-r--r-- | src/ipa/libipa/algorithms/af_hill_climbing.h | 23 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.cpp b/src/ipa/libipa/algorithms/af_hill_climbing.cpp index f666c6c2..28d09176 100644 --- a/src/ipa/libipa/algorithms/af_hill_climbing.cpp +++ b/src/ipa/libipa/algorithms/af_hill_climbing.cpp @@ -84,6 +84,14 @@ namespace ipa::common::algorithms { * \return New lens position calculated by AF algorithm */ +/** + * \fn AfHillClimbing::setFramesToSkip() + * \brief Request AF to skip n frames + * \param[in] n Number of frames to be skipped + * + * Requested number of frames will not be used for AF calculation. + */ + } /* namespace ipa::common::algorithms */ } /* namespace libcamera */ diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.h b/src/ipa/libipa/algorithms/af_hill_climbing.h index db9fc058..e251f3eb 100644 --- a/src/ipa/libipa/algorithms/af_hill_climbing.h +++ b/src/ipa/libipa/algorithms/af_hill_climbing.h @@ -29,7 +29,7 @@ public: lensPosition_(0), bestPosition_(0), currentContrast_(0.0), previousContrast_(0.0), maxContrast_(0.0), maxStep_(0), coarseCompleted_(false), fineCompleted_(false), - lowStep_(0), highStep_(kMaxFocusSteps) + lowStep_(0), highStep_(kMaxFocusSteps), framesToSkip_(0) { } @@ -92,6 +92,9 @@ protected: { currentContrast_ = currentContrast; + if (shouldSkipFrame()) + return lensPosition_; + /* If we are in a paused state, we won't process the stats */ if (pauseState_ == libcamera::controls::AfPauseStatePaused) return lensPosition_; @@ -113,6 +116,12 @@ protected: return lensPosition_; } + void setFramesToSkip(uint32_t n) + { + if (n > framesToSkip_) + framesToSkip_ = n; + } + private: void afCoarseScan() { @@ -191,6 +200,7 @@ private: coarseCompleted_ = false; fineCompleted_ = false; maxContrast_ = 0.0; + setFramesToSkip(1); } bool afIsOutOfFocus() @@ -206,6 +216,16 @@ private: return false; } + bool shouldSkipFrame() + { + if (framesToSkip_ > 0) { + framesToSkip_--; + return true; + } + + return false; + } + controls::AfModeEnum mode_; controls::AfStateEnum state_; controls::AfPauseStateEnum pauseState_; @@ -229,6 +249,7 @@ private: uint32_t lowStep_; uint32_t highStep_; + uint32_t framesToSkip_; /* * Maximum focus steps of the VCM control |