[{"id":27360,"web_url":"https://patchwork.libcamera.org/comment/27360/","msgid":"<-AsogWRM6YgdyCGSA2XG-It0bmA_WXapjfbbR64IksSzWeNuGawKIZrq8CvY4BE4lNljclTttFtg2K5SmgqUA6f-36BYhyVo6IPRwbwLHBQ=@protonmail.com>","date":"2023-06-15T21:03:20","subject":"Re: [libcamera-devel] [PATCH v4 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2023. június 15., csütörtök 19:26 keltezéssel, Kieran Bingham via libcamera-devel <libcamera-devel@lists.libcamera.org> írta:\n\n> The CameraManager exposes addCamera and removeCamera as public API\n> calls, while they should never be called from an application. These\n> calls are only expected to be used by PipelineHandlers to update the\n> CameraManager that a new Camera has been created and allow the Camera\n> Manager to expose it to applications.\n> \n> Remove the public calls and update the private implementations such that\n> they can be used directly by the PipelineHandler through the internal\n> CameraManager::Private provided by the Extensible class.\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> Tested-by: Ashok Sidipotu <ashok.sidipotu@collabora.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  include/libcamera/camera_manager.h          |  4 -\n>  include/libcamera/internal/camera_manager.h |  2 +-\n>  src/libcamera/camera_manager.cpp            | 87 +++++++++------------\n>  src/libcamera/pipeline_handler.cpp          |  6 +-\n>  4 files changed, 43 insertions(+), 56 deletions(-)\n> [...]\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index 882b2d4b234c..cafd7bce574e 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -148,9 +148,25 @@ void CameraManager::Private::cleanup()\n>  \tenumerator_.reset(nullptr);\n>  }\n> \n> +/**\n> + * \\brief Add a camera to the camera manager\n> + * \\param[in] camera The camera to be added\n> + * \\param[in] devnums The device numbers to associate with \\a camera\n> + *\n> + * This function is called by pipeline handlers to register the cameras they\n> + * handle with the camera manager. Registered cameras are immediately made\n> + * available to the system.\n> + *\n> + * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> + * to Camera instances.\n> + *\n> + * \\context This function shall be called from the CameraManager thread.\n> + */\n>  void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n>  \t\t\t\t       const std::vector<dev_t> &devnums)\n>  {\n> +\tASSERT(Thread::current() == this);\n> +\n>  \tMutexLocker locker(mutex_);\n> \n>  \tfor (const std::shared_ptr<Camera> &c : cameras_) {\n> @@ -167,15 +183,31 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n>  \tunsigned int index = cameras_.size() - 1;\n>  \tfor (dev_t devnum : devnums)\n>  \t\tcamerasByDevnum_[devnum] = cameras_[index];\n> +\n> +\t/* Report the addition to the public signal */\n> +\tCameraManager *const o = LIBCAMERA_O_PTR();\n> +\to->cameraAdded.emit(cameras_[index]);\n>  }\n> \n> -void CameraManager::Private::removeCamera(Camera *camera)\n> +/**\n> + * \\brief Remove a camera from the camera manager\n> + * \\param[in] camera The camera to be removed\n> + *\n> + * This function is called by pipeline handlers to unregister cameras from the\n> + * camera manager. Unregistered cameras won't be reported anymore by the\n> + * cameras() and get() calls, but references may still exist in applications.\n> + *\n> + * \\context This function shall be called from the CameraManager thread.\n> + */\n> +void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n>  {\n> +\tASSERT(Thread::current() == this);\n> +\n>  \tMutexLocker locker(mutex_);\n> \n>  \tauto iter = std::find_if(cameras_.begin(), cameras_.end(),\n>  \t\t\t\t [camera](std::shared_ptr<Camera> &c) {\n> -\t\t\t\t\t return c.get() == camera;\n> +\t\t\t\t\t return c.get() == camera.get();\n>  \t\t\t\t });\n>  \tif (iter == cameras_.end())\n>  \t\treturn;\n> @@ -185,12 +217,16 @@ void CameraManager::Private::removeCamera(Camera *camera)\n> \n>  \tauto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),\n>  \t\t\t\t   [camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {\n> -\t\t\t\t\t   return p.second.lock().get() == camera;\n> +\t\t\t\t\t   return p.second.lock().get() == camera.get();\n>  \t\t\t\t   });\n>  \tif (iter_d != camerasByDevnum_.end())\n>  \t\tcamerasByDevnum_.erase(iter_d);\n\nAs far as I can see the above will only ever remove at most a single entry from the\n`camerasByDevnum_` map, but it is allowed for a camera to have multiple underlying devices.\nI know this part is not touched by this series, but it should be fixed sooner or later.\n(Also now that `camera` is a shared_ptr, it would be better to capture it by reference I think.\nAlthough the reason for that change is not clear to me.)\n\n\n> \n>  \tcameras_.erase(iter);\n> +\n> +\t/* Report the removal to the public signal */\n> +\tCameraManager *const o = LIBCAMERA_O_PTR();\n> +\to->cameraRemoved.emit(camera);\n>  }\n> \n>  /**\n> @@ -383,51 +419,6 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n>   * perform any blocking operation.\n>   */\n> \n> -/**\n> - * \\brief Add a camera to the camera manager\n> - * \\param[in] camera The camera to be added\n> - * \\param[in] devnums The device numbers to associate with \\a camera\n> - *\n> - * This function is called by pipeline handlers to register the cameras they\n> - * handle with the camera manager. Registered cameras are immediately made\n> - * available to the system.\n> - *\n> - * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> - * to Camera instances.\n> - *\n> - * \\context This function shall be called from the CameraManager thread.\n> - */\n> -void CameraManager::addCamera(std::shared_ptr<Camera> camera,\n> -\t\t\t      const std::vector<dev_t> &devnums)\n> -{\n> -\tPrivate *const d = _d();\n> -\n> -\tASSERT(Thread::current() == d);\n> -\n> -\td->addCamera(camera, devnums);\n> -\tcameraAdded.emit(camera);\n> -}\n> -\n> -/**\n> - * \\brief Remove a camera from the camera manager\n> - * \\param[in] camera The camera to be removed\n> - *\n> - * This function is called by pipeline handlers to unregister cameras from the\n> - * camera manager. Unregistered cameras won't be reported anymore by the\n> - * cameras() and get() calls, but references may still exist in applications.\n> - *\n> - * \\context This function shall be called from the CameraManager thread.\n> - */\n> -void CameraManager::removeCamera(std::shared_ptr<Camera> camera)\n> -{\n> -\tPrivate *const d = _d();\n> -\n> -\tASSERT(Thread::current() == d);\n> -\n> -\td->removeCamera(camera.get());\n> -\tcameraRemoved.emit(camera);\n> -}\n> -\n>  /**\n>   * \\fn const std::string &CameraManager::version()\n>   * \\brief Retrieve the libcamera version string\n> [...]\n\n\nRegards,\nBarnabás Pőcze","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 8DFFDBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 15 Jun 2023 21:03:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B80CC61E4F;\n\tThu, 15 Jun 2023 23:03:30 +0200 (CEST)","from mail-4316.protonmail.ch (mail-4316.protonmail.ch\n\t[185.70.43.16])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9F2E5614FE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 15 Jun 2023 23:03:28 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686863010;\n\tbh=ujSKtmFM6PwW5k/DHcIU541E8ayh0E/TVC41ovp7t+E=;\n\th=Date:To:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=p0Z3RperYC5dqf48x+4Yby/TMc1Ci1fzCay/YcA8uC8fK6WEyOFMKhOD+/wqEW/gG\n\tI1ufUC90MXLdp8bDRa410Yj5or+8e8QP3kqblRLclI/4Vpt8U1GpvX+xrHtlbq4kMj\n\tAQZNrud6fyQ1TFZ22L3p/YZGfJ6+rHWsDl174sJ9iJJO+hR9sGFKMUToyHO3q+uA4m\n\tSyzD1D8tZQVnvvyJlntc2tVRj3CK3VTtkhxAWS3LQT9vFoimqwZ996ixDYrExncmwx\n\teNq6Ik136Jqa5iV9GygcW/cx7IDVEIZBirl3MbswKyTqX2QCM3mtuLMCjd+jh7qiyo\n\tg29Cyp+w3K6Qw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1686863007; x=1687122207;\n\tbh=BPhRAg+k4QA919c97rDEk058eGS1zmEMr3m8iQCbkW4=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector;\n\tb=HxXrfIIpLAarhCC1Jkced5PrBPRzJ4eRHxJIFhxBPlUzwKYNGWeT3Mhw3CCvLHfo4\n\te545Ah9pQhcP5uDKHyL4GrexplJD2IsJoYYclqiJ1VvEb5Jl+ORYOCVsZYaFsqgZN6\n\tU4p1Z93NXIJ/N+KIWKALdOmR8soM+iBHk6XwOk96EJY8DKRETkXTp1KeHH1ZD66TM6\n\tO0Y5tcrDJTJ9vx8JlEs9joC+NFOk95nrq+HS+kanUrDUqsSoWq53elpxZrgdIzkis1\n\tY7pIqf+hm3NJYrS9D76fa5oHAJXCkVHhQFqnTdwnXwhA3nNiMEbTfQIn4F4842TjN5\n\thVmD+4Pezz82w=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=protonmail.com\n\theader.i=@protonmail.com\n\theader.b=\"HxXrfIIp\"; dkim-atps=neutral","Date":"Thu, 15 Jun 2023 21:03:20 +0000","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<-AsogWRM6YgdyCGSA2XG-It0bmA_WXapjfbbR64IksSzWeNuGawKIZrq8CvY4BE4lNljclTttFtg2K5SmgqUA6f-36BYhyVo6IPRwbwLHBQ=@protonmail.com>","In-Reply-To":"<20230615172608.378258-4-kieran.bingham@ideasonboard.com>","References":"<20230615172608.378258-1-kieran.bingham@ideasonboard.com>\n\t<20230615172608.378258-4-kieran.bingham@ideasonboard.com>","Feedback-ID":"20568564:user:proton","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","Subject":"Re: [libcamera-devel] [PATCH v4 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","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>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze_via_libcamera-devel?=\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tAshok Sidipotu <ashok.sidipotu@collabora.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27362,"web_url":"https://patchwork.libcamera.org/comment/27362/","msgid":"<168686432758.528428.16397082185064106375@Monstersaurus>","date":"2023-06-15T21:25:27","subject":"Re: [libcamera-devel] [PATCH v4 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2023-06-15 22:03:20)\n> Hi\n> \n> \n> 2023. június 15., csütörtök 19:26 keltezéssel, Kieran Bingham via libcamera-devel <libcamera-devel@lists.libcamera.org> írta:\n> \n> > The CameraManager exposes addCamera and removeCamera as public API\n> > calls, while they should never be called from an application. These\n> > calls are only expected to be used by PipelineHandlers to update the\n> > CameraManager that a new Camera has been created and allow the Camera\n> > Manager to expose it to applications.\n> > \n> > Remove the public calls and update the private implementations such that\n> > they can be used directly by the PipelineHandler through the internal\n> > CameraManager::Private provided by the Extensible class.\n> > \n> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> > Tested-by: Ashok Sidipotu <ashok.sidipotu@collabora.com>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > ---\n> >  include/libcamera/camera_manager.h          |  4 -\n> >  include/libcamera/internal/camera_manager.h |  2 +-\n> >  src/libcamera/camera_manager.cpp            | 87 +++++++++------------\n> >  src/libcamera/pipeline_handler.cpp          |  6 +-\n> >  4 files changed, 43 insertions(+), 56 deletions(-)\n> > [...]\n> > diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> > index 882b2d4b234c..cafd7bce574e 100644\n> > --- a/src/libcamera/camera_manager.cpp\n> > +++ b/src/libcamera/camera_manager.cpp\n> > @@ -148,9 +148,25 @@ void CameraManager::Private::cleanup()\n> >       enumerator_.reset(nullptr);\n> >  }\n> > \n> > +/**\n> > + * \\brief Add a camera to the camera manager\n> > + * \\param[in] camera The camera to be added\n> > + * \\param[in] devnums The device numbers to associate with \\a camera\n> > + *\n> > + * This function is called by pipeline handlers to register the cameras they\n> > + * handle with the camera manager. Registered cameras are immediately made\n> > + * available to the system.\n> > + *\n> > + * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> > + * to Camera instances.\n> > + *\n> > + * \\context This function shall be called from the CameraManager thread.\n> > + */\n> >  void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n> >                                      const std::vector<dev_t> &devnums)\n> >  {\n> > +     ASSERT(Thread::current() == this);\n> > +\n> >       MutexLocker locker(mutex_);\n> > \n> >       for (const std::shared_ptr<Camera> &c : cameras_) {\n> > @@ -167,15 +183,31 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n> >       unsigned int index = cameras_.size() - 1;\n> >       for (dev_t devnum : devnums)\n> >               camerasByDevnum_[devnum] = cameras_[index];\n> > +\n> > +     /* Report the addition to the public signal */\n> > +     CameraManager *const o = LIBCAMERA_O_PTR();\n> > +     o->cameraAdded.emit(cameras_[index]);\n> >  }\n> > \n> > -void CameraManager::Private::removeCamera(Camera *camera)\n> > +/**\n> > + * \\brief Remove a camera from the camera manager\n> > + * \\param[in] camera The camera to be removed\n> > + *\n> > + * This function is called by pipeline handlers to unregister cameras from the\n> > + * camera manager. Unregistered cameras won't be reported anymore by the\n> > + * cameras() and get() calls, but references may still exist in applications.\n> > + *\n> > + * \\context This function shall be called from the CameraManager thread.\n> > + */\n> > +void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n> >  {\n> > +     ASSERT(Thread::current() == this);\n> > +\n> >       MutexLocker locker(mutex_);\n> > \n> >       auto iter = std::find_if(cameras_.begin(), cameras_.end(),\n> >                                [camera](std::shared_ptr<Camera> &c) {\n> > -                                      return c.get() == camera;\n> > +                                      return c.get() == camera.get();\n> >                                });\n> >       if (iter == cameras_.end())\n> >               return;\n> > @@ -185,12 +217,16 @@ void CameraManager::Private::removeCamera(Camera *camera)\n> > \n> >       auto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),\n> >                                  [camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {\n> > -                                        return p.second.lock().get() == camera;\n> > +                                        return p.second.lock().get() == camera.get();\n> >                                  });\n> >       if (iter_d != camerasByDevnum_.end())\n> >               camerasByDevnum_.erase(iter_d);\n> \n> As far as I can see the above will only ever remove at most a single entry from the\n> `camerasByDevnum_` map, but it is allowed for a camera to have multiple underlying devices.\n> I know this part is not touched by this series, but it should be fixed sooner or later.\n> (Also now that `camera` is a shared_ptr, it would be better to capture it by reference I think.\n> Although the reason for that change is not clear to me.)\n\nI think all of the camerasByDevnum_ is just a way to support \n\n\tstd::shared_ptr<Camera> get(dev_t devnum);\n\nWhich is only there for the V4L2 Adaptation layer I think.\nI think it's probably better to remove this map and replace it with a\nsearch trhough the cameras() list that examines the new SystemDevices\nproperty on each one.\n\nOf course it may have to be a first match or something as there could be\nmultiple cameras matching / using the same underlying devices ...\n\nI think the V4L2 layer should probably be reworked quite a lot if anyone\nactually wants to use it though - but I'm not sure of anyone who is\npresently.\n\n\nI'll have a quick go now at removing the camerasByDevnum_ entirely.\n\n--\nKieran\n\n\n\n> \n> \n> > \n> >       cameras_.erase(iter);\n> > +\n> > +     /* Report the removal to the public signal */\n> > +     CameraManager *const o = LIBCAMERA_O_PTR();\n> > +     o->cameraRemoved.emit(camera);\n> >  }\n> > \n> >  /**\n> > @@ -383,51 +419,6 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n> >   * perform any blocking operation.\n> >   */\n> > \n> > -/**\n> > - * \\brief Add a camera to the camera manager\n> > - * \\param[in] camera The camera to be added\n> > - * \\param[in] devnums The device numbers to associate with \\a camera\n> > - *\n> > - * This function is called by pipeline handlers to register the cameras they\n> > - * handle with the camera manager. Registered cameras are immediately made\n> > - * available to the system.\n> > - *\n> > - * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> > - * to Camera instances.\n> > - *\n> > - * \\context This function shall be called from the CameraManager thread.\n> > - */\n> > -void CameraManager::addCamera(std::shared_ptr<Camera> camera,\n> > -                           const std::vector<dev_t> &devnums)\n> > -{\n> > -     Private *const d = _d();\n> > -\n> > -     ASSERT(Thread::current() == d);\n> > -\n> > -     d->addCamera(camera, devnums);\n> > -     cameraAdded.emit(camera);\n> > -}\n> > -\n> > -/**\n> > - * \\brief Remove a camera from the camera manager\n> > - * \\param[in] camera The camera to be removed\n> > - *\n> > - * This function is called by pipeline handlers to unregister cameras from the\n> > - * camera manager. Unregistered cameras won't be reported anymore by the\n> > - * cameras() and get() calls, but references may still exist in applications.\n> > - *\n> > - * \\context This function shall be called from the CameraManager thread.\n> > - */\n> > -void CameraManager::removeCamera(std::shared_ptr<Camera> camera)\n> > -{\n> > -     Private *const d = _d();\n> > -\n> > -     ASSERT(Thread::current() == d);\n> > -\n> > -     d->removeCamera(camera.get());\n> > -     cameraRemoved.emit(camera);\n> > -}\n> > -\n> >  /**\n> >   * \\fn const std::string &CameraManager::version()\n> >   * \\brief Retrieve the libcamera version string\n> > [...]\n> \n> \n> Regards,\n> Barnabás Pőcze","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 99B22BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 15 Jun 2023 21:25:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1F97A628B5;\n\tThu, 15 Jun 2023 23:25:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D0B4E614FE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 15 Jun 2023 23:25:30 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net\n\t[82.37.23.78])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2ED48C85;\n\tThu, 15 Jun 2023 23:24:59 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686864332;\n\tbh=J9C/JEwRNqI6c4zfn1bZN9mLbqv6hh4n7hoWW8g9QkA=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=JbP3iLq9ffEJE5mIhkejfwFEuDOkZrI4DjC+k+MARPNS4TNjAHs4YZAXKAxHSnRv9\n\t1PZ1CaFaCuN+Pl+QnpAKNahNagFOBSrSBY52q9XhVuaf2aUoec7Mnk54x/AQa7ywM0\n\tWZeuHPN5WP5j0r3blPjQtwIH/aesuApAjSO1hrutoOqF31FbLQkLzkx42vmQDD0SlO\n\t4dY7yuv9iRgnxPCXf6hp0N0eWbwTXJDw8icmHQIKG2o6a/wdSOWD7MjH69xwFTjrUZ\n\t1nEG100FmV9GY6y2FDepJsqCOQIeUr173/h/B7WRmfuWzWaysHnFZr7IKdyvc8r5eM\n\typgnQtMFViatw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1686864299;\n\tbh=J9C/JEwRNqI6c4zfn1bZN9mLbqv6hh4n7hoWW8g9QkA=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=DmyUPjDJQi61CUvOc/n6VDwEiPiOIiZVU3CyBUAqNBPJwY7bTDScweEz9FqLn/EWE\n\tYMG5uxiV/2LB0cCpHVegfGdhdzgup7Mrt5spYWYJobn2idMTuy2sNo88G+Y6oPuz1+\n\tObVsFdvSxPseWc/iSPRdt2OYv0ktJLD8eh7ui+Lk="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"DmyUPjDJ\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<-AsogWRM6YgdyCGSA2XG-It0bmA_WXapjfbbR64IksSzWeNuGawKIZrq8CvY4BE4lNljclTttFtg2K5SmgqUA6f-36BYhyVo6IPRwbwLHBQ=@protonmail.com>","References":"<20230615172608.378258-1-kieran.bingham@ideasonboard.com>\n\t<20230615172608.378258-4-kieran.bingham@ideasonboard.com>\n\t<-AsogWRM6YgdyCGSA2XG-It0bmA_WXapjfbbR64IksSzWeNuGawKIZrq8CvY4BE4lNljclTttFtg2K5SmgqUA6f-36BYhyVo6IPRwbwLHBQ=@protonmail.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Date":"Thu, 15 Jun 2023 22:25:27 +0100","Message-ID":"<168686432758.528428.16397082185064106375@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v4 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","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>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tAshok Sidipotu <ashok.sidipotu@collabora.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]