{"id":10346,"url":"https://patchwork.libcamera.org/api/patches/10346/?format=json","web_url":"https://patchwork.libcamera.org/patch/10346/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20201105001546.1690179-10-niklas.soderlund@ragnatech.se>","date":"2020-11-05T00:15:44","name":"[libcamera-devel,09/11] libcamera: ipu3: Add helper for parameter and statistic buffers","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"730be12ef58f1a3cbf63da5d24cc88216f8472a1","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/?format=json","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"delegate":{"id":16,"url":"https://patchwork.libcamera.org/api/users/16/?format=json","username":"neg","first_name":"Niklas","last_name":"Söderlund","email":"niklas.soderlund@ragnatech.se"},"mbox":"https://patchwork.libcamera.org/patch/10346/mbox/","series":[{"id":1447,"url":"https://patchwork.libcamera.org/api/series/1447/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1447","date":"2020-11-05T00:15:35","name":"libcamera: ipu3: Attach to an skeleton IPA","version":1,"mbox":"https://patchwork.libcamera.org/series/1447/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/10346/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/10346/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 15A82BDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  5 Nov 2020 00:16:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E6F9662CD4;\n\tThu,  5 Nov 2020 01:16:24 +0100 (CET)","from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net\n\t[195.74.38.229])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D475E62C8E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Nov 2020 01:16:21 +0100 (CET)","from bismarck.berto.se (p4fca2458.dip0.t-ipconnect.de\n\t[79.202.36.88])\n\tby bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA\n\tid 6eaba91e-1efa-11eb-8a9c-005056917a89;\n\tThu, 05 Nov 2020 01:04:11 +0100 (CET)"],"X-Halon-ID":"6eaba91e-1efa-11eb-8a9c-005056917a89","Authorized-sender":"niklas.soderlund@fsdn.se","From":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","To":"libcamera-devel@lists.libcamera.org","Date":"Thu,  5 Nov 2020 01:15:44 +0100","Message-Id":"<20201105001546.1690179-10-niklas.soderlund@ragnatech.se>","X-Mailer":"git-send-email 2.29.2","In-Reply-To":"<20201105001546.1690179-1-niklas.soderlund@ragnatech.se>","References":"<20201105001546.1690179-1-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH 09/11] libcamera: ipu3: Add helper for\n\tparameter and statistic buffers","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=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Add a helper class to aid in associating a parameter and statistic\nbuffer with each request queued to the pipeline. The helper helps with\ntracking the state of the extra buffers and in completing the request\nonce all extra processing is done.\n\nThis change only adds the helper more work is needed to integrate it\nwith the pipeline and an IPA.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/libcamera/pipeline/ipu3/frames.cpp  | 164 ++++++++++++++++++++++++\n src/libcamera/pipeline/ipu3/frames.h    |  68 ++++++++++\n src/libcamera/pipeline/ipu3/meson.build |   1 +\n 3 files changed, 233 insertions(+)\n create mode 100644 src/libcamera/pipeline/ipu3/frames.cpp\n create mode 100644 src/libcamera/pipeline/ipu3/frames.h","diff":"diff --git a/src/libcamera/pipeline/ipu3/frames.cpp b/src/libcamera/pipeline/ipu3/frames.cpp\nnew file mode 100644\nindex 0000000000000000..824844e345e13679\n--- /dev/null\n+++ b/src/libcamera/pipeline/ipu3/frames.cpp\n@@ -0,0 +1,164 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2020, Google Inc.\n+ *\n+ * frames.cpp - Intel IPU3 Frames helper\n+ */\n+\n+#include \"frames.h\"\n+\n+#include <libcamera/buffer.h>\n+#include <libcamera/request.h>\n+\n+#include <libcamera/ipa/ipa_interface.h>\n+\n+#include \"libcamera/internal/pipeline_handler.h\"\n+#include \"libcamera/internal/v4l2_videodevice.h\"\n+\n+namespace libcamera {\n+\n+LOG_DECLARE_CATEGORY(IPU3)\n+\n+IPU3Frames::IPU3Frames(PipelineHandler *pipe, IPAProxy *ipa)\n+\t: pipe_(pipe), ipa_(ipa), nextId_(0)\n+{\n+}\n+\n+void IPU3Frames::mapBuffers(const std::vector<std::unique_ptr<FrameBuffer>> &paramBuffers,\n+\t\t\t    const std::vector<std::unique_ptr<FrameBuffer>> &statBuffers)\n+{\n+\tunsigned int ipaBufferId = 1;\n+\n+\tfor (const std::unique_ptr<FrameBuffer> &buffer : paramBuffers) {\n+\t\tbuffer->setCookie(ipaBufferId++);\n+\t\tipaBuffers_.push_back({ .id = buffer->cookie(),\n+\t\t\t\t\t.planes = buffer->planes() });\n+\t\tavailableParamBuffers_.push(buffer.get());\n+\t}\n+\n+\tfor (const std::unique_ptr<FrameBuffer> &buffer : statBuffers) {\n+\t\tbuffer->setCookie(ipaBufferId++);\n+\t\tipaBuffers_.push_back({ .id = buffer->cookie(),\n+\t\t\t\t\t.planes = buffer->planes() });\n+\t\tavailableStatBuffers_.push(buffer.get());\n+\t}\n+\n+\tipa_->mapBuffers(ipaBuffers_);\n+\n+\tnextId_ = 0;\n+\tframeInfo_.clear();\n+}\n+\n+void IPU3Frames::unmapBuffers()\n+{\n+\tavailableParamBuffers_ = {};\n+\tavailableStatBuffers_ = {};\n+\n+\tstd::vector<unsigned int> ids;\n+\tfor (IPABuffer &ipabuf : ipaBuffers_)\n+\t\tids.push_back(ipabuf.id);\n+\n+\tipa_->unmapBuffers(ids);\n+\tipaBuffers_.clear();\n+}\n+\n+IPU3Frames::Info *IPU3Frames::create(Request *request)\n+{\n+\tunsigned int id = nextId_++;\n+\n+\tif (availableParamBuffers_.empty()) {\n+\t\tLOG(IPU3, Error) << \"Parameters buffer underrun\";\n+\t\treturn nullptr;\n+\t}\n+\tFrameBuffer *paramBuffer = availableParamBuffers_.front();\n+\n+\tif (availableStatBuffers_.empty()) {\n+\t\tLOG(IPU3, Error) << \"Statisitc buffer underrun\";\n+\t\treturn nullptr;\n+\t}\n+\tFrameBuffer *statBuffer = availableStatBuffers_.front();\n+\n+\tavailableParamBuffers_.pop();\n+\tavailableStatBuffers_.pop();\n+\n+\tstd::unique_ptr<Info> info = std::make_unique<Info>();\n+\n+\tinfo->id = id;\n+\tinfo->request = request;\n+\tinfo->rawBuffer = nullptr;\n+\tinfo->paramBuffer = paramBuffer;\n+\tinfo->statBuffer = statBuffer;\n+\tinfo->paramFilled = false;\n+\tinfo->paramDequeued = false;\n+\tinfo->metadataProcessed = false;\n+\n+\tframeInfo_[id] = std::move(info);\n+\n+\treturn frameInfo_[id].get();\n+}\n+\n+bool IPU3Frames::tryComplete(IPU3Frames::Info *info)\n+{\n+\tRequest *request = info->request;\n+\n+\tif (request->hasPendingBuffers())\n+\t\treturn false;\n+\n+\tif (!info->metadataProcessed)\n+\t\treturn false;\n+\n+\tif (!info->paramDequeued)\n+\t\treturn false;\n+\n+\t/* Return params and stat buffer for reuse. */\n+\tavailableParamBuffers_.push(info->paramBuffer);\n+\tavailableStatBuffers_.push(info->statBuffer);\n+\n+\t/* Delete the extended frame information. */\n+\tframeInfo_.erase(info->id);\n+\n+\tpipe_->completeRequest(request);\n+\n+\treturn true;\n+}\n+\n+IPU3Frames::Info *IPU3Frames::find(unsigned int id)\n+{\n+\tconst auto &itInfo = frameInfo_.find(id);\n+\n+\tif (itInfo != frameInfo_.end())\n+\t\treturn itInfo->second.get();\n+\n+\treturn nullptr;\n+}\n+\n+IPU3Frames::Info *IPU3Frames::find(FrameBuffer *buffer)\n+{\n+\tfor (auto const &itInfo : frameInfo_) {\n+\t\tInfo *info = itInfo.second.get();\n+\n+\t\tfor (auto const itBuffers : info->request->buffers())\n+\t\t\tif (itBuffers.second == buffer)\n+\t\t\t\treturn info;\n+\n+\t\tif (info->rawBuffer == buffer || info->paramBuffer == buffer ||\n+\t\t    info->statBuffer == buffer)\n+\t\t\treturn info;\n+\t}\n+\n+\treturn nullptr;\n+}\n+\n+IPU3Frames::Info *IPU3Frames::find(Request *request)\n+{\n+\tfor (auto const &itInfo : frameInfo_) {\n+\t\tInfo *info = itInfo.second.get();\n+\n+\t\tif (info->request == request)\n+\t\t\treturn info;\n+\t}\n+\n+\treturn nullptr;\n+}\n+\n+} /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline/ipu3/frames.h b/src/libcamera/pipeline/ipu3/frames.h\nnew file mode 100644\nindex 0000000000000000..5c072f8ddbc9660f\n--- /dev/null\n+++ b/src/libcamera/pipeline/ipu3/frames.h\n@@ -0,0 +1,68 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2020, Google Inc.\n+ *\n+ * frames.h - Intel IPU3 Frames helper\n+ */\n+#ifndef __LIBCAMERA_PIPELINE_IPU3_FRAMES_H__\n+#define __LIBCAMERA_PIPELINE_IPU3_FRAMES_H__\n+\n+#include <map>\n+#include <memory>\n+#include <queue>\n+#include <vector>\n+\n+namespace libcamera {\n+\n+class FrameBuffer;\n+class IPAProxy;\n+class PipelineHandler;\n+class Request;\n+class V4L2VideoDevice;\n+struct IPABuffer;\n+\n+class IPU3Frames\n+{\n+public:\n+\tstruct Info {\n+\t\tunsigned int id;\n+\t\tRequest *request;\n+\n+\t\tFrameBuffer *rawBuffer;\n+\t\tFrameBuffer *paramBuffer;\n+\t\tFrameBuffer *statBuffer;\n+\n+\t\tbool paramFilled;\n+\t\tbool paramDequeued;\n+\t\tbool metadataProcessed;\n+\t};\n+\n+\tIPU3Frames(PipelineHandler *pipe, IPAProxy *ipa);\n+\n+\tvoid mapBuffers(const std::vector<std::unique_ptr<FrameBuffer>> &paramBuffers,\n+\t\t\tconst std::vector<std::unique_ptr<FrameBuffer>> &statBuffers);\n+\tvoid unmapBuffers();\n+\n+\tInfo *create(Request *request);\n+\tbool tryComplete(IPU3Frames::Info *info);\n+\n+\tInfo *find(unsigned int id);\n+\tInfo *find(FrameBuffer *buffer);\n+\tInfo *find(Request *request);\n+\n+private:\n+\tPipelineHandler *pipe_;\n+\tIPAProxy *ipa_;\n+\n+\tstd::queue<FrameBuffer *> availableParamBuffers_;\n+\tstd::queue<FrameBuffer *> availableStatBuffers_;\n+\n+\tstd::vector<IPABuffer> ipaBuffers_;\n+\n+\tunsigned int nextId_;\n+\tstd::map<unsigned int, std::unique_ptr<Info>> frameInfo_;\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_PIPELINE_IPU3_FRAMES_H__ */\ndiff --git a/src/libcamera/pipeline/ipu3/meson.build b/src/libcamera/pipeline/ipu3/meson.build\nindex d60e07ae6ccac2bc..a1b0b31ac5bcf864 100644\n--- a/src/libcamera/pipeline/ipu3/meson.build\n+++ b/src/libcamera/pipeline/ipu3/meson.build\n@@ -2,6 +2,7 @@\n \n libcamera_sources += files([\n     'cio2.cpp',\n+    'frames.cpp',\n     'imgu.cpp',\n     'ipu3.cpp',\n ])\n","prefixes":["libcamera-devel","09/11"]}