[libcamera-devel] [PATCH v4 2/4] ipa: raspberrypi: Add sensor temperature to DeviceStatus
Naushir Patuck
naush at raspberrypi.com
Wed Jun 29 10:57:20 CEST 2022
Add an optional sensor_temperature field to the DeviceStatus structure. If a
temperature measurement is available for a frame, the value is returned out
through the SensorTemperature control in the Request metadata.
Additionally, provide the sensor temperature value from the std::ostream &operator<<
overload.
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/cam_helper.cpp | 8 +++++---
src/ipa/raspberrypi/controller/device_status.cpp | 3 +++
src/ipa/raspberrypi/controller/device_status.h | 3 +++
src/ipa/raspberrypi/raspberrypi.cpp | 2 ++
4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp
index 74179399e86a..3f81d4187d4d 100644
--- a/src/ipa/raspberrypi/cam_helper.cpp
+++ b/src/ipa/raspberrypi/cam_helper.cpp
@@ -185,9 +185,9 @@ void CamHelper::parseEmbeddedData(Span<const uint8_t> buffer,
metadata.Merge(parsedMetadata);
/*
- * Overwrite the exposure/gain values in the existing DeviceStatus with
- * values from the parsed embedded buffer. Fetch it first in case any
- * other fields were set meaningfully.
+ * Overwrite the exposure/gain, frame length and sensor temperature values
+ * in the existing DeviceStatus with values from the parsed embedded buffer.
+ * Fetch it first in case any other fields were set meaningfully.
*/
DeviceStatus deviceStatus, parsedDeviceStatus;
if (metadata.Get("device.status", deviceStatus) ||
@@ -199,6 +199,8 @@ void CamHelper::parseEmbeddedData(Span<const uint8_t> buffer,
deviceStatus.shutter_speed = parsedDeviceStatus.shutter_speed;
deviceStatus.analogue_gain = parsedDeviceStatus.analogue_gain;
deviceStatus.frame_length = parsedDeviceStatus.frame_length;
+ if (parsedDeviceStatus.sensor_temperature)
+ deviceStatus.sensor_temperature = parsedDeviceStatus.sensor_temperature;
LOG(IPARPI, Debug) << "Metadata updated - " << deviceStatus;
diff --git a/src/ipa/raspberrypi/controller/device_status.cpp b/src/ipa/raspberrypi/controller/device_status.cpp
index f052ea8b7bed..05897fc15b50 100644
--- a/src/ipa/raspberrypi/controller/device_status.cpp
+++ b/src/ipa/raspberrypi/controller/device_status.cpp
@@ -17,5 +17,8 @@ std::ostream &operator<<(std::ostream &out, const DeviceStatus &d)
<< " Lens: " << d.lens_position
<< " Flash: " << d.flash_intensity;
+ if (d.sensor_temperature)
+ out << " Temperature: " << *d.sensor_temperature;
+
return out;
}
diff --git a/src/ipa/raspberrypi/controller/device_status.h b/src/ipa/raspberrypi/controller/device_status.h
index c4a5d9c8e8c7..eca3bf4b042e 100644
--- a/src/ipa/raspberrypi/controller/device_status.h
+++ b/src/ipa/raspberrypi/controller/device_status.h
@@ -7,6 +7,7 @@
#pragma once
#include <iostream>
+#include <optional>
#include <libcamera/base/utils.h>
@@ -36,4 +37,6 @@ struct DeviceStatus {
double aperture;
/* proportional to brightness with 0 = no flash, 1 = maximum flash */
double flash_intensity;
+ /* Sensor reported temperature value (in degrees) */
+ std::optional<double> sensor_temperature;
};
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 3b126bb5175e..cb0025a17aff 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -491,6 +491,8 @@ void IPARPi::reportMetadata()
libcameraMetadata_.set(controls::AnalogueGain, deviceStatus->analogue_gain);
libcameraMetadata_.set(controls::FrameDuration,
helper_->Exposure(deviceStatus->frame_length).get<std::micro>());
+ if (deviceStatus->sensor_temperature)
+ libcameraMetadata_.set(controls::SensorTemperature, *deviceStatus->sensor_temperature);
}
AgcStatus *agcStatus = rpiMetadata_.GetLocked<AgcStatus>("agc.status");
--
2.25.1
More information about the libcamera-devel
mailing list