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

Christian Rauch Rauch.Christian at gmx.de
Mon Mar 28 22:38:54 CEST 2022


Hi,

This patch may have got lost because I was sending it multiple times in
different forms.

Is this something that can be reviewed?

Best,
Christian


Am 21.03.22 um 23:02 schrieb Christian Rauch:
> 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