Show a patch.

GET /api/patches/1694/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 1694,
    "url": "https://patchwork.libcamera.org/api/patches/1694/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/1694/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>",
    "date": "2019-07-13T17:23:48",
    "name": "[libcamera-devel,v2,13/16] libcamera: buffer: Add an accessor to the BufferMemory",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "e0b8ea49f7eb4aeef75c385505780e8750ec092c",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/1694/mbox/",
    "series": [
        {
            "id": 430,
            "url": "https://patchwork.libcamera.org/api/series/430/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=430",
            "date": "2019-07-13T17:23:35",
            "name": "Add support for external buffers",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/430/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/1694/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/1694/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<laurent.pinchart@ideasonboard.com>",
        "Received": [
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C91276175D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 13 Jul 2019 19:24:46 +0200 (CEST)",
            "from pendragon.ideasonboard.com (softbank126209254147.bbtec.net\n\t[126.209.254.147])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A5176443\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 13 Jul 2019 19:24:45 +0200 (CEST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1563038686;\n\tbh=WwzHjo3EpbabPlrEc9YQlp+qaNt+gRdbsBYtHx0VJbA=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=q4cjq8RYMCZvjUYVWfXI/6oQ127omqO80nX65/tb/VpsGSBAUB0BXfxpWMsG9Ptn6\n\t3gW4g1+n93RSEb8PQHg1mHOnKOjjd3akXmSUYKl5a9Dw2BMrodIeK8g+50bfR7UOvI\n\t2gvuS6IPdZyjYNksZM3tFKWNsgza4r7UWfUHjy7w=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Sat, 13 Jul 2019 20:23:48 +0300",
        "Message-Id": "<20190713172351.25452-14-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>",
        "References": "<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[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": "Sat, 13 Jul 2019 17:24:47 -0000"
    },
    "content": "Buffer instances reference memory, which is modelled internally by a\nBufferMemory instance. Store a pointer to the BufferMemory in the Buffer\nclass, and populate it when the buffer is queued to the camera through a\nrequest. This is useful for applications to access the buffer memory in\nthe buffer or request completion handler.\n\nSigned-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(-)",
    "diff": "diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\nindex 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_;\ndiff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp\nindex 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();\ndiff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h\nindex 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_;\ndiff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\nindex 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;\ndiff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\nindex 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\ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 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();\ndiff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\nindex 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 \ndiff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\nindex 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",
    "prefixes": [
        "libcamera-devel",
        "v2",
        "13/16"
    ]
}