[{"id":21725,"web_url":"https://patchwork.libcamera.org/comment/21725/","msgid":"<YbJ7zsODhlgHHJOm@pendragon.ideasonboard.com>","date":"2021-12-09T21:57:34","subject":"Re: [libcamera-devel] [PATCH v10 7/8] libcamera: Add\n\tvalidateColorSpaces to CameraConfiguration class","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi David,\n\nThank you for the patch.\n\nOn Thu, Dec 09, 2021 at 10:12:44AM +0000, David Plowman wrote:\n> This method forces raw streams to have the \"raw\" color space, and also\n\ns/method/function/\n\n> optionally makes all output streams to share the same color space as\n> some platforms may require this.\n> \n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  include/libcamera/camera.h | 10 +++++\n>  src/libcamera/camera.cpp   | 84 ++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 94 insertions(+)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index a7759ccb..5bb06584 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -13,6 +13,7 @@\n>  #include <string>\n>  \n>  #include <libcamera/base/class.h>\n> +#include <libcamera/base/flags.h>\n>  #include <libcamera/base/object.h>\n>  #include <libcamera/base/signal.h>\n>  \n> @@ -69,6 +70,15 @@ public:\n>  protected:\n>  \tCameraConfiguration();\n>  \n> +\tenum class ColorSpaceFlag {\n> +\t\tNone,\n> +\t\tStreamsShareColorSpace,\n> +\t};\n> +\n> +\tusing ColorSpaceFlags = Flags<ColorSpaceFlag>;\n> +\n> +\tStatus validateColorSpaces(ColorSpaceFlags flags = ColorSpaceFlag::None);\n> +\n>  \tstd::vector<StreamConfiguration> config_;\n>  };\n>  \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 400a7cf0..87ef8d72 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -14,12 +14,14 @@\n>  #include <libcamera/base/log.h>\n>  #include <libcamera/base/thread.h>\n>  \n> +#include <libcamera/color_space.h>\n>  #include <libcamera/framebuffer_allocator.h>\n>  #include <libcamera/request.h>\n>  #include <libcamera/stream.h>\n>  \n>  #include \"libcamera/internal/camera.h\"\n>  #include \"libcamera/internal/camera_controls.h\"\n> +#include \"libcamera/internal/formats.h\"\n>  #include \"libcamera/internal/pipeline_handler.h\"\n>  \n>  /**\n> @@ -314,6 +316,88 @@ std::size_t CameraConfiguration::size() const\n>  \treturn config_.size();\n>  }\n>  \n> +namespace {\n> +\n> +bool isRaw(const PixelFormat &pixFmt)\n> +{\n> +\tconst PixelFormatInfo &info = PixelFormatInfo::info(pixFmt);\n> +\treturn info.isValid() &&\n> +\t       info.colourEncoding == PixelFormatInfo::ColourEncodingRAW;\n> +}\n> +\n> +} /* namespace */\n> +\n> +/**\n> + * \\enum CameraConfiguration::ColorSpaceFlag\n> + * \\brief Specify the behaviour of validateColorSpaces\n> + * \\var ColorSpaceFlag::None\n\nDoxygen warns here, you need\n\n * \\var CameraConfiguration::ColorSpaceFlag::None\n\nSame for the next one.\n\n> + * \\brief No extra validation of color spaces is required\n> + * \\var ColorSpaceFlag::StreamsShareColorSpace\n> + * \\brief Non-raw output streams must share the same color space\n> + */\n> +\n> +/**\n> + * \\typedef CameraConfiguration::ColorSpaceFlags\n> + * \\brief A bitwise combination of ColorSpaceFlag values\n> + */\n> +\n> +/**\n> + * \\brief Check the color spaces requested for each stream\n> + * \\param[in] flags Flags to control the behaviour of this function\n> + *\n> + * This function performs certain consistency checks on the color spaces of\n> + * the streams and may adjust them so that:\n> + *\n> + * - Any raw streams have the Raw color space\n> + * - If shareOutputColorSpaces is set, all output streams are forced to share\n\ns/shareOutputColorSpaces/the StreamsShareColorSpace flag/\n\n> + * the same color space (this may be a constraint on some platforms).\n> + *\n> + * It is optional for a pipeline handler to use this method.\n\ns/method/function/\n\n> + *\n> + * \\return A CameraConfiguration::Status value that describes the validation\n> + * status.\n> + * \\retval CameraConfiguration::Invalid The configuration is invalid and can't\n> + * be adjusted. This may only occur in extreme cases such as when the\n> + * configuration is empty.\n\nYou can drop this one, it can never happen.\n\n> + * \\retval CameraConfigutation::Adjusted The configuration has been adjusted\n> + * and is now valid. Parameters may have changed for any stream, and stream\n> + * configurations may have been removed. The caller shall check the\n> + * configuration carefully.\n\nNo stream configuration removal :-) You can adapt the message to make it\nspecific to this function, likely with s/configuration/color spaces/\n\n> + * \\retval CameraConfiguration::Valid The configuration was already valid and\n> + * hasn't been adjusted.\n> + */\n> +CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceFlags flags)\n> +{\n> +\tStatus status = Valid;\n> +\n> +\t/*\n> +\t * Set all raw streams to the Raw color space, and make a note of the largest\n> +\t * non-raw stream with a defined color space (if there is one).\n> +\t */\n> +\tint index = -1;\n> +\tfor (auto [i, cfg] : utils::enumerate(config_)) {\n> +\t\tif (isRaw(cfg.pixelFormat) && cfg.colorSpace != ColorSpace::Raw) {\n> +\t\t\tcfg.colorSpace = ColorSpace::Raw;\n> +\t\t\tstatus = Adjusted;\n> +\t\t} else if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size))\n> +\t\t\tindex = i;\n\n\t\t} else if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size)) {\n\t\t\tindex = i;\n\t\t}\n\n> +\t}\n> +\n> +\tif (index < 0 || !(flags & ColorSpaceFlag::StreamsShareColorSpace))\n> +\t\treturn status;\n> +\n> +\t/* Make all output color spaces the same, if requested. */\n> +\tfor (auto &cfg : config_) {\n> +\t\tif (!isRaw(cfg.pixelFormat) &&\n> +\t\t    cfg.colorSpace != config_[index].colorSpace) {\n> +\t\t\tcfg.colorSpace = config_[index].colorSpace;\n> +\t\t\tstatus = Adjusted;\n> +\t\t}\n> +\t}\n> +\n> +\treturn status;\n> +}\n> +\n>  /**\n>   * \\var CameraConfiguration::transform\n>   * \\brief User-specified transform to be applied to the image","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E32A7BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Dec 2021 21:58:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 23B156086A;\n\tThu,  9 Dec 2021 22:58:06 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 54E09607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Dec 2021 22:58:04 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B9CE5501;\n\tThu,  9 Dec 2021 22:58:03 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"K43+UtT9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1639087083;\n\tbh=YzEBfSocBle5AFTLaoi6vcxuMxPbOjOi8NiRSWNflWA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=K43+UtT9ZhbmJNjL2o7VzHCSsDSwlQwW3lCmhvYAxs0OEQ2Hqn3hDpVtpBYTgzDZC\n\th+Yro7wt03OCEV0aXXzt78iZsLeB3NRvDIrv+eKgR6kKqJWvY4mEtZCvhGJFFkGs+Y\n\t9tytPOncrWQlE5xIwKq7lEgUy16Q8oCy5uTZoOrY=","Date":"Thu, 9 Dec 2021 23:57:34 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<YbJ7zsODhlgHHJOm@pendragon.ideasonboard.com>","References":"<20211209101245.6187-1-david.plowman@raspberrypi.com>\n\t<20211209101245.6187-8-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211209101245.6187-8-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v10 7/8] libcamera: Add\n\tvalidateColorSpaces to CameraConfiguration class","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"Tomasz Figa <tfiga@google.com>, libcamera-devel@lists.libcamera.org,\n\tHans Verkuil <hverkuil-cisco@xs4all.nl>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]