Patch Detail
Show a patch.
GET /api/1.1/patches/9230/?format=api
{ "id": 9230, "url": "https://patchwork.libcamera.org/api/1.1/patches/9230/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9230/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/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": "<20200805151507.227503-4-kieran.bingham@ideasonboard.com>", "date": "2020-08-05T15:14:57", "name": "[libcamera-devel,v4,03/13] libcamera: buffer: Create a MappedBuffer", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "ab6340ca0774775b8d01d4d1bf4e045b84cf3308", "submitter": { "id": 4, "url": "https://patchwork.libcamera.org/api/1.1/people/4/?format=api", "name": "Kieran Bingham", "email": "kieran.bingham@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/9230/mbox/", "series": [ { "id": 1198, "url": "https://patchwork.libcamera.org/api/1.1/series/1198/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1198", "date": "2020-08-05T15:14:54", "name": "android: JPEG support", "version": 4, "mbox": "https://patchwork.libcamera.org/series/1198/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9230/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9230/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 458B2BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 5 Aug 2020 15:15:15 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 140AF605B8;\n\tWed, 5 Aug 2020 17:15:15 +0200 (CEST)", "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 12C1660599\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 5 Aug 2020 17:15:12 +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 A46D8B90;\n\tWed, 5 Aug 2020 17:15:11 +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=\"QpVRn4Jz\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1596640511;\n\tbh=ybsy37bbS0FJ5GnFEaly8S/4eQECIx+M/OrEaRVRFmo=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=QpVRn4JzZMtaFqzPeitIzvMIGeSpQ7nvDmpY8LMd5d3sgCVnqnkMzb/jmqcdR9wVp\n\tqSive8DnAwAqrjy01YH8y3i2TAUP02k0z2gHUXuiHIpiKFWDfwyyXd6Vz+mlk/nPPV\n\tIK8g4AYbIlOKMJMw958ptHkFjFAL/tASSH3IiFEY=", "From": "Kieran Bingham <kieran.bingham@ideasonboard.com>", "To": "libcamera devel <libcamera-devel@lists.libcamera.org>", "Date": "Wed, 5 Aug 2020 16:14:57 +0100", "Message-Id": "<20200805151507.227503-4-kieran.bingham@ideasonboard.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20200805151507.227503-1-kieran.bingham@ideasonboard.com>", "References": "<20200805151507.227503-1-kieran.bingham@ideasonboard.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v4 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\nv4:\n - Use reference when unmapping, rather than a copy of the planes.\n - Move MappedPlane to MappedBuffer::Plane\n - Remove valid_\n - Make constructor protected\n - Rename move constructor parameters from rhs to other\n - Rework move constructor documentation.\n---\n include/libcamera/internal/buffer.h | 47 +++++++++\n src/libcamera/buffer.cpp | 152 +++++++++++++++++++++++++++-\n 2 files changed, 198 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..b7b0173f93f5\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+class MappedBuffer\n+{\n+public:\n+\tusing Plane = Span<uint8_t>;\n+\n+\t~MappedBuffer();\n+\n+\tMappedBuffer(MappedBuffer &&other);\n+\tMappedBuffer &operator=(MappedBuffer &&other);\n+\n+\tbool isValid() const { return error_ == 0; }\n+\tint error() const { return error_; }\n+\tconst std::vector<Plane> &maps() const { return maps_; }\n+\n+protected:\n+\tMappedBuffer();\n+\n+\tint error_;\n+\tstd::vector<Plane> 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..8666f1992a77 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,152 @@ 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 the CPU.\n+ *\n+ * This class is not meant to be constructed directly, but instead derived\n+ * classes should be used to implement the correct mapping of a source buffer.\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+ * \\typedef MappedBuffer::Plane\n+ * \\brief A mapped region of memory accessible to the CPU\n+ *\n+ * The MappedBuffer::Plane uses the Span interface to describe the mapped memory\n+ * region.\n+ */\n+\n+/**\n+ * \\brief Construct an empty MappedBuffer\n+ *\n+ * Base class initialisation for MappedBuffer.\n+ */\n+MappedBuffer::MappedBuffer()\n+\t: error_(0)\n+{\n+}\n+\n+/**\n+ * \\brief Move constructor, construct the MappedBuffer with the contents of \\a\n+ * other using move semantics\n+ * \\param[in] other The other MappedBuffer\n+ *\n+ * Moving a MappedBuffer moves the mappings contained in the \\a other to the new\n+ * MappedBuffer and invalidates the \\a other.\n+ *\n+ * No mappings are unmapped or destroyed in this process.\n+ */\n+MappedBuffer::MappedBuffer(MappedBuffer &&other)\n+{\n+\t*this = std::move(other);\n+}\n+\n+/**\n+ * \\brief Move assignment operator, replace the mappings with those of \\a other\n+ * mappings\n+ * \\param[in] other The other MappedBuffer\n+ *\n+ * Moving a MappedBuffer moves the mappings contained in the \\a other to the new\n+ * MappedBuffer and invalidates the \\a other.\n+ *\n+ * No mappings are unmapped or destroyed in this process.\n+ */\n+MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other)\n+{\n+\terror_ = other.error_;\n+\tmaps_ = std::move(other.maps_);\n+\tother.error_ = -ENOENT;\n+\n+\treturn *this;\n+}\n+\n+MappedBuffer::~MappedBuffer()\n+{\n+\tfor (Plane &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::error_\n+ * \\brief Stores the error value if present\n+ *\n+ * MappedBuffer derived classes 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 derived classes 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 Map a FrameBuffer using the MappedBuffer interface\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+\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+\n } /* namespace libcamera */\n", "prefixes": [ "libcamera-devel", "v4", "03/13" ] }