<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>