Patch Detail
Show a patch.
GET /api/patches/10345/?format=api
{ "id": 10345, "url": "https://patchwork.libcamera.org/api/patches/10345/?format=api", "web_url": "https://patchwork.libcamera.org/patch/10345/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20201105001546.1690179-9-niklas.soderlund@ragnatech.se>", "date": "2020-11-05T00:15:43", "name": "[libcamera-devel,08/11] libcamera: ipu3: Attach to an IPA and allow it to set sensor controls", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "490eaa204ffee17f49a6fbd43173d0064053c3ec", "submitter": { "id": 5, "url": "https://patchwork.libcamera.org/api/people/5/?format=api", "name": "Niklas Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "delegate": { "id": 16, "url": "https://patchwork.libcamera.org/api/users/16/?format=api", "username": "neg", "first_name": "Niklas", "last_name": "Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "mbox": "https://patchwork.libcamera.org/patch/10345/mbox/", "series": [ { "id": 1447, "url": "https://patchwork.libcamera.org/api/series/1447/?format=api", "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/10345/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/10345/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 AEEFDBDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 5 Nov 2020 00:16:23 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8768562CAF;\n\tThu, 5 Nov 2020 01:16:23 +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 E420062CD6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 5 Nov 2020 01:16:20 +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 6e399a76-1efa-11eb-8a9c-005056917a89;\n\tThu, 05 Nov 2020 01:04:10 +0100 (CET)" ], "X-Halon-ID": "6e399a76-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:43 +0100", "Message-Id": "<20201105001546.1690179-9-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 08/11] libcamera: ipu3: Attach to an IPA\n\tand allow it to set sensor controls", "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": "Attache to an IPA and allow it to push V4L2 controls that applies on the\ncamera sensor. The IPA is not fully integrated in the pipeline as\nstatistics and parameters buffers are not yet allocated, processed by\nthe IPA nor queued to the hardware.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/libcamera/pipeline/ipu3/ipu3.cpp | 83 +++++++++++++++++++++++++++-\n 1 file changed, 82 insertions(+), 1 deletion(-)", "diff": "diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 62e99a308a6136a7..d161c2e68c0db0f2 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -14,11 +14,13 @@\n #include <libcamera/camera.h>\n #include <libcamera/control_ids.h>\n #include <libcamera/formats.h>\n+#include <libcamera/ipa/ipu3.h>\n #include <libcamera/request.h>\n #include <libcamera/stream.h>\n \n #include \"libcamera/internal/camera_sensor.h\"\n #include \"libcamera/internal/device_enumerator.h\"\n+#include \"libcamera/internal/ipa_manager.h\"\n #include \"libcamera/internal/log.h\"\n #include \"libcamera/internal/media_device.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n@@ -49,10 +51,12 @@ class IPU3CameraData : public CameraData\n {\n public:\n \tIPU3CameraData(PipelineHandler *pipe)\n-\t\t: CameraData(pipe)\n+\t\t: CameraData(pipe), delayedCtrls_(nullptr)\n \t{\n \t}\n \n+\tint loadIPA();\n+\n \tvoid imguOutputBufferReady(FrameBuffer *buffer);\n \tvoid cio2BufferReady(FrameBuffer *buffer);\n \n@@ -62,6 +66,11 @@ public:\n \tStream outStream_;\n \tStream vfStream_;\n \tStream rawStream_;\n+\n+\tDelayedControls *delayedCtrls_;\n+\n+private:\n+\tvoid actOnIpa(unsigned int id, const IPAOperationData &op);\n };\n \n class IPU3CameraConfiguration : public CameraConfiguration\n@@ -590,6 +599,12 @@ int PipelineHandlerIPU3::start(Camera *camera)\n \tIPU3CameraData *data = cameraData(camera);\n \tCIO2Device *cio2 = &data->cio2_;\n \tImgUDevice *imgu = data->imgu_;\n+\n+\tCameraSensorInfo sensorInfo = {};\n+\tstd::map<unsigned int, IPAStream> streamConfig;\n+\tstd::map<unsigned int, const ControlInfoMap &> entityControls;\n+\tIPAOperationData ipaConfig;\n+\n \tint ret;\n \n \t/* Allocate buffers for internal pipeline usage. */\n@@ -597,6 +612,10 @@ int PipelineHandlerIPU3::start(Camera *camera)\n \tif (ret)\n \t\treturn ret;\n \n+\tret = data->ipa_->start();\n+\tif (ret)\n+\t\tgoto error;\n+\n \t/*\n \t * Start the ImgU video devices, buffers will be queued to the\n \t * ImgU output and viewfinder when requests will be queued.\n@@ -612,9 +631,33 @@ int PipelineHandlerIPU3::start(Camera *camera)\n \t\tgoto error;\n \t}\n \n+\t/* Inform IPA of stream configuration and sensor controls. */\n+\tret = data->cio2_.sensor()->sensorInfo(&sensorInfo);\n+\tif (ret) {\n+\t\t/* \\todo Turn to hard failure once sensors info is mandatory. */\n+\t\tLOG(IPU3, Warning) << \"Camera sensor information not available\";\n+\t\tsensorInfo = {};\n+\t\tret = 0;\n+\t}\n+\n+\tstreamConfig[0] = {\n+\t\t.pixelFormat = data->outStream_.configuration().pixelFormat,\n+\t\t.size = data->outStream_.configuration().size,\n+\t};\n+\tstreamConfig[0] = {\n+\t\t.pixelFormat = data->vfStream_.configuration().pixelFormat,\n+\t\t.size = data->vfStream_.configuration().size,\n+\t};\n+\n+\tentityControls.emplace(0, data->cio2_.sensor()->controls());\n+\n+\tdata->ipa_->configure(sensorInfo, streamConfig, entityControls,\n+\t\t\t ipaConfig, nullptr);\n+\n \treturn 0;\n \n error:\n+\tdata->ipa_->stop();\n \tfreeBuffers(camera);\n \tLOG(IPU3, Error) << \"Failed to start camera \" << camera->id();\n \n@@ -631,6 +674,8 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n \tif (ret)\n \t\tLOG(IPU3, Warning) << \"Failed to stop camera \" << camera->id();\n \n+\tdata->ipa_->stop();\n+\n \tfreeBuffers(camera);\n }\n \n@@ -762,12 +807,20 @@ int PipelineHandlerIPU3::registerCameras()\n \t\tif (ret)\n \t\t\tcontinue;\n \n+\t\tret = data->loadIPA();\n+\t\tif (ret)\n+\t\t\tcontinue;\n+\n \t\t/* Initialize the camera properties. */\n \t\tdata->properties_ = cio2->sensor()->properties();\n \n \t\t/* Initialze the camera controls. */\n \t\tdata->controlInfo_ = IPU3Controls;\n \n+\t\tdata->delayedCtrls_ = cio2->sensor()->delayedContols();\n+\t\tdata->cio2_.frameStart().connect(data->delayedCtrls_,\n+\t\t\t\t\t\t &DelayedControls::frameStart);\n+\n \t\t/**\n \t\t * \\todo Dynamically assign ImgU and output devices to each\n \t\t * stream and camera; as of now, limit support to two cameras\n@@ -811,6 +864,34 @@ int PipelineHandlerIPU3::registerCameras()\n \treturn numCameras ? 0 : -ENODEV;\n }\n \n+int IPU3CameraData::loadIPA()\n+{\n+\tipa_ = IPAManager::createIPA(pipe_, 1, 1);\n+\tif (!ipa_)\n+\t\treturn -ENOENT;\n+\n+\tipa_->queueFrameAction.connect(this, &IPU3CameraData::actOnIpa);\n+\n+\tipa_->init(IPASettings{});\n+\n+\treturn 0;\n+}\n+\n+void IPU3CameraData::actOnIpa([[maybe_unused]] unsigned int id,\n+\t\t\t const IPAOperationData &action)\n+{\n+\tswitch (action.operation) {\n+\tcase IPU3_IPA_ACTION_SET_SENSOR_CONTROLS: {\n+\t\tconst ControlList &controls = action.controls[0];\n+\t\tdelayedCtrls_->push(controls);\n+\t\tbreak;\n+\t}\n+\tdefault:\n+\t\tLOG(IPU3, Error) << \"Unknown action \" << action.operation;\n+\t\tbreak;\n+\t}\n+}\n+\n /* -----------------------------------------------------------------------------\n * Buffer Ready slots\n */\n", "prefixes": [ "libcamera-devel", "08/11" ] }