Patch Detail
Show a patch.
GET /api/patches/9196/?format=api
{ "id": 9196, "url": "https://patchwork.libcamera.org/api/patches/9196/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9196/", "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": "<20200804214711.177645-4-kieran.bingham@ideasonboard.com>", "date": "2020-08-04T21:47:01", "name": "[libcamera-devel,v3,03/13] libcamera: buffer: Create a MappedBuffer", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "6db1136a5771380c8a4f0b330203895ed880fe08", "submitter": { "id": 4, "url": "https://patchwork.libcamera.org/api/people/4/?format=api", "name": "Kieran Bingham", "email": "kieran.bingham@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/9196/mbox/", "series": [ { "id": 1191, "url": "https://patchwork.libcamera.org/api/series/1191/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1191", "date": "2020-08-04T21:46:58", "name": "android: JPEG support", "version": 3, "mbox": "https://patchwork.libcamera.org/series/1191/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9196/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9196/checks/", "tags": {}, "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 D945BBD87A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 4 Aug 2020 21:47:20 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AB09A60589;\n\tTue, 4 Aug 2020 23:47:20 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 80C2F60550\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 4 Aug 2020 23:47:17 +0200 (CEST)", "from Q.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net\n\t[86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 01FC3A60;\n\tTue, 4 Aug 2020 23:47:16 +0200 (CEST)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"KMcxcifl\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1596577637;\n\tbh=nQrGnvb95ZZ2ujBQJw3JCHSyPYMBXCpLzQNfdgLHXJQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=KMcxciflSDtbpjr/ua8LRCJKOx5oA42JMJUvcGhAMkh70HRPnn/jbVyKW69twkZ2X\n\tXsdfbO2EZJkYj7zG1uMOLCutWr7RTWCIUUP6uZneiXe0djezbI6UqqQP/YHL2KU+vE\n\t40aM5gtIn34+2m+LqWDW3iQpmy2ynbYx3S6XKXPY=", "From": "Kieran Bingham <kieran.bingham@ideasonboard.com>", "To": "libcamera devel <libcamera-devel@lists.libcamera.org>", "Date": "Tue, 4 Aug 2020 22:47:01 +0100", "Message-Id": "<20200804214711.177645-4-kieran.bingham@ideasonboard.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20200804214711.177645-1-kieran.bingham@ideasonboard.com>", "References": "<20200804214711.177645-1-kieran.bingham@ideasonboard.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v3 03/13] libcamera: buffer: Create a\n\tMappedBuffer", "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>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Provide a MappedFrameBuffer helper class which will map\nall of the Planes within a FrameBuffer and provide CPU addressable\npointers for those planes.\n\nThe MappedFrameBuffer implements the interface of the MappedBuffer\nallowing other buffer types to be constructed of the same form, with a\ncommon interface and cleanup.\n\nThis allows MappedBuffer instances to be created from Camera3Buffer types.\n\nMappings are removed upon destruction.\n\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n---\nv3\n - Documentation fixups\n---\n include/libcamera/internal/buffer.h | 47 ++++++++\n src/libcamera/buffer.cpp | 162 +++++++++++++++++++++++++++-\n 2 files changed, 208 insertions(+), 1 deletion(-)\n create mode 100644 include/libcamera/internal/buffer.h", "diff": "diff --git a/include/libcamera/internal/buffer.h b/include/libcamera/internal/buffer.h\nnew file mode 100644\nindex 000000000000..e86a003cd8ba\n--- /dev/null\n+++ b/include/libcamera/internal/buffer.h\n@@ -0,0 +1,47 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2020, Google Inc.\n+ *\n+ * buffer.h - Internal buffer handling\n+ */\n+#ifndef __LIBCAMERA_INTERNAL_BUFFER_H__\n+#define __LIBCAMERA_INTERNAL_BUFFER_H__\n+\n+#include <sys/mman.h>\n+#include <vector>\n+\n+#include <libcamera/buffer.h>\n+#include <libcamera/span.h>\n+\n+namespace libcamera {\n+\n+using MappedPlane = Span<uint8_t>;\n+\n+class MappedBuffer\n+{\n+public:\n+\tMappedBuffer();\n+\t~MappedBuffer();\n+\n+\tMappedBuffer(MappedBuffer &&rhs);\n+\tMappedBuffer &operator=(MappedBuffer &&rhs);\n+\n+\tbool isValid() const { return valid_; }\n+\tint error() const { return error_; }\n+\tconst std::vector<MappedPlane> &maps() const { return maps_; }\n+\n+protected:\n+\tint error_;\n+\tbool valid_;\n+\tstd::vector<MappedPlane> maps_;\n+};\n+\n+class MappedFrameBuffer : public MappedBuffer\n+{\n+public:\n+\tMappedFrameBuffer(const FrameBuffer *buffer, int flags);\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_INTERNAL_BUFFER_H__ */\ndiff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\nindex 8278f8a92af4..5f7dff60a48b 100644\n--- a/src/libcamera/buffer.cpp\n+++ b/src/libcamera/buffer.cpp\n@@ -6,6 +6,7 @@\n */\n \n #include <libcamera/buffer.h>\n+#include \"libcamera/internal/buffer.h\"\n \n #include <errno.h>\n #include <string.h>\n@@ -15,7 +16,8 @@\n #include \"libcamera/internal/log.h\"\n \n /**\n- * \\file buffer.h\n+ * \\file libcamera/buffer.h\n+ * \\file libcamera/internal/buffer.h\n * \\brief Buffer handling\n */\n \n@@ -290,4 +292,162 @@ int FrameBuffer::copyFrom(const FrameBuffer *src)\n \treturn 0;\n }\n \n+/**\n+ * \\class MappedBuffer\n+ * \\brief Provide an interface to support managing memory mapped buffers\n+ *\n+ * The MappedBuffer interface provides access to a set of MappedPlanes which\n+ * are available for access by a CPU.\n+ *\n+ * The MappedBuffer interface does not implement any valid constructor but\n+ * defines the move operators and destructors for the derived implementations,\n+ * which are able to construct according to their derived types and given\n+ * flags.\n+ *\n+ * This allows treating CPU accessible memory through a generic interface\n+ * regardless of whether it originates from a libcamera FrameBuffer or other\n+ * source.\n+ */\n+\n+/**\n+ * \\brief Construct an empty MappedBuffer\n+ *\n+ * A default constructor is required to allow subclassing the MappedBuffer\n+ * class. Construct an initialised, but invalid MappedBuffer.\n+ */\n+MappedBuffer::MappedBuffer()\n+\t: error_(0), valid_(false)\n+{\n+}\n+\n+/**\n+ * \\brief Construct a MappedBuffer by taking the \\a rhs mappings\n+ * \\param[in] rhs The other MappedBuffer\n+ *\n+ * Moving a MappedBuffer moves the mappings contained in the \\a rhs to the new\n+ * MappedBuffer and invalidates the \\a rhs. No mappings are unmapped or\n+ * destroyed in this process.\n+ */\n+MappedBuffer::MappedBuffer(MappedBuffer &&rhs)\n+{\n+\t*this = std::move(rhs);\n+}\n+\n+/**\n+ * \\brief Move assingment operator, move a MappedBuffer by taking the \\a rhs mappings\n+ * \\param[in] rhs The other MappedBuffer\n+ *\n+ * Moving a MappedBuffer moves the mappings contained in the \\a rhs to the new\n+ * MappedBuffer and invalidates the \\a rhs. No mappings are unmapped or\n+ * destroyed in this process.\n+ */\n+MappedBuffer &MappedBuffer::operator=(MappedBuffer &&rhs)\n+{\n+\terror_ = rhs.error_;\n+\tvalid_ = rhs.valid_;\n+\tmaps_ = std::move(rhs.maps_);\n+\trhs.valid_ = false;\n+\trhs.error_ = 0;\n+\n+\treturn *this;\n+}\n+\n+MappedBuffer::~MappedBuffer()\n+{\n+\tfor (MappedPlane map : maps_)\n+\t\tmunmap(map.data(), map.size());\n+}\n+\n+/**\n+ * \\fn MappedBuffer::isValid()\n+ * \\brief Check if the MappedBuffer instance is valid\n+ * \\return True if the MappedBuffer has valid mappings, false otherwise\n+ */\n+\n+/**\n+ * \\fn MappedBuffer::error()\n+ * \\brief Retrieve the map error status\n+ *\n+ * This function retrieves the error status from the MappedBuffer.\n+ * The error status is a negative number as defined by errno.h. If\n+ * no error occurred, this function returns 0.\n+ *\n+ * \\return 0 on success or a negative error code otherwise\n+ */\n+\n+/**\n+ * \\fn MappedBuffer::maps()\n+ * \\brief Retrieve the mapped planes\n+ *\n+ * This function retrieves the successfully mapped planes stored as a vector\n+ * of Span<uint8_t> to provide access to the mapped memory.\n+ *\n+ * \\return A vector of the mapped planes.\n+ */\n+\n+/**\n+ * \\var MappedBuffer::valid_\n+ * \\brief Stores the status of the mapping\n+ *\n+ * MappedBuffer implementations shall set this to represent if the mapping\n+ * was successfully completed without errors.\n+ */\n+\n+/**\n+ * \\var MappedBuffer::error_\n+ * \\brief Stores the error value if present\n+ *\n+ * MappedBuffer implementations shall set this to a negative value as defined\n+ * by errno.h if an error occured during the mapping process\n+ */\n+\n+/**\n+ * \\var MappedBuffer::maps_\n+ * \\brief Stores the internal\n+ *\n+ * MappedBuffer implementations shall store the mappings they create in this\n+ * vector which is parsed during destruct to unmap any memory mappings which\n+ * completed successfully.\n+ */\n+\n+/**\n+ * \\class MappedFrameBuffer\n+ * \\brief Maps a FrameBuffer using the MappedBuffer interface\n+ *\n+ * The MappedFrameBuffer interface maps a FrameBuffer instance\n+ *\n+ * The MappedBuffer interface does not implement any constructor but defines\n+ * the move operators and destructors for the derived implementations, which\n+ * are able to construct according to their derived types and given flags.\n+ */\n+\n+/**\n+ * \\brief Map all planes of a FrameBuffer\n+ * \\param[in] buffer FrameBuffer to be mapped\n+ * \\param[in] flags Protection flags to apply to map\n+ *\n+ * Construct an object to map a frame buffer for CPU access.\n+ * The flags are passed directly to mmap and should be either PROT_READ,\n+ * PROT_WRITE, or a bitwise-or combination of both.\n+ */\n+MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags)\n+{\n+\tmaps_.reserve(buffer->planes().size());\n+\n+\tfor (const FrameBuffer::Plane &plane : buffer->planes()) {\n+\t\tvoid *address = mmap(nullptr, plane.length, flags,\n+\t\t\t\t MAP_SHARED, plane.fd.fd(), 0);\n+\n+\t\tif (address == MAP_FAILED) {\n+\t\t\terror_ = -errno;\n+\t\t\tLOG(Buffer, Error) << \"Failed to mmap plane\";\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tmaps_.emplace_back(static_cast<uint8_t *>(address), plane.length);\n+\t}\n+\n+\tvalid_ = buffer->planes().size() == maps_.size();\n+}\n+\n } /* namespace libcamera */\n", "prefixes": [ "libcamera-devel", "v3", "03/13" ] }