From 8e0670031ba0cf1563f811963390f529e039447e Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 17 Apr 2025 15:38:30 +0300 Subject: color16: Fix RGB-to-YUV The calculation was not right, producing bad values. Fix it, and this time actually test the output... Signed-off-by: Tomi Valkeinen --- kms++util/inc/kms++util/color16.h | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kms++util/inc/kms++util/color16.h b/kms++util/inc/kms++util/color16.h index 6d25c82..ac48785 100644 --- a/kms++util/inc/kms++util/color16.h +++ b/kms++util/inc/kms++util/color16.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -133,23 +134,24 @@ constexpr YUV16 RGB16::to_yuv(RecStandard rec, ColorRange range) const noexcept const double g_norm = static_cast(g) / max_value; const double b_norm = static_cast(b) / max_value; - // Calculate Y - double y = coeff.kr * r_norm + coeff.kg * g_norm + coeff.kb * b_norm; + // Calculate Y (unscaled) + double y_unscaled = coeff.kr * r_norm + coeff.kg * g_norm + coeff.kb * b_norm; - // Scale Y to target range - y = y * (scaling.y_max - scaling.y_min) + scaling.y_min; + // Calculate U and V using unscaled Y + double u = (b_norm - y_unscaled) / (2.0 * (1.0 - coeff.kb)); + double v = (r_norm - y_unscaled) / (2.0 * (1.0 - coeff.kr)); - // Calculate U and V - double u = (b_norm - y) / (2.0 * (1.0 - coeff.kb)); - double v = (r_norm - y) / (2.0 * (1.0 - coeff.kr)); + // Scale Y to target range + double y = y_unscaled * (scaling.y_max - scaling.y_min) + scaling.y_min; // Scale U and V to target range u = u * (scaling.c_max - scaling.c_min) + (scaling.c_max + scaling.c_min) / 2.0; v = v * (scaling.c_max - scaling.c_min) + (scaling.c_max + scaling.c_min) / 2.0; // Convert back to 16-bit values - return YUV16(static_cast(y * max_value), static_cast(u * max_value), - static_cast(v * max_value)); + return YUV16(static_cast(std::round(y * max_value)), + static_cast(std::round(u * max_value)), + static_cast(std::round(v * max_value))); } constexpr RGB16 YUV16::to_rgb(RecStandard rec, ColorRange range) const noexcept -- cgit v1.2.3