[{"id":14352,"web_url":"https://patchwork.libcamera.org/comment/14352/","msgid":"<X+hrfAN1JSDY/dD8@wyvern>","date":"2020-12-27T11:09:48","subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your work.\n\nOn 2020-12-23 18:47:06 +0100, Jacopo Mondi wrote:\n> The existing implementation of the BayerFormat class supports\n> converting a V4L2PixelFormat to a BayerFormat and vice-versa.\n> \n> Expand the class by adding support for converting a media bus code\n> to a BayerFormat instance, by providing a conversion table and a\n> dedicated static methods.\n> \n> Do not provide support for converting a BayerFormat to a media bus code\n> as the feature is currently not required.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  include/libcamera/internal/bayer_format.h |  1 +\n>  src/libcamera/bayer_format.cpp            | 55 +++++++++++++++++++++++\n>  2 files changed, 56 insertions(+)\n> \n> diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h\n> index 4280b76b016f..dc86f6ee3aca 100644\n> --- a/include/libcamera/internal/bayer_format.h\n> +++ b/include/libcamera/internal/bayer_format.h\n> @@ -43,6 +43,7 @@ public:\n>  \t}\n>  \n>  \texplicit BayerFormat(V4L2PixelFormat v4l2Format);\n> +\tstatic const BayerFormat &fromMbusCode(unsigned int mbusCode);\n>  \tbool isValid() const { return bitDepth != 0; }\n>  \n>  \tstd::string toString() const;\n> diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp\n> index c42792ff1948..c2c91ce8b6da 100644\n> --- a/src/libcamera/bayer_format.cpp\n> +++ b/src/libcamera/bayer_format.cpp\n> @@ -8,6 +8,9 @@\n>  #include \"libcamera/internal/bayer_format.h\"\n>  \n>  #include <map>\n> +#include <unordered_map>\n> +\n> +#include <linux/media-bus-format.h>\n>  \n>  #include <libcamera/transform.h>\n>  \n> @@ -140,6 +143,41 @@ const std::map<BayerFormat, V4L2PixelFormat, BayerFormatComparator> bayerToV4l2{\n>  \t{ { BayerFormat::RGGB, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) },\n>  };\n>  \n> +const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{\n> +\t{ MEDIA_BUS_FMT_SBGGR8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR10_1X10, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG10_1X10, { BayerFormat::GBRG, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG10_1X10, { BayerFormat::GRBG, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB10_1X10, { BayerFormat::RGGB, 10, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR12_1X12, { BayerFormat::BGGR, 12, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG12_1X12, { BayerFormat::GBRG, 12, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG12_1X12, { BayerFormat::GRBG, 12, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB12_1X12, { BayerFormat::RGGB, 12, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR14_1X14, { BayerFormat::BGGR, 14, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG14_1X14, { BayerFormat::GBRG, 14, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG14_1X14, { BayerFormat::GRBG, 14, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB14_1X14, { BayerFormat::RGGB, 14, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SBGGR16_1X16, { BayerFormat::BGGR, 16, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGBRG16_1X16, { BayerFormat::GBRG, 16, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SGRBG16_1X16, { BayerFormat::GRBG, 16, BayerFormat::None } },\n> +\t{ MEDIA_BUS_FMT_SRGGB16_1X16, { BayerFormat::RGGB, 16, BayerFormat::None } },\n> +};\n\nnit: Would it make sens to use BayerFormat::Packing::None to ease \nreading of the table?\n\nIn either case,\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> +\n>  } /* namespace */\n>  \n>  /**\n> @@ -169,6 +207,23 @@ BayerFormat::BayerFormat(V4L2PixelFormat v4l2Format)\n>  \t\t*this = it->second;\n>  }\n>  \n> +/**\n> + * \\brief Retrieve the BayerFormat associated to a media bus code\n> + * \\param[in] mbusCode The media bus code to convert into a BayerFormat\n> + *\n> + * The media bus code numeric identifiers are defined by the V4L2 specification.\n> + */\n> +const BayerFormat &BayerFormat::fromMbusCode(unsigned int mbusCode)\n> +{\n> +\tstatic BayerFormat empty;\n> +\n> +\tconst auto it = mbusCodeToBayer.find(mbusCode);\n> +\tif (it == mbusCodeToBayer.end())\n> +\t\treturn empty;\n> +\telse\n> +\t\treturn it->second;\n> +}\n> +\n>  /**\n>   * \\fn BayerFormat::isValid()\n>   * \\brief Return whether a BayerFormat is valid\n> -- \n> 2.29.2\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 B1A84C0F1A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 27 Dec 2020 11:09:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 82F5E62006;\n\tSun, 27 Dec 2020 12:09:51 +0100 (CET)","from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 68575615B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 27 Dec 2020 12:09:50 +0100 (CET)","by mail-lf1-x142.google.com with SMTP id x20so18007349lfe.12\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 27 Dec 2020 03:09:50 -0800 (PST)","from localhost ([185.224.57.161]) by smtp.gmail.com with ESMTPSA id\n\tj4sm4949156lfg.197.2020.12.27.03.09.48\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 27 Dec 2020 03:09:49 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"mSPqEDzf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=6eEzBTw9qkqHaMqNPYzKS33IpFQqBrjxrfBrp7x687c=;\n\tb=mSPqEDzfKnBSrsSwH28MicR3pNc8G75onFx6bF/UnXT/4iE05xmuIog7FlIQJE2Rny\n\trUPIZ+pbdboVswcopJ6um8uRNANbh7kRteVv9fICavlvX5QcNIc4xbuo5OvD63O8ZhxY\n\tDj+31DKJKJNKGUK3KoWWtweAOZ6M7rTcjclbTx3tppGrxu9ktt0daKRdyl+YvplM6M+X\n\teY7imT9yQbRf3S7T3pDiCkygv8GS/GdlWpvVTKSWJm0avAtMznGBGXrDf2ayViVKjQbF\n\tcgwfMLYrxWMZkMmrEpJLTGsNnrJeAE67w33oFOxoYK1H33pkL/VDFB93yVpXjcQttaia\n\tXXwg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=6eEzBTw9qkqHaMqNPYzKS33IpFQqBrjxrfBrp7x687c=;\n\tb=mop2wSVAfUb4WrDm8M4dAuYo9bnaSWMTsfCV2hkSDP9K3rcL7uxnJkUwKOoHd/Z5XF\n\tDFA+bdxwzE7a0T3HF7xOd3HzXq54iqm01Sg8q3l51dfDFLoD+yL72+u0epNLZ7/uZkKc\n\taCeR0h1QXjIy5d8P75lelR5nJk8i2kpMUVpOEdV2T7vPI+jBMonGDOuGQ46b/V+kplq4\n\tL7m7+f7/3PyLSOG2fSZRSVwo39iCBaL/+BukYbtuKyzprcfIEY5kxuHjmoGV0xWAeqcA\n\tEo6tM+EegqZjTuKghbwFm/NB6Bc3RRjfDO5U+ZrRGbLgkH09mScdOCjS6v1ZLw4UivqL\n\tGj0Q==","X-Gm-Message-State":"AOAM531AaNPykgrVnplnwreizfr5Q48i3OdPNJRn+zhUQYYEhWKKpkpt\n\tjn7ciniSoYUeyxHxRGwgHOEOJnDXLmBu+w==","X-Google-Smtp-Source":"ABdhPJxWvM6coTD7R6Bed0QtVHwqsV2cRm65i5XcS+CGka+jWwJdpcFmbjK8U2cVpHou41T2rL8ZSQ==","X-Received":"by 2002:a2e:b012:: with SMTP id\n\ty18mr18902431ljk.396.1609067389890; \n\tSun, 27 Dec 2020 03:09:49 -0800 (PST)","Date":"Sun, 27 Dec 2020 12:09:48 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<X+hrfAN1JSDY/dD8@wyvern>","References":"<20201223174709.45457-1-jacopo@jmondi.org>\n\t<20201223174709.45457-4-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201223174709.45457-4-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","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","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":14375,"web_url":"https://patchwork.libcamera.org/comment/14375/","msgid":"<20201228094257.72vktm4vx5jhgeyy@uno.localdomain>","date":"2020-12-28T09:42:57","subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n\nOn Sun, Dec 27, 2020 at 12:09:48PM +0100, Niklas Söderlund wrote:\n> Hi Jacopo,\n>\n> Thanks for your work.\n>\n> On 2020-12-23 18:47:06 +0100, Jacopo Mondi wrote:\n> > The existing implementation of the BayerFormat class supports\n> > converting a V4L2PixelFormat to a BayerFormat and vice-versa.\n> >\n> > Expand the class by adding support for converting a media bus code\n> > to a BayerFormat instance, by providing a conversion table and a\n> > dedicated static methods.\n> >\n> > Do not provide support for converting a BayerFormat to a media bus code\n> > as the feature is currently not required.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  include/libcamera/internal/bayer_format.h |  1 +\n> >  src/libcamera/bayer_format.cpp            | 55 +++++++++++++++++++++++\n> >  2 files changed, 56 insertions(+)\n> >\n> > diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h\n> > index 4280b76b016f..dc86f6ee3aca 100644\n> > --- a/include/libcamera/internal/bayer_format.h\n> > +++ b/include/libcamera/internal/bayer_format.h\n> > @@ -43,6 +43,7 @@ public:\n> >  \t}\n> >\n> >  \texplicit BayerFormat(V4L2PixelFormat v4l2Format);\n> > +\tstatic const BayerFormat &fromMbusCode(unsigned int mbusCode);\n> >  \tbool isValid() const { return bitDepth != 0; }\n> >\n> >  \tstd::string toString() const;\n> > diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp\n> > index c42792ff1948..c2c91ce8b6da 100644\n> > --- a/src/libcamera/bayer_format.cpp\n> > +++ b/src/libcamera/bayer_format.cpp\n> > @@ -8,6 +8,9 @@\n> >  #include \"libcamera/internal/bayer_format.h\"\n> >\n> >  #include <map>\n> > +#include <unordered_map>\n> > +\n> > +#include <linux/media-bus-format.h>\n> >\n> >  #include <libcamera/transform.h>\n> >\n> > @@ -140,6 +143,41 @@ const std::map<BayerFormat, V4L2PixelFormat, BayerFormatComparator> bayerToV4l2{\n> >  \t{ { BayerFormat::RGGB, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) },\n> >  };\n> >\n> > +const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{\n> > +\t{ MEDIA_BUS_FMT_SBGGR8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR10_1X10, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG10_1X10, { BayerFormat::GBRG, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG10_1X10, { BayerFormat::GRBG, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB10_1X10, { BayerFormat::RGGB, 10, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR12_1X12, { BayerFormat::BGGR, 12, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG12_1X12, { BayerFormat::GBRG, 12, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG12_1X12, { BayerFormat::GRBG, 12, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB12_1X12, { BayerFormat::RGGB, 12, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR14_1X14, { BayerFormat::BGGR, 14, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG14_1X14, { BayerFormat::GBRG, 14, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG14_1X14, { BayerFormat::GRBG, 14, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB14_1X14, { BayerFormat::RGGB, 14, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SBGGR16_1X16, { BayerFormat::BGGR, 16, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGBRG16_1X16, { BayerFormat::GBRG, 16, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SGRBG16_1X16, { BayerFormat::GRBG, 16, BayerFormat::None } },\n> > +\t{ MEDIA_BUS_FMT_SRGGB16_1X16, { BayerFormat::RGGB, 16, BayerFormat::None } },\n> > +};\n>\n> nit: Would it make sens to use BayerFormat::Packing::None to ease\n> reading of the table?\n\nAre you suggesting\n        s/BayerFormat::None/BayerFormat::Packing::None/\nright ?\n\nWe could, but the existing tables use BayerFormat::None, I didn't want\nto make this one different!\n\nThanks\n   j\n\n>\n> In either case,\n>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n>\n> > +\n> >  } /* namespace */\n> >\n> >  /**\n> > @@ -169,6 +207,23 @@ BayerFormat::BayerFormat(V4L2PixelFormat v4l2Format)\n> >  \t\t*this = it->second;\n> >  }\n> >\n> > +/**\n> > + * \\brief Retrieve the BayerFormat associated to a media bus code\n> > + * \\param[in] mbusCode The media bus code to convert into a BayerFormat\n> > + *\n> > + * The media bus code numeric identifiers are defined by the V4L2 specification.\n> > + */\n> > +const BayerFormat &BayerFormat::fromMbusCode(unsigned int mbusCode)\n> > +{\n> > +\tstatic BayerFormat empty;\n> > +\n> > +\tconst auto it = mbusCodeToBayer.find(mbusCode);\n> > +\tif (it == mbusCodeToBayer.end())\n> > +\t\treturn empty;\n> > +\telse\n> > +\t\treturn it->second;\n> > +}\n> > +\n> >  /**\n> >   * \\fn BayerFormat::isValid()\n> >   * \\brief Return whether a BayerFormat is valid\n> > --\n> > 2.29.2\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel\n>\n> --\n> Regards,\n> Niklas Söderlund","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 602E3C0F1A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Dec 2020 09:42:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E0998615D2;\n\tMon, 28 Dec 2020 10:42:44 +0100 (CET)","from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net\n\t[217.70.183.197])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 931B66031E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Dec 2020 10:42:43 +0100 (CET)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 0B03F1C0009;\n\tMon, 28 Dec 2020 09:42:42 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Mon, 28 Dec 2020 10:42:57 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Message-ID":"<20201228094257.72vktm4vx5jhgeyy@uno.localdomain>","References":"<20201223174709.45457-1-jacopo@jmondi.org>\n\t<20201223174709.45457-4-jacopo@jmondi.org>\n\t<X+hrfAN1JSDY/dD8@wyvern>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<X+hrfAN1JSDY/dD8@wyvern>","Subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","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","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":14381,"web_url":"https://patchwork.libcamera.org/comment/14381/","msgid":"<X+nL5J3vZDi/KAGs@pendragon.ideasonboard.com>","date":"2020-12-28T12:13:24","subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Mon, Dec 28, 2020 at 10:42:57AM +0100, Jacopo Mondi wrote:\n> On Sun, Dec 27, 2020 at 12:09:48PM +0100, Niklas Söderlund wrote:\n> > On 2020-12-23 18:47:06 +0100, Jacopo Mondi wrote:\n> > > The existing implementation of the BayerFormat class supports\n> > > converting a V4L2PixelFormat to a BayerFormat and vice-versa.\n> > >\n> > > Expand the class by adding support for converting a media bus code\n> > > to a BayerFormat instance, by providing a conversion table and a\n> > > dedicated static methods.\n> > >\n> > > Do not provide support for converting a BayerFormat to a media bus code\n> > > as the feature is currently not required.\n\nAnd it's also no possible, there's no 1:1 mapping between the two. I'd\nreword this last sentence to explain this.\n\n> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > > ---\n> > >  include/libcamera/internal/bayer_format.h |  1 +\n> > >  src/libcamera/bayer_format.cpp            | 55 +++++++++++++++++++++++\n> > >  2 files changed, 56 insertions(+)\n> > >\n> > > diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h\n> > > index 4280b76b016f..dc86f6ee3aca 100644\n> > > --- a/include/libcamera/internal/bayer_format.h\n> > > +++ b/include/libcamera/internal/bayer_format.h\n> > > @@ -43,6 +43,7 @@ public:\n> > >  \t}\n> > >\n> > >  \texplicit BayerFormat(V4L2PixelFormat v4l2Format);\n> > > +\tstatic const BayerFormat &fromMbusCode(unsigned int mbusCode);\n> > >  \tbool isValid() const { return bitDepth != 0; }\n> > >\n> > >  \tstd::string toString() const;\n> > > diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp\n> > > index c42792ff1948..c2c91ce8b6da 100644\n> > > --- a/src/libcamera/bayer_format.cpp\n> > > +++ b/src/libcamera/bayer_format.cpp\n> > > @@ -8,6 +8,9 @@\n> > >  #include \"libcamera/internal/bayer_format.h\"\n> > >\n> > >  #include <map>\n> > > +#include <unordered_map>\n> > > +\n> > > +#include <linux/media-bus-format.h>\n> > >\n> > >  #include <libcamera/transform.h>\n> > >\n> > > @@ -140,6 +143,41 @@ const std::map<BayerFormat, V4L2PixelFormat, BayerFormatComparator> bayerToV4l2{\n> > >  \t{ { BayerFormat::RGGB, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) },\n> > >  };\n> > >\n> > > +const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{\n> > > +\t{ MEDIA_BUS_FMT_SBGGR8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, { BayerFormat::BGGR, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, { BayerFormat::GBRG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, { BayerFormat::GRBG, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, { BayerFormat::RGGB, 8, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR10_1X10, { BayerFormat::BGGR, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG10_1X10, { BayerFormat::GBRG, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG10_1X10, { BayerFormat::GRBG, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB10_1X10, { BayerFormat::RGGB, 10, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR12_1X12, { BayerFormat::BGGR, 12, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG12_1X12, { BayerFormat::GBRG, 12, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG12_1X12, { BayerFormat::GRBG, 12, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB12_1X12, { BayerFormat::RGGB, 12, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR14_1X14, { BayerFormat::BGGR, 14, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG14_1X14, { BayerFormat::GBRG, 14, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG14_1X14, { BayerFormat::GRBG, 14, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB14_1X14, { BayerFormat::RGGB, 14, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SBGGR16_1X16, { BayerFormat::BGGR, 16, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGBRG16_1X16, { BayerFormat::GBRG, 16, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SGRBG16_1X16, { BayerFormat::GRBG, 16, BayerFormat::None } },\n> > > +\t{ MEDIA_BUS_FMT_SRGGB16_1X16, { BayerFormat::RGGB, 16, BayerFormat::None } },\n> > > +};\n> >\n> > nit: Would it make sens to use BayerFormat::Packing::None to ease\n> > reading of the table?\n> \n> Are you suggesting\n>         s/BayerFormat::None/BayerFormat::Packing::None/\n> right ?\n> \n> We could, but the existing tables use BayerFormat::None, I didn't want\n> to make this one different!\n\nTurning Packing into an enum class would indeed make sense, on top of\nthis.\n\n> > In either case,\n> >\n> > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> >\n> > > +\n> > >  } /* namespace */\n> > >\n> > >  /**\n> > > @@ -169,6 +207,23 @@ BayerFormat::BayerFormat(V4L2PixelFormat v4l2Format)\n> > >  \t\t*this = it->second;\n> > >  }\n> > >\n> > > +/**\n> > > + * \\brief Retrieve the BayerFormat associated to a media bus code\n\ns/associated to/associated with/\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> > > + * \\param[in] mbusCode The media bus code to convert into a BayerFormat\n> > > + *\n> > > + * The media bus code numeric identifiers are defined by the V4L2 specification.\n> > > + */\n> > > +const BayerFormat &BayerFormat::fromMbusCode(unsigned int mbusCode)\n> > > +{\n> > > +\tstatic BayerFormat empty;\n> > > +\n> > > +\tconst auto it = mbusCodeToBayer.find(mbusCode);\n> > > +\tif (it == mbusCodeToBayer.end())\n> > > +\t\treturn empty;\n> > > +\telse\n> > > +\t\treturn it->second;\n> > > +}\n> > > +\n> > >  /**\n> > >   * \\fn BayerFormat::isValid()\n> > >   * \\brief Return whether a BayerFormat is valid","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 86502C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Dec 2020 12:13:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DCFB1615B2;\n\tMon, 28 Dec 2020 13:13:36 +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 2E37960111\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Dec 2020 13:13:35 +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 9BB7225B;\n\tMon, 28 Dec 2020 13:13:34 +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=\"tQa1WrIo\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1609157614;\n\tbh=5iHX3oQKYuW/wHWNRabybvFL6FvOCpGZ+dhmWcUXgy0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=tQa1WrIobU44dpTRHHFKD7WprdOjucOuTWlnRm6GVlWeEFHGKZd3x2zHJeyc0XgEl\n\tfohnRkj7USIhraU0qM4ZYrMxG2MLK8q+UIV45s6bC3BxRqM/5ZoWEPSPtJJ604aUzA\n\t1v2defd10cyPKBElmhP5CYuzKh+BItxbL8V2Tujk=","Date":"Mon, 28 Dec 2020 14:13:24 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<X+nL5J3vZDi/KAGs@pendragon.ideasonboard.com>","References":"<20201223174709.45457-1-jacopo@jmondi.org>\n\t<20201223174709.45457-4-jacopo@jmondi.org>\n\t<X+hrfAN1JSDY/dD8@wyvern>\n\t<20201228094257.72vktm4vx5jhgeyy@uno.localdomain>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201228094257.72vktm4vx5jhgeyy@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH 3/6] libcamera: bayer_format: Add\n\tsupport for mbus codes","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","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]