[{"id":2250,"web_url":"https://patchwork.libcamera.org/comment/2250/","msgid":"<20190714072744.5nwubddqoaepoiy4@uno.localdomain>","date":"2019-07-14T07:27:44","subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Sat, Jul 13, 2019 at 08:23:48PM +0300, Laurent Pinchart wrote:\n> Buffer instances reference memory, which is modelled internally by a\n> BufferMemory instance. Store a pointer to the BufferMemory in the Buffer\n> class, and populate it when the buffer is queued to the camera through a\n> request. This is useful for applications to access the buffer memory in\n> the buffer or request completion handler.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/buffer.h |  3 +++\n>  src/cam/buffer_writer.cpp  |  4 ++--\n>  src/cam/buffer_writer.h    |  3 +--\n>  src/cam/capture.cpp        |  3 +--\n>  src/libcamera/buffer.cpp   | 11 +++++++++++\n>  src/libcamera/camera.cpp   |  4 ++++\n>  src/qcam/main_window.cpp   |  7 +++----\n>  src/qcam/main_window.h     |  2 +-\n>  8 files changed, 26 insertions(+), 11 deletions(-)\n>\n> diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\n> index f8569a6b67f3..fc5c7d4c41b6 100644\n> --- a/include/libcamera/buffer.h\n> +++ b/include/libcamera/buffer.h\n> @@ -77,6 +77,7 @@ public:\n>\n>  \tunsigned int index() const { return index_; }\n>  \tconst std::array<int, 3> &dmabufs() const { return dmabuf_; }\n> +\tBufferMemory *mem() { return mem_; }\n\nShould this return a const * or is the buffer available in write mode\ntoo ?\n\n>\n>  \tunsigned int bytesused() const { return bytesused_; }\n>  \tuint64_t timestamp() const { return timestamp_; }\n> @@ -87,6 +88,7 @@ public:\n>  \tStream *stream() const { return stream_; }\n>\n>  private:\n> +\tfriend class Camera;\n>  \tfriend class PipelineHandler;\n>  \tfriend class Request;\n>  \tfriend class Stream;\n> @@ -98,6 +100,7 @@ private:\n>\n>  \tunsigned int index_;\n>  \tstd::array<int, 3> dmabuf_;\n> +\tBufferMemory *mem_;\n>\n>  \tunsigned int bytesused_;\n>  \tuint64_t timestamp_;\n> diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp\n> index b7f2ed4f2d2d..1c044b063467 100644\n> --- a/src/cam/buffer_writer.cpp\n> +++ b/src/cam/buffer_writer.cpp\n> @@ -19,8 +19,7 @@ BufferWriter::BufferWriter(const std::string &pattern)\n>  {\n>  }\n>\n> -int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> -\t\t\tconst std::string &streamName)\n> +int BufferWriter::write(libcamera::Buffer *buffer, const std::string &streamName)\n>  {\n>  \tstd::string filename;\n>  \tsize_t pos;\n> @@ -41,6 +40,7 @@ int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n>  \tif (fd == -1)\n>  \t\treturn -errno;\n>\n> +\tlibcamera::BufferMemory *mem = buffer->mem();\n>  \tfor (libcamera::Plane &plane : mem->planes()) {\n>  \t\tvoid *data = plane.mem();\n>  \t\tunsigned int length = plane.length();\n> diff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h\n> index 9bea205fac1d..7bf785d1e832 100644\n> --- a/src/cam/buffer_writer.h\n> +++ b/src/cam/buffer_writer.h\n> @@ -16,8 +16,7 @@ class BufferWriter\n>  public:\n>  \tBufferWriter(const std::string &pattern = \"frame-#.bin\");\n>\n> -\tint write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> -\t\t  const std::string &streamName);\n> +\tint write(libcamera::Buffer *buffer, const std::string &streamName);\n>\n>  private:\n>  \tstd::string pattern_;\n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index 5ffa4ae291da..df9602de4ab8 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -154,7 +154,6 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n>  \tfor (auto it = buffers.begin(); it != buffers.end(); ++it) {\n>  \t\tStream *stream = it->first;\n>  \t\tBuffer *buffer = it->second;\n> -\t\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n>  \t\tconst std::string &name = streamName_[stream];\n>\n>  \t\tinfo << \" \" << name\n> @@ -163,7 +162,7 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n>  \t\t     << \" bytesused: \" << buffer->bytesused();\n>\n>  \t\tif (writer_)\n> -\t\t\twriter_->write(buffer, mem, name);\n> +\t\t\twriter_->write(buffer, name);\n>  \t}\n>\n>  \tstd::cout << info.str() << std::endl;\n> diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\n> index 99358633a088..fe29c2f68619 100644\n> --- a/src/libcamera/buffer.cpp\n> +++ b/src/libcamera/buffer.cpp\n> @@ -300,6 +300,17 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n>   * \\return The dmabuf file descriptors\n>   */\n>\n> +/**\n> + * \\fn Buffer::mem()\n> + * \\brief Retrieve the BufferMemory this buffer is associated with\n> + *\n> + * The association between the buffer and a BufferMemory instance is valid from\n> + * the time the request containing this buffer is queued to a camera to the end\n> + * of that request's completion handler.\n> + *\n> + * \\return The BufferMemory this buffer is associated with\n> + */\n> +\n>  /**\n>   * \\fn Buffer::bytesused()\n>   * \\brief Retrieve the number of bytes occupied by the data in the buffer\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index af69607b19e6..db15fd46cd51 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -811,10 +811,14 @@ int Camera::queueRequest(Request *request)\n>\n>  \tfor (auto const &it : request->buffers()) {\n>  \t\tStream *stream = it.first;\n> +\t\tBuffer *buffer = it.second;\n> +\n>  \t\tif (activeStreams_.find(stream) == activeStreams_.end()) {\n>  \t\t\tLOG(Camera, Error) << \"Invalid request\";\n>  \t\t\treturn -EINVAL;\n>  \t\t}\n> +\n> +\t\tbuffer->mem_ = &stream->buffers()[buffer->index_];\n>  \t}\n>\n>  \tint ret = request->prepare();\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index 92f888323f0b..5c26ab8ebf70 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -221,7 +221,6 @@ void MainWindow::requestComplete(Request *request,\n>\n>  \tframesCaptured_++;\n>\n> -\tStream *stream = buffers.begin()->first;\n>  \tBuffer *buffer = buffers.begin()->second;\n>\n>  \tdouble fps = buffer->timestamp() - lastBufferTime_;\n> @@ -235,8 +234,7 @@ void MainWindow::requestComplete(Request *request,\n>  \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n>  \t\t  << std::endl;\n>\n> -\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n> -\tdisplay(buffer, mem);\n> +\tdisplay(buffer);\n>\n>  \trequest = camera_->createRequest();\n>  \tif (!request) {\n> @@ -261,8 +259,9 @@ void MainWindow::requestComplete(Request *request,\n>  \tcamera_->queueRequest(request);\n>  }\n>\n> -int MainWindow::display(Buffer *buffer, BufferMemory *mem)\n> +int MainWindow::display(Buffer *buffer)\n>  {\n> +\tBufferMemory *mem = buffer->mem();\n>  \tif (mem->planes().size() != 1)\n>  \t\treturn -EINVAL;\n>\n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index b4f6f747e16e..f58cb6a65b2b 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -48,7 +48,7 @@ private:\n>\n>  \tvoid requestComplete(Request *request,\n>  \t\t\t     const std::map<Stream *, Buffer *> &buffers);\n> -\tint display(Buffer *buffer, BufferMemory *mem);\n> +\tint display(Buffer *buffer);\n>\n>  \tQString title_;\n>  \tQTimer titleTimer_;\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5BAE560E3F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 09:26:31 +0200 (CEST)","from uno.localdomain (softbank126159224182.bbtec.net\n\t[126.159.224.182]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id E07B440003;\n\tSun, 14 Jul 2019 07:26:29 +0000 (UTC)"],"X-Originating-IP":"126.159.224.182","Date":"Sun, 14 Jul 2019 09:27:44 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190714072744.5nwubddqoaepoiy4@uno.localdomain>","References":"<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>\n\t<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"owvsdi5aktfyid4t\"","Content-Disposition":"inline","In-Reply-To":"<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Sun, 14 Jul 2019 07:26:31 -0000"}},{"id":2252,"web_url":"https://patchwork.libcamera.org/comment/2252/","msgid":"<20190714074040.GA6043@pendragon.ideasonboard.com>","date":"2019-07-14T07:40:40","subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Sun, Jul 14, 2019 at 09:27:44AM +0200, Jacopo Mondi wrote:\n> On Sat, Jul 13, 2019 at 08:23:48PM +0300, Laurent Pinchart wrote:\n> > Buffer instances reference memory, which is modelled internally by a\n> > BufferMemory instance. Store a pointer to the BufferMemory in the Buffer\n> > class, and populate it when the buffer is queued to the camera through a\n> > request. This is useful for applications to access the buffer memory in\n> > the buffer or request completion handler.\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  include/libcamera/buffer.h |  3 +++\n> >  src/cam/buffer_writer.cpp  |  4 ++--\n> >  src/cam/buffer_writer.h    |  3 +--\n> >  src/cam/capture.cpp        |  3 +--\n> >  src/libcamera/buffer.cpp   | 11 +++++++++++\n> >  src/libcamera/camera.cpp   |  4 ++++\n> >  src/qcam/main_window.cpp   |  7 +++----\n> >  src/qcam/main_window.h     |  2 +-\n> >  8 files changed, 26 insertions(+), 11 deletions(-)\n> >\n> > diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\n> > index f8569a6b67f3..fc5c7d4c41b6 100644\n> > --- a/include/libcamera/buffer.h\n> > +++ b/include/libcamera/buffer.h\n> > @@ -77,6 +77,7 @@ public:\n> >\n> >  \tunsigned int index() const { return index_; }\n> >  \tconst std::array<int, 3> &dmabufs() const { return dmabuf_; }\n> > +\tBufferMemory *mem() { return mem_; }\n> \n> Should this return a const * or is the buffer available in write mode\n> too ?\n\nThe BufferMemory is used to retrieve a plane, which is then used to\naccess the plane's CPU-mapped memory, and that can't operate on a const\npointer.\n\n> >\n> >  \tunsigned int bytesused() const { return bytesused_; }\n> >  \tuint64_t timestamp() const { return timestamp_; }\n> > @@ -87,6 +88,7 @@ public:\n> >  \tStream *stream() const { return stream_; }\n> >\n> >  private:\n> > +\tfriend class Camera;\n> >  \tfriend class PipelineHandler;\n> >  \tfriend class Request;\n> >  \tfriend class Stream;\n> > @@ -98,6 +100,7 @@ private:\n> >\n> >  \tunsigned int index_;\n> >  \tstd::array<int, 3> dmabuf_;\n> > +\tBufferMemory *mem_;\n> >\n> >  \tunsigned int bytesused_;\n> >  \tuint64_t timestamp_;\n> > diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp\n> > index b7f2ed4f2d2d..1c044b063467 100644\n> > --- a/src/cam/buffer_writer.cpp\n> > +++ b/src/cam/buffer_writer.cpp\n> > @@ -19,8 +19,7 @@ BufferWriter::BufferWriter(const std::string &pattern)\n> >  {\n> >  }\n> >\n> > -int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> > -\t\t\tconst std::string &streamName)\n> > +int BufferWriter::write(libcamera::Buffer *buffer, const std::string &streamName)\n> >  {\n> >  \tstd::string filename;\n> >  \tsize_t pos;\n> > @@ -41,6 +40,7 @@ int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> >  \tif (fd == -1)\n> >  \t\treturn -errno;\n> >\n> > +\tlibcamera::BufferMemory *mem = buffer->mem();\n> >  \tfor (libcamera::Plane &plane : mem->planes()) {\n> >  \t\tvoid *data = plane.mem();\n> >  \t\tunsigned int length = plane.length();\n> > diff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h\n> > index 9bea205fac1d..7bf785d1e832 100644\n> > --- a/src/cam/buffer_writer.h\n> > +++ b/src/cam/buffer_writer.h\n> > @@ -16,8 +16,7 @@ class BufferWriter\n> >  public:\n> >  \tBufferWriter(const std::string &pattern = \"frame-#.bin\");\n> >\n> > -\tint write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> > -\t\t  const std::string &streamName);\n> > +\tint write(libcamera::Buffer *buffer, const std::string &streamName);\n> >\n> >  private:\n> >  \tstd::string pattern_;\n> > diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> > index 5ffa4ae291da..df9602de4ab8 100644\n> > --- a/src/cam/capture.cpp\n> > +++ b/src/cam/capture.cpp\n> > @@ -154,7 +154,6 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n> >  \tfor (auto it = buffers.begin(); it != buffers.end(); ++it) {\n> >  \t\tStream *stream = it->first;\n> >  \t\tBuffer *buffer = it->second;\n> > -\t\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n> >  \t\tconst std::string &name = streamName_[stream];\n> >\n> >  \t\tinfo << \" \" << name\n> > @@ -163,7 +162,7 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n> >  \t\t     << \" bytesused: \" << buffer->bytesused();\n> >\n> >  \t\tif (writer_)\n> > -\t\t\twriter_->write(buffer, mem, name);\n> > +\t\t\twriter_->write(buffer, name);\n> >  \t}\n> >\n> >  \tstd::cout << info.str() << std::endl;\n> > diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\n> > index 99358633a088..fe29c2f68619 100644\n> > --- a/src/libcamera/buffer.cpp\n> > +++ b/src/libcamera/buffer.cpp\n> > @@ -300,6 +300,17 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n> >   * \\return The dmabuf file descriptors\n> >   */\n> >\n> > +/**\n> > + * \\fn Buffer::mem()\n> > + * \\brief Retrieve the BufferMemory this buffer is associated with\n> > + *\n> > + * The association between the buffer and a BufferMemory instance is valid from\n> > + * the time the request containing this buffer is queued to a camera to the end\n> > + * of that request's completion handler.\n> > + *\n> > + * \\return The BufferMemory this buffer is associated with\n> > + */\n> > +\n> >  /**\n> >   * \\fn Buffer::bytesused()\n> >   * \\brief Retrieve the number of bytes occupied by the data in the buffer\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index af69607b19e6..db15fd46cd51 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -811,10 +811,14 @@ int Camera::queueRequest(Request *request)\n> >\n> >  \tfor (auto const &it : request->buffers()) {\n> >  \t\tStream *stream = it.first;\n> > +\t\tBuffer *buffer = it.second;\n> > +\n> >  \t\tif (activeStreams_.find(stream) == activeStreams_.end()) {\n> >  \t\t\tLOG(Camera, Error) << \"Invalid request\";\n> >  \t\t\treturn -EINVAL;\n> >  \t\t}\n> > +\n> > +\t\tbuffer->mem_ = &stream->buffers()[buffer->index_];\n> >  \t}\n> >\n> >  \tint ret = request->prepare();\n> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> > index 92f888323f0b..5c26ab8ebf70 100644\n> > --- a/src/qcam/main_window.cpp\n> > +++ b/src/qcam/main_window.cpp\n> > @@ -221,7 +221,6 @@ void MainWindow::requestComplete(Request *request,\n> >\n> >  \tframesCaptured_++;\n> >\n> > -\tStream *stream = buffers.begin()->first;\n> >  \tBuffer *buffer = buffers.begin()->second;\n> >\n> >  \tdouble fps = buffer->timestamp() - lastBufferTime_;\n> > @@ -235,8 +234,7 @@ void MainWindow::requestComplete(Request *request,\n> >  \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n> >  \t\t  << std::endl;\n> >\n> > -\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n> > -\tdisplay(buffer, mem);\n> > +\tdisplay(buffer);\n> >\n> >  \trequest = camera_->createRequest();\n> >  \tif (!request) {\n> > @@ -261,8 +259,9 @@ void MainWindow::requestComplete(Request *request,\n> >  \tcamera_->queueRequest(request);\n> >  }\n> >\n> > -int MainWindow::display(Buffer *buffer, BufferMemory *mem)\n> > +int MainWindow::display(Buffer *buffer)\n> >  {\n> > +\tBufferMemory *mem = buffer->mem();\n> >  \tif (mem->planes().size() != 1)\n> >  \t\treturn -EINVAL;\n> >\n> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> > index b4f6f747e16e..f58cb6a65b2b 100644\n> > --- a/src/qcam/main_window.h\n> > +++ b/src/qcam/main_window.h\n> > @@ -48,7 +48,7 @@ private:\n> >\n> >  \tvoid requestComplete(Request *request,\n> >  \t\t\t     const std::map<Stream *, Buffer *> &buffers);\n> > -\tint display(Buffer *buffer, BufferMemory *mem);\n> > +\tint display(Buffer *buffer);\n> >\n> >  \tQString title_;\n> >  \tQTimer titleTimer_;","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 4F91560E3F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 09:41:10 +0200 (CEST)","from pendragon.ideasonboard.com (softbank126159224182.bbtec.net\n\t[126.159.224.182])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8D8E2B2;\n\tSun, 14 Jul 2019 09:41:08 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1563090069;\n\tbh=/uRTVxyHWNOMLScXN6HzgtHTBetJKdAh0YJdeFag5CY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=rd8MwgT0WyzB5c9fAtL91xJ9ylw+sjkCE/OHkqxcVbViaQEb4bCviWTacqHDD38/Z\n\t6dgH1fB5eIax0HJnbcUGofuSD9WRlKNOB7Qtd8IgehA/tvvY2of6sSzMlsmVkxiEAt\n\ti+UXiq0ltwGX13/9G371dm3Ae8pw6mmWUzXnHXbc=","Date":"Sun, 14 Jul 2019 10:40:40 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190714074040.GA6043@pendragon.ideasonboard.com>","References":"<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>\n\t<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>\n\t<20190714072744.5nwubddqoaepoiy4@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190714072744.5nwubddqoaepoiy4@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Sun, 14 Jul 2019 07:41:10 -0000"}},{"id":2266,"web_url":"https://patchwork.libcamera.org/comment/2266/","msgid":"<20190714105708.GK31102@wyvern>","date":"2019-07-14T10:57:08","subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your work.\n\nOn 2019-07-13 20:23:48 +0300, Laurent Pinchart wrote:\n> Buffer instances reference memory, which is modelled internally by a\n> BufferMemory instance. Store a pointer to the BufferMemory in the Buffer\n> class, and populate it when the buffer is queued to the camera through a\n> request. This is useful for applications to access the buffer memory in\n> the buffer or request completion handler.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  include/libcamera/buffer.h |  3 +++\n>  src/cam/buffer_writer.cpp  |  4 ++--\n>  src/cam/buffer_writer.h    |  3 +--\n>  src/cam/capture.cpp        |  3 +--\n>  src/libcamera/buffer.cpp   | 11 +++++++++++\n>  src/libcamera/camera.cpp   |  4 ++++\n>  src/qcam/main_window.cpp   |  7 +++----\n>  src/qcam/main_window.h     |  2 +-\n>  8 files changed, 26 insertions(+), 11 deletions(-)\n> \n> diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\n> index f8569a6b67f3..fc5c7d4c41b6 100644\n> --- a/include/libcamera/buffer.h\n> +++ b/include/libcamera/buffer.h\n> @@ -77,6 +77,7 @@ public:\n>  \n>  \tunsigned int index() const { return index_; }\n>  \tconst std::array<int, 3> &dmabufs() const { return dmabuf_; }\n> +\tBufferMemory *mem() { return mem_; }\n>  \n>  \tunsigned int bytesused() const { return bytesused_; }\n>  \tuint64_t timestamp() const { return timestamp_; }\n> @@ -87,6 +88,7 @@ public:\n>  \tStream *stream() const { return stream_; }\n>  \n>  private:\n> +\tfriend class Camera;\n>  \tfriend class PipelineHandler;\n>  \tfriend class Request;\n>  \tfriend class Stream;\n> @@ -98,6 +100,7 @@ private:\n>  \n>  \tunsigned int index_;\n>  \tstd::array<int, 3> dmabuf_;\n> +\tBufferMemory *mem_;\n>  \n>  \tunsigned int bytesused_;\n>  \tuint64_t timestamp_;\n> diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp\n> index b7f2ed4f2d2d..1c044b063467 100644\n> --- a/src/cam/buffer_writer.cpp\n> +++ b/src/cam/buffer_writer.cpp\n> @@ -19,8 +19,7 @@ BufferWriter::BufferWriter(const std::string &pattern)\n>  {\n>  }\n>  \n> -int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> -\t\t\tconst std::string &streamName)\n> +int BufferWriter::write(libcamera::Buffer *buffer, const std::string &streamName)\n>  {\n>  \tstd::string filename;\n>  \tsize_t pos;\n> @@ -41,6 +40,7 @@ int BufferWriter::write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n>  \tif (fd == -1)\n>  \t\treturn -errno;\n>  \n> +\tlibcamera::BufferMemory *mem = buffer->mem();\n>  \tfor (libcamera::Plane &plane : mem->planes()) {\n>  \t\tvoid *data = plane.mem();\n>  \t\tunsigned int length = plane.length();\n> diff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h\n> index 9bea205fac1d..7bf785d1e832 100644\n> --- a/src/cam/buffer_writer.h\n> +++ b/src/cam/buffer_writer.h\n> @@ -16,8 +16,7 @@ class BufferWriter\n>  public:\n>  \tBufferWriter(const std::string &pattern = \"frame-#.bin\");\n>  \n> -\tint write(libcamera::Buffer *buffer, libcamera::BufferMemory *mem,\n> -\t\t  const std::string &streamName);\n> +\tint write(libcamera::Buffer *buffer, const std::string &streamName);\n>  \n>  private:\n>  \tstd::string pattern_;\n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index 5ffa4ae291da..df9602de4ab8 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -154,7 +154,6 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n>  \tfor (auto it = buffers.begin(); it != buffers.end(); ++it) {\n>  \t\tStream *stream = it->first;\n>  \t\tBuffer *buffer = it->second;\n> -\t\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n>  \t\tconst std::string &name = streamName_[stream];\n>  \n>  \t\tinfo << \" \" << name\n> @@ -163,7 +162,7 @@ void Capture::requestComplete(Request *request, const std::map<Stream *, Buffer\n>  \t\t     << \" bytesused: \" << buffer->bytesused();\n>  \n>  \t\tif (writer_)\n> -\t\t\twriter_->write(buffer, mem, name);\n> +\t\t\twriter_->write(buffer, name);\n>  \t}\n>  \n>  \tstd::cout << info.str() << std::endl;\n> diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\n> index 99358633a088..fe29c2f68619 100644\n> --- a/src/libcamera/buffer.cpp\n> +++ b/src/libcamera/buffer.cpp\n> @@ -300,6 +300,17 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n>   * \\return The dmabuf file descriptors\n>   */\n>  \n> +/**\n> + * \\fn Buffer::mem()\n> + * \\brief Retrieve the BufferMemory this buffer is associated with\n> + *\n> + * The association between the buffer and a BufferMemory instance is valid from\n> + * the time the request containing this buffer is queued to a camera to the end\n> + * of that request's completion handler.\n> + *\n> + * \\return The BufferMemory this buffer is associated with\n> + */\n> +\n>  /**\n>   * \\fn Buffer::bytesused()\n>   * \\brief Retrieve the number of bytes occupied by the data in the buffer\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index af69607b19e6..db15fd46cd51 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -811,10 +811,14 @@ int Camera::queueRequest(Request *request)\n>  \n>  \tfor (auto const &it : request->buffers()) {\n>  \t\tStream *stream = it.first;\n> +\t\tBuffer *buffer = it.second;\n> +\n>  \t\tif (activeStreams_.find(stream) == activeStreams_.end()) {\n>  \t\t\tLOG(Camera, Error) << \"Invalid request\";\n>  \t\t\treturn -EINVAL;\n>  \t\t}\n> +\n> +\t\tbuffer->mem_ = &stream->buffers()[buffer->index_];\n>  \t}\n>  \n>  \tint ret = request->prepare();\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index 92f888323f0b..5c26ab8ebf70 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -221,7 +221,6 @@ void MainWindow::requestComplete(Request *request,\n>  \n>  \tframesCaptured_++;\n>  \n> -\tStream *stream = buffers.begin()->first;\n>  \tBuffer *buffer = buffers.begin()->second;\n>  \n>  \tdouble fps = buffer->timestamp() - lastBufferTime_;\n> @@ -235,8 +234,7 @@ void MainWindow::requestComplete(Request *request,\n>  \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n>  \t\t  << std::endl;\n>  \n> -\tBufferMemory *mem = &stream->buffers()[buffer->index()];\n> -\tdisplay(buffer, mem);\n> +\tdisplay(buffer);\n>  \n>  \trequest = camera_->createRequest();\n>  \tif (!request) {\n> @@ -261,8 +259,9 @@ void MainWindow::requestComplete(Request *request,\n>  \tcamera_->queueRequest(request);\n>  }\n>  \n> -int MainWindow::display(Buffer *buffer, BufferMemory *mem)\n> +int MainWindow::display(Buffer *buffer)\n>  {\n> +\tBufferMemory *mem = buffer->mem();\n>  \tif (mem->planes().size() != 1)\n>  \t\treturn -EINVAL;\n>  \n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index b4f6f747e16e..f58cb6a65b2b 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -48,7 +48,7 @@ private:\n>  \n>  \tvoid requestComplete(Request *request,\n>  \t\t\t     const std::map<Stream *, Buffer *> &buffers);\n> -\tint display(Buffer *buffer, BufferMemory *mem);\n> +\tint display(Buffer *buffer);\n>  \n>  \tQString title_;\n>  \tQTimer titleTimer_;\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-pf1-x441.google.com (mail-pf1-x441.google.com\n\t[IPv6:2607:f8b0:4864:20::441])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D503161572\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 12:57:14 +0200 (CEST)","by mail-pf1-x441.google.com with SMTP id b13so6158330pfo.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 03:57:14 -0700 (PDT)","from localhost (softbank126159224182.bbtec.net. [126.159.224.182])\n\tby smtp.gmail.com with ESMTPSA id\n\tp187sm20970303pfg.89.2019.07.14.03.57.11\n\t(version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256);\n\tSun, 14 Jul 2019 03:57:12 -0700 (PDT)"],"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\t:user-agent; bh=xfCSWEHEkGE9sp681OZCWOY3o3cwkbAbEfZlh/tsYIg=;\n\tb=CooFfuOr1r79xs30XKYWGXQeemYZ1vkRIejK2j6sFwtHGC3Kk+yRHoapxT4laMY4UG\n\tUZGgBRCdmHbbXk9IKSBv/bxFsEt77gXeyffefKf8HQdfMABmAvdBpE6OYlz28l/kEP6t\n\t76fcKflYNLLxI3FHfWTZ9xS146UIN2DLUS8ruguLqTRTeA9uRe9k3RICkWg7u0/acOmU\n\t7aMt7U2eGdXcLUO+949Qf2iZP7eQkzy4mxFUv79FshI9FI67X2u/tTODTK5trwyAggR8\n\tWbU4wIbbBZc+Vw0lFtVbPHuHZjN0iOR7lCS7NC4EnCeB8IK1UcGUsk4YfO0TASyL1KtR\n\tuN2g==","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:user-agent;\n\tbh=xfCSWEHEkGE9sp681OZCWOY3o3cwkbAbEfZlh/tsYIg=;\n\tb=jCUokJrfFYvyU78zYhEP1mhcVtvhhX3/5C5feoumU9lNLpyUxYVMLCbwqFL5zrOhZm\n\tJRviFMcHURYqbdktZ6BFo7Gd4N1DKpWKaUei13qAzWWOrsMFtKtQYsCdkNGdFNeJmToC\n\t9U5w7B/bLuIgIplEkKJitHk/gv6vR2tU0VIFFg82DdVqe3A3kl853xrT5RT+lVb7zUQk\n\tPz+IuHy60B9T0oqi4L875vXzOPHJzE+LJEYQcK9ayhzEPx8c4F6QE3fy/629q3LJWzVk\n\tvnGhYaEtNIqHjTa2gRud6IrA/RrcWMrGohJ04ypBJkbk25lxU0VjM2zEWaRWbm67MCIh\n\tJuYw==","X-Gm-Message-State":"APjAAAVl/Kyl6SRdTFXmPQSP3PXGDsDf/1il3hTnX07AKmD4mLv9VLfx\n\t3FezdshzOXGd4neHvS8OlAFIAbB/hTI=","X-Google-Smtp-Source":"APXvYqwJ9+K6RrA1obsGknWD8aEFFkk/vqn5tdsIczUvd6Tc1omuzlsZoilVtYlFfVHC9+7jFPLOiQ==","X-Received":"by 2002:a65:48c3:: with SMTP id o3mr21612478pgs.70.1563101833509;\n\tSun, 14 Jul 2019 03:57:13 -0700 (PDT)","Date":"Sun, 14 Jul 2019 19:57:08 +0900","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190714105708.GK31102@wyvern>","References":"<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>\n\t<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 13/16] libcamera: buffer: Add an\n\taccessor to the BufferMemory","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Sun, 14 Jul 2019 10:57:15 -0000"}}]