[{"id":31542,"web_url":"https://patchwork.libcamera.org/comment/31542/","msgid":"<045e7bae-cb87-4979-9e53-7e19c38d324e@ideasonboard.com>","date":"2024-10-03T05:32:19","subject":"Re: [PATCH v2 4/4] libcamera: pipeline: rkisp1: Convert to use\n\tMediaPipeline","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Kieran,\n\nOn 03/10/24 2:56 am, Kieran Bingham wrote:\n> Use the new MediaPipeline to manage and identify all sensors connected\n> to complex pipelines that can connect to the CSI2 receiver before the\n> ISP.\n>\n> This can include chained multiplexers that supply multiple cameras, so\n> make use of the MediaDevice::locateEntities to search for all cameras\n> and construct a pipeline for each.\n>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\ndouble S-o-B\n> ---\n>   src/libcamera/pipeline/rkisp1/rkisp1.cpp | 86 +++++++++---------------\n>   1 file changed, 32 insertions(+), 54 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 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>","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 B9782BD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Oct 2024 05:32:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B88ED6351F;\n\tThu,  3 Oct 2024 07:32:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 225A062C8F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Oct 2024 07:32:24 +0200 (CEST)","from [IPV6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f] (unknown\n\t[IPv6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 903C5593;\n\tThu,  3 Oct 2024 07:30:50 +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=\"RFSart4d\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727933451;\n\tbh=TouhSgUmEGgF7jnqO5P5hXEbykV1zHXm9FzXIzMvDIA=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=RFSart4dQO5SnywWu6k2GjSru0qNbay8kSFhR7Vjy7wBzIj6/8fASDsShi0VCVHyx\n\tZsMPW9bw/ZjRBPSSP2iJ95ExQJZtCgSsYdLCSkakYND9AYuUg9Y7kKJyNxZY2+R69j\n\th4koRYMZ3PTmejsRAk8kT+zMnY0LabYlJB8lY8lQ=","Message-ID":"<045e7bae-cb87-4979-9e53-7e19c38d324e@ideasonboard.com>","Date":"Thu, 3 Oct 2024 11:02:19 +0530","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 4/4] libcamera: pipeline: rkisp1: Convert to use\n\tMediaPipeline","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","References":"<20241002212632.2463458-1-kieran.bingham@ideasonboard.com>\n\t<20241002212632.2463458-5-kieran.bingham@ideasonboard.com>","Content-Language":"en-US","From":"Umang Jain <umang.jain@ideasonboard.com>","In-Reply-To":"<20241002212632.2463458-5-kieran.bingham@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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>"}}]