{"id":10776,"url":"https://patchwork.libcamera.org/api/1.1/patches/10776/?format=json","web_url":"https://patchwork.libcamera.org/patch/10776/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20201229160318.77536-11-niklas.soderlund@ragnatech.se>","date":"2020-12-29T16:03:17","name":"[libcamera-devel,v2,10/11] libcamera: ipu3: Add helper for parameter and statistic buffers","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"7447eb154489fa9c21523ada4061a716513e6582","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/1.1/people/5/?format=json","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"delegate":{"id":16,"url":"https://patchwork.libcamera.org/api/1.1/users/16/?format=json","username":"neg","first_name":"Niklas","last_name":"Söderlund","email":"niklas.soderlund@ragnatech.se"},"mbox":"https://patchwork.libcamera.org/patch/10776/mbox/","series":[{"id":1559,"url":"https://patchwork.libcamera.org/api/1.1/series/1559/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1559","date":"2020-12-29T16:03:07","name":"libcamera: ipu3: Attach to an skeleton IPA","version":2,"mbox":"https://patchwork.libcamera.org/series/1559/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/10776/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/10776/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 D6B59C0F1A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 29 Dec 2020 16:04:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B01A560525;\n\tTue, 29 Dec 2020 17:04:17 +0100 (CET)","from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 54C9F60320\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Dec 2020 17:04:14 +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 7e059204-49ef-11eb-a542-005056917a89;\n\tTue, 29 Dec 2020 17:04:12 +0100 (CET)"],"X-Halon-ID":"7e059204-49ef-11eb-a542-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":"Tue, 29 Dec 2020 17:03:17 +0100","Message-Id":"<20201229160318.77536-11-niklas.soderlund@ragnatech.se>","X-Mailer":"git-send-email 2.29.2","In-Reply-To":"<20201229160318.77536-1-niklas.soderlund@ragnatech.se>","References":"<20201229160318.77536-1-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v2 10/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* Changes since v1\n- Move mapping of buffers to IPA to the pipeline handler and a separate\n  patch.\n- Move all pipeline interactions out of helper.\n---\n src/libcamera/pipeline/ipu3/frames.cpp  | 141 ++++++++++++++++++++++++\n src/libcamera/pipeline/ipu3/frames.h    |  63 +++++++++++\n src/libcamera/pipeline/ipu3/meson.build |   1 +\n 3 files changed, 205 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..1ab078db056ce193\n--- /dev/null\n+++ b/src/libcamera/pipeline/ipu3/frames.cpp\n@@ -0,0 +1,141 @@\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/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()\n+\t: nextId_(0)\n+{\n+}\n+\n+void IPU3Frames::init(const std::vector<std::unique_ptr<FrameBuffer>> &paramBuffers,\n+\t\t      const std::vector<std::unique_ptr<FrameBuffer>> &statBuffers)\n+{\n+\tfor (const std::unique_ptr<FrameBuffer> &buffer : paramBuffers)\n+\t\tavailableParamBuffers_.push(buffer.get());\n+\n+\tfor (const std::unique_ptr<FrameBuffer> &buffer : statBuffers)\n+\t\tavailableStatBuffers_.push(buffer.get());\n+\n+\tnextId_ = 0;\n+\tframeInfo_.clear();\n+}\n+\n+void IPU3Frames::clear()\n+{\n+\tavailableParamBuffers_ = {};\n+\tavailableStatBuffers_ = {};\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+\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..06b2678be4fb04d7\n--- /dev/null\n+++ b/src/libcamera/pipeline/ipu3/frames.h\n@@ -0,0 +1,63 @@\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();\n+\n+\tvoid init(const std::vector<std::unique_ptr<FrameBuffer>> &paramBuffers,\n+\t\t  const std::vector<std::unique_ptr<FrameBuffer>> &statBuffers);\n+\tvoid clear();\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+\tstd::queue<FrameBuffer *> availableParamBuffers_;\n+\tstd::queue<FrameBuffer *> availableStatBuffers_;\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","v2","10/11"]}