From patchwork Wed Aug 24 16:24:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 17198 X-Patchwork-Delegate: umang.jain@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7F2CCC3272 for ; Wed, 24 Aug 2022 16:24:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 46F4961FBF; Wed, 24 Aug 2022 18:24:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661358286; bh=IjV1sn2fP2b8d4xLppdD595LhjYUwBxlhRcWyEruQp0=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=FieXyJEQU66omex9gvLTpCvSNbGYGQs481a13xbdaBzXsXMewfqUphjTTMB1NuMCv q3oHS/E2ofQjs5Gn+sOQxwKiiOhqhGBwFzi1j1sfVGS16Bv7CoLtV81jeUjo03NsSq 6kpwXc5rbr6kseHzEMl9e3FQgabFHQB+XTqQjEPtP97ZZuiexz7wKh0G4rAdGwAbVb 4JkgewhmUyzeBxdFgYvvRAAQfHXfCtYf5hrGPw3R6Ol5ah3ET4kdvH8am5Smtn/4d3 DZzGRxqthbRNCZPL/NyAKpTY6AjcSqzd7hJ98xANHid5Nm6F3Z5p2SfppviSb9qhfL aUG90COmQgi5Q== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8694060E26 for ; Wed, 24 Aug 2022 18:24:44 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="UDYWMdzu"; dkim-atps=neutral Received: from umang.jainideasonboard.com (unknown [IPv6:2401:4900:1f3f:806e:6647:8e5c:f441:ca9a]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7B70D2B3; Wed, 24 Aug 2022 18:24:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661358284; bh=IjV1sn2fP2b8d4xLppdD595LhjYUwBxlhRcWyEruQp0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UDYWMdzu2nishxBMbnXfwQNY53zxacDm1NCqqUZrSyKNLucADiCNYShBkSzfl+tpZ UvFoqiJLzQb6raUSX1taB+8pDX+VuH9OjY3N5XbmuTXOgdmVQtWfIaGjKJMmfa3/dd 3UZBi9MCZt5M8qpAN4U9f+I+fv3iSb9uNoPUv88k= To: libcamera-devel Date: Wed, 24 Aug 2022 21:54:23 +0530 Message-Id: <20220824162425.71087-5-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220824162425.71087-1-umang.jain@ideasonboard.com> References: <20220824162425.71087-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 4/6] libcamera: colorspace: Adjust colorspace of YUV streams X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Umang Jain via libcamera-devel From: Umang Jain Reply-To: Umang Jain Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" If a YUV stream is requested with no Y'CbCr encoding, we need to adjust it to provide a Y'CbCr encoding. Depending on the transfer function and primaries specified, a Y'CbCr encoding is picked up. Signed-off-by: Umang Jain --- include/libcamera/color_space.h | 7 ++++++ src/libcamera/camera.cpp | 7 ++++++ src/libcamera/color_space.cpp | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/include/libcamera/color_space.h b/include/libcamera/color_space.h index 8030a264..3ee1d28f 100644 --- a/include/libcamera/color_space.h +++ b/include/libcamera/color_space.h @@ -12,6 +12,9 @@ namespace libcamera { +class CameraConfiguration; +struct StreamConfiguration; + class ColorSpace { public: @@ -59,6 +62,10 @@ public: std::string toString() const; static std::string toString(const std::optional &colorSpace); + +private: + friend class CameraConfiguration; + void adjust(const StreamConfiguration &cfg); }; bool operator==(const ColorSpace &lhs, const ColorSpace &rhs); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index a5c3aabe..cdf3c112 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -383,6 +383,13 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF } } + if (config_[index].colorSpace) { + ColorSpace oldColorspace = config_[index].colorSpace.value(); + config_[index].colorSpace->adjust(config_[index]); + if (oldColorspace != config_[index].colorSpace) + status = Adjusted; + } + if (index < 0 || !(flags & ColorSpaceFlag::StreamsShareColorSpace)) return status; diff --git a/src/libcamera/color_space.cpp b/src/libcamera/color_space.cpp index cb47acf9..7beddcbc 100644 --- a/src/libcamera/color_space.cpp +++ b/src/libcamera/color_space.cpp @@ -13,6 +13,10 @@ #include #include +#include + +#include "libcamera/internal/formats.h" + /** * \file color_space.h * \brief Class and enums to represent color spaces @@ -203,6 +207,44 @@ std::string ColorSpace::toString() const return ss.str(); } +/** + * \brief Adjust the colorspace depending on the stream configuration + * \param[in] config Stream configuration + * + * This function adjust the stream's colorspace depending on various factors + * as reflected by the \a config. + * + * - If the stream's colorspace consists a YUV stream and has no Y'Cbcr + * encoding specified, the Y'Cbcr encoding is updated based on the transfer + * function and primaries fields. + */ +void ColorSpace::adjust(const StreamConfiguration &config) +{ + ColorSpace *cs = this; + bool isYUV = (PixelFormatInfo::info(config.pixelFormat).colourEncoding == + PixelFormatInfo::ColourEncodingYUV); + + if (isYUV && cs->ycbcrEncoding == YcbcrEncoding::None) { + if (cs->transferFunction == TransferFunction::Rec709) { + switch (cs->primaries) { + /* Raw should never happen */ + case Primaries::Raw: + case Primaries::Smpte170m: + cs->ycbcrEncoding = YcbcrEncoding::Rec601; + break; + case Primaries::Rec709: + cs->ycbcrEncoding = YcbcrEncoding::Rec709; + break; + case Primaries::Rec2020: + cs->ycbcrEncoding = YcbcrEncoding::Rec2020; + break; + } + } else if (cs->transferFunction == TransferFunction::Srgb) { + cs->ycbcrEncoding = YcbcrEncoding::Rec601; + } + } +} + /** * \brief Assemble and return a readable string representation of an * optional ColorSpace