[{"id":19417,"web_url":"https://patchwork.libcamera.org/comment/19417/","msgid":"<a7eae58d-810e-1196-3ba6-67ad0e912636@ideasonboard.com>","date":"2021-09-06T09:38:13","subject":"Re: [libcamera-devel] [PATCH v2 27/27] qcam: viewfinder_qt: Support\n\tmulti-planar buffers","submitter":{"id":75,"url":"https://patchwork.libcamera.org/api/people/75/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 06/09/2021 04:01, Laurent Pinchart wrote:\n> Now that the ViewFinderQt receives an Image, move the Converter API to\n> take an Image as well, and enable multi-planar buffer support.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> ---\n>  src/qcam/format_converter.cpp | 18 +++++++++++-------\n>  src/qcam/format_converter.h   |  9 +++++----\n>  src/qcam/viewfinder_qt.cpp    | 14 +++++---------\n>  3 files changed, 21 insertions(+), 20 deletions(-)\n> \n> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> index 973966f6afc1..673ad33e141d 100644\n> --- a/src/qcam/format_converter.cpp\n> +++ b/src/qcam/format_converter.cpp\n> @@ -13,6 +13,8 @@\n>  \n>  #include <libcamera/formats.h>\n>  \n> +#include \"../cam/image.h\"\n> +\n>  #define RGBSHIFT\t\t8\n>  #ifndef MAX\n>  #define MAX(a,b)\t\t((a)>(b)?(a):(b))\n> @@ -154,12 +156,11 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n>  \treturn 0;\n>  }\n>  \n> -void FormatConverter::convert(const unsigned char *src, size_t size,\n> -\t\t\t      QImage *dst)\n> +void FormatConverter::convert(const Image *src, size_t size, QImage *dst)\n>  {\n>  \tswitch (formatFamily_) {\n>  \tcase MJPEG:\n> -\t\tdst->loadFromData(src, size, \"JPEG\");\n> +\t\tdst->loadFromData(src->data(0).data(), size, \"JPEG\");\n>  \t\tbreak;\n>  \tcase YUV:\n>  \t\tconvertYUV(src, dst->bits());\n> @@ -183,13 +184,14 @@ static void yuv_to_rgb(int y, int u, int v, int *r, int *g, int *b)\n>  \t*b = CLIP(( 298 * c + 516 * d           + 128) >> RGBSHIFT);\n>  }\n>  \n> -void FormatConverter::convertNV(const unsigned char *src, unsigned char *dst)\n> +void FormatConverter::convertNV(const Image *srcImage, unsigned char *dst)\n>  {\n>  \tunsigned int c_stride = width_ * (2 / horzSubSample_);\n>  \tunsigned int c_inc = horzSubSample_ == 1 ? 2 : 0;\n>  \tunsigned int cb_pos = nvSwap_ ? 1 : 0;\n>  \tunsigned int cr_pos = nvSwap_ ? 0 : 1;\n> -\tconst unsigned char *src_c = src + width_ * height_;\n> +\tconst unsigned char *src = srcImage->data(0).data();\n> +\tconst unsigned char *src_c = srcImage->data(1).data();\n>  \tint r, g, b;\n>  \n>  \tfor (unsigned int y = 0; y < height_; y++) {\n> @@ -223,8 +225,9 @@ void FormatConverter::convertNV(const unsigned char *src, unsigned char *dst)\n>  \t}\n>  }\n>  \n> -void FormatConverter::convertRGB(const unsigned char *src, unsigned char *dst)\n> +void FormatConverter::convertRGB(const Image *srcImage, unsigned char *dst)\n>  {\n> +\tconst unsigned char *src = srcImage->data(0).data();\n>  \tunsigned int x, y;\n>  \tint r, g, b;\n>  \n> @@ -245,8 +248,9 @@ void FormatConverter::convertRGB(const unsigned char *src, unsigned char *dst)\n>  \t}\n>  }\n>  \n> -void FormatConverter::convertYUV(const unsigned char *src, unsigned char *dst)\n> +void FormatConverter::convertYUV(const Image *srcImage, unsigned char *dst)\n>  {\n> +\tconst unsigned char *src = srcImage->data(0).data();\n>  \tunsigned int src_x, src_y, dst_x, dst_y;\n>  \tunsigned int src_stride;\n>  \tunsigned int dst_stride;\n> diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> index e389b24a69f7..2220a62b5f11 100644\n> --- a/src/qcam/format_converter.h\n> +++ b/src/qcam/format_converter.h\n> @@ -13,6 +13,7 @@\n>  \n>  #include <libcamera/pixel_format.h>\n>  \n> +class Image;\n>  class QImage;\n>  \n>  class FormatConverter\n> @@ -20,7 +21,7 @@ class FormatConverter\n>  public:\n>  \tint configure(const libcamera::PixelFormat &format, const QSize &size);\n>  \n> -\tvoid convert(const unsigned char *src, size_t size, QImage *dst);\n> +\tvoid convert(const Image *src, size_t size, QImage *dst);\n>  \n>  private:\n>  \tenum FormatFamily {\n> @@ -30,9 +31,9 @@ private:\n>  \t\tYUV,\n>  \t};\n>  \n> -\tvoid convertNV(const unsigned char *src, unsigned char *dst);\n> -\tvoid convertRGB(const unsigned char *src, unsigned char *dst);\n> -\tvoid convertYUV(const unsigned char *src, unsigned char *dst);\n> +\tvoid convertNV(const Image *src, unsigned char *dst);\n> +\tvoid convertRGB(const Image *src, unsigned char *dst);\n> +\tvoid convertYUV(const Image *src, unsigned char *dst);\n>  \n>  \tlibcamera::PixelFormat format_;\n>  \tunsigned int width_;\n> diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp\n> index fef6d53eef5e..0d357d860014 100644\n> --- a/src/qcam/viewfinder_qt.cpp\n> +++ b/src/qcam/viewfinder_qt.cpp\n> @@ -7,6 +7,7 @@\n>  \n>  #include \"viewfinder_qt.h\"\n>  \n> +#include <assert.h>\n>  #include <stdint.h>\n>  #include <utility>\n>  \n> @@ -81,12 +82,6 @@ int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n>  \n>  void ViewFinderQt::render(libcamera::FrameBuffer *buffer, Image *image)\n>  {\n> -\tif (buffer->planes().size() != 1) {\n> -\t\tqWarning() << \"Multi-planar buffers are not supported\";\n> -\t\treturn;\n> -\t}\n> -\n> -\tunsigned char *memory = image->data(0).data();\n>  \tsize_t size = buffer->metadata().planes()[0].bytesused;\n>  \n>  \t{\n> @@ -103,8 +98,9 @@ void ViewFinderQt::render(libcamera::FrameBuffer *buffer, Image *image)\n>  \t\t\t * \\todo Get the stride from the buffer instead of\n>  \t\t\t * computing it naively\n>  \t\t\t */\n> -\t\t\timage_ = QImage(memory, size_.width(), size_.height(),\n> -\t\t\t\t\tsize / size_.height(),\n> +\t\t\tassert(buffer->planes().size() == 1);\n> +\t\t\timage_ = QImage(image->data(0).data(), size_.width(),\n> +\t\t\t\t\tsize_.height(), size / size_.height(),\n>  \t\t\t\t\t::nativeFormats[format_]);\n>  \t\t\tstd::swap(buffer, buffer_);\n>  \t\t} else {\n> @@ -112,7 +108,7 @@ void ViewFinderQt::render(libcamera::FrameBuffer *buffer, Image *image)\n>  \t\t\t * Otherwise, convert the format and release the frame\n>  \t\t\t * buffer immediately.\n>  \t\t\t */\n> -\t\t\tconverter_.convert(memory, size, &image_);\n> +\t\t\tconverter_.convert(image, size, &image_);\n>  \t\t}\n>  \t}\n>  \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 AF1BDBD87D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Sep 2021 09:38:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 784EB69168;\n\tMon,  6 Sep 2021 11:38:17 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 51E1A60503\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Sep 2021 11:38:16 +0200 (CEST)","from tatooine.ideasonboard.com (unknown\n\t[IPv6:2a01:e0a:169:7140:eb18:8e30:9b7:f998])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0ADAE8D7;\n\tMon,  6 Sep 2021 11:38:16 +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=\"karMNLcI\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1630921096;\n\tbh=ojxbheQJZn6v04C3QoRzzyzqt7DrtZDIpftPWXuOq9c=;\n\th=Subject:To:References:From:Date:In-Reply-To:From;\n\tb=karMNLcIxKOJ6zmC78FVhsilVwAKVNsJJHNIQ5HBR2t/doLGvU1UFW4/XEh00kMif\n\tvzBdOosfZkhLr8dVwrk+DcYKHdt/N90mZd3tlEhcfs4v/MkY+ccin1BlXQYGzViEuk\n\t/L2WKFDAih9l+2eQU1vw4rELkEpt56wdBVirjWek=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210906020100.14430-1-laurent.pinchart@ideasonboard.com>\n\t<20210906020100.14430-28-laurent.pinchart@ideasonboard.com>","From":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","Message-ID":"<a7eae58d-810e-1196-3ba6-67ad0e912636@ideasonboard.com>","Date":"Mon, 6 Sep 2021 11:38:13 +0200","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.13.0","MIME-Version":"1.0","In-Reply-To":"<20210906020100.14430-28-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-US","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2 27/27] qcam: viewfinder_qt: Support\n\tmulti-planar buffers","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>"}}]