Show a patch.

GET /api/patches/21485/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 21485,
    "url": "https://patchwork.libcamera.org/api/patches/21485/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/21485/",
    "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": "<20241002212632.2463458-5-kieran.bingham@ideasonboard.com>",
    "date": "2024-10-02T21:26:32",
    "name": "[v2,4/4] libcamera: pipeline: rkisp1: Convert to use MediaPipeline",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "5c6af618f6269dbf11c56a9d10ef5ee3de389b16",
    "submitter": {
        "id": 4,
        "url": "https://patchwork.libcamera.org/api/people/4/?format=api",
        "name": "Kieran Bingham",
        "email": "kieran.bingham@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/21485/mbox/",
    "series": [
        {
            "id": 4650,
            "url": "https://patchwork.libcamera.org/api/series/4650/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4650",
            "date": "2024-10-02T21:26:28",
            "name": "MediaPipeline: Complex input device support",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/4650/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/21485/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/21485/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 E6249C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Oct 2024 21:26:49 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7CD6A63528;\n\tWed,  2 Oct 2024 23:26:46 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8CACF63526\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Oct 2024 23:26:38 +0200 (CEST)",
            "from Monstersaurus.tail69b4.ts.net\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E74C9D52;\n\tWed,  2 Oct 2024 23:25:05 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"tgHS8R5h\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727904306;\n\tbh=sEWWTuT3IY/o/vSV5Oolf5bQD+PHUkQsbamcUbKVLZI=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=tgHS8R5h07IVORkftZbCegA6MRFGAyvDAxnBS6VMekqJMXrGNrflUXkQEmqubPxaT\n\tw0JJkjApQe200pLgl1/Jwov263fTcsw+TAlouiGlJ4Jz2WD7XWJbwfeNA/4+fu3Enb\n\tU8Gv2YyKyU1vrEqNOdCa2PshPgvJqMECHiI9PIio=",
        "From": "Kieran Bingham <kieran.bingham@ideasonboard.com>",
        "To": "libcamera devel <libcamera-devel@lists.libcamera.org>",
        "Cc": "Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tUmang Jain <umang.jain@ideasonboard.com>",
        "Subject": "[PATCH v2 4/4] libcamera: pipeline: rkisp1: Convert to use\n\tMediaPipeline",
        "Date": "Wed,  2 Oct 2024 22:26:32 +0100",
        "Message-Id": "<20241002212632.2463458-5-kieran.bingham@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20241002212632.2463458-1-kieran.bingham@ideasonboard.com>",
        "References": "<20241002212632.2463458-1-kieran.bingham@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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": "Use the new MediaPipeline to manage and identify all sensors connected\nto complex pipelines that can connect to the CSI2 receiver before the\nISP.\n\nThis can include chained multiplexers that supply multiple cameras, so\nmake use of the MediaDevice::locateEntities to search for all cameras\nand construct a pipeline for each.\n\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 86 +++++++++---------------\n 1 file changed, 32 insertions(+), 54 deletions(-)",
    "diff": "diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 2fee84e56d4d..e94f047ba70c 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -37,6 +37,7 @@\n #include \"libcamera/internal/framebuffer.h\"\n #include \"libcamera/internal/ipa_manager.h\"\n #include \"libcamera/internal/media_device.h\"\n+#include \"libcamera/internal/media_pipeline.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n #include \"libcamera/internal/v4l2_subdevice.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n@@ -108,6 +109,11 @@ public:\n \n \tstd::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;\n \n+\t/*\n+\t * All entities in the pipeline, from the camera sensor to the RkISP1.\n+\t */\n+\tMediaPipeline pipe_;\n+\n private:\n \tvoid paramFilled(unsigned int frame, unsigned int bytesused);\n \tvoid setSensorControls(unsigned int frame,\n@@ -171,8 +177,7 @@ private:\n \tfriend RkISP1CameraData;\n \tfriend RkISP1Frames;\n \n-\tint initLinks(Camera *camera, const CameraSensor *sensor,\n-\t\t      const RkISP1CameraConfiguration &config);\n+\tint initLinks(Camera *camera, const RkISP1CameraConfiguration &config);\n \tint createCamera(MediaEntity *sensor);\n \tvoid tryCompleteRequest(RkISP1FrameInfo *info);\n \tvoid bufferReady(FrameBuffer *buffer);\n@@ -187,7 +192,6 @@ private:\n \tstd::unique_ptr<V4L2Subdevice> isp_;\n \tstd::unique_ptr<V4L2VideoDevice> param_;\n \tstd::unique_ptr<V4L2VideoDevice> stat_;\n-\tstd::unique_ptr<V4L2Subdevice> csi_;\n \n \tbool hasSelfPath_;\n \tbool isRaw_;\n@@ -201,8 +205,6 @@ private:\n \tstd::queue<FrameBuffer *> availableStatBuffers_;\n \n \tCamera *activeCamera_;\n-\n-\tconst MediaPad *ispSink_;\n };\n \n RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)\n@@ -712,7 +714,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n \tCameraSensor *sensor = data->sensor_.get();\n \tint ret;\n \n-\tret = initLinks(camera, sensor, *config);\n+\tret = initLinks(camera, *config);\n \tif (ret)\n \t\treturn ret;\n \n@@ -729,12 +731,12 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n \n \tLOG(RkISP1, Debug) << \"Sensor configured with \" << format;\n \n-\tif (csi_) {\n-\t\tret = csi_->setFormat(0, &format);\n-\t\tif (ret < 0)\n-\t\t\treturn ret;\n-\t}\n+\t/* Propagate format through the internal media pipeline up to the ISP */\n+\tret = data->pipe_.configure(sensor, &format);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n+\tLOG(RkISP1, Debug) << \"Configuring ISP with : \" << format;\n \tret = isp_->setFormat(0, &format);\n \tif (ret < 0)\n \t\treturn ret;\n@@ -1035,7 +1037,6 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n  */\n \n int PipelineHandlerRkISP1::initLinks(Camera *camera,\n-\t\t\t\t     const CameraSensor *sensor,\n \t\t\t\t     const RkISP1CameraConfiguration &config)\n {\n \tRkISP1CameraData *data = cameraData(camera);\n@@ -1046,31 +1047,16 @@ int PipelineHandlerRkISP1::initLinks(Camera *camera,\n \t\treturn ret;\n \n \t/*\n-\t * Configure the sensor links: enable the link corresponding to this\n-\t * camera.\n+\t * Configure the sensor links: enable the links corresponding to this\n+\t * pipeline all the way up to the ISP, through any connected CSI receiver.\n \t */\n-\tfor (MediaLink *link : ispSink_->links()) {\n-\t\tif (link->source()->entity() != sensor->entity())\n-\t\t\tcontinue;\n-\n-\t\tLOG(RkISP1, Debug)\n-\t\t\t<< \"Enabling link from sensor '\"\n-\t\t\t<< link->source()->entity()->name()\n-\t\t\t<< \"' to ISP\";\n-\n-\t\tret = link->setEnabled(true);\n-\t\tif (ret < 0)\n-\t\t\treturn ret;\n-\t}\n-\n-\tif (csi_) {\n-\t\tMediaLink *link = isp_->entity()->getPadByIndex(0)->links().at(0);\n-\n-\t\tret = link->setEnabled(true);\n-\t\tif (ret < 0)\n-\t\t\treturn ret;\n+\tret = data->pipe_.initLinks();\n+\tif (ret) {\n+\t\tLOG(RkISP1, Error) << \"Failed to set up pipe links\";\n+\t\treturn ret;\n \t}\n \n+\t/* Configure the paths after the ISP */\n \tfor (const StreamConfiguration &cfg : config) {\n \t\tif (cfg.stream() == &data->mainPathStream_)\n \t\t\tret = data->mainPath_->setEnabled(true);\n@@ -1094,6 +1080,13 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \t\tstd::make_unique<RkISP1CameraData>(this, &mainPath_,\n \t\t\t\t\t\t   hasSelfPath_ ? &selfPath_ : nullptr);\n \n+\t/* Identify the pipeline path between the sensor and the rkisp1_isp */\n+\tret = data->pipe_.init(sensor, \"rkisp1_isp\");\n+\tif (ret) {\n+\t\tLOG(RkISP1, Error) << \"Failed to identify path from sensor to rkisp1_isp\";\n+\t\treturn ret;\n+\t}\n+\n \tdata->sensor_ = std::make_unique<CameraSensor>(sensor);\n \tret = data->sensor_->init();\n \tif (ret)\n@@ -1129,6 +1122,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \tconst std::string &id = data->sensor_->id();\n \tstd::shared_ptr<Camera> camera =\n \t\tCamera::create(std::move(data), id, streams);\n+\n \tregisterCamera(std::move(camera));\n \n \treturn 0;\n@@ -1136,8 +1130,6 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \n bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n {\n-\tconst MediaPad *pad;\n-\n \tDeviceMatch dm(\"rkisp1\");\n \tdm.add(\"rkisp1_isp\");\n \tdm.add(\"rkisp1_resizer_mainpath\");\n@@ -1162,22 +1154,6 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n \tif (isp_->open() < 0)\n \t\treturn false;\n \n-\t/* Locate and open the optional CSI-2 receiver. */\n-\tispSink_ = isp_->entity()->getPadByIndex(0);\n-\tif (!ispSink_ || ispSink_->links().empty())\n-\t\treturn false;\n-\n-\tpad = ispSink_->links().at(0)->source();\n-\tif (pad->entity()->function() == MEDIA_ENT_F_VID_IF_BRIDGE) {\n-\t\tcsi_ = std::make_unique<V4L2Subdevice>(pad->entity());\n-\t\tif (csi_->open() < 0)\n-\t\t\treturn false;\n-\n-\t\tispSink_ = csi_->entity()->getPadByIndex(0);\n-\t\tif (!ispSink_)\n-\t\t\treturn false;\n-\t}\n-\n \t/* Locate and open the stats and params video nodes. */\n \tstat_ = V4L2VideoDevice::fromEntityName(media_, \"rkisp1_stats\");\n \tif (stat_->open() < 0)\n@@ -1205,8 +1181,10 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n \t * camera instance for each of them.\n \t */\n \tbool registered = false;\n-\tfor (MediaLink *link : ispSink_->links()) {\n-\t\tif (!createCamera(link->source()->entity()))\n+\n+\tfor (MediaEntity *entity : media_->locateEntities(MEDIA_ENT_F_CAM_SENSOR)) {\n+\t\tLOG(RkISP1, Info) << \"Identified \" << entity->name();\n+\t\tif (!createCamera(entity))\n \t\t\tregistered = true;\n \t}\n \n",
    "prefixes": [
        "v2",
        "4/4"
    ]
}