@@ -140,6 +140,17 @@ double CameraSensorHelper::gain(uint32_t gainCode) const
}
}
+/**
+ * \fn CameraSensorHelper::sensorDelays()
+ * \brief Fetch the delays for sensor subdevice controls
+ *
+ * This function returns the delays between setting a control on a
+ * sensor subdevice and it becoming effective, measured in frames. If
+ * they are unknown, default values are used.
+ *
+ * \return The delays for sensor subdevice controls
+ */
+
/**
* \enum CameraSensorHelper::AnalogueGainType
* \brief The gain calculation modes as defined by the MIPI CCS
@@ -252,6 +263,12 @@ double CameraSensorHelper::gain(uint32_t gainCode) const
* sensor specific. Use this variable to store the values at init time.
*/
+/**
+ * \var CameraSensorHelper::sensorDelays_
+ * \brief The delays for sensor subdevice controls
+ * \sa CameraSensorHelper::sensorDelays()
+ */
+
/**
* \class CameraSensorHelperFactoryBase
* \brief Base class for camera sensor helper factories
@@ -567,6 +584,12 @@ public:
blackLevel_ = 3200;
gainType_ = AnalogueGainLinear;
gainConstants_.linear = { 0, 2048, -1, 2048 };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("imx283", CameraSensorHelperImx283)
@@ -578,6 +601,12 @@ public:
{
gainType_ = AnalogueGainExponential;
gainConstants_.exp = { 1.0, expGainDb(0.3) };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("imx290", CameraSensorHelperImx290)
@@ -589,6 +618,12 @@ public:
{
gainType_ = AnalogueGainExponential;
gainConstants_.exp = { 1.0, expGainDb(0.1) };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("imx296", CameraSensorHelperImx296)
@@ -629,6 +664,12 @@ public:
{
gainType_ = AnalogueGainLinear;
gainConstants_.linear = { 0, 1024, -1, 1024 };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 3;
+ sensorDelays_.hblankDelay = 3;
}
};
REGISTER_CAMERA_SENSOR_HELPER("imx477", CameraSensorHelperImx477)
@@ -668,6 +709,12 @@ public:
blackLevel_ = 1024;
gainType_ = AnalogueGainLinear;
gainConstants_.linear = { 1, 0, 0, 128 };
+
+ /* Found by experimentation. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("ov4689", CameraSensorHelperOv4689)
@@ -692,6 +739,12 @@ public:
{
gainType_ = AnalogueGainLinear;
gainConstants_.linear = { 1, 0, 0, 16 };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("ov5647", CameraSensorHelperOv5647)
@@ -738,6 +791,12 @@ public:
{
gainType_ = AnalogueGainLinear;
gainConstants_.linear = { 1, 0, 0, 128 };
+
+ /* Taken from CamHelper. */
+ sensorDelays_.exposureDelay = 2;
+ sensorDelays_.gainDelay = 2;
+ sensorDelays_.vblankDelay = 2;
+ sensorDelays_.hblankDelay = 2;
}
};
REGISTER_CAMERA_SENSOR_HELPER("ov64a40", CameraSensorHelperOv64a40)
@@ -14,6 +14,7 @@
#include <vector>
#include <libcamera/base/class.h>
+#include <libcamera/ipa/core_ipa_interface.h>
namespace libcamera {
@@ -28,6 +29,7 @@ public:
std::optional<int16_t> blackLevel() const { return blackLevel_; }
virtual uint32_t gainCode(double gain) const;
virtual double gain(uint32_t gainCode) const;
+ IPASensorDelays sensorDelays() const { return sensorDelays_; };
protected:
enum AnalogueGainType {
@@ -56,6 +58,9 @@ protected:
AnalogueGainType gainType_;
AnalogueGainConstants gainConstants_;
+ /* Generic values taken from the Raspberry Pi. */
+ IPASensorDelays sensorDelays_{ 2, 1, 2, 2 };
+
private:
LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelper)
};
Add a method to return sensor control application delays. Internally, a protected member variable sensorDelays_ with default delays is added to the base class CameraSensorHelper. Subsclasses for specific sensor, where the delays are known, are supposed to override default values in their constructors. Also override the defaults where correct delays are known from CamHelper or other sources. Signed-off-by: Mikhail Rudenko <mike.rudenko@gmail.com> --- src/ipa/libipa/camera_sensor_helper.cpp | 59 +++++++++++++++++++++++++ src/ipa/libipa/camera_sensor_helper.h | 5 +++ 2 files changed, 64 insertions(+)