ipa: raspberrypi: Add sensor mode limits to CameraMode

Add fields in the CameraMode structure to capture the mode specific
limits for analogue gain and shutter speed. For convenience, also add
fields for minimum and maximum frame durations.

Populate these new fields when setting up the CameraMode structure.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-03-27 08:35:28 +01:00 committed by Kieran Bingham
parent d942bdc913
commit d6e85bdfe9
2 changed files with 25 additions and 1 deletions

View file

@ -36,9 +36,11 @@ struct CameraMode {
double scaleY; double scaleY;
/* scaling of the noise compared to the native sensor mode */ /* scaling of the noise compared to the native sensor mode */
double noiseFactor; double noiseFactor;
/* minimum and maximum line time */ /* minimum and maximum line time and frame durations */
libcamera::utils::Duration minLineLength; libcamera::utils::Duration minLineLength;
libcamera::utils::Duration maxLineLength; libcamera::utils::Duration maxLineLength;
libcamera::utils::Duration minFrameDuration;
libcamera::utils::Duration maxFrameDuration;
/* any camera transform *not* reflected already in the camera tuning */ /* any camera transform *not* reflected already in the camera tuning */
libcamera::Transform transform; libcamera::Transform transform;
/* minimum and maximum frame lengths in units of lines */ /* minimum and maximum frame lengths in units of lines */
@ -48,4 +50,10 @@ struct CameraMode {
double sensitivity; double sensitivity;
/* pixel clock rate */ /* pixel clock rate */
uint64_t pixelRate; uint64_t pixelRate;
/* Mode specific shutter speed limits */
libcamera::utils::Duration minShutter;
libcamera::utils::Duration maxShutter;
/* Mode specific analogue gain limits */
double minAnalogueGain;
double maxAnalogueGain;
}; };

View file

@ -407,11 +407,27 @@ void IPARPi::setMode(const IPACameraSensorInfo &sensorInfo)
mode_.minFrameLength = sensorInfo.minFrameLength; mode_.minFrameLength = sensorInfo.minFrameLength;
mode_.maxFrameLength = sensorInfo.maxFrameLength; mode_.maxFrameLength = sensorInfo.maxFrameLength;
/* Store these for convenience. */
mode_.minFrameDuration = mode_.minFrameLength * mode_.minLineLength;
mode_.maxFrameDuration = mode_.maxFrameLength * mode_.maxLineLength;
/* /*
* Some sensors may have different sensitivities in different modes; * Some sensors may have different sensitivities in different modes;
* the CamHelper will know the correct value. * the CamHelper will know the correct value.
*/ */
mode_.sensitivity = helper_->getModeSensitivity(mode_); mode_.sensitivity = helper_->getModeSensitivity(mode_);
const ControlInfo &gainCtrl = sensorCtrls_.at(V4L2_CID_ANALOGUE_GAIN);
const ControlInfo &shutterCtrl = sensorCtrls_.at(V4L2_CID_EXPOSURE);
mode_.minAnalogueGain = helper_->gain(gainCtrl.min().get<int32_t>());
mode_.maxAnalogueGain = helper_->gain(gainCtrl.max().get<int32_t>());
/* Shutter speed is calculated based on the limits of the frame durations. */
mode_.minShutter = helper_->exposure(shutterCtrl.min().get<int32_t>(), mode_.minLineLength);
mode_.maxShutter = Duration::max();
helper_->getBlanking(mode_.maxShutter,
mode_.minFrameDuration, mode_.maxFrameDuration);
} }
int IPARPi::configure(const IPACameraSensorInfo &sensorInfo, const IPAConfig &ipaConfig, int IPARPi::configure(const IPACameraSensorInfo &sensorInfo, const IPAConfig &ipaConfig,