Patch Detail
Show a patch.
GET /api/1.1/patches/25372/?format=api
{ "id": 25372, "url": "https://patchwork.libcamera.org/api/1.1/patches/25372/?format=api", "web_url": "https://patchwork.libcamera.org/patch/25372/", "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": "<20251205-mali-cru-v1-3-d81bb5ffe73a@ideasonboard.com>", "date": "2025-12-05T14:52:09", "name": "[3/7] libcamera: mali-c55: Register memory input camera", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "292131551e5063e8767e6df56fbf68eac1aa8e1b", "submitter": { "id": 143, "url": "https://patchwork.libcamera.org/api/1.1/people/143/?format=api", "name": "Jacopo Mondi", "email": "jacopo.mondi@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/25372/mbox/", "series": [ { "id": 5640, "url": "https://patchwork.libcamera.org/api/1.1/series/5640/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5640", "date": "2025-12-05T14:52:06", "name": "libcamera: mali-c55: Add support for memory-to-memory", "version": 1, "mbox": "https://patchwork.libcamera.org/series/5640/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/25372/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/25372/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 95C2CC3260\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 5 Dec 2025 14:52:38 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 39C36613DE;\n\tFri, 5 Dec 2025 15:52:34 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3166F6115A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 5 Dec 2025 15:52:31 +0100 (CET)", "from [192.168.1.4] (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E42F7EAE;\n\tFri, 5 Dec 2025 15:50:14 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"b5ffPrnJ\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1764946215;\n\tbh=SgrgQCL9TrEOmvw9ck0E9mB0BXthdIMrBljUU+foLoU=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=b5ffPrnJy416bqdo+D0sBeCjw/Nnjlx/NiAn4WgVaPvRNw0RwbREZWs/EpHamTjLI\n\tsF+2/I/Wk0vCFZUPxdgS0Ycgi9ncvXlXysKxDyEiuwDX4tTrdWPNqeQP6phGhVMaNW\n\toQKwWMujTGOX1hMQHHHasm9uFIUfzm/wCXxRETBg=", "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "Date": "Fri, 05 Dec 2025 15:52:09 +0100", "Subject": "[PATCH 3/7] libcamera: mali-c55: Register memory input camera", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "Message-Id": "<20251205-mali-cru-v1-3-d81bb5ffe73a@ideasonboard.com>", "References": "<20251205-mali-cru-v1-0-d81bb5ffe73a@ideasonboard.com>", "In-Reply-To": "<20251205-mali-cru-v1-0-d81bb5ffe73a@ideasonboard.com>", "To": "Daniel Scally <dan.scally@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org", "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "X-Mailer": "b4 0.14.2", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=13306;\n\ti=jacopo.mondi@ideasonboard.com; h=from:subject:message-id;\n\tbh=vl0sIQFlsoVvekcoNbHCxxhkB0wA+QaJwace1sYFD5E=;\n\tb=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpMvGsBynQHMqrh0gzwxb0kgjyxyr9sUzTelT7s\n\tJUBa0cnU7yJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaTLxrAAKCRByNAaPFqFW\n\tPHWMD/4+04KNA1lcHAnvlwWCjf8BGsptafXiPxhd4NcTrX+r2Se8bARU86vryklPARmffGfNHpR\n\tjcTGyX1zKjGBQYmsxTHHVzSYruVTtOTjLYVoUSckFLxlIO37TKxcoocqJCgteW7Fr1zsc36jsxI\n\tDivGJx6ejMQEd5SgKxz3Yrxujl1Ke+l3YTVsuQev49Pb8ENPOOaZeOIIPpm15ntmsDCX2URoyXe\n\t1hOO83dYpUtydB8XxhBv46lGCEZryLZKMNPJra+Q4IWO4ZaREvUfUtgUUj18IuD2wJ4qtGboOAK\n\tfsa9B/m28uO/gZTwyww+WYtYwMGV0DxkuyMd5K85zks7jev9/XMeDGkGY5Ihl+S2+Wd5f/1MXB0\n\tWhf5UaDcAsDPz1K84jBU6BsKR45moBNUcosjckRf8UMRnd5nz/XqzHloutZKdj8ytyXE7oljiic\n\tquB7sEtepfjDtpkuVhUgr09HhsHe7vJ2/hDgMP0B0ggwq2wx5re2+mb/9FCOOv670xhVV7tzCOk\n\t6HgV1VTSXQnG8J2jCwsio8ZytYlJ3vko8KcDIoRSpVqV6dQRoxdSVWM0o0Q83+6vqM1zysACLSi\n\tIc0XlRqkresi9rcnq5OElIQUotqA0oBeaJfxlb1VUU1quHeHCtYdPCKtGc1ZG+X5c44Q+XwioSS\n\t7Lr1zBNQJWhb72w==", "X-Developer-Key": "i=jacopo.mondi@ideasonboard.com; a=openpgp;\n\tfpr=72392EDC88144A65C701EA9BA5826A2587AD026B", "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": "From: Daniel Scally <dan.scally@ideasonboard.com>\n\nAdd support to Mali C55 pipeline handler for memory-to-memory camera\nmode.\n\nThe Mali-C55, as integrated in the Renesas RZ/V2H(P) SoC, is fed with\nimages saved to memory by the CRU unit and read on behalf of the ISP\nby the IVC.\n\nUpdate the pipeline handler's match() function to search for the CRU\nmedia entity necessary to register a memory input camera. Create and\ninitialize a CameraData instance for the memory camera use case if a\nvalid CRU is found and initialize the IVC components used to feed the\nISP with images read from memory.\n\nThe CameraData functions that deflect the selection of the subdevice at\nthe origin of the pipeline, the list of supported sizes and the maximum\nsupported resolution have been updated to support memory-to-memory\noperations.\n\nSigned-off-by: Daniel Scally <dan.scally@ideasonboard.com>\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\n src/libcamera/pipeline/mali-c55/mali-c55.cpp | 181 ++++++++++++++++++++++-----\n 1 file changed, 150 insertions(+), 31 deletions(-)", "diff": "diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\nindex 801067ce00fe4e0fd6b81db699fcaed2ebb840b6..6816bf7179ae09434ec10c35ea296725d3ac0700 100644\n--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n@@ -42,6 +42,8 @@\n #include \"libcamera/internal/v4l2_subdevice.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n \n+#include \"rzg2l-cru.h\"\n+\n namespace {\n \n bool isFormatRaw(const libcamera::PixelFormat &pixFmt)\n@@ -95,6 +97,7 @@ public:\n \tenum CameraType {\n \t\tTPG,\n \t\tInline,\n+\t\tMemory,\n \t};\n \n \tMaliC55CameraData(PipelineHandler *pipe)\n@@ -104,10 +107,11 @@ public:\n \n \tint loadIPA();\n \n-\t/* Deflect these functionalities to either TPG or CameraSensor. */\n+\t/* Deflect these functionalities to either TPG, inline sensor or CRU. */\n \tstd::vector<Size> sizes(unsigned int mbusCode) const;\n \tSize resolution() const;\n \tV4L2Subdevice *subdev() const;\n+\tCameraSensor *sensor() const;\n \n \tint pixfmtToMbusCode(const PixelFormat &pixFmt) const;\n \tconst PixelFormat &bestRawFormat() const;\n@@ -119,6 +123,7 @@ public:\n \n \tint initTPG(MediaEntity *tpg);\n \tint initInlineCamera(MediaEntity *sensor);\n+\tvoid initMemoryCamera();\n \n \tStream frStream_;\n \tStream dsStream_;\n@@ -139,10 +144,15 @@ public:\n \t\tstd::unique_ptr<CameraSensor> sensor_;\n \t} inlineInput;\n \n+\tstruct {\n+\t\tstd::unique_ptr<RZG2LCRU> cru_;\n+\t} memoryInput;\n+\n \tCameraType input_;\n \n private:\n \tvoid setSensorControls(const ControlList &sensorControls);\n+\tstd::vector<Size> tpgSizes(unsigned int mbusCode) const;\n \tstd::string id_;\n };\n \n@@ -196,16 +206,18 @@ int MaliC55CameraData::initInlineCamera(MediaEntity *sensor)\n \treturn 0;\n }\n \n+void MaliC55CameraData::initMemoryCamera()\n+{\n+\tinput_ = Memory;\n+}\n+\n void MaliC55CameraData::setSensorControls(const ControlList &sensorControls)\n {\n \tdelayedCtrls_->push(sensorControls);\n }\n \n-std::vector<Size> MaliC55CameraData::sizes(unsigned int mbusCode) const\n+std::vector<Size> MaliC55CameraData::tpgSizes(unsigned int mbusCode) const\n {\n-\tif (input_ == Inline)\n-\t\treturn inlineInput.sensor_->sizes(mbusCode);\n-\n \tV4L2Subdevice::Formats formats = tpgInput.sd_->formats(0);\n \tif (formats.empty())\n \t\treturn {};\n@@ -224,6 +236,21 @@ std::vector<Size> MaliC55CameraData::sizes(unsigned int mbusCode) const\n \treturn sizes;\n }\n \n+std::vector<Size> MaliC55CameraData::sizes(unsigned int mbusCode) const\n+{\n+\tswitch (input_) {\n+\tcase TPG:\n+\t\treturn tpgSizes(mbusCode);\n+\tcase Inline:\n+\t\treturn inlineInput.sensor_->sizes(mbusCode);\n+\tcase Memory:\n+\t\treturn memoryInput.cru_->sizes();\n+\t}\n+\n+\tassert(false);\n+\treturn {};\n+}\n+\n Size MaliC55CameraData::resolution() const\n {\n \tswitch (input_) {\n@@ -231,6 +258,8 @@ Size MaliC55CameraData::resolution() const\n \t\treturn tpgInput.resolution_;\n \tcase Inline:\n \t\treturn inlineInput.sensor_->resolution();\n+\tcase Memory:\n+\t\treturn memoryInput.cru_->resolution();\n \t}\n \n \tassert(false);\n@@ -244,6 +273,27 @@ V4L2Subdevice *MaliC55CameraData::subdev() const\n \t\treturn tpgInput.sd_.get();\n \tcase Inline:\n \t\treturn inlineInput.sensor_->device();\n+\tcase Memory:\n+\t\treturn memoryInput.cru_->sensor()->device();\n+\t}\n+\n+\tassert(false);\n+\treturn nullptr;\n+}\n+\n+CameraSensor *MaliC55CameraData::sensor() const\n+{\n+\tswitch (input_) {\n+\tcase Inline:\n+\t\treturn inlineInput.sensor_.get();\n+\tcase Memory:\n+\t\treturn memoryInput.cru_->sensor();\n+\tcase TPG:\n+\t\t/*\n+\t\t * TPG has no camera sensor, we shall never call this\n+\t\t * function if TPG is in use. Exit the switch and assert().\n+\t\t */\n+\t\tbreak;\n \t}\n \n \tassert(false);\n@@ -332,7 +382,8 @@ void MaliC55CameraData::updateControls(const ControlInfoMap &ipaControls)\n \t\treturn;\n \n \tIPACameraSensorInfo sensorInfo;\n-\tint ret = inlineInput.sensor_->sensorInfo(&sensorInfo);\n+\tCameraSensor *sensor = this->sensor();\n+\tint ret = sensor->sensorInfo(&sensorInfo);\n \tif (ret) {\n \t\tLOG(MaliC55, Error) << \"Failed to retrieve sensor info\";\n \t\treturn;\n@@ -414,7 +465,7 @@ int MaliC55CameraData::loadIPA()\n \n \tipa_->setSensorControls.connect(this, &MaliC55CameraData::setSensorControls);\n \n-\tCameraSensor *sensor = inlineInput.sensor_.get();\n+\tCameraSensor *sensor = this->sensor();\n \tstd::string ipaTuningFile = ipa_->configurationFile(sensor->model() + \".yaml\",\n \t\t\t\t\t\t\t \"uncalibrated.yaml\");\n \n@@ -475,8 +526,8 @@ CameraConfiguration::Status MaliC55CameraConfiguration::validate()\n \t\tcombinedTransform_ = Transform::Rot0;\n \t} else {\n \t\tOrientation requestedOrientation = orientation;\n-\t\tcombinedTransform_ =\n-\t\t\tdata_->inlineInput.sensor_->computeTransform(&orientation);\n+\t\tCameraSensor *sensor = data_->sensor();\n+\t\tcombinedTransform_ = sensor->computeTransform(&orientation);\n \t\tif (orientation != requestedOrientation)\n \t\t\tstatus = Adjusted;\n \t}\n@@ -709,11 +760,15 @@ private:\n \t\t\t\tconst std::string &name);\n \tbool registerTPGCamera(MediaLink *link);\n \tbool registerSensorCamera(MediaLink *link);\n+\tbool registerMemoryInputCamera();\n \n \tstd::shared_ptr<MediaDevice> media_;\n+\tstd::shared_ptr<MediaDevice> cruMedia_;\n \tstd::unique_ptr<V4L2Subdevice> isp_;\n \tstd::unique_ptr<V4L2VideoDevice> stats_;\n \tstd::unique_ptr<V4L2VideoDevice> params_;\n+\tstd::unique_ptr<V4L2Subdevice> ivc_;\n+\tstd::unique_ptr<V4L2VideoDevice> input_;\n \n \tstd::vector<std::unique_ptr<FrameBuffer>> statsBuffers_;\n \tstd::queue<FrameBuffer *> availableStatsBuffers_;\n@@ -966,6 +1021,8 @@ int PipelineHandlerMaliC55::configure(Camera *camera,\n \t\tret = csi2Entity->getPadByIndex(1)->links()[0]->setEnabled(true);\n \t\tbreak;\n \t}\n+\tcase MaliC55CameraData::Memory:\n+\t\tbreak;\n \t}\n \tif (ret)\n \t\treturn ret;\n@@ -991,6 +1048,8 @@ int PipelineHandlerMaliC55::configure(Camera *camera,\n \n \t\tret = data->inlineInput.csi2_->getFormat(1, &subdevFormat);\n \n+\t\tbreak;\n+\tcase MaliC55CameraData::Memory:\n \t\tbreak;\n \t}\n \tif (ret)\n@@ -1065,6 +1124,7 @@ int PipelineHandlerMaliC55::configure(Camera *camera,\n \t\tpipe->stream = stream;\n \t}\n \n+\t/* TPG doesn't support the IPA, so stop here. */\n \tif (!data->ipa_)\n \t\treturn 0;\n \n@@ -1091,20 +1151,20 @@ int PipelineHandlerMaliC55::configure(Camera *camera,\n \n \t/* We need to inform the IPA of the sensor configuration */\n \tipa::mali_c55::IPAConfigInfo ipaConfig{};\n+\tCameraSensor *sensor = data->sensor();\n \n-\tret = data->inlineInput.sensor_->sensorInfo(&ipaConfig.sensorInfo);\n+\tret = sensor->sensorInfo(&ipaConfig.sensorInfo);\n \tif (ret)\n \t\treturn ret;\n \n-\tipaConfig.sensorControls = data->inlineInput.sensor_->controls();\n+\tipaConfig.sensorControls = sensor->controls();\n \n \t/*\n \t * And we also need to tell the IPA the bayerOrder of the data (as\n \t * affected by any flips that we've configured)\n \t */\n \tconst Transform &combinedTransform = maliConfig->combinedTransform();\n-\tBayerFormat::Order bayerOrder =\n-\t\tdata->inlineInput.sensor_->bayerOrder(combinedTransform);\n+\tBayerFormat::Order bayerOrder = sensor->bayerOrder(combinedTransform);\n \n \tControlInfoMap ipaControls;\n \tret = data->ipa_->configure(ipaConfig, utils::to_underlying(bayerOrder),\n@@ -1323,10 +1383,11 @@ void PipelineHandlerMaliC55::applyScalerCrop(Camera *camera,\n \t\treturn;\n \t}\n \n+\tCameraSensor *sensor = data->sensor();\n \tRectangle nativeCrop = *scalerCrop;\n-\n \tIPACameraSensorInfo sensorInfo;\n-\tint ret = data->inlineInput.sensor_->sensorInfo(&sensorInfo);\n+\n+\tint ret = sensor->sensorInfo(&sensorInfo);\n \tif (ret) {\n \t\tLOG(MaliC55, Error) << \"Failed to retrieve sensor info\";\n \t\treturn;\n@@ -1661,6 +1722,39 @@ bool PipelineHandlerMaliC55::registerSensorCamera(MediaLink *ispLink)\n \treturn true;\n }\n \n+bool PipelineHandlerMaliC55::registerMemoryInputCamera()\n+{\n+\tstd::unique_ptr<MaliC55CameraData> data = std::make_unique<MaliC55CameraData>(this);\n+\n+\tdata->memoryInput.cru_ = std::make_unique<RZG2LCRU>();\n+\tint ret = data->memoryInput.cru_->init(cruMedia_.get());\n+\tif (ret)\n+\t\treturn false;\n+\n+\tdata->initMemoryCamera();\n+\n+\tCameraSensor *sensor = data->memoryInput.cru_->sensor();\n+\tdata->properties_ = sensor->properties();\n+\n+\tconst CameraSensorProperties::SensorDelays &delays = sensor->sensorDelays();\n+\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n+\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n+\t\t{ V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n+\t};\n+\n+\tdata->delayedCtrls_ = std::make_unique<DelayedControls>(sensor->device(), params);\n+\tisp_->frameStart.connect(data->delayedCtrls_.get(),\n+\t\t\t\t &DelayedControls::applyControls);\n+\n+\tinput_->bufferReady.connect(data->memoryInput.cru_.get(),\n+\t\t\t\t &RZG2LCRU::cruReturnBuffer);\n+\n+\tif (!registerMaliCamera(std::move(data), sensor->device()->entity()->name()))\n+\t\treturn false;\n+\n+\treturn true;\n+}\n+\n bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n {\n \tconst MediaPad *ispSink;\n@@ -1670,14 +1764,14 @@ bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n \t * The TPG and the downscale pipe are both optional blocks and may not\n \t * be fitted.\n \t */\n-\tDeviceMatch dm(\"mali-c55\");\n-\tdm.add(\"mali-c55 isp\");\n-\tdm.add(\"mali-c55 resizer fr\");\n-\tdm.add(\"mali-c55 fr\");\n-\tdm.add(\"mali-c55 3a stats\");\n-\tdm.add(\"mali-c55 3a params\");\n-\n-\tmedia_ = acquireMediaDevice(enumerator, dm);\n+\tDeviceMatch c55_dm(\"mali-c55\");\n+\tc55_dm.add(\"mali-c55 isp\");\n+\tc55_dm.add(\"mali-c55 resizer fr\");\n+\tc55_dm.add(\"mali-c55 fr\");\n+\tc55_dm.add(\"mali-c55 3a stats\");\n+\tc55_dm.add(\"mali-c55 3a params\");\n+\n+\tmedia_ = acquireMediaDevice(enumerator, c55_dm);\n \tif (!media_)\n \t\treturn false;\n \n@@ -1737,6 +1831,22 @@ bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n \tstats_->bufferReady.connect(this, &PipelineHandlerMaliC55::statsBufferReady);\n \tparams_->bufferReady.connect(this, &PipelineHandlerMaliC55::paramsBufferReady);\n \n+\t/*\n+\t * We also need to search for the rzg2l-cru CSI-2 receiver. If we find\n+\t * that then we need to work in memory input mode instead of the inline\n+\t * mode. The absence of this match is not necessarily a failure at this\n+\t * point...it depends on the media links that we investigate momentarily.\n+\t *\n+\t * This is a bit hacky, because there could be multiple of these media\n+\t * devices and we're just taking the first. We need modular pipelines to\n+\t * properly solve the issue.\n+\t */\n+\tDeviceMatch cru_dm(\"rzg2l_cru\");\n+\tcru_dm.add(std::regex(\"csi-[0-9a-f]{8}.csi2\"));\n+\tcru_dm.add(std::regex(\"cru-ip-[0-9a-f]{8}.cru[0-9]\"));\n+\tcru_dm.add(\"CRU output\");\n+\tcruMedia_ = acquireMediaDevice(enumerator, cru_dm);\n+\n \tispSink = isp_->entity()->getPadByIndex(0);\n \tif (!ispSink || ispSink->links().empty()) {\n \t\tLOG(MaliC55, Error) << \"ISP sink pad error\";\n@@ -1750,13 +1860,6 @@ bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n \t * MEDIA_ENT_F_CAM_SENSOR - The test pattern generator\n \t * MEDIA_ENT_F_VID_IF_BRIDGE - A CSI-2 receiver\n \t * MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER - An input device\n-\t *\n-\t * The last one will be unsupported for now. The TPG is relatively easy,\n-\t * we just register a Camera for it. If we have a CSI-2 receiver we need\n-\t * to check its sink pad and register Cameras for anything connected to\n-\t * it (probably...there are some complex situations in which that might\n-\t * not be true but let's pretend they don't exist until we come across\n-\t * them)\n \t */\n \tbool registered;\n \tfor (MediaLink *link : ispSink->links()) {\n@@ -1776,7 +1879,23 @@ bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n \n \t\t\tbreak;\n \t\tcase MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER:\n-\t\t\tLOG(MaliC55, Warning) << \"Memory input not yet supported\";\n+\t\t\tif (!cruMedia_)\n+\t\t\t\treturn false;\n+\n+\t\t\tivc_ = V4L2Subdevice::fromEntityName(media_.get(),\n+\t\t\t\t\t\t\t \"rzv2h ivc block\");\n+\t\t\tif (ivc_->open() < 0)\n+\t\t\t\treturn false;\n+\n+\t\t\tinput_ = V4L2VideoDevice::fromEntityName(media_.get(),\n+\t\t\t\t\t\t\t\t \"rzv2h-ivc\");\n+\t\t\tif (input_->open() < 0)\n+\t\t\t\treturn false;\n+\n+\t\t\tregistered = registerMemoryInputCamera();\n+\t\t\tif (!registered)\n+\t\t\t\treturn registered;\n+\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tLOG(MaliC55, Error) << \"Unsupported entity function\";\n", "prefixes": [ "3/7" ] }