@@ -187,6 +187,7 @@ 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;
LOG(IPARPI, Debug) << "Metadata updated - " << deviceStatus;
@@ -30,7 +30,10 @@ using namespace RPiController;
constexpr uint32_t gainReg = 0x157;
constexpr uint32_t expHiReg = 0x15a;
constexpr uint32_t expLoReg = 0x15b;
-constexpr std::initializer_list<uint32_t> registerList [[maybe_unused]] = { expHiReg, expLoReg, gainReg };
+constexpr uint32_t frameLengthHiReg = 0x160;
+constexpr uint32_t frameLengthLoReg = 0x161;
+constexpr std::initializer_list<uint32_t> registerList [[maybe_unused]]
+ = { expHiReg, expLoReg, gainReg, frameLengthHiReg, frameLengthLoReg };
class CamHelperImx219 : public CamHelper
{
@@ -93,6 +96,7 @@ void CamHelperImx219::PopulateMetadata(const MdParser::RegisterMap ®isters,
deviceStatus.shutter_speed = Exposure(registers.at(expHiReg) * 256 + registers.at(expLoReg));
deviceStatus.analogue_gain = Gain(registers.at(gainReg));
+ deviceStatus.frame_length = registers.at(frameLengthHiReg) * 256 + registers.at(frameLengthLoReg);
metadata.Set("device.status", deviceStatus);
}
@@ -23,7 +23,10 @@ constexpr uint32_t expHiReg = 0x0202;
constexpr uint32_t expLoReg = 0x0203;
constexpr uint32_t gainHiReg = 0x0204;
constexpr uint32_t gainLoReg = 0x0205;
-constexpr std::initializer_list<uint32_t> registerList = { expHiReg, expLoReg, gainHiReg, gainLoReg };
+constexpr uint32_t frameLengthHiReg = 0x0340;
+constexpr uint32_t frameLengthLoReg = 0x0341;
+constexpr std::initializer_list<uint32_t> registerList =
+ { expHiReg, expLoReg, gainHiReg, gainLoReg, frameLengthHiReg, frameLengthLoReg };
class CamHelperImx477 : public CamHelper
{
@@ -81,6 +84,7 @@ void CamHelperImx477::PopulateMetadata(const MdParser::RegisterMap ®isters,
deviceStatus.shutter_speed = Exposure(registers.at(expHiReg) * 256 + registers.at(expLoReg));
deviceStatus.analogue_gain = Gain(registers.at(gainHiReg) * 256 + registers.at(gainLoReg));
+ deviceStatus.frame_length = registers.at(frameLengthHiReg) * 256 + registers.at(frameLengthLoReg);
metadata.Set("device.status", deviceStatus);
}
@@ -17,7 +17,7 @@
struct DeviceStatus {
DeviceStatus()
- : shutter_speed(std::chrono::seconds(0)), analogue_gain(0.0),
+ : shutter_speed(std::chrono::seconds(0)), frame_length(0), analogue_gain(0.0),
lens_position(0.0), aperture(0.0), flash_intensity(0.0)
{
}
@@ -28,6 +28,7 @@ struct DeviceStatus {
out << "Exposure: " << d.shutter_speed
<< " Gain: " << d.analogue_gain
+ << " Frame Length: " << d.frame_length
<< " Aperture: " << d.aperture
<< " Lens: " << d.lens_position
<< " Flash: " << d.flash_intensity;
@@ -37,6 +38,8 @@ struct DeviceStatus {
/* time shutter is open */
libcamera::utils::Duration shutter_speed;
+ // frame length given in number of lines
+ uint32_t frame_length;
double analogue_gain;
/* 1.0/distance-in-metres, or 0 if unknown */
double lens_position;
@@ -1015,9 +1015,11 @@ void IPARPi::fillDeviceStatus(const ControlList &sensorControls)
int32_t exposureLines = sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
int32_t gainCode = sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>();
+ int32_t vblank = sensorControls.get(V4L2_CID_VBLANK).get<int32_t>();
deviceStatus.shutter_speed = helper_->Exposure(exposureLines);
deviceStatus.analogue_gain = helper_->Gain(gainCode);
+ deviceStatus.frame_length = mode_.height + vblank;
LOG(IPARPI, Debug) << "Metadata - " << deviceStatus;