ipa: raspberrypi: Limit the maximum sensor gain used
Limit the gain code to the maximum value reported by the sensor controls when sending to DelayedControls. The AGC algorithm will handle a lower gain used by the sensor, provided it knows the actual gain used. This change ensures that DelayedControls will never report an unclipped gain used. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
b71cd3358f
commit
e875503bc4
1 changed files with 12 additions and 0 deletions
|
@ -173,6 +173,9 @@ private:
|
|||
/* Frame duration (1/fps) limits. */
|
||||
Duration minFrameDuration_;
|
||||
Duration maxFrameDuration_;
|
||||
|
||||
/* Maximum gain code for the sensor. */
|
||||
uint32_t maxSensorGainCode_;
|
||||
};
|
||||
|
||||
int IPARPi::init(const IPASettings &settings, ipa::RPi::SensorConfig *sensorConfig)
|
||||
|
@ -357,6 +360,8 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
|
|||
return -1;
|
||||
}
|
||||
|
||||
maxSensorGainCode_ = sensorCtrls_.at(V4L2_CID_ANALOGUE_GAIN).max().get<int32_t>();
|
||||
|
||||
/* Setup a metadata ControlList to output metadata. */
|
||||
libcameraMetadata_ = ControlList(controls::controls);
|
||||
|
||||
|
@ -1113,6 +1118,13 @@ void IPARPi::applyAGC(const struct AgcStatus *agcStatus, ControlList &ctrls)
|
|||
{
|
||||
int32_t gainCode = helper_->GainCode(agcStatus->analogue_gain);
|
||||
|
||||
/*
|
||||
* Ensure anything larger than the max gain code will not be passed to
|
||||
* DelayedControls. The AGC will correctly handle a lower gain returned
|
||||
* by the sensor, provided it knows the actual gain used.
|
||||
*/
|
||||
gainCode = std::min<int32_t>(gainCode, maxSensorGainCode_);
|
||||
|
||||
/* GetVBlanking might clip exposure time to the fps limits. */
|
||||
Duration exposure = agcStatus->shutter_time;
|
||||
int32_t vblanking = helper_->GetVBlanking(exposure, minFrameDuration_, maxFrameDuration_);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue