ipa: raspberrypi: Move initial frame drop decision to AGC/AWB
Previously the CamHelper was returning the number of frames to drop (on account of AGC/AWB converging). This wasn't really appropriate, it's better for the algorithms to do it as they know how many frames they might need. The CamHelper::HideFramesStartup method should now just be returning the number of frames to hide because they're bad/invalid in some way, not worrying about the AGC/AWB. For many sensors, the correct value for this is zero. But the ov5647 needs updating as it must return 2. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
4cd283acd0
commit
aaeee427b0
3 changed files with 41 additions and 3 deletions
|
@ -82,10 +82,10 @@ bool CamHelper::SensorEmbeddedDataPresent() const
|
|||
unsigned int CamHelper::HideFramesStartup() const
|
||||
{
|
||||
/*
|
||||
* By default, hide 6 frames completely at start-up while AGC etc. sort
|
||||
* themselves out (converge).
|
||||
* The number of frames when a camera first starts that shouldn't be
|
||||
* displayed as they are invalid in some way.
|
||||
*/
|
||||
return 6;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int CamHelper::HideFramesModeSwitch() const
|
||||
|
|
|
@ -19,6 +19,7 @@ public:
|
|||
uint32_t GainCode(double gain) const override;
|
||||
double Gain(uint32_t gain_code) const override;
|
||||
void GetDelays(int &exposure_delay, int &gain_delay) const override;
|
||||
unsigned int HideFramesStartup() const override;
|
||||
unsigned int HideFramesModeSwitch() const override;
|
||||
unsigned int MistrustFramesStartup() const override;
|
||||
unsigned int MistrustFramesModeSwitch() const override;
|
||||
|
@ -54,6 +55,15 @@ void CamHelperOv5647::GetDelays(int &exposure_delay, int &gain_delay) const
|
|||
gain_delay = 2;
|
||||
}
|
||||
|
||||
unsigned int CamHelperOv5647::HideFramesStartup() const
|
||||
{
|
||||
/*
|
||||
* On startup, we get a couple of under-exposed frames which
|
||||
* we don't want shown.
|
||||
*/
|
||||
return 2;
|
||||
}
|
||||
|
||||
unsigned int CamHelperOv5647::HideFramesModeSwitch() const
|
||||
{
|
||||
/*
|
||||
|
|
|
@ -194,6 +194,34 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result)
|
|||
if (firstStart_) {
|
||||
dropFrame = helper_->HideFramesStartup();
|
||||
mistrustCount_ = helper_->MistrustFramesStartup();
|
||||
|
||||
/*
|
||||
* Query the AGC/AWB for how many frames they may take to
|
||||
* converge sufficiently. Where these numbers are non-zero
|
||||
* we must allow for the frames with bad statistics
|
||||
* (mistrustCount_) that they won't see. But if zero (i.e.
|
||||
* no convergence necessary), no frames need to be dropped.
|
||||
*/
|
||||
unsigned int agcConvergenceFrames = 0;
|
||||
RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(
|
||||
controller_.GetAlgorithm("agc"));
|
||||
if (agc) {
|
||||
agcConvergenceFrames = agc->GetConvergenceFrames();
|
||||
if (agcConvergenceFrames)
|
||||
agcConvergenceFrames += mistrustCount_;
|
||||
}
|
||||
|
||||
unsigned int awbConvergenceFrames = 0;
|
||||
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
|
||||
controller_.GetAlgorithm("awb"));
|
||||
if (awb) {
|
||||
awbConvergenceFrames = awb->GetConvergenceFrames();
|
||||
if (awbConvergenceFrames)
|
||||
awbConvergenceFrames += mistrustCount_;
|
||||
}
|
||||
|
||||
dropFrame = std::max({ dropFrame, agcConvergenceFrames, awbConvergenceFrames });
|
||||
LOG(IPARPI, Debug) << "Drop " << dropFrame << " frames on startup";
|
||||
} else {
|
||||
dropFrame = helper_->HideFramesModeSwitch();
|
||||
mistrustCount_ = helper_->MistrustFramesModeSwitch();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue