[{"id":21843,"web_url":"https://patchwork.libcamera.org/comment/21843/","msgid":"<CAHW6GYJOvjCQ+ma4Z7PZVathzdUzXuJ4khs4S5=mgjzvovgdqw@mail.gmail.com>","date":"2021-12-21T10:34:19","subject":"Re: [libcamera-devel] [PATCH v4 1/2] pipeline: raspberrypi: Move\n\tsensor entity detection out of registerCamera()","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Naush\n\nThanks for this patch!\n\nOn Tue, 14 Dec 2021 at 14:00, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Enumerate the sensor device entities in PipelineHandlerRPi::match() and loop\n> over PipelineHandlerRPi::registerCamera() for each sensor found. This will\n> allow the pipeline handler to register multiple cameras attached to a single\n> Unicam instance with a Video Mux device.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 35 +++++++++++--------\n>  1 file changed, 20 insertions(+), 15 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 86851ac467ad..2a2fb5273eb8 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -310,7 +310,7 @@ private:\n>                 return static_cast<RPiCameraData *>(camera->_d());\n>         }\n>\n> -       int registerCamera(MediaDevice *unicam, MediaDevice *isp);\n> +       int registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity);\n>         int queueAllBuffers(Camera *camera);\n>         int prepareBuffers(Camera *camera);\n>         void freeBuffers(Camera *camera);\n> @@ -1029,16 +1029,28 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)\n>                 return false;\n>         }\n>\n> -       int ret = registerCamera(unicamDevice, ispDevice);\n> -       if (ret) {\n> -               LOG(RPI, Error) << \"Failed to register camera: \" << ret;\n> -               return false;\n> +       /*\n> +        * The loop below is used to register multiple cameras behind one or more\n> +        * video mux devices that are attached to a particular Unicam instance.\n> +        * Obviously these cameras cannot be used simultaneously.\n> +        */\n> +       unsigned int numCameras = 0;\n> +       for (MediaEntity *entity : unicamDevice->entities()) {\n> +               if (entity->function() != MEDIA_ENT_F_CAM_SENSOR)\n> +                       continue;\n> +\n> +               int ret = registerCamera(unicamDevice, ispDevice, entity);\n> +               if (ret)\n> +                       LOG(RPI, Error) << \"Failed to register camera \"\n> +                                       << entity->name() << \": \" << ret;\n> +               else\n> +                       numCameras++;\n>         }\n>\n> -       return true;\n> +       return !!numCameras;\n\nI slightly wonder if the \"!!\" is necessary, or perhaps it reminds you\nthat you're returning a bool?\n\nBut I have nothing to add above the pointless/trivial, so:\n\nReviewed-by: David Plowman <david.plowman@raspberrypi.com>\n\nThanks!\nDavid\n\n>  }\n>\n> -int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)\n> +int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity)\n>  {\n>         std::unique_ptr<RPiCameraData> data = std::make_unique<RPiCameraData>(this);\n>\n> @@ -1079,14 +1091,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)\n>         data->isp_[Isp::Output1].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);\n>         data->isp_[Isp::Stats].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);\n>\n> -       /* Identify the sensor. */\n> -       for (MediaEntity *entity : unicam->entities()) {\n> -               if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) {\n> -                       data->sensor_ = std::make_unique<CameraSensor>(entity);\n> -                       break;\n> -               }\n> -       }\n> -\n> +       data->sensor_ = std::make_unique<CameraSensor>(sensorEntity);\n>         if (!data->sensor_)\n>                 return -EINVAL;\n>\n> --\n> 2.25.1\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 0BA3FBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Dec 2021 10:34:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6F446608A2;\n\tTue, 21 Dec 2021 11:34:32 +0100 (CET)","from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com\n\t[IPv6:2a00:1450:4864:20::42c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2334E60113\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Dec 2021 11:34:31 +0100 (CET)","by mail-wr1-x42c.google.com with SMTP id d9so6445830wrb.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Dec 2021 02:34:31 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"dm1ELVra\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=L5IzHxoRFNdatMN1nRx6mfefxwSZfHUNO7jIL907qY4=;\n\tb=dm1ELVrars8vlMTGdExqZ6EbjKYcWr6Ont/Dctvor4AWtKl+7emW3jq+NkfuBLS8wc\n\tKZJ4Xxis+dts4mhrCQkIQg+EnD32DA4eC9PE0cAaPeF0o+vEZ/naasFFJ21BMIW+oICt\n\tjo2xNOtLqfItinH8I/2bz6K6oFfj6Ol8PJVbkfI5y40X0uXNQvoBkMUZYnqi+pJ+WEoH\n\tSK6jmyltcQx/U8p2Ua/9VyvyDhEyQHXTKANP0MydNIYSHbnSrousIqCCReJsHCAi2jqN\n\tohasifuyTO9whPPciVgW7o07Hd6fFde2Nkx3DG0CbJMAkIlqoIK9qq/TKVJt/rSbtb4m\n\t+wYw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=L5IzHxoRFNdatMN1nRx6mfefxwSZfHUNO7jIL907qY4=;\n\tb=C6GFA1mR+Es4V0Pf8acdOHoGltjzR5486f3sMKSfw7+8QPxKtRTjx7mqOfJkj6B4JA\n\trNN9xgb1/IiJqKUDwBnNx+n8kiGTOal+pC17Gq5nLNiNwSRgM9XSEDS+EsUhqK6fd6Ke\n\tS1KKlpJaG97g47lNE+jWIBzMHwOoeHtFpFMZs8NPxoiOMejjtvzAGtX7np7jqFEjeyZ6\n\txvb6uACdU7NMQBxxul8EKgwqOaJfJIMXwQxhbTEBzzBP+JmfvrufN1NLa/qT+9myILWE\n\thV3m0O2+U4qd7CHo463duybu378V1+X29LGyQNEzt22ANPxr3rME60Vqsud/cmC2tgfV\n\t7l5A==","X-Gm-Message-State":"AOAM5312q+kFJSqktDwYhYywrj94jGEd4sQ4wzbClm+BGoCLyE/nYpW+\n\tzP83dQN/x42qldsO5Ed56SZLKzpZ9uBQAtpZJ2YARGXZu4s=","X-Google-Smtp-Source":"ABdhPJxw35mLMhGmShdJzfp3KuRDOJNy4D1cBIhYh+Oas0MOnM/DE6UxOf2LSNqe6KQ93bWx/2wnRKZ0lUhQIz6Dt/8=","X-Received":"by 2002:adf:f801:: with SMTP id s1mr2103457wrp.3.1640082870698; \n\tTue, 21 Dec 2021 02:34:30 -0800 (PST)","MIME-Version":"1.0","References":"<20211214140002.3552445-1-naush@raspberrypi.com>\n\t<20211214140002.3552445-2-naush@raspberrypi.com>","In-Reply-To":"<20211214140002.3552445-2-naush@raspberrypi.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Tue, 21 Dec 2021 10:34:19 +0000","Message-ID":"<CAHW6GYJOvjCQ+ma4Z7PZVathzdUzXuJ4khs4S5=mgjzvovgdqw@mail.gmail.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v4 1/2] pipeline: raspberrypi: Move\n\tsensor entity detection out of registerCamera()","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21859,"web_url":"https://patchwork.libcamera.org/comment/21859/","msgid":"<20211221174517.n2uxosesljjxyogb@uno.localdomain>","date":"2021-12-21T17:45:17","subject":"Re: [libcamera-devel] [PATCH v4 1/2] pipeline: raspberrypi: Move\n\tsensor entity detection out of registerCamera()","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Naush\n\nOn Tue, Dec 14, 2021 at 02:00:01PM +0000, Naushir Patuck wrote:\n> Enumerate the sensor device entities in PipelineHandlerRPi::match() and loop\n> over PipelineHandlerRPi::registerCamera() for each sensor found. This will\n> allow the pipeline handler to register multiple cameras attached to a single\n> Unicam instance with a Video Mux device.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 35 +++++++++++--------\n>  1 file changed, 20 insertions(+), 15 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 86851ac467ad..2a2fb5273eb8 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -310,7 +310,7 @@ private:\n>  \t\treturn static_cast<RPiCameraData *>(camera->_d());\n>  \t}\n>\n> -\tint registerCamera(MediaDevice *unicam, MediaDevice *isp);\n> +\tint registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity);\n>  \tint queueAllBuffers(Camera *camera);\n>  \tint prepareBuffers(Camera *camera);\n>  \tvoid freeBuffers(Camera *camera);\n> @@ -1029,16 +1029,28 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)\n>  \t\treturn false;\n>  \t}\n>\n> -\tint ret = registerCamera(unicamDevice, ispDevice);\n> -\tif (ret) {\n> -\t\tLOG(RPI, Error) << \"Failed to register camera: \" << ret;\n> -\t\treturn false;\n> +\t/*\n> +\t * The loop below is used to register multiple cameras behind one or more\n> +\t * video mux devices that are attached to a particular Unicam instance.\n> +\t * Obviously these cameras cannot be used simultaneously.\n> +\t */\n> +\tunsigned int numCameras = 0;\n> +\tfor (MediaEntity *entity : unicamDevice->entities()) {\n> +\t\tif (entity->function() != MEDIA_ENT_F_CAM_SENSOR)\n> +\t\t\tcontinue;\n> +\n> +\t\tint ret = registerCamera(unicamDevice, ispDevice, entity);\n> +\t\tif (ret)\n> +\t\t\tLOG(RPI, Error) << \"Failed to register camera \"\n> +\t\t\t\t\t<< entity->name() << \": \" << ret;\n> +\t\telse\n> +\t\t\tnumCameras++;\n>  \t}\n>\n> -\treturn true;\n> +\treturn !!numCameras;\n>  }\n>\n> -int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)\n> +int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity)\n>  {\n>  \tstd::unique_ptr<RPiCameraData> data = std::make_unique<RPiCameraData>(this);\n>\n> @@ -1079,14 +1091,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)\n>  \tdata->isp_[Isp::Output1].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);\n>  \tdata->isp_[Isp::Stats].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);\n>\n> -\t/* Identify the sensor. */\n> -\tfor (MediaEntity *entity : unicam->entities()) {\n> -\t\tif (entity->function() == MEDIA_ENT_F_CAM_SENSOR) {\n> -\t\t\tdata->sensor_ = std::make_unique<CameraSensor>(entity);\n> -\t\t\tbreak;\n> -\t\t}\n> -\t}\n> -\n> +\tdata->sensor_ = std::make_unique<CameraSensor>(sensorEntity);\n>  \tif (!data->sensor_)\n>  \t\treturn -EINVAL;\n>\n> --\n> 2.25.1\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 BE279BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Dec 2021 17:44:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EDD3D608F9;\n\tTue, 21 Dec 2021 18:44:24 +0100 (CET)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 78799605A8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Dec 2021 18:44:23 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 077DB200005;\n\tTue, 21 Dec 2021 17:44:22 +0000 (UTC)"],"Date":"Tue, 21 Dec 2021 18:45:17 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20211221174517.n2uxosesljjxyogb@uno.localdomain>","References":"<20211214140002.3552445-1-naush@raspberrypi.com>\n\t<20211214140002.3552445-2-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211214140002.3552445-2-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v4 1/2] pipeline: raspberrypi: Move\n\tsensor entity detection out of registerCamera()","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]