[PATCH] libcamera: software_isp: Fix CCM multiplication
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Apr 14 20:20:57 CEST 2025
Hi Milan,
Thank you for the patch.
On Mon, Apr 14, 2025 at 07:32:44PM +0200, Milan Zamazal wrote:
> A colour correction matrix (CCM) is applied like this to an RGB pixel
> vector P:
>
> CCM * P
>
> White balance must be applied before CCM. If CCM is used, software ISP
> makes a combined matrix by multiplying the CCM by a white balance gains
> CCM-like matrix (WBG). The multiplication should be as follows to do it
> in the correct order:
>
> CCM * (WBG * P) = (CCM * WBG) * P
>
> The multiplication order in Lut software ISP algorithm is reversed,
> resulting in colour casts. Let's fix the order.
Fixes: e2b4000dc9cc ("libcamera: software_isp: Apply CCM in debayering")
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/simple/algorithms/lut.cpp | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp
> index e8638f27..d1d5f727 100644
> --- a/src/ipa/simple/algorithms/lut.cpp
> +++ b/src/ipa/simple/algorithms/lut.cpp
> @@ -122,7 +122,7 @@ void Lut::prepare(IPAContext &context,
> Matrix<float, 3, 3> gainCcm = { { gains.r(), 0, 0,
> 0, gains.g(), 0,
> 0, 0, gains.b() } };
> - auto ccm = gainCcm * context.activeState.ccm.ccm;
> + auto ccm = context.activeState.ccm.ccm * gainCcm;
> auto &red = params->redCcm;
> auto &green = params->greenCcm;
> auto &blue = params->blueCcm;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list