diff options
-rw-r--r-- | include/libcamera/ipa/raspberrypi.mojom | 1 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper.cpp | 3 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper.h | 2 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_imx290.cpp | 5 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_imx296.cpp | 6 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_imx477.cpp | 5 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_imx519.cpp | 5 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_ov5647.cpp | 5 | ||||
-rw-r--r-- | src/ipa/raspberrypi/cam_helper_ov9281.cpp | 5 | ||||
-rw-r--r-- | src/ipa/raspberrypi/raspberrypi.cpp | 6 | ||||
-rw-r--r-- | src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 1 |
11 files changed, 28 insertions, 16 deletions
diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom index c0de435b..40f78d9e 100644 --- a/include/libcamera/ipa/raspberrypi.mojom +++ b/include/libcamera/ipa/raspberrypi.mojom @@ -23,6 +23,7 @@ struct SensorConfig { uint32 gainDelay; uint32 exposureDelay; uint32 vblankDelay; + uint32 hblankDelay; uint32 sensorMetadata; }; diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp index 45214531..dd7236f1 100644 --- a/src/ipa/raspberrypi/cam_helper.cpp +++ b/src/ipa/raspberrypi/cam_helper.cpp @@ -107,7 +107,7 @@ void CamHelper::setCameraMode(const CameraMode &mode) } void CamHelper::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { /* * These values are correct for many sensors. Other sensors will @@ -116,6 +116,7 @@ void CamHelper::getDelays(int &exposureDelay, int &gainDelay, exposureDelay = 2; gainDelay = 1; vblankDelay = 2; + hblankDelay = 2; } bool CamHelper::sensorEmbeddedDataPresent() const diff --git a/src/ipa/raspberrypi/cam_helper.h b/src/ipa/raspberrypi/cam_helper.h index 6771829a..db2387af 100644 --- a/src/ipa/raspberrypi/cam_helper.h +++ b/src/ipa/raspberrypi/cam_helper.h @@ -88,7 +88,7 @@ public: virtual uint32_t gainCode(double gain) const = 0; virtual double gain(uint32_t gainCode) const = 0; virtual void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const; + int &vblankDelay, int &hblankDelay) const; virtual bool sensorEmbeddedDataPresent() const; virtual double getModeSensitivity(const CameraMode &mode) const; virtual unsigned int hideFramesStartup() const; diff --git a/src/ipa/raspberrypi/cam_helper_imx290.cpp b/src/ipa/raspberrypi/cam_helper_imx290.cpp index 25f23d53..7d6f5b54 100644 --- a/src/ipa/raspberrypi/cam_helper_imx290.cpp +++ b/src/ipa/raspberrypi/cam_helper_imx290.cpp @@ -18,7 +18,7 @@ public: uint32_t gainCode(double gain) const override; double gain(uint32_t gainCode) const override; void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const override; + int &vblankDelay, int &hblankDelay) const override; unsigned int hideFramesModeSwitch() const override; private: @@ -46,11 +46,12 @@ double CamHelperImx290::gain(uint32_t gainCode) const } void CamHelperImx290::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { exposureDelay = 2; gainDelay = 2; vblankDelay = 2; + hblankDelay = 2; } unsigned int CamHelperImx290::hideFramesModeSwitch() const diff --git a/src/ipa/raspberrypi/cam_helper_imx296.cpp b/src/ipa/raspberrypi/cam_helper_imx296.cpp index d86ff387..ecb845e7 100644 --- a/src/ipa/raspberrypi/cam_helper_imx296.cpp +++ b/src/ipa/raspberrypi/cam_helper_imx296.cpp @@ -23,7 +23,8 @@ public: double gain(uint32_t gainCode) const override; uint32_t exposureLines(const Duration exposure, const Duration lineLength) const override; Duration exposure(uint32_t exposureLines, const Duration lineLength) const override; - void getDelays(int &exposureDelay, int &gainDelay, int &vblankDelay) const override; + void getDelays(int &exposureDelay, int &gainDelay, + int &vblankDelay, int &hblankDelay) const override; private: static constexpr uint32_t minExposureLines = 1; @@ -66,11 +67,12 @@ Duration CamHelperImx296::exposure(uint32_t exposureLines, } void CamHelperImx296::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { exposureDelay = 2; gainDelay = 2; vblankDelay = 2; + hblankDelay = 2; } static CamHelper *create() diff --git a/src/ipa/raspberrypi/cam_helper_imx477.cpp b/src/ipa/raspberrypi/cam_helper_imx477.cpp index 71529bdd..76a82cc5 100644 --- a/src/ipa/raspberrypi/cam_helper_imx477.cpp +++ b/src/ipa/raspberrypi/cam_helper_imx477.cpp @@ -49,7 +49,7 @@ public: uint32_t getVBlanking(Duration &exposure, Duration minFrameDuration, Duration maxFrameDuration) const override; void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const override; + int &vblankDelay, int &hblankDelay) const override; bool sensorEmbeddedDataPresent() const override; private: @@ -153,11 +153,12 @@ uint32_t CamHelperImx477::getVBlanking(Duration &exposure, } void CamHelperImx477::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { exposureDelay = 2; gainDelay = 2; vblankDelay = 3; + hblankDelay = 3; } bool CamHelperImx477::sensorEmbeddedDataPresent() const diff --git a/src/ipa/raspberrypi/cam_helper_imx519.cpp b/src/ipa/raspberrypi/cam_helper_imx519.cpp index 2c120dad..9dff1eeb 100644 --- a/src/ipa/raspberrypi/cam_helper_imx519.cpp +++ b/src/ipa/raspberrypi/cam_helper_imx519.cpp @@ -49,7 +49,7 @@ public: uint32_t getVBlanking(Duration &exposure, Duration minFrameDuration, Duration maxFrameDuration) const override; void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const override; + int &vblankDelay, int &hblankDelay) const override; bool sensorEmbeddedDataPresent() const override; private: @@ -153,11 +153,12 @@ uint32_t CamHelperImx519::getVBlanking(Duration &exposure, } void CamHelperImx519::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { exposureDelay = 2; gainDelay = 2; vblankDelay = 3; + hblankDelay = 3; } bool CamHelperImx519::sensorEmbeddedDataPresent() const diff --git a/src/ipa/raspberrypi/cam_helper_ov5647.cpp b/src/ipa/raspberrypi/cam_helper_ov5647.cpp index 04fb725d..5a99083d 100644 --- a/src/ipa/raspberrypi/cam_helper_ov5647.cpp +++ b/src/ipa/raspberrypi/cam_helper_ov5647.cpp @@ -18,7 +18,7 @@ public: uint32_t gainCode(double gain) const override; double gain(uint32_t gainCode) const override; void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const override; + int &vblankDelay, int &hblankDelay) const override; unsigned int hideFramesStartup() const override; unsigned int hideFramesModeSwitch() const override; unsigned int mistrustFramesStartup() const override; @@ -53,7 +53,7 @@ double CamHelperOv5647::gain(uint32_t gainCode) const } void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { /* * We run this sensor in a mode where the gain delay is bumped up to @@ -62,6 +62,7 @@ void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay, exposureDelay = 2; gainDelay = 2; vblankDelay = 2; + hblankDelay = 2; } unsigned int CamHelperOv5647::hideFramesStartup() const diff --git a/src/ipa/raspberrypi/cam_helper_ov9281.cpp b/src/ipa/raspberrypi/cam_helper_ov9281.cpp index 66f56a31..86c5bc4c 100644 --- a/src/ipa/raspberrypi/cam_helper_ov9281.cpp +++ b/src/ipa/raspberrypi/cam_helper_ov9281.cpp @@ -18,7 +18,7 @@ public: uint32_t gainCode(double gain) const override; double gain(uint32_t gainCode) const override; void getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const override; + int &vblankDelay, int &hblankDelay) const override; private: /* @@ -49,12 +49,13 @@ double CamHelperOv9281::gain(uint32_t gainCode) const } void CamHelperOv9281::getDelays(int &exposureDelay, int &gainDelay, - int &vblankDelay) const + int &vblankDelay, int &hblankDelay) const { /* The driver appears to behave as follows: */ exposureDelay = 2; gainDelay = 2; vblankDelay = 2; + hblankDelay = 2; } static CamHelper *create() diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 560b61bd..126a48d0 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -219,13 +219,14 @@ int IPARPi::init(const IPASettings &settings, IPAInitResult *result) * Pass out the sensor config to the pipeline handler in order * to setup the staggered writer class. */ - int gainDelay, exposureDelay, vblankDelay, sensorMetadata; - helper_->getDelays(exposureDelay, gainDelay, vblankDelay); + int gainDelay, exposureDelay, vblankDelay, hblankDelay, sensorMetadata; + helper_->getDelays(exposureDelay, gainDelay, vblankDelay, hblankDelay); sensorMetadata = helper_->sensorEmbeddedDataPresent(); result->sensorConfig.gainDelay = gainDelay; result->sensorConfig.exposureDelay = exposureDelay; result->sensorConfig.vblankDelay = vblankDelay; + result->sensorConfig.hblankDelay = hblankDelay; result->sensorConfig.sensorMetadata = sensorMetadata; /* Load the tuning file for this sensor. */ @@ -606,6 +607,7 @@ bool IPARPi::validateSensorControls() V4L2_CID_ANALOGUE_GAIN, V4L2_CID_EXPOSURE, V4L2_CID_VBLANK, + V4L2_CID_HBLANK, }; for (auto c : ctrls) { diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index d366a8be..343f8cb2 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1297,6 +1297,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me std::unordered_map<uint32_t, DelayedControls::ControlParams> params = { { V4L2_CID_ANALOGUE_GAIN, { result.sensorConfig.gainDelay, false } }, { V4L2_CID_EXPOSURE, { result.sensorConfig.exposureDelay, false } }, + { V4L2_CID_HBLANK, { result.sensorConfig.hblankDelay, false } }, { V4L2_CID_VBLANK, { result.sensorConfig.vblankDelay, true } } }; data->delayedCtrls_ = std::make_unique<DelayedControls>(data->sensor_->device(), params); |