Patch Detail
Show a patch.
GET /api/1.1/patches/9143/?format=api
{ "id": 9143, "url": "https://patchwork.libcamera.org/api/1.1/patches/9143/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9143/", "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": "<20200803161816.107113-4-kieran.bingham@ideasonboard.com>", "date": "2020-08-03T16:18:07", "name": "[libcamera-devel,v2,03/12] libcamera: buffer: Create a MappedBuffer", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "4bd8f19d8fca2e7263da50c6e5fe51367cdf978d", "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/9143/mbox/", "series": [ { "id": 1183, "url": "https://patchwork.libcamera.org/api/1.1/series/1183/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1183", "date": "2020-08-03T16:18:04", "name": "android: jpeg", "version": 2, "mbox": "https://patchwork.libcamera.org/series/1183/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9143/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9143/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 A654DBD87B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 3 Aug 2020 16:18:25 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C621561A12;\n\tMon, 3 Aug 2020 18:18:24 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DDD9D60905\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 3 Aug 2020 18:18:22 +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 6AA0FA62;\n\tMon, 3 Aug 2020 18:18:22 +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=\"Aw8K6VsO\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1596471502;\n\tbh=ma1nnWQzZHdN8csH7HZAqALRKraHiWDg3KbQNBH+Il0=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Aw8K6VsOTxeIJNVAK9vU+c68dnNj3a7mkHo1WmROd+L2eLGOVjtMAbJUULwNZhlyE\n\tM28Mv1kjnhccMe6iyoavUVGJEYrwD7sFQGj2y9pXW4VW3a/WbLLzhm+5v/RyOsMVnW\n\tD2VWEHNbNg9WUcLGk/XfigkQzLNv7FIc/f0oWtv0=", "From": "Kieran Bingham <kieran.bingham@ideasonboard.com>", "To": "libcamera devel <libcamera-devel@lists.libcamera.org>", "Date": "Mon, 3 Aug 2020 17:18:07 +0100", "Message-Id": "<20200803161816.107113-4-kieran.bingham@ideasonboard.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20200803161816.107113-1-kieran.bingham@ideasonboard.com>", "References": "<20200803161816.107113-1-kieran.bingham@ideasonboard.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v2 03/12] 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 include/libcamera/internal/buffer.h | 46 ++++++++++\n src/libcamera/buffer.cpp | 134 ++++++++++++++++++++++++++++\n 2 files changed, 180 insertions(+)\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..c04c294fecda\n--- /dev/null\n+++ b/include/libcamera/internal/buffer.h\n@@ -0,0 +1,46 @@\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 <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..2f667db42922 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@@ -290,4 +291,137 @@ int FrameBuffer::copyFrom(const FrameBuffer *src)\n \treturn 0;\n }\n \n+/**\n+ * \\class MappedBuffer\n+ * \\brief Provide\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+\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+\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+ * \\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", "v2", "03/12" ] }