<div dir="ltr"><div dir="ltr">Hi David,<div><br></div><div>Thank you for your patch.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 11 Jun 2021 at 11:07, David Plowman <<a href="mailto:david.plowman@raspberrypi.com">david.plowman@raspberrypi.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">We use the CamHelper class to initialise it to the usual value of 1.<br>
<br>
The CamHelper's GetModeSensitivity method can be redefined to<br>
implement a different behaviour for sensors that require it.<br>
<br>
Signed-off-by: David Plowman <<a href="mailto:david.plowman@raspberrypi.com" target="_blank">david.plowman@raspberrypi.com</a>><br></blockquote><div><br></div><div>This is a bit awkward with the whole chicken-and-egg thing, but I cannot see what else</div><div>to do.</div><div><br></div><div>Reviewed-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
src/ipa/raspberrypi/cam_helper.cpp | 11 +++++++++++<br>
src/ipa/raspberrypi/cam_helper.hpp | 3 +++<br>
src/ipa/raspberrypi/controller/camera_mode.h | 2 ++<br>
src/ipa/raspberrypi/raspberrypi.cpp | 6 ++++++<br>
4 files changed, 22 insertions(+)<br>
<br>
diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp<br>
index 062e94c4..d0104da7 100644<br>
--- a/src/ipa/raspberrypi/cam_helper.cpp<br>
+++ b/src/ipa/raspberrypi/cam_helper.cpp<br>
@@ -130,6 +130,17 @@ bool CamHelper::SensorEmbeddedDataPresent() const<br>
return false;<br>
}<br>
<br>
+double CamHelper::GetModeSensitivity([[maybe_unused]] const CameraMode &mode) const<br>
+{<br>
+ /*<br>
+ * Most sensors have the same sensitivity in every mode, but this<br>
+ * method can be overridden for those that do not. Note that it is<br>
+ * called before mode_ is set, so it must return the sensitivity<br>
+ * of the mode that is passed in.<br>
+ */<br>
+ return 1.0;<br>
+}<br>
+<br>
unsigned int CamHelper::HideFramesStartup() const<br>
{<br>
/*<br>
diff --git a/src/ipa/raspberrypi/cam_helper.hpp b/src/ipa/raspberrypi/cam_helper.hpp<br>
index f53f5c39..f524fe84 100644<br>
--- a/src/ipa/raspberrypi/cam_helper.hpp<br>
+++ b/src/ipa/raspberrypi/cam_helper.hpp<br>
@@ -40,6 +40,8 @@ namespace RPiController {<br>
//<br>
// A method to query if the sensor outputs embedded data that can be parsed.<br>
//<br>
+// A method to return the sensitivity of a given camera mode.<br>
+//<br>
// A parser to parse the embedded data buffers provided by some sensors (for<br>
// example, the imx219 does; the ov5647 doesn't). This allows us to know for<br>
// sure the exposure and gain of the frame we're looking at. CamHelper<br>
@@ -83,6 +85,7 @@ public:<br>
virtual void GetDelays(int &exposure_delay, int &gain_delay,<br>
int &vblank_delay) const;<br>
virtual bool SensorEmbeddedDataPresent() const;<br>
+ virtual double GetModeSensitivity(const CameraMode &mode) const;<br>
virtual unsigned int HideFramesStartup() const;<br>
virtual unsigned int HideFramesModeSwitch() const;<br>
virtual unsigned int MistrustFramesStartup() const;<br>
diff --git a/src/ipa/raspberrypi/controller/camera_mode.h b/src/ipa/raspberrypi/controller/camera_mode.h<br>
index 2aa2335d..72c68dc6 100644<br>
--- a/src/ipa/raspberrypi/controller/camera_mode.h<br>
+++ b/src/ipa/raspberrypi/controller/camera_mode.h<br>
@@ -41,6 +41,8 @@ struct CameraMode {<br>
libcamera::Transform transform;<br>
// minimum and maximum fame lengths in units of lines<br>
uint32_t min_frame_length, max_frame_length;<br>
+ // sensitivity of this mode<br>
+ double sensitivity;<br>
};<br>
<br>
#ifdef __cplusplus<br>
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp<br>
index 1c1e802a..9ce0db08 100644<br>
--- a/src/ipa/raspberrypi/raspberrypi.cpp<br>
+++ b/src/ipa/raspberrypi/raspberrypi.cpp<br>
@@ -324,6 +324,12 @@ void IPARPi::setMode(const IPACameraSensorInfo &sensorInfo)<br>
*/<br>
mode_.min_frame_length = sensorInfo.minFrameLength;<br>
mode_.max_frame_length = sensorInfo.maxFrameLength;<br>
+<br>
+ /*<br>
+ * Some sensors may have different sensitivities in different modes;<br>
+ * the CamHelper will know the correct value.<br>
+ */<br>
+ mode_.sensitivity = helper_->GetModeSensitivity(mode_);<br>
}<br>
<br>
int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,<br>
-- <br>
2.20.1<br>
<br>
</blockquote></div></div>