[{"id":21545,"web_url":"https://patchwork.libcamera.org/comment/21545/","msgid":"<20211202101841.r4i4cvgqddypfa44@uno.localdomain>","date":"2021-12-02T10:18:41","subject":"Re: [libcamera-devel] [PATCH v8 7/8] libcamera: Add\n\tvalidateColorSpaces to CameraConfiguration class","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi David\n\nOn Wed, Dec 01, 2021 at 03:44:33PM +0000, David Plowman wrote:\n> This method forces raw streams to have the \"raw\" color space, and also\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 |  2 ++\n>  src/libcamera/camera.cpp   | 69 ++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 71 insertions(+)\n>\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index a7759ccb..fdcb66ab 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -69,6 +69,8 @@ public:\n>  protected:\n>  \tCameraConfiguration();\n>\n> +\tStatus validateColorSpaces(bool shareOutputColorSpaces);\n> +\n>  \tstd::vector<StreamConfiguration> config_;\n>  };\n>\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 400a7cf0..a6a93dd0 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,73 @@ std::size_t CameraConfiguration::size() const\n>  \treturn config_.size();\n>  }\n>\n> +static 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> +/**\n> + * \\brief Check the color spaces requested for each stream\n\nCheck and update\n\n> + * \\param[in] shareOutputColorSpaces Force all output streams to share the same\n> + * color space\n\nThe non-RAW output streams ?\n\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> + * 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> + *\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> + * \\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> + * \\retval CameraConfiguration::Valid The configuration was already valid and\n> + * hasn't been adjusted.\n\nThanks for the detailed documentation of the return values, much\napreciated. I think you could have saved it though, as\nCameraConfiguration::Status is fully documented, so it's enough to say\nwe return that.\n\n> + */\n> +CameraConfiguration::Status CameraConfiguration::validateColorSpaces(bool shareOutputColorSpaces)\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)) {\n> +\t\t\tif (cfg.colorSpace != ColorSpace::Raw) {\n> +\t\t\t\tcfg.colorSpace = ColorSpace::Raw;\n> +\t\t\t\tstatus = Adjusted;\n> +\t\t}\n> +\t\telse if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size))\n> +\t\t\tindex = i;\n> +\t}\n> +\n> +\tif (index < 0 || !shareOutputColorSpaces)\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\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>  /**\n>   * \\var CameraConfiguration::transform\n>   * \\brief User-specified transform to be applied to the image\n> --\n> 2.30.2\n>","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 71C9FBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  2 Dec 2021 10:17:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C27BC6082A;\n\tThu,  2 Dec 2021 11:17:51 +0100 (CET)","from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DA7DF6059E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  2 Dec 2021 11:17:50 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 9457A40018;\n\tThu,  2 Dec 2021 10:17:49 +0000 (UTC)"],"Date":"Thu, 2 Dec 2021 11:18:41 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<20211202101841.r4i4cvgqddypfa44@uno.localdomain>","References":"<20211201154434.23127-1-david.plowman@raspberrypi.com>\n\t<20211201154434.23127-8-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211201154434.23127-8-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v8 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>"}}]