[libcamera-devel] [PATCH v4 4/4] ipa: raspberrypi: Use std::optional in DeviceStatus

Naushir Patuck naush at raspberrypi.com
Wed Jun 29 10:57:22 CEST 2022


Switch the aperture, lens_position, and flash_intensity fields in the
DeviceStatus structure to use std::optional instead of using invalid default
values.

Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
---
 src/ipa/raspberrypi/controller/device_status.cpp | 14 ++++++++++----
 src/ipa/raspberrypi/controller/device_status.h   |  9 ++++-----
 src/ipa/raspberrypi/controller/rpi/lux.cpp       |  4 +---
 3 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/ipa/raspberrypi/controller/device_status.cpp b/src/ipa/raspberrypi/controller/device_status.cpp
index 05897fc15b50..a389c40dafed 100644
--- a/src/ipa/raspberrypi/controller/device_status.cpp
+++ b/src/ipa/raspberrypi/controller/device_status.cpp
@@ -12,10 +12,16 @@ std::ostream &operator<<(std::ostream &out, const DeviceStatus &d)
 {
 	out << "Exposure: " << d.shutter_speed
 	    << " Frame length: " << d.frame_length
-	    << " Gain: " << d.analogue_gain
-	    << " Aperture: " << d.aperture
-	    << " Lens: " << d.lens_position
-	    << " Flash: " << d.flash_intensity;
+	    << " Gain: " << d.analogue_gain;
+
+	if (d.aperture)
+		out << " Aperture: " << *d.aperture;
+
+	if (d.lens_position)
+		out << " Lens: " << *d.lens_position;
+
+	if (d.flash_intensity)
+		out << " Flash: " << *d.flash_intensity;
 
 	if (d.sensor_temperature)
 		out << " Temperature: " << *d.sensor_temperature;
diff --git a/src/ipa/raspberrypi/controller/device_status.h b/src/ipa/raspberrypi/controller/device_status.h
index eca3bf4b042e..b33f0d093ff3 100644
--- a/src/ipa/raspberrypi/controller/device_status.h
+++ b/src/ipa/raspberrypi/controller/device_status.h
@@ -19,8 +19,7 @@
 struct DeviceStatus {
 	DeviceStatus()
 		: shutter_speed(std::chrono::seconds(0)), frame_length(0),
-		  analogue_gain(0.0), lens_position(0.0), aperture(0.0),
-		  flash_intensity(0.0)
+		  analogue_gain(0.0)
 	{
 	}
 
@@ -32,11 +31,11 @@ struct DeviceStatus {
 	uint32_t frame_length;
 	double analogue_gain;
 	/* 1.0/distance-in-metres, or 0 if unknown */
-	double lens_position;
+	std::optional<double> lens_position;
 	/* 1/f so that brightness quadruples when this doubles, or 0 if unknown */
-	double aperture;
+	std::optional<double> aperture;
 	/* proportional to brightness with 0 = no flash, 1 = maximum flash */
-	double flash_intensity;
+	std::optional<double> flash_intensity;
 	/* Sensor reported temperature value (in degrees) */
 	std::optional<double> sensor_temperature;
 };
diff --git a/src/ipa/raspberrypi/controller/rpi/lux.cpp b/src/ipa/raspberrypi/controller/rpi/lux.cpp
index f77e9140ac10..4d145b6ff0e9 100644
--- a/src/ipa/raspberrypi/controller/rpi/lux.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/lux.cpp
@@ -63,9 +63,7 @@ void Lux::Process(StatisticsPtr &stats, Metadata *image_metadata)
 	DeviceStatus device_status;
 	if (image_metadata->Get("device.status", device_status) == 0) {
 		double current_gain = device_status.analogue_gain;
-		double current_aperture = device_status.aperture;
-		if (current_aperture == 0)
-			current_aperture = current_aperture_;
+		double current_aperture = device_status.aperture.value_or(current_aperture_);
 		uint64_t sum = 0;
 		uint32_t num = 0;
 		uint32_t *bin = stats->hist[0].g_hist;
-- 
2.25.1



More information about the libcamera-devel mailing list