Patch Detail
Show a patch.
GET /api/1.1/patches/13246/?format=api
{ "id": 13246, "url": "https://patchwork.libcamera.org/api/1.1/patches/13246/?format=api", "web_url": "https://patchwork.libcamera.org/patch/13246/", "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": "<20210806101409.324645-4-umang.jain@ideasonboard.com>", "date": "2021-08-06T10:14:08", "name": "[libcamera-devel,3/4] ipa: vimc: Map and unmap buffers", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "4a1500a67f9b66f2a82c053a40082dcb5e7f41fc", "submitter": { "id": 86, "url": "https://patchwork.libcamera.org/api/1.1/people/86/?format=api", "name": "Umang Jain", "email": "umang.jain@ideasonboard.com" }, "delegate": { "id": 12, "url": "https://patchwork.libcamera.org/api/1.1/users/12/?format=api", "username": "uajain", "first_name": "Umang", "last_name": "Jain", "email": "umang.jain@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/13246/mbox/", "series": [ { "id": 2316, "url": "https://patchwork.libcamera.org/api/1.1/series/2316/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2316", "date": "2021-08-06T10:14:05", "name": "Pass buffers to VIMC IPA", "version": 1, "mbox": "https://patchwork.libcamera.org/series/2316/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/13246/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/13246/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 6AB56C323A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 6 Aug 2021 10:14:51 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D1EF668826;\n\tFri, 6 Aug 2021 12:14:35 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 85DC360266\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 6 Aug 2021 12:14:34 +0200 (CEST)", "from perceval.ideasonboard.com (unknown [103.251.226.40])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 870B84FB;\n\tFri, 6 Aug 2021 12:14:33 +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=\"Ffk9HvGS\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1628244874;\n\tbh=t9tLZf42sBKWVBp70IKnG24J8T093wLPKnhI8PXi1NM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Ffk9HvGSGT/5zc4oj0K1DN/A0Jt4DLv7581LV+fJwuTSl2E+KLpWdyZcPR8Ircglu\n\t4fSyk9c4l6uu7jB9R0yV+LL33jNZbKtlaa5VAH1lejTKyvNyaTHvdb8G0Iigjg5fQ8\n\t4sw7UdcrWUsQQ2e9qEO5FTec0azQ3FnL5WbzD4RI=", "From": "Umang Jain <umang.jain@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 6 Aug 2021 15:44:08 +0530", "Message-Id": "<20210806101409.324645-4-umang.jain@ideasonboard.com>", "X-Mailer": "git-send-email 2.31.1", "In-Reply-To": "<20210806101409.324645-1-umang.jain@ideasonboard.com>", "References": "<20210806101409.324645-1-umang.jain@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 3/4] ipa: vimc: Map and unmap 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>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Since VIMC is a virtual test driver, the support for IPA\nbuffers(parameter and statistics) is missing. We could create\nour own and pass it around, but created buffers needs to be\nbacked by dmabuf file-descriptors ideally.\n\nThis might prove cubersome given that we use vimc for test purposes.\nHence, pass actual frame data buffers into the IPA instead, which\nwould result in exercising these code paths for now. Introduce plumbing\nsupport for mapping and un-mapping of these buffers into the IPA.\n\nSigned-off-by: Umang Jain <umang.jain@ideasonboard.com>\n---\n include/libcamera/ipa/vimc.mojom | 3 +++\n src/ipa/vimc/vimc.cpp | 26 ++++++++++++++++++++++++++\n src/libcamera/pipeline/vimc/vimc.cpp | 25 ++++++++++++++++++++++++-\n 3 files changed, 53 insertions(+), 1 deletion(-)", "diff": "diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom\nindex 99b6412b..8452461d 100644\n--- a/include/libcamera/ipa/vimc.mojom\n+++ b/include/libcamera/ipa/vimc.mojom\n@@ -26,6 +26,9 @@ interface IPAVimcInterface {\n \n \tstart() => (int32 ret);\n \tstop();\n+\n+\tmapBuffers(array<libcamera.IPABuffer> buffers);\n+\tunmapBuffers(array<uint32> ids);\n };\n \n interface IPAVimcEventInterface {\ndiff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp\nindex 54d9086a..2b00687f 100644\n--- a/src/ipa/vimc/vimc.cpp\n+++ b/src/ipa/vimc/vimc.cpp\n@@ -19,6 +19,8 @@\n #include <libcamera/ipa/ipa_interface.h>\n #include <libcamera/ipa/ipa_module_info.h>\n \n+#include \"libcamera/internal/framebuffer.h\"\n+\n namespace libcamera {\n \n LOG_DEFINE_CATEGORY(IPAVimc)\n@@ -38,11 +40,15 @@ public:\n \t\t const std::map<unsigned int, IPAStream> &streamConfig,\n \t\t const std::map<unsigned int, ControlInfoMap> &entityControls) override;\n \n+\tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override;\n+\tvoid unmapBuffers(const std::vector<unsigned int> &ids) override;\n+\n private:\n \tvoid initTrace();\n \tvoid trace(enum ipa::vimc::IPATraceCode operation);\n \n \tint fd_;\n+\tstd::map<unsigned int, MappedFrameBuffer> buffers_;\n };\n \n IPAVimc::IPAVimc()\n@@ -99,6 +105,26 @@ int IPAVimc::configure([[maybe_unused]] const IPACameraSensorInfo &sensorInfo,\n \treturn 0;\n }\n \n+void IPAVimc::mapBuffers(const std::vector<IPABuffer> &buffers)\n+{\n+\tfor (const IPABuffer &buffer : buffers) {\n+\t\tconst FrameBuffer fb(buffer.planes);\n+\t\tbuffers_.emplace(buffer.id,\n+\t\t\t\t MappedFrameBuffer(&fb, PROT_READ));\n+\t}\n+}\n+\n+void IPAVimc::unmapBuffers(const std::vector<unsigned int> &ids)\n+{\n+\tfor (unsigned int id : ids) {\n+\t\tauto it = buffers_.find(id);\n+\t\tif (it == buffers_.end())\n+\t\t\tcontinue;\n+\n+\t\tbuffers_.erase(it);\n+\t}\n+}\n+\n void IPAVimc::initTrace()\n {\n \tstruct stat fifoStat;\ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex b7dd6595..fa21128d 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -45,7 +45,7 @@ class VimcCameraData : public CameraData\n {\n public:\n \tVimcCameraData(PipelineHandler *pipe, MediaDevice *media)\n-\t\t: CameraData(pipe), media_(media)\n+\t\t: CameraData(pipe), media_(media), buffers_(nullptr)\n \t{\n \t}\n \n@@ -61,6 +61,9 @@ public:\n \tStream stream_;\n \n \tstd::unique_ptr<ipa::vimc::IPAProxyVimc> ipa_;\n+\n+\tstd::vector<std::unique_ptr<FrameBuffer>> *buffers_;\n+\tstd::vector<IPABuffer> ipaBuffers_;\n };\n \n class VimcCameraConfiguration : public CameraConfiguration\n@@ -319,6 +322,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream,\n {\n \tVimcCameraData *data = cameraData(camera);\n \tunsigned int count = stream->configuration().bufferCount;\n+\tdata->buffers_ = buffers;\n \n \treturn data->video_->exportBuffers(count, buffers);\n }\n@@ -332,6 +336,19 @@ int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis\n \tif (ret < 0)\n \t\treturn ret;\n \n+\t/*\n+\t * We don't have actual parameters/statistics buffers in VIMC.\n+\t * Hence, map frame buffers to exercise IPA IPC code paths for now.\n+\t */\n+\tASSERT(data->buffers_ != nullptr);\n+\tunsigned int ipaBufferId = 1;\n+\tfor (unsigned int i = 0; i< count; i++) {\n+\t\tstd::unique_ptr<FrameBuffer> &buffer = data->buffers_->at(i);\n+\t\tbuffer->setCookie(ipaBufferId++);\n+ data->ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes());\n+\t}\n+\tdata->ipa_->mapBuffers(data->ipaBuffers_);\n+\n \tret = data->ipa_->start();\n \tif (ret) {\n \t\tdata->video_->releaseBuffers();\n@@ -352,7 +369,13 @@ void PipelineHandlerVimc::stop(Camera *camera)\n {\n \tVimcCameraData *data = cameraData(camera);\n \tdata->video_->streamOff();\n+\n+\tstd::vector<unsigned int> ids;\n+\tfor (IPABuffer &ipabuf : data->ipaBuffers_)\n+\t\tids.push_back(ipabuf.id);\n+\tdata->ipa_->unmapBuffers(ids);\n \tdata->ipa_->stop();\n+\n \tdata->video_->releaseBuffers();\n }\n \n", "prefixes": [ "libcamera-devel", "3/4" ] }