[{"id":21753,"web_url":"https://patchwork.libcamera.org/comment/21753/","msgid":"<20211210144951.kbtxedk3yn4ypnrl@uno.localdomain>","date":"2021-12-10T14:49:51","subject":"Re: [libcamera-devel] [PATCH v12 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 Fri, Dec 10, 2021 at 02:44:23PM +0000, David Plowman wrote:\n> This function forces raw streams to have the \"raw\" color space, and\n> also optionally makes all non-raw output streams to share the same\n> color space as some platforms may require this.\n>\n> When sharing color spaces we take the shared value to be the one from\n> the largest of these streams. This choice is ultimately arbitrary, but\n> can be appropriate if smaller output streams are used for image\n> analysis rather than human consumption, when the precise colours may\n> be less important.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nI would have said usage of Flag<> is really an overkill, but I see\nyou've been suggested so, so no big deal\n\nThanks\n   j\n\n> ---\n>  include/libcamera/camera.h | 10 +++++\n>  src/libcamera/camera.cpp   | 83 ++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 93 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..86d84ac0 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,87 @@ 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 CameraConfiguration::ColorSpaceFlag::None\n> + * \\brief No extra validation of color spaces is required\n> + * \\var CameraConfiguration::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 the StreamsShareColorSpace flag is set, all output streams are forced\n> + * to share the same color space (this may be a constraint on some platforms).\n> + *\n> + * It is optional for a pipeline handler to use this function.\n> + *\n> + * \\return A CameraConfiguration::Status value that describes the validation\n> + * status.\n> + * \\retval CameraConfigutation::Adjusted The configuration has been adjusted\n> + * and is now valid. The color space of some or all of the streams may bave\n> + * benn changed. The caller shall check the color spaces carefully.\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)) {\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\t}\n> +\t\t} else if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size)) {\n> +\t\t\tindex = i;\n> +\t\t}\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\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 27C5BBDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 10 Dec 2021 14:49:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 69D8860890;\n\tFri, 10 Dec 2021 15:49:02 +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 D1D9760868\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 10 Dec 2021 15:49:00 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 9F8164000B;\n\tFri, 10 Dec 2021 14:48:59 +0000 (UTC)"],"Date":"Fri, 10 Dec 2021 15:49:51 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<20211210144951.kbtxedk3yn4ypnrl@uno.localdomain>","References":"<20211210144424.14747-1-david.plowman@raspberrypi.com>\n\t<20211210144424.14747-8-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211210144424.14747-8-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v12 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>"}}]