[{"id":19745,"web_url":"https://patchwork.libcamera.org/comment/19745/","msgid":"<e36bfb0c-4c4b-39e3-5682-368cb9f1fff5@ideasonboard.com>","date":"2021-09-21T15:35:32","subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 07/09/2021 01:20, Laurent Pinchart wrote:\n> Add support for the YUV420, YVU420 and YUV420 formats supported by\n> libcamera. YUV420 can be produced by the Raspberry Pi pipeline handler,\n> being able to display it is useful for testing.\n> \n\nThese need adding to the gstlibcamera-utils.cpp format_map too.\nI've done that while working through to verify the formats here.\n\nPatch incoming separately.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/qcam/format_converter.cpp | 66 +++++++++++++++++++++++++++++++++++\n>  src/qcam/format_converter.h   |  2 ++\n>  2 files changed, 68 insertions(+)\n> \n> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> index 7979ea8a77ff..d4d3223bc698 100644\n> --- a/src/qcam/format_converter.cpp\n> +++ b/src/qcam/format_converter.cpp\n> @@ -8,6 +8,7 @@\n>  #include \"format_converter.h\"\n>  \n>  #include <errno.h>\n> +#include <utility>\n>  \n>  #include <QImage>\n>  \n> @@ -141,6 +142,25 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n>  \t\tcb_pos_ = 1;\n>  \t\tbreak;\n>  \n> +\tcase libcamera::formats::YUV420:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 2;\n> +\t\tnvSwap_ = false;\n> +\t\tbreak;\n> +\tcase libcamera::formats::YVU420:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 2;\n> +\t\tnvSwap_ = true;\n> +\t\tbreak;\n> +\tcase libcamera::formats::YUV422:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 1;\n> +\t\tnvSwap_ = false;\n> +\t\tbreak;\n> +\n>  \tcase libcamera::formats::MJPEG:\n>  \t\tformatFamily_ = MJPEG;\n>  \t\tbreak;\n> @@ -172,6 +192,9 @@ void FormatConverter::convert(const Image *src, size_t size, QImage *dst)\n>  \tcase YUVSemiPlanar:\n>  \t\tconvertYUVSemiPlanar(src, dst->bits());\n>  \t\tbreak;\n> +\tcase YUVPlanar:\n> +\t\tconvertYUVPlanar(src, dst->bits());\n> +\t\tbreak;\n>  \t};\n>  }\n>  \n> @@ -247,6 +270,49 @@ void FormatConverter::convertYUVPacked(const Image *srcImage, unsigned char *dst\n>  \t}\n>  }\n>  \n> +void FormatConverter::convertYUVPlanar(const Image *srcImage, unsigned char *dst)\n> +{\n> +\tunsigned int c_stride = stride_ / horzSubSample_;\n> +\tunsigned int c_inc = horzSubSample_ == 1 ? 1 : 0;\n> +\tconst unsigned char *src_y = srcImage->data(0).data();\n> +\tconst unsigned char *src_cb = srcImage->data(1).data();\n> +\tconst unsigned char *src_cr = srcImage->data(2).data();\n> +\tint r, g, b;\n> +\n> +\tif (nvSwap_)\n> +\t\tstd::swap(src_cb, src_cr);\n> +\n> +\tfor (unsigned int y = 0; y < height_; y++) {\n> +\t\tconst unsigned char *line_y = src_y + y * stride_;\n> +\t\tconst unsigned char *line_cb = src_cb + (y / vertSubSample_) *\n> +\t\t\t\t\t       c_stride;\n> +\t\tconst unsigned char *line_cr = src_cr + (y / vertSubSample_) *\n> +\t\t\t\t\t       c_stride;\n> +\n> +\t\tfor (unsigned int x = 0; x < width_; x += 2) {\n> +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> +\t\t\tdst[0] = b;\n> +\t\t\tdst[1] = g;\n> +\t\t\tdst[2] = r;\n> +\t\t\tdst[3] = 0xff;\n> +\t\t\tline_y++;\n> +\t\t\tline_cb += c_inc;\n> +\t\t\tline_cr += c_inc;\n> +\t\t\tdst += 4;\n> +\n> +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> +\t\t\tdst[0] = b;\n> +\t\t\tdst[1] = g;\n> +\t\t\tdst[2] = r;\n> +\t\t\tdst[3] = 0xff;\n> +\t\t\tline_y++;\n> +\t\t\tline_cb += 1;\n> +\t\t\tline_cr += 1;\n> +\t\t\tdst += 4;\n> +\t\t}\n> +\t}\n> +}\n> +\n>  void FormatConverter::convertYUVSemiPlanar(const Image *srcImage, unsigned char *dst)\n>  {\n>  \tunsigned int c_stride = stride_ * (2 / horzSubSample_);\n> diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> index 9ce2cc6da7f2..9da2df5d294b 100644\n> --- a/src/qcam/format_converter.h\n> +++ b/src/qcam/format_converter.h\n> @@ -29,11 +29,13 @@ private:\n>  \t\tMJPEG,\n>  \t\tRGB,\n>  \t\tYUVPacked,\n> +\t\tYUVPlanar,\n>  \t\tYUVSemiPlanar,\n>  \t};\n>  \n>  \tvoid convertRGB(const Image *src, unsigned char *dst);\n>  \tvoid convertYUVPacked(const Image *src, unsigned char *dst);\n> +\tvoid convertYUVPlanar(const Image *src, unsigned char *dst);\n>  \tvoid convertYUVSemiPlanar(const Image *src, unsigned char *dst);\n>  \n>  \tlibcamera::PixelFormat format_;\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 879C9BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Sep 2021 15:35:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4D3036918A;\n\tTue, 21 Sep 2021 17:35:38 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0024D60247\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Sep 2021 17:35:35 +0200 (CEST)","from [192.168.0.20]\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 99C2845E;\n\tTue, 21 Sep 2021 17:35:35 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"VuudqoO6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1632238535;\n\tbh=ftlycmTzY3XC6D5nlN6Hzw/Ey/AIcDalZTfP3xJB4p4=;\n\th=To:References:From:Subject:Date:In-Reply-To:From;\n\tb=VuudqoO6hHM37oPy3pc+RXUFJ/5Povo5Z9ZclxjzU5b4X+UDiyTVOktr0zqUVmhBr\n\tPwNRr7l0sIFw+haRZMl76GD6Xz57UK/brRzP4iG/4XTMUE/GPc+QAHPUQsqmG8yKJ2\n\tAlW7fhWIXUrx/MKOgG4iClqKH01j/QNErprEdiRk=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210907002044.7319-1-laurent.pinchart@ideasonboard.com>\n\t<20210907002044.7319-5-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<e36bfb0c-4c4b-39e3-5682-368cb9f1fff5@ideasonboard.com>","Date":"Tue, 21 Sep 2021 16:35:32 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.11.0","MIME-Version":"1.0","In-Reply-To":"<20210907002044.7319-5-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","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":19775,"web_url":"https://patchwork.libcamera.org/comment/19775/","msgid":"<20210922070919.GJ4382@pyrite.rasen.tech>","date":"2021-09-22T07:09:19","subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Laurent,\n\nOn Tue, Sep 07, 2021 at 03:20:43AM +0300, Laurent Pinchart wrote:\n> Add support for the YUV420, YVU420 and YUV420 formats supported by\n\nYUV420 and YUV420? :p\n\n> libcamera. YUV420 can be produced by the Raspberry Pi pipeline handler,\n> being able to display it is useful for testing.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  src/qcam/format_converter.cpp | 66 +++++++++++++++++++++++++++++++++++\n>  src/qcam/format_converter.h   |  2 ++\n>  2 files changed, 68 insertions(+)\n> \n> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> index 7979ea8a77ff..d4d3223bc698 100644\n> --- a/src/qcam/format_converter.cpp\n> +++ b/src/qcam/format_converter.cpp\n> @@ -8,6 +8,7 @@\n>  #include \"format_converter.h\"\n>  \n>  #include <errno.h>\n> +#include <utility>\n>  \n>  #include <QImage>\n>  \n> @@ -141,6 +142,25 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n>  \t\tcb_pos_ = 1;\n>  \t\tbreak;\n>  \n> +\tcase libcamera::formats::YUV420:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 2;\n> +\t\tnvSwap_ = false;\n> +\t\tbreak;\n> +\tcase libcamera::formats::YVU420:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 2;\n> +\t\tnvSwap_ = true;\n> +\t\tbreak;\n> +\tcase libcamera::formats::YUV422:\n> +\t\tformatFamily_ = YUVPlanar;\n> +\t\thorzSubSample_ = 2;\n> +\t\tvertSubSample_ = 1;\n> +\t\tnvSwap_ = false;\n> +\t\tbreak;\n> +\n>  \tcase libcamera::formats::MJPEG:\n>  \t\tformatFamily_ = MJPEG;\n>  \t\tbreak;\n> @@ -172,6 +192,9 @@ void FormatConverter::convert(const Image *src, size_t size, QImage *dst)\n>  \tcase YUVSemiPlanar:\n>  \t\tconvertYUVSemiPlanar(src, dst->bits());\n>  \t\tbreak;\n> +\tcase YUVPlanar:\n> +\t\tconvertYUVPlanar(src, dst->bits());\n> +\t\tbreak;\n>  \t};\n>  }\n>  \n> @@ -247,6 +270,49 @@ void FormatConverter::convertYUVPacked(const Image *srcImage, unsigned char *dst\n>  \t}\n>  }\n>  \n> +void FormatConverter::convertYUVPlanar(const Image *srcImage, unsigned char *dst)\n> +{\n> +\tunsigned int c_stride = stride_ / horzSubSample_;\n> +\tunsigned int c_inc = horzSubSample_ == 1 ? 1 : 0;\n> +\tconst unsigned char *src_y = srcImage->data(0).data();\n> +\tconst unsigned char *src_cb = srcImage->data(1).data();\n> +\tconst unsigned char *src_cr = srcImage->data(2).data();\n> +\tint r, g, b;\n> +\n> +\tif (nvSwap_)\n> +\t\tstd::swap(src_cb, src_cr);\n> +\n> +\tfor (unsigned int y = 0; y < height_; y++) {\n> +\t\tconst unsigned char *line_y = src_y + y * stride_;\n> +\t\tconst unsigned char *line_cb = src_cb + (y / vertSubSample_) *\n> +\t\t\t\t\t       c_stride;\n> +\t\tconst unsigned char *line_cr = src_cr + (y / vertSubSample_) *\n> +\t\t\t\t\t       c_stride;\n> +\n> +\t\tfor (unsigned int x = 0; x < width_; x += 2) {\n> +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> +\t\t\tdst[0] = b;\n> +\t\t\tdst[1] = g;\n> +\t\t\tdst[2] = r;\n> +\t\t\tdst[3] = 0xff;\n> +\t\t\tline_y++;\n> +\t\t\tline_cb += c_inc;\n> +\t\t\tline_cr += c_inc;\n> +\t\t\tdst += 4;\n> +\n> +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> +\t\t\tdst[0] = b;\n> +\t\t\tdst[1] = g;\n> +\t\t\tdst[2] = r;\n> +\t\t\tdst[3] = 0xff;\n> +\t\t\tline_y++;\n> +\t\t\tline_cb += 1;\n> +\t\t\tline_cr += 1;\n> +\t\t\tdst += 4;\n> +\t\t}\n> +\t}\n> +}\n> +\n>  void FormatConverter::convertYUVSemiPlanar(const Image *srcImage, unsigned char *dst)\n>  {\n>  \tunsigned int c_stride = stride_ * (2 / horzSubSample_);\n> diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> index 9ce2cc6da7f2..9da2df5d294b 100644\n> --- a/src/qcam/format_converter.h\n> +++ b/src/qcam/format_converter.h\n> @@ -29,11 +29,13 @@ private:\n>  \t\tMJPEG,\n>  \t\tRGB,\n>  \t\tYUVPacked,\n> +\t\tYUVPlanar,\n>  \t\tYUVSemiPlanar,\n>  \t};\n>  \n>  \tvoid convertRGB(const Image *src, unsigned char *dst);\n>  \tvoid convertYUVPacked(const Image *src, unsigned char *dst);\n> +\tvoid convertYUVPlanar(const Image *src, unsigned char *dst);\n>  \tvoid convertYUVSemiPlanar(const Image *src, unsigned char *dst);\n>  \n>  \tlibcamera::PixelFormat format_;\n> -- \n> Regards,\n> \n> Laurent Pinchart\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 9BD96BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Sep 2021 07:09:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 189A46918C;\n\tWed, 22 Sep 2021 09:09:29 +0200 (CEST)","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 E47A1687DD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Sep 2021 09:09:27 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 61F71F1;\n\tWed, 22 Sep 2021 09:09:26 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"DQx686eX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1632294567;\n\tbh=vFyfq7xnyOo5B2TT7yxZtBYqCwMppAFnnNjEuGTVU98=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DQx686eXyPumKP7nOLAUOYR73EoLlBLOX5+bYyLLu9KK8HWNvc9NbjlR74R6m1eNl\n\tsyvNQmAeXnD1CBI8Zlo4ITcoiQk9X21JhEf7/Jk/MknyvU6PzXjDblJ+yqS/JtzNsK\n\tO7gtx7TyMVzMvClruxSJju7fi8f8TMZk7WO/nXHo=","Date":"Wed, 22 Sep 2021 16:09:19 +0900","From":"paul.elder@ideasonboard.com","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20210922070919.GJ4382@pyrite.rasen.tech>","References":"<20210907002044.7319-1-laurent.pinchart@ideasonboard.com>\n\t<20210907002044.7319-5-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20210907002044.7319-5-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","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>"}},{"id":19776,"web_url":"https://patchwork.libcamera.org/comment/19776/","msgid":"<YUrhJUJHKjE8XM5R@pendragon.ideasonboard.com>","date":"2021-09-22T07:54:13","subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nOn Wed, Sep 22, 2021 at 04:09:19PM +0900, paul.elder@ideasonboard.com wrote:\n> On Tue, Sep 07, 2021 at 03:20:43AM +0300, Laurent Pinchart wrote:\n> > Add support for the YUV420, YVU420 and YUV420 formats supported by\n> \n> YUV420 and YUV420? :p\n\nOops :-) I'll fix that.\n\n> > libcamera. YUV420 can be produced by the Raspberry Pi pipeline handler,\n> > being able to display it is useful for testing.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n> > ---\n> >  src/qcam/format_converter.cpp | 66 +++++++++++++++++++++++++++++++++++\n> >  src/qcam/format_converter.h   |  2 ++\n> >  2 files changed, 68 insertions(+)\n> > \n> > diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> > index 7979ea8a77ff..d4d3223bc698 100644\n> > --- a/src/qcam/format_converter.cpp\n> > +++ b/src/qcam/format_converter.cpp\n> > @@ -8,6 +8,7 @@\n> >  #include \"format_converter.h\"\n> >  \n> >  #include <errno.h>\n> > +#include <utility>\n> >  \n> >  #include <QImage>\n> >  \n> > @@ -141,6 +142,25 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n> >  \t\tcb_pos_ = 1;\n> >  \t\tbreak;\n> >  \n> > +\tcase libcamera::formats::YUV420:\n> > +\t\tformatFamily_ = YUVPlanar;\n> > +\t\thorzSubSample_ = 2;\n> > +\t\tvertSubSample_ = 2;\n> > +\t\tnvSwap_ = false;\n> > +\t\tbreak;\n> > +\tcase libcamera::formats::YVU420:\n> > +\t\tformatFamily_ = YUVPlanar;\n> > +\t\thorzSubSample_ = 2;\n> > +\t\tvertSubSample_ = 2;\n> > +\t\tnvSwap_ = true;\n> > +\t\tbreak;\n> > +\tcase libcamera::formats::YUV422:\n> > +\t\tformatFamily_ = YUVPlanar;\n> > +\t\thorzSubSample_ = 2;\n> > +\t\tvertSubSample_ = 1;\n> > +\t\tnvSwap_ = false;\n> > +\t\tbreak;\n> > +\n> >  \tcase libcamera::formats::MJPEG:\n> >  \t\tformatFamily_ = MJPEG;\n> >  \t\tbreak;\n> > @@ -172,6 +192,9 @@ void FormatConverter::convert(const Image *src, size_t size, QImage *dst)\n> >  \tcase YUVSemiPlanar:\n> >  \t\tconvertYUVSemiPlanar(src, dst->bits());\n> >  \t\tbreak;\n> > +\tcase YUVPlanar:\n> > +\t\tconvertYUVPlanar(src, dst->bits());\n> > +\t\tbreak;\n> >  \t};\n> >  }\n> >  \n> > @@ -247,6 +270,49 @@ void FormatConverter::convertYUVPacked(const Image *srcImage, unsigned char *dst\n> >  \t}\n> >  }\n> >  \n> > +void FormatConverter::convertYUVPlanar(const Image *srcImage, unsigned char *dst)\n> > +{\n> > +\tunsigned int c_stride = stride_ / horzSubSample_;\n> > +\tunsigned int c_inc = horzSubSample_ == 1 ? 1 : 0;\n> > +\tconst unsigned char *src_y = srcImage->data(0).data();\n> > +\tconst unsigned char *src_cb = srcImage->data(1).data();\n> > +\tconst unsigned char *src_cr = srcImage->data(2).data();\n> > +\tint r, g, b;\n> > +\n> > +\tif (nvSwap_)\n> > +\t\tstd::swap(src_cb, src_cr);\n> > +\n> > +\tfor (unsigned int y = 0; y < height_; y++) {\n> > +\t\tconst unsigned char *line_y = src_y + y * stride_;\n> > +\t\tconst unsigned char *line_cb = src_cb + (y / vertSubSample_) *\n> > +\t\t\t\t\t       c_stride;\n> > +\t\tconst unsigned char *line_cr = src_cr + (y / vertSubSample_) *\n> > +\t\t\t\t\t       c_stride;\n> > +\n> > +\t\tfor (unsigned int x = 0; x < width_; x += 2) {\n> > +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> > +\t\t\tdst[0] = b;\n> > +\t\t\tdst[1] = g;\n> > +\t\t\tdst[2] = r;\n> > +\t\t\tdst[3] = 0xff;\n> > +\t\t\tline_y++;\n> > +\t\t\tline_cb += c_inc;\n> > +\t\t\tline_cr += c_inc;\n> > +\t\t\tdst += 4;\n> > +\n> > +\t\t\tyuv_to_rgb(*line_y, *line_cb, *line_cr, &r, &g, &b);\n> > +\t\t\tdst[0] = b;\n> > +\t\t\tdst[1] = g;\n> > +\t\t\tdst[2] = r;\n> > +\t\t\tdst[3] = 0xff;\n> > +\t\t\tline_y++;\n> > +\t\t\tline_cb += 1;\n> > +\t\t\tline_cr += 1;\n> > +\t\t\tdst += 4;\n> > +\t\t}\n> > +\t}\n> > +}\n> > +\n> >  void FormatConverter::convertYUVSemiPlanar(const Image *srcImage, unsigned char *dst)\n> >  {\n> >  \tunsigned int c_stride = stride_ * (2 / horzSubSample_);\n> > diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> > index 9ce2cc6da7f2..9da2df5d294b 100644\n> > --- a/src/qcam/format_converter.h\n> > +++ b/src/qcam/format_converter.h\n> > @@ -29,11 +29,13 @@ private:\n> >  \t\tMJPEG,\n> >  \t\tRGB,\n> >  \t\tYUVPacked,\n> > +\t\tYUVPlanar,\n> >  \t\tYUVSemiPlanar,\n> >  \t};\n> >  \n> >  \tvoid convertRGB(const Image *src, unsigned char *dst);\n> >  \tvoid convertYUVPacked(const Image *src, unsigned char *dst);\n> > +\tvoid convertYUVPlanar(const Image *src, unsigned char *dst);\n> >  \tvoid convertYUVSemiPlanar(const Image *src, unsigned char *dst);\n> >  \n> >  \tlibcamera::PixelFormat format_;","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 69BB6BF01C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Sep 2021 07:54:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AAAB56918E;\n\tWed, 22 Sep 2021 09:54:47 +0200 (CEST)","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 41B3D687DD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Sep 2021 09:54:46 +0200 (CEST)","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 AFAADF1;\n\tWed, 22 Sep 2021 09:54:45 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"MbgSAyv5\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1632297285;\n\tbh=E3efJZpuuWoEVWQeda1IF2lMsSNAB06MiPxQwKEJWQY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=MbgSAyv5iPWl4x+VWK3XFAFrSjQpQIz5v93YEfBnol19HNV429eD6jY83KbCe4S5D\n\tk9W6GeefHVnjSp063h/eE0JJEzjuGPu7jc99IQQgzA1qacJ+efncDxSRgxW0fCucG8\n\tplrVnZBiEQYq4D/tuTOwptn94d7k/1EE7vmsomNk=","Date":"Wed, 22 Sep 2021 10:54:13 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"paul.elder@ideasonboard.com","Message-ID":"<YUrhJUJHKjE8XM5R@pendragon.ideasonboard.com>","References":"<20210907002044.7319-1-laurent.pinchart@ideasonboard.com>\n\t<20210907002044.7319-5-laurent.pinchart@ideasonboard.com>\n\t<20210922070919.GJ4382@pyrite.rasen.tech>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210922070919.GJ4382@pyrite.rasen.tech>","Subject":"Re: [libcamera-devel] [PATCH v2 4/5] qcam: format_converter: Add\n\tfully-planar YUV formats support","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>"}}]