[{"id":4237,"web_url":"https://patchwork.libcamera.org/comment/4237/","msgid":"<89d86e7f-ab26-3f0a-4abb-496f78a01992@ideasonboard.com>","date":"2020-03-23T17:23:06","subject":"Re: [libcamera-devel] [PATCH 19/21] qcam: viewfinder: Avoid memory\n\tcopy when conversion isn't needed","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 23/03/2020 14:22, Laurent Pinchart wrote:\n> If the frame buffer format is identical to the display format, the\n> viewfinder still invokes the converter to perform what is essentially a\n> slow memcpy(). Make is possible to skip that operation by creating a\n\ns/is/it/\n\n> QImage referencing the buffer memory instead. A reference to the frame\n> buffer is kept internally, and released when the next buffer is queued,\n> pushing the current one out.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nSome questions ... but nothing blocking I don't think\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> ---\n>  src/qcam/viewfinder.cpp | 59 +++++++++++++++++++++++++++++------------\n>  src/qcam/viewfinder.h   |  1 +\n>  2 files changed, 43 insertions(+), 17 deletions(-)\n> \n> diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp\n> index 31b358da47dc..4c35659e24aa 100644\n> --- a/src/qcam/viewfinder.cpp\n> +++ b/src/qcam/viewfinder.cpp\n> @@ -7,6 +7,8 @@\n>  \n>  #include \"viewfinder.h\"\n>  \n> +#include <utility>\n> +\n>  #include <QImage>\n>  #include <QImageWriter>\n>  #include <QMutexLocker>\n> @@ -16,7 +18,7 @@\n>  #include \"format_converter.h\"\n>  \n>  ViewFinder::ViewFinder(QWidget *parent)\n> -\t: QWidget(parent)\n> +\t: QWidget(parent), buffer_(nullptr)\n>  {\n>  }\n>  \n> @@ -27,17 +29,23 @@ ViewFinder::~ViewFinder()\n>  int ViewFinder::setFormat(const libcamera::PixelFormat &format,\n>  \t\t\t  const QSize &size)\n>  {\n> -\tint ret;\n> +\timage_ = QImage();\n> +\n> +\t/*\n> +\t * If format conversion is needed, configure the converter and allocate\n> +\t * the destination image.\n> +\t */\n> +\tif (format != DRM_FORMAT_ARGB8888) {\n\nIs this the only format which doesn't require converting? Can Qt support\nany other formats for direct render? (I'm assuming things like a\ncompatible format which doesn't have alpha blending or such, but that\nalpha is ignored perhaps?)\n\n> +\t\tint ret = converter_.configure(format, size);\n> +\t\tif (ret < 0)\n> +\t\t\treturn ret;\n>  \n> -\tret = converter_.configure(format, size);\n> -\tif (ret < 0)\n> -\t\treturn ret;\n> +\t\timage_ = QImage(size, QImage::Format_RGB32);\n> +\t}\n>  \n>  \tformat_ = format;\n>  \tsize_ = size;\n>  \n> -\timage_ = QImage(size_, QImage::Format_RGB32);\n> -\n>  \tupdateGeometry();\n>  \treturn 0;\n>  }\n> @@ -49,19 +57,36 @@ void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)\n>  \t\treturn;\n>  \t}\n>  \n> -\tQMutexLocker locker(&mutex_);\n> -\n> -\t/*\n> -\t * \\todo We're not supposed to block the pipeline handler thread\n> -\t * for long, implement a better way to save images without\n> -\t * impacting performances.\n> -\t */\n> +\tunsigned char *memory = static_cast<unsigned char *>(map->memory);\n> +\tsize_t size = buffer->metadata().planes[0].bytesused;\n> +\n> +\t{\n> +\t\tQMutexLocker locker(&mutex_);\n> +\n> +\t\tif (format_ == DRM_FORMAT_ARGB8888) {\n> +\t\t\t/*\n> +\t\t\t * If the frame format is identical to the display\n> +\t\t\t * format, create a QImage that references the frame\n> +\t\t\t * and store a reference to the frame buffer. The\n> +\t\t\t * previously stored frame buffer, if any, will be\n> +\t\t\t * released.\n> +\t\t\t */\n> +\t\t\timage_ = QImage(memory, size_.width(), size_.height(),\n> +\t\t\t\t\tsize / size_.height(), QImage::Format_RGB32);\n\nIs that stride 'guaranteed'?\nOr should we get it from somewhere else?\n\nIf we can't get this from the buffer - do we need to add a todo note for\nthe future?\n\n> +\t\t\tstd::swap(buffer, buffer_);\n\n\nDo we need to release buffer_ on stop at all?\n\n\n> +\t\t} else {\n> +\t\t\t/*\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}\n> +\t}\n>  \n> -\tconverter_.convert(static_cast<unsigned char *>(map->memory),\n> -\t\t\t   buffer->metadata().planes[0].bytesused, &image_);\n>  \tupdate();\n>  \n> -\trenderComplete(buffer);\n> +\tif (buffer)\n> +\t\trenderComplete(buffer);\n>  }\n>  \n>  QImage ViewFinder::getCurrentImage()\n> diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h\n> index 54c0fa9dd7a0..b5153160f70e 100644\n> --- a/src/qcam/viewfinder.h\n> +++ b/src/qcam/viewfinder.h\n> @@ -52,6 +52,7 @@ private:\n>  \tlibcamera::PixelFormat format_;\n>  \tQSize size_;\n>  \n> +\tlibcamera::FrameBuffer *buffer_;\n>  \tQImage image_;\n>  \tQMutex mutex_; /* Prevent concurrent access to image_ */\n>  };\n>","headers":{"Return-Path":"<kieran.bingham@ideasonboard.com>","Received":["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 084B760417\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 23 Mar 2020 18:23:14 +0100 (CET)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5DDA5308;\n\tMon, 23 Mar 2020 18:23:12 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584984193;\n\tbh=VOqy5QC4M6giebbvErNG1d705z+xL2ckVnTID72Uczs=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=wNlhUkm433Zd8a0S7opE5mQdkq1Vq61iwqN18RvXe1hSFbVe7dycrmdpczvCL5HPQ\n\twb6QlleVdENLqqLKLW+TToirSIwUGoNBvAcElpGXRB1v7vZVw76Srbeo1LZYCKPbQd\n\tKDi865G25Wld0hgdyyQpSRIgv9xFlAHz1pQaxt/c=","Reply-To":"kieran.bingham@ideasonboard.com","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20200323142205.28342-1-laurent.pinchart@ideasonboard.com>\n\t<20200323142205.28342-20-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Openpgp":"preference=signencrypt","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<89d86e7f-ab26-3f0a-4abb-496f78a01992@ideasonboard.com>","Date":"Mon, 23 Mar 2020 17:23:06 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101\n\tThunderbird/60.9.1","MIME-Version":"1.0","In-Reply-To":"<20200323142205.28342-20-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH 19/21] qcam: viewfinder: Avoid memory\n\tcopy when conversion isn't needed","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>","X-List-Received-Date":"Mon, 23 Mar 2020 17:23:14 -0000"}},{"id":4238,"web_url":"https://patchwork.libcamera.org/comment/4238/","msgid":"<20200323172716.GS4768@pendragon.ideasonboard.com>","date":"2020-03-23T17:27:16","subject":"Re: [libcamera-devel] [PATCH 19/21] qcam: viewfinder: Avoid memory\n\tcopy when conversion isn't needed","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Mon, Mar 23, 2020 at 05:23:06PM +0000, Kieran Bingham wrote:\n> On 23/03/2020 14:22, Laurent Pinchart wrote:\n> > If the frame buffer format is identical to the display format, the\n> > viewfinder still invokes the converter to perform what is essentially a\n> > slow memcpy(). Make is possible to skip that operation by creating a\n> \n> s/is/it/\n> \n> > QImage referencing the buffer memory instead. A reference to the frame\n> > buffer is kept internally, and released when the next buffer is queued,\n> > pushing the current one out.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> Some questions ... but nothing blocking I don't think\n> \n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> > ---\n> >  src/qcam/viewfinder.cpp | 59 +++++++++++++++++++++++++++++------------\n> >  src/qcam/viewfinder.h   |  1 +\n> >  2 files changed, 43 insertions(+), 17 deletions(-)\n> > \n> > diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp\n> > index 31b358da47dc..4c35659e24aa 100644\n> > --- a/src/qcam/viewfinder.cpp\n> > +++ b/src/qcam/viewfinder.cpp\n> > @@ -7,6 +7,8 @@\n> >  \n> >  #include \"viewfinder.h\"\n> >  \n> > +#include <utility>\n> > +\n> >  #include <QImage>\n> >  #include <QImageWriter>\n> >  #include <QMutexLocker>\n> > @@ -16,7 +18,7 @@\n> >  #include \"format_converter.h\"\n> >  \n> >  ViewFinder::ViewFinder(QWidget *parent)\n> > -\t: QWidget(parent)\n> > +\t: QWidget(parent), buffer_(nullptr)\n> >  {\n> >  }\n> >  \n> > @@ -27,17 +29,23 @@ ViewFinder::~ViewFinder()\n> >  int ViewFinder::setFormat(const libcamera::PixelFormat &format,\n> >  \t\t\t  const QSize &size)\n> >  {\n> > -\tint ret;\n> > +\timage_ = QImage();\n> > +\n> > +\t/*\n> > +\t * If format conversion is needed, configure the converter and allocate\n> > +\t * the destination image.\n> > +\t */\n> > +\tif (format != DRM_FORMAT_ARGB8888) {\n> \n> Is this the only format which doesn't require converting? Can Qt support\n> any other formats for direct render? (I'm assuming things like a\n> compatible format which doesn't have alpha blending or such, but that\n> alpha is ignored perhaps?)\n\nSee the last patch in the series :-)\n\n> > +\t\tint ret = converter_.configure(format, size);\n> > +\t\tif (ret < 0)\n> > +\t\t\treturn ret;\n> >  \n> > -\tret = converter_.configure(format, size);\n> > -\tif (ret < 0)\n> > -\t\treturn ret;\n> > +\t\timage_ = QImage(size, QImage::Format_RGB32);\n> > +\t}\n> >  \n> >  \tformat_ = format;\n> >  \tsize_ = size;\n> >  \n> > -\timage_ = QImage(size_, QImage::Format_RGB32);\n> > -\n> >  \tupdateGeometry();\n> >  \treturn 0;\n> >  }\n> > @@ -49,19 +57,36 @@ void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)\n> >  \t\treturn;\n> >  \t}\n> >  \n> > -\tQMutexLocker locker(&mutex_);\n> > -\n> > -\t/*\n> > -\t * \\todo We're not supposed to block the pipeline handler thread\n> > -\t * for long, implement a better way to save images without\n> > -\t * impacting performances.\n> > -\t */\n> > +\tunsigned char *memory = static_cast<unsigned char *>(map->memory);\n> > +\tsize_t size = buffer->metadata().planes[0].bytesused;\n> > +\n> > +\t{\n> > +\t\tQMutexLocker locker(&mutex_);\n> > +\n> > +\t\tif (format_ == DRM_FORMAT_ARGB8888) {\n> > +\t\t\t/*\n> > +\t\t\t * If the frame format is identical to the display\n> > +\t\t\t * format, create a QImage that references the frame\n> > +\t\t\t * and store a reference to the frame buffer. The\n> > +\t\t\t * previously stored frame buffer, if any, will be\n> > +\t\t\t * released.\n> > +\t\t\t */\n> > +\t\t\timage_ = QImage(memory, size_.width(), size_.height(),\n> > +\t\t\t\t\tsize / size_.height(), QImage::Format_RGB32);\n> \n> Is that stride 'guaranteed'?\n> Or should we get it from somewhere else?\n> \n> If we can't get this from the buffer - do we need to add a todo note for\n> the future?\n\nWe should get it from the buffer, but we don't support strides yet. I'll\nadd a todo.\n\n> > +\t\t\tstd::swap(buffer, buffer_);\n> \n> Do we need to release buffer_ on stop at all?\n\nYes. It's in the next patch, I'll move it here.\n\n> > +\t\t} else {\n> > +\t\t\t/*\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}\n> > +\t}\n> >  \n> > -\tconverter_.convert(static_cast<unsigned char *>(map->memory),\n> > -\t\t\t   buffer->metadata().planes[0].bytesused, &image_);\n> >  \tupdate();\n> >  \n> > -\trenderComplete(buffer);\n> > +\tif (buffer)\n> > +\t\trenderComplete(buffer);\n> >  }\n> >  \n> >  QImage ViewFinder::getCurrentImage()\n> > diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h\n> > index 54c0fa9dd7a0..b5153160f70e 100644\n> > --- a/src/qcam/viewfinder.h\n> > +++ b/src/qcam/viewfinder.h\n> > @@ -52,6 +52,7 @@ private:\n> >  \tlibcamera::PixelFormat format_;\n> >  \tQSize size_;\n> >  \n> > +\tlibcamera::FrameBuffer *buffer_;\n> >  \tQImage image_;\n> >  \tQMutex mutex_; /* Prevent concurrent access to image_ */\n> >  };","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 1AFED60417\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 23 Mar 2020 18:27:26 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7C647308;\n\tMon, 23 Mar 2020 18:27:25 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584984445;\n\tbh=s2MejiQyu4tErqsXct4+sMX0V3nWaNwX0u4iYEcADUg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=RTDh7VfL789OKAYp7yrDr5bogydDLlzuEUQOpnETMD60qa/l+xlKAtGwdbWWu0Vw3\n\t0/ofun4Lyo+PRXUA9e05hBZBn1SS/DGqFL0gikAEhXeVZI5/AZBMxlki6ElQVuMlbp\n\tJcfsU0ASpLvDW3g1MLmx1PFxwNBpKzDlnJi0KhWo=","Date":"Mon, 23 Mar 2020 19:27:16 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200323172716.GS4768@pendragon.ideasonboard.com>","References":"<20200323142205.28342-1-laurent.pinchart@ideasonboard.com>\n\t<20200323142205.28342-20-laurent.pinchart@ideasonboard.com>\n\t<89d86e7f-ab26-3f0a-4abb-496f78a01992@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<89d86e7f-ab26-3f0a-4abb-496f78a01992@ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 19/21] qcam: viewfinder: Avoid memory\n\tcopy when conversion isn't needed","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>","X-List-Received-Date":"Mon, 23 Mar 2020 17:27:26 -0000"}}]