From patchwork Tue Aug 2 18:57:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 16919 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 92296C3275 for ; Tue, 2 Aug 2022 18:57:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5189463312; Tue, 2 Aug 2022 20:57:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1659466654; bh=TEGpV3flB5XViFvlMSyN0wI+yMDxiS/1IVfJrpNnqtg=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=K39bGTetJ1ulgIhCgN7HYQwLwykLyQPW2EvKZAux4IxBEfIvgckVnGHMtSf1ioUOl X0NasYi5XpcFfWnr3QPD+phOowvIzCtCA2WzDOmXjwbht7DbewEVMB/h3CN3cBLVGM F/H/0WOofRvphPp66B2pTQDE7vB+VvMXE4bfXK6NZBbN/7c8FGo2qaAb8CiV6R2hH0 R6JpvGdsZI+surdsgJXnKSHZ/UwNdnad/6InMlz+P7OmHxO2QS5g6pv7fbt6n1f1wy UvBAEqLZRdik4RF5WNAwFPnQ/8SJIQKk8pKbiQ8zOEERoNBPqSYGC/xoNSEf6BQy7H lcftq4oxDxn3g== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 93D45603E7 for ; Tue, 2 Aug 2022 20:57:32 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="OHvS77um"; dkim-atps=neutral Received: from perceval.ideasonboard.com (unknown [IPv6:2401:4900:1f3f:85c2:5ee8:5bb8:aca7:5517]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 044B525B; Tue, 2 Aug 2022 20:57:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1659466652; bh=TEGpV3flB5XViFvlMSyN0wI+yMDxiS/1IVfJrpNnqtg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OHvS77umUzTOXl1NOBlRC75cXxUzuffkTHvTdXp8BxiWFr9drr99TGUQMsLsQp/pU Eq613wkYcTJ/kYNQka3iF3rHMowKGqnSNR6n4Itm3/EDqhP6Aw+W3ZjUxzyXz9CUxo tD6yIpyGeIwk3mFgBHUPhcNOzXKkKTzsRUTk1Y3E= To: libcamera-devel@lists.libcamera.org Date: Wed, 3 Aug 2022 00:27:17 +0530 Message-Id: <20220802185719.380855-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220802185719.380855-1-umang.jain@ideasonboard.com> References: <20220802185719.380855-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 2/4] 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 Cc: rishikeshdonadkar@gmail.com 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 | 6 ++++ src/libcamera/camera.cpp | 11 ++++++ src/libcamera/color_space.cpp | 61 +++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/include/libcamera/color_space.h b/include/libcamera/color_space.h index 0d39fbc0..113e2715 100644 --- a/include/libcamera/color_space.h +++ b/include/libcamera/color_space.h @@ -12,6 +12,8 @@ namespace libcamera { +struct StreamConfiguration; + class ColorSpace { public: @@ -59,6 +61,10 @@ public: std::string toString() const; static std::string toString(const std::optional &colorSpace); + ColorSpace adjust(const StreamConfiguration &cfg); + +private: + ColorSpace adjustYuv(const StreamConfiguration &cfg); }; bool operator==(const ColorSpace &lhs, const ColorSpace &rhs); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 3910915c..05135d16 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -386,6 +386,17 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF if (index < 0 || !(flags & ColorSpaceFlag::StreamsShareColorSpace)) return status; + /* + * \todo Question StreamsShareColorSpace <> an adjusted colorspace + * interation. + */ + if (config_[index].colorSpace) { + ColorSpace oldColorspace = config_[index].colorSpace.value(); + ColorSpace newColorspace = oldColorspace.adjust(config_[index]); + if (oldColorspace != newColorspace) + config_[index].colorSpace = newColorspace; + } + /* Make all output color spaces the same, if requested. */ for (auto &cfg : config_) { if (!isRaw(cfg.pixelFormat) && diff --git a/src/libcamera/color_space.cpp b/src/libcamera/color_space.cpp index 73148228..ff3f76d9 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 @@ -193,6 +197,63 @@ std::string ColorSpace::toString() const return ss.str(); } +/** + * \brief Adjust colospace when stream configuration contains YUV stream + * \param[in] config Stream configuration + * + * This function adjust the stream's colorspace if it consists a YUV stream + * and has no Y'Cbcr encoding specified. The function shall update the + * Y'Cbcr encoding based on the transfer function and primaries fields. + * + * \return The adjusted colorspace + */ +ColorSpace +ColorSpace::adjustYuv(const StreamConfiguration &cfg) +{ + ColorSpace cs = *this; + bool isYUV = (PixelFormatInfo::info(cfg.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; + } + + /* \todo: Determine if range needs to be adjusted in some cases? */ + } + + return cs; +} + +/** + * \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. + * + * \return The adjusted colorspace according to the stream configuration + */ +ColorSpace +ColorSpace::adjust(const StreamConfiguration &config) +{ + return adjustYuv(config); +} + /** * \brief Assemble and return a readable string representation of an * optional ColorSpace