[libcamera-devel] [PATCH 3/5] libcamera: raspberrypi: Plumb user transform through to individual IPAs
David Plowman
david.plowman at raspberrypi.com
Wed Jul 29 11:31:52 CEST 2020
This commit takes the user/application supplied Transform and plumbs
it through to all our individual IPAs using the SwitchMode method of
the Controller/Algorithms. IPARPi::configure has to be re-ordered just
a little to ensure the userTransform_ is available before calling
SwitchMode.
---
src/ipa/raspberrypi/controller/algorithm.cpp | 4 ++-
src/ipa/raspberrypi/controller/algorithm.hpp | 3 +-
src/ipa/raspberrypi/controller/controller.cpp | 5 +--
src/ipa/raspberrypi/controller/controller.hpp | 5 ++-
src/ipa/raspberrypi/controller/rpi/agc.cpp | 3 +-
src/ipa/raspberrypi/controller/rpi/agc.hpp | 3 +-
src/ipa/raspberrypi/controller/rpi/alsc.cpp | 3 +-
src/ipa/raspberrypi/controller/rpi/alsc.hpp | 3 +-
src/ipa/raspberrypi/controller/rpi/noise.cpp | 4 ++-
src/ipa/raspberrypi/controller/rpi/noise.hpp | 3 +-
.../raspberrypi/controller/rpi/sharpen.cpp | 3 +-
.../raspberrypi/controller/rpi/sharpen.hpp | 3 +-
src/ipa/raspberrypi/raspberrypi.cpp | 31 ++++++++++---------
13 files changed, 45 insertions(+), 28 deletions(-)
diff --git a/src/ipa/raspberrypi/controller/algorithm.cpp b/src/ipa/raspberrypi/controller/algorithm.cpp
index 55cb201..b95ebb8 100644
--- a/src/ipa/raspberrypi/controller/algorithm.cpp
+++ b/src/ipa/raspberrypi/controller/algorithm.cpp
@@ -16,9 +16,11 @@ void Algorithm::Read(boost::property_tree::ptree const ¶ms)
void Algorithm::Initialise() {}
-void Algorithm::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Algorithm::SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata)
{
(void)camera_mode;
+ (void)transform;
(void)metadata;
}
diff --git a/src/ipa/raspberrypi/controller/algorithm.hpp b/src/ipa/raspberrypi/controller/algorithm.hpp
index 187c50c..b38f167 100644
--- a/src/ipa/raspberrypi/controller/algorithm.hpp
+++ b/src/ipa/raspberrypi/controller/algorithm.hpp
@@ -37,7 +37,8 @@ public:
virtual void Resume() { paused_ = false; }
virtual void Read(boost::property_tree::ptree const ¶ms);
virtual void Initialise();
- virtual void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
+ virtual void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata);
virtual void Prepare(Metadata *image_metadata);
virtual void Process(StatisticsPtr &stats, Metadata *image_metadata);
Metadata &GetGlobalMetadata() const
diff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp
index 7c4b04f..7a4310f 100644
--- a/src/ipa/raspberrypi/controller/controller.cpp
+++ b/src/ipa/raspberrypi/controller/controller.cpp
@@ -56,11 +56,12 @@ void Controller::Initialise()
RPI_LOG("Controller finished");
}
-void Controller::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Controller::SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata)
{
RPI_LOG("Controller starting");
for (auto &algo : algorithms_)
- algo->SwitchMode(camera_mode, metadata);
+ algo->SwitchMode(camera_mode, transform, metadata);
switch_mode_called_ = true;
RPI_LOG("Controller finished");
}
diff --git a/src/ipa/raspberrypi/controller/controller.hpp b/src/ipa/raspberrypi/controller/controller.hpp
index 6ba9412..738c4b6 100644
--- a/src/ipa/raspberrypi/controller/controller.hpp
+++ b/src/ipa/raspberrypi/controller/controller.hpp
@@ -15,6 +15,8 @@
#include <linux/bcm2835-isp.h>
+#include <libcamera/transform.h>
+
#include "camera_mode.h"
#include "device_status.h"
#include "metadata.hpp"
@@ -39,7 +41,8 @@ public:
Algorithm *CreateAlgorithm(char const *name);
void Read(char const *filename);
void Initialise();
- void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
+ void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata);
void Prepare(Metadata *image_metadata);
void Process(StatisticsPtr stats, Metadata *image_metadata);
Metadata &GetGlobalMetadata();
diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp
index c02b5ec..ceac771 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp
@@ -221,7 +221,8 @@ void Agc::SetConstraintMode(std::string const &constraint_mode_name)
constraint_mode_name_ = constraint_mode_name;
}
-void Agc::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Agc::SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata)
{
// On a mode switch, it's possible the exposure profile could change,
// so we run through the dividing up of exposure/gain again and
diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp b/src/ipa/raspberrypi/controller/rpi/agc.hpp
index 9a7e89c..78f016e 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp
@@ -75,7 +75,8 @@ public:
void SetMeteringMode(std::string const &metering_mode_name) override;
void SetExposureMode(std::string const &exposure_mode_name) override;
void SetConstraintMode(std::string const &contraint_mode_name) override;
- void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
+ void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata) override;
void Prepare(Metadata *image_metadata) override;
void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
index 76e2f04..5fac9dd 100644
--- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
@@ -12,6 +12,7 @@
// Raspberry Pi ALSC (Auto Lens Shading Correction) algorithm.
using namespace RPi;
+using libcamera::Transform;
#define NAME "rpi.alsc"
@@ -173,7 +174,7 @@ void Alsc::Initialise()
lambda_r_[i] = lambda_b_[i] = 1.0;
}
-void Alsc::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Alsc::SwitchMode(CameraMode const &camera_mode, Transform transform, Metadata *metadata)
{
(void)metadata;
diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.hpp b/src/ipa/raspberrypi/controller/rpi/alsc.hpp
index 3806257..9b54578 100644
--- a/src/ipa/raspberrypi/controller/rpi/alsc.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/alsc.hpp
@@ -50,7 +50,8 @@ public:
~Alsc();
char const *Name() const override;
void Initialise() override;
- void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
+ void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata) override;
void Read(boost::property_tree::ptree const ¶ms) override;
void Prepare(Metadata *image_metadata) override;
void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
diff --git a/src/ipa/raspberrypi/controller/rpi/noise.cpp b/src/ipa/raspberrypi/controller/rpi/noise.cpp
index 2cafde3..0f4002b 100644
--- a/src/ipa/raspberrypi/controller/rpi/noise.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/noise.cpp
@@ -27,8 +27,10 @@ char const *Noise::Name() const
return NAME;
}
-void Noise::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Noise::SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata)
{
+ (void)transform;
(void)metadata;
// For example, we would expect a 2x2 binned mode to have a "noise
diff --git a/src/ipa/raspberrypi/controller/rpi/noise.hpp b/src/ipa/raspberrypi/controller/rpi/noise.hpp
index 25bf188..37a22fd 100644
--- a/src/ipa/raspberrypi/controller/rpi/noise.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/noise.hpp
@@ -18,7 +18,8 @@ class Noise : public Algorithm
public:
Noise(Controller *controller);
char const *Name() const override;
- void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
+ void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata) override;
void Read(boost::property_tree::ptree const ¶ms) override;
void Prepare(Metadata *image_metadata) override;
diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp
index 2b701db..64d269d 100644
--- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp
@@ -26,7 +26,8 @@ char const *Sharpen::Name() const
return NAME;
}
-void Sharpen::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
+void Sharpen::SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata)
{
(void)metadata;
diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp
index 568521b..8a1c164 100644
--- a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp
@@ -18,7 +18,8 @@ class Sharpen : public SharpenAlgorithm
public:
Sharpen(Controller *controller);
char const *Name() const override;
- void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
+ void SwitchMode(CameraMode const &camera_mode, libcamera::Transform transform,
+ Metadata *metadata) override;
void Read(boost::property_tree::ptree const ¶ms) override;
void SetStrength(double strength) override;
void Prepare(Metadata *image_metadata) override;
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 2809521..a8676fb 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -270,21 +270,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
agcStatus.analogue_gain = DEFAULT_ANALOGUE_GAIN;
}
- RPi::Metadata metadata;
- controller_.SwitchMode(mode_, &metadata);
-
- /* SwitchMode may supply updated exposure/gain values to use. */
- metadata.Get("agc.status", agcStatus);
- if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {
- ControlList ctrls(unicam_ctrls_);
- applyAGC(&agcStatus, ctrls);
- result->controls.push_back(ctrls);
-
- result->operation |= RPI_IPA_CONFIG_SENSOR;
- }
-
- lastMode_ = mode_;
-
/* Store the lens shading table pointer and handle if available. */
unsigned int next_element = 0;
if (ipaConfig.operation & RPI_IPA_CONFIG_LS_TABLE) {
@@ -312,6 +297,22 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
uint32_t transformType = ipaConfig.data[next_element++];
userTransform_ = reinterpret_cast<Transform &>(transformType);
}
+
+ /* Finally we can tell the IPAs about the new camera mode. */
+ RPi::Metadata metadata;
+ controller_.SwitchMode(mode_, userTransform_, &metadata);
+
+ /* SwitchMode may supply updated exposure/gain values to use. */
+ metadata.Get("agc.status", agcStatus);
+ if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {
+ ControlList ctrls(unicam_ctrls_);
+ applyAGC(&agcStatus, ctrls);
+ result->controls.push_back(ctrls);
+
+ result->operation |= RPI_IPA_CONFIG_SENSOR;
+ }
+
+ lastMode_ = mode_;
}
void IPARPi::mapBuffers(const std::vector<IPABuffer> &buffers)
--
2.20.1
More information about the libcamera-devel
mailing list