[libcamera-devel] [PATCH] fix ControlInfo for Span Controls

Christian Rauch Rauch.Christian at gmx.de
Tue Mar 22 00:02:46 CET 2022


Some control properties are typed with a Span to store an array of values.
Currently those are ColourGains, SensorBlackLevels, ColourCorrectionMatrix
and FrameDurationLimits. The value range and defaults in the ControlInfo of
those Controls is currently defined as scalar. This prevents accessing the
ControlInfo via the native Span type.

By defining the ControlInfo in terms of Spans, we can avoid this issue.
---
 include/libcamera/ipa/raspberrypi.h           | 52 ++++++++++++-------
 src/ipa/ipu3/ipu3.cpp                         |  6 +--
 .../ipa_data_serializer_test.cpp              |  8 +--
 3 files changed, 40 insertions(+), 26 deletions(-)

diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index 7f705e49..fb5188a1 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -27,26 +27,38 @@ namespace RPi {
  * and the pipeline handler may be reverted so that it aborts when an
  * unsupported control is encountered.
  */
-static const ControlInfoMap Controls({
-		{ &controls::AeEnable, ControlInfo(false, true) },
-		{ &controls::ExposureTime, ControlInfo(0, 999999) },
-		{ &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },
-		{ &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) },
-		{ &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },
-		{ &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },
-		{ &controls::ExposureValue, ControlInfo(0.0f, 16.0f) },
-		{ &controls::AwbEnable, ControlInfo(false, true) },
-		{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
-		{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
-		{ &controls::Brightness, ControlInfo(-1.0f, 1.0f) },
-		{ &controls::Contrast, ControlInfo(0.0f, 32.0f) },
-		{ &controls::Saturation, ControlInfo(0.0f, 32.0f) },
-		{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
-		{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },
-		{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
-		{ &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },
-		{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }
-	}, controls::controls);
+static const ControlInfoMap Controls(
+	{ { &controls::AeEnable, ControlInfo(false, true) },
+	  { &controls::ExposureTime, ControlInfo(0, 999999) },
+	  { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },
+	  { &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) },
+	  { &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },
+	  { &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },
+	  { &controls::ExposureValue, ControlInfo(0.0f, 16.0f) },
+	  { &controls::AwbEnable, ControlInfo(false, true) },
+	  { &controls::ColourGains, ControlInfo{
+					    Span<const float>({ 0, 0 }),
+					    Span<const float>({ 32, 32 }),
+					    Span<const float>({ 0, 0 }),
+				    } },
+	  { &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
+	  { &controls::Brightness, ControlInfo(-1.0f, 1.0f) },
+	  { &controls::Contrast, ControlInfo(0.0f, 32.0f) },
+	  { &controls::Saturation, ControlInfo(0.0f, 32.0f) },
+	  { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
+	  { &controls::ColourCorrectionMatrix, ControlInfo{
+						       Span<const float>({ -16, -16, -16, -16, -16, -16, -16, -16, -16 }),
+						       Span<const float>({ 16, 16, 16, 16, 16, 16, 16, 16, 16 }),
+						       Span<const float>({ 1, 0, 0, 0, 1, 0, 0, 0, 1 }),
+					       } },
+	  { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
+	  { &controls::FrameDurationLimits, ControlInfo{
+						    Span<const int64_t>({ 1000, 1000 }),
+						    Span<const int64_t>({ 1000000000, 1000000000 }),
+						    Span<const int64_t>({ 1000, 1000 }),
+					    } },
+	  { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) } },
+	controls::controls);

 } /* namespace RPi */

diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 1ea2c898..e64fc2bb 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -267,9 +267,9 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
 		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
 	}

-	controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
-							       frameDurations[1],
-							       frameDurations[2]);
+	controls[&controls::FrameDurationLimits] = ControlInfo{ Span<const int64_t>({ frameDurations[0], frameDurations[0] }),
+								Span<const int64_t>({ frameDurations[1], frameDurations[1] }),
+								Span<const int64_t>({ frameDurations[2], frameDurations[2] }) };

 	*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
 }
diff --git a/test/serialization/ipa_data_serializer_test.cpp b/test/serialization/ipa_data_serializer_test.cpp
index d2050a86..5503cc8a 100644
--- a/test/serialization/ipa_data_serializer_test.cpp
+++ b/test/serialization/ipa_data_serializer_test.cpp
@@ -32,13 +32,15 @@
 using namespace std;
 using namespace libcamera;

-static const ControlInfoMap Controls = ControlInfoMap({
+static const ControlInfoMap Controls = ControlInfoMap(
+	{
 		{ &controls::AeEnable, ControlInfo(false, true) },
 		{ &controls::ExposureTime, ControlInfo(0, 999999) },
 		{ &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },
-		{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
+		{ &controls::ColourGains, ControlInfo{ Span<const float>({ 0, 0 }), Span<const float>({ 32, 32 }), Span<const float>({ 0, 0 }) } },
 		{ &controls::Brightness, ControlInfo(-1.0f, 1.0f) },
-	}, controls::controls);
+	},
+	controls::controls);

 namespace libcamera {

--
2.25.1



More information about the libcamera-devel mailing list