[{"id":19512,"web_url":"https://patchwork.libcamera.org/comment/19512/","msgid":"<6fc7137e-1099-b8f7-f701-162f91dcca93@ideasonboard.com>","date":"2021-09-07T14:10:22","subject":"Re: [libcamera-devel] [PATCH v3 28/30] qcam: viewfinder_gl: Support\n\tmulti-planar buffers","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 06/09/2021 23:56, Laurent Pinchart wrote:\n> Now that the ViewFinderGL receives an Image, it can trivially support\n> multi-planar buffers.\n\n  \\o/\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> ---\n>  src/qcam/viewfinder_gl.cpp | 38 +++++++++++++++++---------------------\n>  src/qcam/viewfinder_gl.h   |  2 +-\n>  2 files changed, 18 insertions(+), 22 deletions(-)\n> \n> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp\n> index 87e4fe03cb8d..32232faa2ad8 100644\n> --- a/src/qcam/viewfinder_gl.cpp\n> +++ b/src/qcam/viewfinder_gl.cpp\n> @@ -56,7 +56,7 @@ static const QList<libcamera::PixelFormat> supportedFormats{\n>  };\n>  \n>  ViewFinderGL::ViewFinderGL(QWidget *parent)\n> -\t: QOpenGLWidget(parent), buffer_(nullptr), data_(nullptr),\n> +\t: QOpenGLWidget(parent), buffer_(nullptr), image_(nullptr),\n>  \t  vertexBuffer_(QOpenGLBuffer::VertexBuffer)\n>  {\n>  }\n> @@ -102,6 +102,7 @@ void ViewFinderGL::stop()\n>  \tif (buffer_) {\n>  \t\trenderComplete(buffer_);\n>  \t\tbuffer_ = nullptr;\n> +\t\timage_ = nullptr;\n>  \t}\n>  }\n>  \n> @@ -114,15 +115,10 @@ QImage ViewFinderGL::getCurrentImage()\n>  \n>  void ViewFinderGL::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>  \tif (buffer_)\n>  \t\trenderComplete(buffer_);\n>  \n> -\tdata_ = image->data(0).data();\n> +\timage_ = image;\n>  \t/*\n>  \t * \\todo Get the stride from the buffer instead of computing it naively\n>  \t */\n> @@ -489,7 +485,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \n>  \t\t/* Activate texture UV/VU */\n> @@ -503,7 +499,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE_ALPHA,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_ + size_.width() * size_.height());\n> +\t\t\t     image_->data(1).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformU_, 1);\n>  \t\tbreak;\n>  \n> @@ -519,7 +515,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \n>  \t\t/* Activate texture U */\n> @@ -533,7 +529,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_ + size_.width() * size_.height());\n> +\t\t\t     image_->data(1).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformU_, 1);\n>  \n>  \t\t/* Activate texture V */\n> @@ -547,7 +543,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_ + size_.width() * size_.height() * 5 / 4);\n> +\t\t\t     image_->data(2).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformV_, 2);\n>  \t\tbreak;\n>  \n> @@ -563,7 +559,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \n>  \t\t/* Activate texture V */\n> @@ -577,7 +573,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_ + size_.width() * size_.height());\n> +\t\t\t     image_->data(1).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformV_, 2);\n>  \n>  \t\t/* Activate texture U */\n> @@ -591,7 +587,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_ + size_.width() * size_.height() * 5 / 4);\n> +\t\t\t     image_->data(2).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformU_, 1);\n>  \t\tbreak;\n>  \n> @@ -602,7 +598,7 @@ void ViewFinderGL::doRender()\n>  \t\t/*\n>  \t\t * Packed YUV formats are stored in a RGBA texture to match the\n>  \t\t * OpenGL texel size with the 4 bytes repeating pattern in YUV.\n> -\t\t * The texture width is thus half of the image with.\n> +\t\t * The texture width is thus half of the image_ with.\n>  \t\t */\n>  \t\tglActiveTexture(GL_TEXTURE0);\n>  \t\tconfigureTexture(*textures_[0]);\n> @@ -614,7 +610,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_RGBA,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \n>  \t\t/*\n> @@ -642,7 +638,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_RGBA,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \t\tbreak;\n>  \n> @@ -658,7 +654,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_RGB,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \t\tbreak;\n>  \n> @@ -689,7 +685,7 @@ void ViewFinderGL::doRender()\n>  \t\t\t     0,\n>  \t\t\t     GL_LUMINANCE,\n>  \t\t\t     GL_UNSIGNED_BYTE,\n> -\t\t\t     data_);\n> +\t\t\t     image_->data(0).data());\n>  \t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n>  \t\tshaderProgram_.setUniformValue(textureUniformBayerFirstRed_,\n>  \t\t\t\t\t       firstRed_);\n> @@ -714,7 +710,7 @@ void ViewFinderGL::paintGL()\n>  \t\t\t\t   << \"create fragment shader failed.\";\n>  \t\t}\n>  \n> -\tif (data_) {\n> +\tif (image_) {\n>  \t\tglClearColor(0.0, 0.0, 0.0, 1.0);\n>  \t\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n>  \n> diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h\n> index 7cd8ef3316b9..72a60ecb9159 100644\n> --- a/src/qcam/viewfinder_gl.h\n> +++ b/src/qcam/viewfinder_gl.h\n> @@ -67,7 +67,7 @@ private:\n>  \tlibcamera::PixelFormat format_;\n>  \tQSize size_;\n>  \tunsigned int stride_;\n> -\tunsigned char *data_;\n> +\tImage *image_;\n>  \n>  \t/* Shaders */\n>  \tQOpenGLShaderProgram shaderProgram_;\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 2CEFEBDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  7 Sep 2021 14:10:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B1F3B60252;\n\tTue,  7 Sep 2021 16:10:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F382460251\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  7 Sep 2021 16:10:24 +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 76C57499;\n\tTue,  7 Sep 2021 16:10:24 +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=\"oVxEB3yF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1631023824;\n\tbh=AcYSxcfiBn/uFqhIBWiIu2rHsYZvhfAqsP6wh9WjHm8=;\n\th=To:References:From:Subject:Date:In-Reply-To:From;\n\tb=oVxEB3yFxqGfp0n1TnmDKV9dBBkcQx/+xPiPt3nV6ovHUQCwJ8uuiec2y2W0Pm2vm\n\tEllyaVzJCzNkzdZkk6RxIMgihLOnUU/YONL0quZuOTNQoRAFGLusphJ4d6bxyq+ZbJ\n\tHrq84T6SG2bz3iSlL/ou1ftqF8d3Zb8K3PrjxYi8=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210906225420.13275-1-laurent.pinchart@ideasonboard.com>\n\t<20210906225636.14683-28-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<6fc7137e-1099-b8f7-f701-162f91dcca93@ideasonboard.com>","Date":"Tue, 7 Sep 2021 15:10:22 +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":"<20210906225636.14683-28-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v3 28/30] qcam: viewfinder_gl: 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>"}}]