[{"id":20687,"web_url":"https://patchwork.libcamera.org/comment/20687/","msgid":"<163611494238.275423.4344355752420857774@Monstersaurus>","date":"2021-11-05T12:22:22","subject":"Re: [libcamera-devel] [PATCH v5 4/7] libcamera: Support passing\n\tColorSpaces to V4L2 video devices","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting David Plowman (2021-11-04 13:58:02)\n> The ColorSpace from the StreamConfiguration is now handled\n> appropriately in the V4L2VideoDevice.\n> \n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  include/libcamera/internal/v4l2_videodevice.h |  2 +\n>  src/libcamera/v4l2_videodevice.cpp            | 67 +++++++++++++++++--\n>  2 files changed, 65 insertions(+), 4 deletions(-)\n> \n> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n> index a1c458e4..6ca749c1 100644\n> --- a/include/libcamera/internal/v4l2_videodevice.h\n> +++ b/include/libcamera/internal/v4l2_videodevice.h\n> @@ -20,6 +20,7 @@\n>  #include <libcamera/base/log.h>\n>  #include <libcamera/base/signal.h>\n>  \n> +#include <libcamera/color_space.h>\n>  #include <libcamera/framebuffer.h>\n>  #include <libcamera/geometry.h>\n>  #include <libcamera/pixel_format.h>\n> @@ -167,6 +168,7 @@ public:\n>  \n>         V4L2PixelFormat fourcc;\n>         Size size;\n> +       ColorSpace colorSpace;\n>  \n>         std::array<Plane, 3> planes;\n>         unsigned int planesCount = 0;\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 4f04212d..ccf3d28c 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -370,17 +370,29 @@ bool V4L2BufferCache::Entry::operator==(const FrameBuffer &buffer) const\n>   * \\brief The plane line stride (in bytes)\n>   */\n>  \n> +/**\n> + * \\var V4L2DeviceFormat::fourcc\n> + * \\brief The fourcc code describing the pixel encoding scheme\n> + *\n> + * The fourcc code, as defined by the V4L2 API with the V4L2_PIX_FMT_* macros,\n> + * that identifies the image format pixel encoding scheme.\n> + */\n> +\n\nAha, these were incorrectly ordered. This could be a separate patch, but\nit's probably easier to just explictily state in the commit message:\n\n  \"Re-sort the documentation correctly while adding the colorSpace\"\n\n>  /**\n>   * \\var V4L2DeviceFormat::size\n>   * \\brief The image size in pixels\n>   */\n>  \n>  /**\n> - * \\var V4L2DeviceFormat::fourcc\n> - * \\brief The fourcc code describing the pixel encoding scheme\n> + * \\var V4L2DeviceFormat::colorSpace\n> + * \\brief The color space of the pixels\n>   *\n> - * The fourcc code, as defined by the V4L2 API with the V4L2_PIX_FMT_* macros,\n> - * that identifies the image format pixel encoding scheme.\n> + * When setting or trying a format, passing in \"Undefined\" fields in the\n> + * ColorSpace is not permitted because the driver will then make an\n> + * arbitrary choice of its own. Choices made by the driver will be\n> + * passed back in the normal way, though note that \"Undefined\" values can\n> + * be returned if the device has chosen something that the ColorSpace\n> + * class cannot represent.\n>   */\n>  \n>  /**\n> @@ -879,6 +891,12 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format)\n>         format->fourcc = V4L2PixelFormat(pix->pixelformat);\n>         format->planesCount = pix->num_planes;\n>  \n> +       format->colorSpace = toColorSpace(*pix);\n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Warning)\n> +                       << \"Retrieved undefined color space: \"\n> +                       << format->colorSpace.toString();\n> +\n>         for (unsigned int i = 0; i < format->planesCount; ++i) {\n>                 format->planes[i].bpl = pix->plane_fmt[i].bytesperline;\n>                 format->planes[i].size = pix->plane_fmt[i].sizeimage;\n> @@ -893,6 +911,11 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>         struct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp;\n>         int ret;\n>  \n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Error)\n> +                       << \"Trying to set undefined color space: \"\n> +                       << format->colorSpace.toString();\n> +\n>         v4l2Format.type = bufferType_;\n>         pix->width = format->size.width;\n>         pix->height = format->size.height;\n> @@ -900,6 +923,12 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>         pix->num_planes = format->planesCount;\n>         pix->field = V4L2_FIELD_NONE;\n>  \n> +       ret = fromColorSpace(format->colorSpace, *pix);\n> +       if (ret < 0)\n> +               LOG(V4L2, Warning)\n> +                       << \"Setting color space unrecognised by V4L2: \"\n> +                       << format->colorSpace.toString();\n> +\n>         ASSERT(pix->num_planes <= std::size(pix->plane_fmt));\n>  \n>         for (unsigned int i = 0; i < pix->num_planes; ++i) {\n> @@ -928,6 +957,12 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>                 format->planes[i].size = pix->plane_fmt[i].sizeimage;\n>         }\n>  \n> +       format->colorSpace = toColorSpace(*pix);\n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Warning)\n> +                       << \"Undefined color space has been set: \"\n> +                       << format->colorSpace.toString();\n> +\n>         return 0;\n>  }\n>  \n> @@ -951,6 +986,12 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format)\n>         format->planes[0].bpl = pix->bytesperline;\n>         format->planes[0].size = pix->sizeimage;\n>  \n> +       format->colorSpace = toColorSpace(*pix);\n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Warning)\n> +                       << \"Retrieved undefined color space: \"\n> +                       << format->colorSpace.toString();\n> +\n>         return 0;\n>  }\n>  \n> @@ -960,12 +1001,24 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)\n>         struct v4l2_pix_format *pix = &v4l2Format.fmt.pix;\n>         int ret;\n>  \n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Error)\n> +                       << \"Trying to set undefined color space: \"\n> +                       << format->colorSpace.toString();\n\nI wonder if these might get a bit verbose - but I think that's the\npoint, to highlight that the colorspaces are not being handled correctly\nso I'm fine with that for now.\n\nIf we find it's overly verbose in conditions that it doesn't need to be\nwe can handle those accordingly. Better to be loud to start with I\nthink.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> +\n>         v4l2Format.type = bufferType_;\n>         pix->width = format->size.width;\n>         pix->height = format->size.height;\n>         pix->pixelformat = format->fourcc;\n>         pix->bytesperline = format->planes[0].bpl;\n>         pix->field = V4L2_FIELD_NONE;\n> +\n> +       ret = fromColorSpace(format->colorSpace, *pix);\n> +       if (ret < 0)\n> +               LOG(V4L2, Warning)\n> +                       << \"Set color space unrecognised by V4L2: \"\n> +                       << format->colorSpace.toString();\n> +\n>         ret = ioctl(set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT, &v4l2Format);\n>         if (ret) {\n>                 LOG(V4L2, Error)\n> @@ -985,6 +1038,12 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)\n>         format->planes[0].bpl = pix->bytesperline;\n>         format->planes[0].size = pix->sizeimage;\n>  \n> +       format->colorSpace = toColorSpace(*pix);\n> +       if (!format->colorSpace.isFullyDefined())\n> +               LOG(V4L2, Warning)\n> +                       << \"Undefined color space has been set: \"\n> +                       << format->colorSpace.toString();\n> +\n>         return 0;\n>  }\n>  \n> -- \n> 2.20.1\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 ECA55BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  5 Nov 2021 12:22:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 541986034A;\n\tFri,  5 Nov 2021 13:22:26 +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 19516600B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  5 Nov 2021 13:22:25 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AB0851908;\n\tFri,  5 Nov 2021 13:22:24 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"W6d7DX30\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1636114944;\n\tbh=WN1B62dk5Jp//C7uR619me4jStG6k9YSLxv7xJRB5JU=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=W6d7DX30HKJf9m5jz1yjYwYhiEHmk79Abe7bfDkrP2IHKuu/2VsLyk4n0h5hWl6ny\n\tpEudhK5B5iPW4ULVd0FpltkmzwCyqSrjZpmVy3twArsOYXeRXTCXIwqCEe7JY0UVTE\n\t0OUCoyWPsb6ZABEiO5LAiM2GoKnynlpgbGZPHn+8=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20211104135805.5269-5-david.plowman@raspberrypi.com>","References":"<20211104135805.5269-1-david.plowman@raspberrypi.com>\n\t<20211104135805.5269-5-david.plowman@raspberrypi.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Fri, 05 Nov 2021 12:22:22 +0000","Message-ID":"<163611494238.275423.4344355752420857774@Monstersaurus>","User-Agent":"alot/0.9.1","Subject":"Re: [libcamera-devel] [PATCH v5 4/7] libcamera: Support passing\n\tColorSpaces to V4L2 video devices","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":20701,"web_url":"https://patchwork.libcamera.org/comment/20701/","msgid":"<20211106163220.ruectkyvrsu757cr@uno.localdomain>","date":"2021-11-06T16:32:20","subject":"Re: [libcamera-devel] [PATCH v5 4/7] libcamera: Support passing\n\tColorSpaces to V4L2 video devices","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi David,\n\nOn Thu, Nov 04, 2021 at 01:58:02PM +0000, David Plowman wrote:\n> The ColorSpace from the StreamConfiguration is now handled\n> appropriately in the V4L2VideoDevice.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  include/libcamera/internal/v4l2_videodevice.h |  2 +\n>  src/libcamera/v4l2_videodevice.cpp            | 67 +++++++++++++++++--\n>  2 files changed, 65 insertions(+), 4 deletions(-)\n>\n> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n> index a1c458e4..6ca749c1 100644\n> --- a/include/libcamera/internal/v4l2_videodevice.h\n> +++ b/include/libcamera/internal/v4l2_videodevice.h\n> @@ -20,6 +20,7 @@\n>  #include <libcamera/base/log.h>\n>  #include <libcamera/base/signal.h>\n>\n> +#include <libcamera/color_space.h>\n>  #include <libcamera/framebuffer.h>\n>  #include <libcamera/geometry.h>\n>  #include <libcamera/pixel_format.h>\n> @@ -167,6 +168,7 @@ public:\n>\n>  \tV4L2PixelFormat fourcc;\n>  \tSize size;\n> +\tColorSpace colorSpace;\n>\n>  \tstd::array<Plane, 3> planes;\n>  \tunsigned int planesCount = 0;\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 4f04212d..ccf3d28c 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -370,17 +370,29 @@ bool V4L2BufferCache::Entry::operator==(const FrameBuffer &buffer) const\n>   * \\brief The plane line stride (in bytes)\n>   */\n>\n> +/**\n> + * \\var V4L2DeviceFormat::fourcc\n> + * \\brief The fourcc code describing the pixel encoding scheme\n> + *\n> + * The fourcc code, as defined by the V4L2 API with the V4L2_PIX_FMT_* macros,\n> + * that identifies the image format pixel encoding scheme.\n> + */\n> +\n>  /**\n>   * \\var V4L2DeviceFormat::size\n>   * \\brief The image size in pixels\n>   */\n>\n>  /**\n> - * \\var V4L2DeviceFormat::fourcc\n> - * \\brief The fourcc code describing the pixel encoding scheme\n> + * \\var V4L2DeviceFormat::colorSpace\n> + * \\brief The color space of the pixels\n>   *\n> - * The fourcc code, as defined by the V4L2 API with the V4L2_PIX_FMT_* macros,\n> - * that identifies the image format pixel encoding scheme.\n> + * When setting or trying a format, passing in \"Undefined\" fields in the\n> + * ColorSpace is not permitted because the driver will then make an\n> + * arbitrary choice of its own. Choices made by the driver will be\n> + * passed back in the normal way, though note that \"Undefined\" values can\n> + * be returned if the device has chosen something that the ColorSpace\n> + * class cannot represent.\n>   */\n>\n>  /**\n> @@ -879,6 +891,12 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format)\n>  \tformat->fourcc = V4L2PixelFormat(pix->pixelformat);\n>  \tformat->planesCount = pix->num_planes;\n>\n> +\tformat->colorSpace = toColorSpace(*pix);\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Retrieved undefined color space: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n\nIf this gets in in the current form, all other platforms will have\ntheir log polluted by these messages. For most pipeline handlers I\nassume with the appropriate knowledge if applications are not\ninstrumented to pass in a valid color space, it can be adjusted to\nsomething meaningul. But what about the simple pipeline handler which\nworks with devices that simply transfer to application streams in\nYUV/RGB formats produced by the sensor ? What colorspace should\npipeline handler adjust to ?\n\n>  \tfor (unsigned int i = 0; i < format->planesCount; ++i) {\n>  \t\tformat->planes[i].bpl = pix->plane_fmt[i].bytesperline;\n>  \t\tformat->planes[i].size = pix->plane_fmt[i].sizeimage;\n> @@ -893,6 +911,11 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>  \tstruct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp;\n>  \tint ret;\n>\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Error)\n> +\t\t\t<< \"Trying to set undefined color space: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \tv4l2Format.type = bufferType_;\n>  \tpix->width = format->size.width;\n>  \tpix->height = format->size.height;\n> @@ -900,6 +923,12 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>  \tpix->num_planes = format->planesCount;\n>  \tpix->field = V4L2_FIELD_NONE;\n>\n> +\tret = fromColorSpace(format->colorSpace, *pix);\n> +\tif (ret < 0)\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Setting color space unrecognised by V4L2: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \tASSERT(pix->num_planes <= std::size(pix->plane_fmt));\n>\n>  \tfor (unsigned int i = 0; i < pix->num_planes; ++i) {\n> @@ -928,6 +957,12 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)\n>  \t\tformat->planes[i].size = pix->plane_fmt[i].sizeimage;\n>  \t}\n>\n> +\tformat->colorSpace = toColorSpace(*pix);\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Undefined color space has been set: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \treturn 0;\n>  }\n>\n> @@ -951,6 +986,12 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format)\n>  \tformat->planes[0].bpl = pix->bytesperline;\n>  \tformat->planes[0].size = pix->sizeimage;\n>\n> +\tformat->colorSpace = toColorSpace(*pix);\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Retrieved undefined color space: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \treturn 0;\n>  }\n>\n> @@ -960,12 +1001,24 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)\n>  \tstruct v4l2_pix_format *pix = &v4l2Format.fmt.pix;\n>  \tint ret;\n>\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Error)\n> +\t\t\t<< \"Trying to set undefined color space: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \tv4l2Format.type = bufferType_;\n>  \tpix->width = format->size.width;\n>  \tpix->height = format->size.height;\n>  \tpix->pixelformat = format->fourcc;\n>  \tpix->bytesperline = format->planes[0].bpl;\n>  \tpix->field = V4L2_FIELD_NONE;\n> +\n> +\tret = fromColorSpace(format->colorSpace, *pix);\n> +\tif (ret < 0)\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Set color space unrecognised by V4L2: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \tret = ioctl(set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT, &v4l2Format);\n>  \tif (ret) {\n>  \t\tLOG(V4L2, Error)\n> @@ -985,6 +1038,12 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)\n>  \tformat->planes[0].bpl = pix->bytesperline;\n>  \tformat->planes[0].size = pix->sizeimage;\n>\n> +\tformat->colorSpace = toColorSpace(*pix);\n> +\tif (!format->colorSpace.isFullyDefined())\n> +\t\tLOG(V4L2, Warning)\n> +\t\t\t<< \"Undefined color space has been set: \"\n> +\t\t\t<< format->colorSpace.toString();\n> +\n>  \treturn 0;\n>  }\n>\n> --\n> 2.20.1\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 CB9D8BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat,  6 Nov 2021 16:31:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F6A26034F;\n\tSat,  6 Nov 2021 17:31:30 +0100 (CET)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D7B026033A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  6 Nov 2021 17:31:28 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 2DC9FC0008;\n\tSat,  6 Nov 2021 16:31:27 +0000 (UTC)"],"Date":"Sat, 6 Nov 2021 17:32:20 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<20211106163220.ruectkyvrsu757cr@uno.localdomain>","References":"<20211104135805.5269-1-david.plowman@raspberrypi.com>\n\t<20211104135805.5269-5-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211104135805.5269-5-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v5 4/7] libcamera: Support passing\n\tColorSpaces to V4L2 video devices","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":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]