summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ipa/raspberrypi/cam_helper.cpp8
-rw-r--r--src/ipa/raspberrypi/controller/camera_mode.h25
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp13
3 files changed, 27 insertions, 19 deletions
diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp
index cac8f39e..42251ba2 100644
--- a/src/ipa/raspberrypi/cam_helper.cpp
+++ b/src/ipa/raspberrypi/cam_helper.cpp
@@ -64,13 +64,13 @@ void CamHelper::process([[maybe_unused]] StatisticsPtr &stats,
uint32_t CamHelper::exposureLines(const Duration exposure) const
{
assert(initialized_);
- return exposure / mode_.lineLength;
+ return exposure / mode_.minLineLength;
}
Duration CamHelper::exposure(uint32_t exposureLines) const
{
assert(initialized_);
- return exposureLines * mode_.lineLength;
+ return exposureLines * mode_.minLineLength;
}
uint32_t CamHelper::getVBlanking(Duration &exposure,
@@ -86,8 +86,8 @@ uint32_t CamHelper::getVBlanking(Duration &exposure,
* minFrameDuration and maxFrameDuration are clamped by the caller
* based on the limits for the active sensor mode.
*/
- frameLengthMin = minFrameDuration / mode_.lineLength;
- frameLengthMax = maxFrameDuration / mode_.lineLength;
+ frameLengthMin = minFrameDuration / mode_.minLineLength;
+ frameLengthMax = maxFrameDuration / mode_.minLineLength;
/*
* Limit the exposure to the maximum frame duration requested, and
diff --git a/src/ipa/raspberrypi/controller/camera_mode.h b/src/ipa/raspberrypi/controller/camera_mode.h
index a6ccf8c1..204c96a0 100644
--- a/src/ipa/raspberrypi/controller/camera_mode.h
+++ b/src/ipa/raspberrypi/controller/camera_mode.h
@@ -20,23 +20,30 @@ struct CameraMode {
/* bit depth of the raw camera output */
uint32_t bitdepth;
/* size in pixels of frames in this mode */
- uint16_t width, height;
+ uint16_t width;
+ uint16_t height;
/* size of full resolution uncropped frame ("sensor frame") */
- uint16_t sensorWidth, sensorHeight;
+ uint16_t sensorWidth;
+ uint16_t sensorHeight;
/* binning factor (1 = no binning, 2 = 2-pixel binning etc.) */
- uint8_t binX, binY;
+ uint8_t binX;
+ uint8_t binY;
/* location of top left pixel in the sensor frame */
- uint16_t cropX, cropY;
+ uint16_t cropX;
+ uint16_t cropY;
/* scaling factor (so if uncropped, width*scaleX is sensorWidth) */
- double scaleX, scaleY;
+ double scaleX;
+ double scaleY;
/* scaling of the noise compared to the native sensor mode */
double noiseFactor;
- /* line time */
- libcamera::utils::Duration lineLength;
+ /* minimum and maximum line time */
+ libcamera::utils::Duration minLineLength;
+ libcamera::utils::Duration maxLineLength;
/* any camera transform *not* reflected already in the camera tuning */
libcamera::Transform transform;
- /* minimum and maximum fame lengths in units of lines */
- uint32_t minFrameLength, maxFrameLength;
+ /* minimum and maximum frame lengths in units of lines */
+ uint32_t minFrameLength;
+ uint32_t maxFrameLength;
/* sensitivity of this mode */
double sensitivity;
};
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index ec495a37..5db5b86d 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -314,7 +314,7 @@ void IPARPi::start(const ControlList &controls, StartConfig *startConfig)
}
startConfig->dropFrameCount = dropFrameCount_;
- const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.lineLength;
+ const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.minLineLength;
startConfig->maxSensorFrameLengthMs = maxSensorFrameDuration.get<std::milli>();
firstStart_ = false;
@@ -356,7 +356,8 @@ void IPARPi::setMode(const IPACameraSensorInfo &sensorInfo)
* Calculate the line length as the ratio between the line length in
* pixels and the pixel rate.
*/
- mode_.lineLength = sensorInfo.minLineLength * (1.0s / sensorInfo.pixelRate);
+ mode_.minLineLength = sensorInfo.minLineLength * (1.0s / sensorInfo.pixelRate);
+ mode_.maxLineLength = sensorInfo.maxLineLength * (1.0s / sensorInfo.pixelRate);
/*
* Set the frame length limits for the mode to ensure exposure and
@@ -458,8 +459,8 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
* based on the current sensor mode.
*/
ControlInfoMap::Map ctrlMap = ipaControls;
- const Duration minSensorFrameDuration = mode_.minFrameLength * mode_.lineLength;
- const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.lineLength;
+ const Duration minSensorFrameDuration = mode_.minFrameLength * mode_.minLineLength;
+ const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.minLineLength;
ctrlMap[&controls::FrameDurationLimits] =
ControlInfo(static_cast<int64_t>(minSensorFrameDuration.get<std::micro>()),
static_cast<int64_t>(maxSensorFrameDuration.get<std::micro>()));
@@ -1149,8 +1150,8 @@ void IPARPi::applyAWB(const struct AwbStatus *awbStatus, ControlList &ctrls)
void IPARPi::applyFrameDurations(Duration minFrameDuration, Duration maxFrameDuration)
{
- const Duration minSensorFrameDuration = mode_.minFrameLength * mode_.lineLength;
- const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.lineLength;
+ const Duration minSensorFrameDuration = mode_.minFrameLength * mode_.minLineLength;
+ const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.minLineLength;
/*
* This will only be applied once AGC recalculations occur.