[libcamera-devel,2/3] libcamera: raspberrypi: Add ColourCorrectionMatrix control

Message ID 20200704095914.17344-3-david.plowman@raspberrypi.com
State Accepted
Headers show
Series
  • ColourCorrectionMatrixControl
Related show

Commit Message

David Plowman July 4, 2020, 9:59 a.m. UTC
Implements, for the Raspberry Pi platform, the returning of the CCM
(Colour Correction Matrix) used by the pipeline in the libcamera
metadata.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
---
 include/libcamera/ipa/raspberrypi.h | 1 +
 src/ipa/raspberrypi/raspberrypi.cpp | 9 +++++++++
 2 files changed, 10 insertions(+)

Comments

Laurent Pinchart July 24, 2020, 12:38 a.m. UTC | #1
Hi David,

Thank you for the patch.

On Sat, Jul 04, 2020 at 10:59:13AM +0100, David Plowman wrote:
> Implements, for the Raspberry Pi platform, the returning of the CCM
> (Colour Correction Matrix) used by the pipeline in the libcamera
> metadata.
> 
> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> ---
>  include/libcamera/ipa/raspberrypi.h | 1 +
>  src/ipa/raspberrypi/raspberrypi.cpp | 9 +++++++++
>  2 files changed, 10 insertions(+)
> 
> diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
> index a18ce9a..2682319 100644
> --- a/include/libcamera/ipa/raspberrypi.h
> +++ b/include/libcamera/ipa/raspberrypi.h
> @@ -52,6 +52,7 @@ static const ControlInfoMap RPiControls = {
>  	{ &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) },
>  };
>  
>  } /* namespace libcamera */
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index bc89ab5..592bb04 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -404,6 +404,15 @@ void IPARPi::reportMetadata()
>  					 static_cast<int32_t>(blackLevelStatus->black_level_g),
>  					 static_cast<int32_t>(blackLevelStatus->black_level_g),
>  					 static_cast<int32_t>(blackLevelStatus->black_level_b) });
> +
> +	CcmStatus *ccmStatus = rpiMetadata_.GetLocked<CcmStatus>("ccm.status");
> +	if (ccmStatus) {
> +		float m[9];
> +		int i;
> +		for (i = 0; i < 9; i++)

		for (unsigned int i = 0; i < 9; i++)

> +			m[i] = ccmStatus->matrix[i];

or now that I think about it, may

		for (double v : ccmStatus->matrix)
			m[i++] = v;

or

		std::transform(std::begin(ccmStatus->matrix),
			       std::end(ccmStatus->matrix), std::begin(m),
			       [](double v) { return static_cast<float>(v); });

if you think any of those two would be better.

Which option do you like best ?

> +		libcameraMetadata_.set(controls::ColourCorrectionMatrix, m);
> +	}
>  }
>  
>  /*

Patch

diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index a18ce9a..2682319 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -52,6 +52,7 @@  static const ControlInfoMap RPiControls = {
 	{ &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) },
 };
 
 } /* namespace libcamera */
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index bc89ab5..592bb04 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -404,6 +404,15 @@  void IPARPi::reportMetadata()
 					 static_cast<int32_t>(blackLevelStatus->black_level_g),
 					 static_cast<int32_t>(blackLevelStatus->black_level_g),
 					 static_cast<int32_t>(blackLevelStatus->black_level_b) });
+
+	CcmStatus *ccmStatus = rpiMetadata_.GetLocked<CcmStatus>("ccm.status");
+	if (ccmStatus) {
+		float m[9];
+		int i;
+		for (i = 0; i < 9; i++)
+			m[i] = ccmStatus->matrix[i];
+		libcameraMetadata_.set(controls::ColourCorrectionMatrix, m);
+	}
 }
 
 /*