[{"id":18685,"web_url":"https://patchwork.libcamera.org/comment/18685/","msgid":"<20210810135931.4zyj4bqoxmc5d6im@uno.localdomain>","date":"2021-08-10T13:59:31","subject":"Re: [libcamera-devel] [PATCH v2 10/11] Documentation: guides:\n\tpipeline-handler: Migrate to Camera::Private","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Thu, Aug 05, 2021 at 08:58:47PM +0300, Laurent Pinchart wrote:\n> Update the pipeline handler guide following the migration from the\n> CameraData class to the Camera::Private class.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  Documentation/guides/pipeline-handler.rst | 67 ++++++++++++-----------\n>  1 file changed, 34 insertions(+), 33 deletions(-)\n>\n> diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> index 152776935a33..7e9ff824dd50 100644\n> --- a/Documentation/guides/pipeline-handler.rst\n> +++ b/Documentation/guides/pipeline-handler.rst\n> @@ -106,7 +106,7 @@ functionalities descibed above. Below is a brief overview of each of those:\n>     Abstracts camera sensor handling by hiding the details of the V4L2 subdevice\n>     kernel API and caching sensor information.\n>\n> --  `CameraData <http://libcamera.org/api-html/classlibcamera_1_1CameraData.html>`_:\n> +-  `Camera::Private <http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html>`_:\n>     Represents device-specific data a pipeline handler associates to each Camera\n>     instance.\n>\n> @@ -416,26 +416,26 @@ receivers port output.\n>  The Pipeline Handler is responsible for defining the set of Streams associated\n>  with the Camera.\n>\n> -Each Camera has instance-specific data represented using the `CameraData`_\n> +Each Camera has instance-specific data represented using the `Camera::Private`_\n>  class, which can be extended for the specific needs of the pipeline handler.\n>\n> -.. _CameraData: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html\n> +.. _Camera::Private: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html\n>\n>\n> -To support the Camera we will later register, we need to create a CameraData\n> +To support the Camera we will later register, we need to create a Camera::Private\n>  class that we can implement for our specific Pipeline Handler.\n>\n> -Define a new ``VividCameraData()`` class derived from ``CameraData`` by adding\n> -the following code before the PipelineHandlerVivid class definition where it\n> -will be used:\n> +Define a new ``VividCameraPrivate()`` class derived from ``Camera::Private`` by\n> +adding the following code before the PipelineHandlerVivid class definition where\n> +it will be used:\n>\n>  .. code-block:: cpp\n>\n> -   class VividCameraData : public CameraData\n> +   class VividCameraData : public Camera::Private\n>     {\n>     public:\n>            VividCameraData(PipelineHandler *pipe, MediaDevice *media)\n> -                : CameraData(pipe), media_(media), video_(nullptr)\n> +                : Camera::Private(pipe), media_(media), video_(nullptr)\n>            {\n>            }\n>\n> @@ -457,17 +457,17 @@ single stream, represented by the ``VividCameraData`` class members. More\n>  complex pipeline handlers might register cameras composed of several video\n>  devices and sub-devices, or multiple streams per camera that represent the\n>  several components of the image capture pipeline. You should represent all these\n> -components in the ``CameraData`` derived class when developing a custom\n> +components in the ``Camera::Private`` derived class when developing a custom\n>  PipelineHandler.\n>\n>  In our example VividCameraData we implement an ``init()`` function to prepare\n> -the object from our PipelineHandler, however the CameraData class does not\n> +the object from our PipelineHandler, however the Camera::Private class does not\n>  specify the interface for initialisation and PipelineHandlers can manage this\n> -based on their own needs. Derived CameraData classes are used only by their\n> +based on their own needs. Derived Camera::Private classes are used only by their\n>  respective pipeline handlers.\n>\n> -The CameraData class stores the context required for each camera instance and\n> -is usually responsible for opening all Devices used in the capture pipeline.\n> +The Camera::Private class stores the context required for each camera instance\n> +and is usually responsible for opening all Devices used in the capture pipeline.\n>\n>  We can now implement the ``init`` method for our example Pipeline Handler to\n>  create a new V4L2 video device from the media entity, which we can specify using\n> @@ -488,11 +488,11 @@ capture device named 'vivid-000-vid-cap' by the device.\n>            return 0;\n>     }\n>\n> -The CameraData should be created and initialised before we move on to register a\n> -new Camera device so we need to construct and initialise our\n> +The VividCameraData should be created and initialised before we move on to\n> +register a new Camera device so we need to construct and initialise our\n>  VividCameraData after we have identified our device within\n>  PipelineHandlerVivid::match(). The VividCameraData is wrapped by a\n> -std::unique_ptr to help manage the lifetime of our CameraData instance.\n> +std::unique_ptr to help manage the lifetime of the instance.\n\nIf the ownership is not transfered, this is really an implementation\ndetail of each pipeline's match() implementation\n\n>\n>  If the camera data initialization fails, return ``false`` to indicate the\n>  failure to the ``match()`` method and prevent retrying of the pipeline handler.\n> @@ -508,9 +508,9 @@ failure to the ``match()`` method and prevent retrying of the pipeline handler.\n>  Once the camera data has been initialized, the Camera device instances and the\n>  associated streams have to be registered. Create a set of streams for the\n>  camera, which for this device is only one. You create a camera using the static\n> -`Camera::create`_ method, passing the pipeline handler, the id of the camera,\n> -and the streams available. Then register the camera and its data with the\n> -pipeline handler and camera manager using `registerCamera`_.\n> +`Camera::create`_ method, passing the Camera::Private instance, the id of the\n> +camera, and the streams available. Then register the camera with the pipeline\n> +handler and camera manager using `registerCamera`_.\n>\n>  Finally with a successful construction, we return 'true' indicating that the\n>  PipelineHandler successfully matched and constructed a device.\n> @@ -548,23 +548,24 @@ Our match function should now look like the following:\n>\n>     \t/* Create and register the camera. */\n>     \tstd::set<Stream *> streams{ &data->stream_ };\n> -   \tstd::shared_ptr<Camera> camera = Camera::create(this, data->video_->deviceName(), streams);\n> -   \tregisterCamera(std::move(camera), std::move(data));\n> +        const std::string &id = data->video_->deviceName();\n\n       ^ weird spacing\n\n> +   \tstd::shared_ptr<Camera> camera = Camera::create(data.release(), id, streams);\n> +   \tregisterCamera(std::move(camera));\n>\n>     \treturn true;\n>     }\n>\n> -We will need to use our custom CameraData class frequently throughout the\n> +We will need to use our custom VividCameraData class frequently throughout the\n>  pipeline handler, so we add a private convenience helper to our Pipeline handler\n> -to obtain and cast the custom CameraData instance from a Camera instance.\n> +to obtain and cast the custom VividCameraData instance from a Camera::Private\n> +instance.\n>\n>  .. code-block:: cpp\n>\n>     private:\n> -       VividCameraData *cameraData(const Camera *camera)\n> +       VividCameraData *cameraData(Camera *camera)\n>         {\n> -               return static_cast<VividCameraData *>(\n> -                        PipelineHandler::cameraData(camera));\n> +               return static_cast<VividCameraData *>(camera->_d());\n>         }\n>\n>  At this point, you need to add the following new includes to provide the Camera\n> @@ -594,12 +595,12 @@ are defined by src/libcamera/`properties_ids.yaml`_.\n>\n>  Pipeline handlers can optionally register the list of controls an application\n>  can set as well as a list of immutable camera properties. Being both\n> -Camera-specific values, they are represented in the ``CameraData`` base class,\n> -which provides two members for this purpose: the `CameraData::controlInfo_`_ and\n> -the `CameraData::properties_`_ fields.\n> +Camera-specific values, they are represented in the ``Camera::Private`` base\n> +class, which provides two members for this purpose: the\n> +`Camera::Private::controlInfo_`_ and the `Camera::Private::properties_`_ fields.\n>\n> -.. _CameraData::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#ab9fecd05c655df6084a2233872144a52\n> -.. _CameraData::properties_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#a84002c29f45bd35566c172bb65e7ec0b\n> +.. _Camera::Private::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ab4e183eb4dabe929d1b2bbbb519b969f\n> +.. _Camera::Private::properties_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ad31f12f5ed9c1fbe25750902f4791064\n>\n>  The ``controlInfo_`` field represents a map of ``ControlId`` instances\n>  associated with the limits of valid values supported for the control. More\n> @@ -617,7 +618,7 @@ Complete the initialization of the ``VividCameraData`` class by adding the\n>  following code to the ``VividCameraData::init()`` method to initialise the\n>  controls. For more complex control configurations, this could of course be\n>  broken out to a separate function, but for now we just initialise the small set\n> -inline in our CameraData init:\n> +inline in our VividCameraData init:\n\nThe rest looks ok\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n\n>\n>  .. code-block:: cpp\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\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 3930AC3240\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 10 Aug 2021 13:58:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 964726884D;\n\tTue, 10 Aug 2021 15:58:44 +0200 (CEST)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D8A1D687F0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 10 Aug 2021 15:58:43 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 5B519C000B;\n\tTue, 10 Aug 2021 13:58:43 +0000 (UTC)"],"Date":"Tue, 10 Aug 2021 15:59:31 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20210810135931.4zyj4bqoxmc5d6im@uno.localdomain>","References":"<20210805175848.24188-1-laurent.pinchart@ideasonboard.com>\n\t<20210805175848.24188-11-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210805175848.24188-11-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 10/11] Documentation: guides:\n\tpipeline-handler: Migrate to Camera::Private","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>"}},{"id":18710,"web_url":"https://patchwork.libcamera.org/comment/18710/","msgid":"<YRQF/nLWVLy4ZIBf@pendragon.ideasonboard.com>","date":"2021-08-11T17:16:46","subject":"Re: [libcamera-devel] [PATCH v2 10/11] Documentation: guides:\n\tpipeline-handler: Migrate to Camera::Private","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Tue, Aug 10, 2021 at 03:59:31PM +0200, Jacopo Mondi wrote:\n> On Thu, Aug 05, 2021 at 08:58:47PM +0300, Laurent Pinchart wrote:\n> > Update the pipeline handler guide following the migration from the\n> > CameraData class to the Camera::Private class.\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  Documentation/guides/pipeline-handler.rst | 67 ++++++++++++-----------\n> >  1 file changed, 34 insertions(+), 33 deletions(-)\n> >\n> > diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> > index 152776935a33..7e9ff824dd50 100644\n> > --- a/Documentation/guides/pipeline-handler.rst\n> > +++ b/Documentation/guides/pipeline-handler.rst\n> > @@ -106,7 +106,7 @@ functionalities descibed above. Below is a brief overview of each of those:\n> >     Abstracts camera sensor handling by hiding the details of the V4L2 subdevice\n> >     kernel API and caching sensor information.\n> >\n> > --  `CameraData <http://libcamera.org/api-html/classlibcamera_1_1CameraData.html>`_:\n> > +-  `Camera::Private <http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html>`_:\n> >     Represents device-specific data a pipeline handler associates to each Camera\n> >     instance.\n> >\n> > @@ -416,26 +416,26 @@ receivers port output.\n> >  The Pipeline Handler is responsible for defining the set of Streams associated\n> >  with the Camera.\n> >\n> > -Each Camera has instance-specific data represented using the `CameraData`_\n> > +Each Camera has instance-specific data represented using the `Camera::Private`_\n> >  class, which can be extended for the specific needs of the pipeline handler.\n> >\n> > -.. _CameraData: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html\n> > +.. _Camera::Private: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html\n> >\n> >\n> > -To support the Camera we will later register, we need to create a CameraData\n> > +To support the Camera we will later register, we need to create a Camera::Private\n> >  class that we can implement for our specific Pipeline Handler.\n> >\n> > -Define a new ``VividCameraData()`` class derived from ``CameraData`` by adding\n> > -the following code before the PipelineHandlerVivid class definition where it\n> > -will be used:\n> > +Define a new ``VividCameraPrivate()`` class derived from ``Camera::Private`` by\n> > +adding the following code before the PipelineHandlerVivid class definition where\n> > +it will be used:\n> >\n> >  .. code-block:: cpp\n> >\n> > -   class VividCameraData : public CameraData\n> > +   class VividCameraData : public Camera::Private\n> >     {\n> >     public:\n> >            VividCameraData(PipelineHandler *pipe, MediaDevice *media)\n> > -                : CameraData(pipe), media_(media), video_(nullptr)\n> > +                : Camera::Private(pipe), media_(media), video_(nullptr)\n> >            {\n> >            }\n> >\n> > @@ -457,17 +457,17 @@ single stream, represented by the ``VividCameraData`` class members. More\n> >  complex pipeline handlers might register cameras composed of several video\n> >  devices and sub-devices, or multiple streams per camera that represent the\n> >  several components of the image capture pipeline. You should represent all these\n> > -components in the ``CameraData`` derived class when developing a custom\n> > +components in the ``Camera::Private`` derived class when developing a custom\n> >  PipelineHandler.\n> >\n> >  In our example VividCameraData we implement an ``init()`` function to prepare\n> > -the object from our PipelineHandler, however the CameraData class does not\n> > +the object from our PipelineHandler, however the Camera::Private class does not\n> >  specify the interface for initialisation and PipelineHandlers can manage this\n> > -based on their own needs. Derived CameraData classes are used only by their\n> > +based on their own needs. Derived Camera::Private classes are used only by their\n> >  respective pipeline handlers.\n> >\n> > -The CameraData class stores the context required for each camera instance and\n> > -is usually responsible for opening all Devices used in the capture pipeline.\n> > +The Camera::Private class stores the context required for each camera instance\n> > +and is usually responsible for opening all Devices used in the capture pipeline.\n> >\n> >  We can now implement the ``init`` method for our example Pipeline Handler to\n> >  create a new V4L2 video device from the media entity, which we can specify using\n> > @@ -488,11 +488,11 @@ capture device named 'vivid-000-vid-cap' by the device.\n> >            return 0;\n> >     }\n> >\n> > -The CameraData should be created and initialised before we move on to register a\n> > -new Camera device so we need to construct and initialise our\n> > +The VividCameraData should be created and initialised before we move on to\n> > +register a new Camera device so we need to construct and initialise our\n> >  VividCameraData after we have identified our device within\n> >  PipelineHandlerVivid::match(). The VividCameraData is wrapped by a\n> > -std::unique_ptr to help manage the lifetime of our CameraData instance.\n> > +std::unique_ptr to help manage the lifetime of the instance.\n> \n> If the ownership is not transfered, this is really an implementation\n> detail of each pipeline's match() implementation\n\nIndeed, but even then, I think it's nice to show best practices in the\ndocumentation. In any case I've modified Camera::create() to take a\nunique_ptr, so it's now part of the API.\n\n> >  If the camera data initialization fails, return ``false`` to indicate the\n> >  failure to the ``match()`` method and prevent retrying of the pipeline handler.\n> > @@ -508,9 +508,9 @@ failure to the ``match()`` method and prevent retrying of the pipeline handler.\n> >  Once the camera data has been initialized, the Camera device instances and the\n> >  associated streams have to be registered. Create a set of streams for the\n> >  camera, which for this device is only one. You create a camera using the static\n> > -`Camera::create`_ method, passing the pipeline handler, the id of the camera,\n> > -and the streams available. Then register the camera and its data with the\n> > -pipeline handler and camera manager using `registerCamera`_.\n> > +`Camera::create`_ method, passing the Camera::Private instance, the id of the\n> > +camera, and the streams available. Then register the camera with the pipeline\n> > +handler and camera manager using `registerCamera`_.\n> >\n> >  Finally with a successful construction, we return 'true' indicating that the\n> >  PipelineHandler successfully matched and constructed a device.\n> > @@ -548,23 +548,24 @@ Our match function should now look like the following:\n> >\n> >     \t/* Create and register the camera. */\n> >     \tstd::set<Stream *> streams{ &data->stream_ };\n> > -   \tstd::shared_ptr<Camera> camera = Camera::create(this, data->video_->deviceName(), streams);\n> > -   \tregisterCamera(std::move(camera), std::move(data));\n> > +        const std::string &id = data->video_->deviceName();\n> \n>        ^ weird spacing\n\nOops. Will fix.\n\n> > +   \tstd::shared_ptr<Camera> camera = Camera::create(data.release(), id, streams);\n> > +   \tregisterCamera(std::move(camera));\n> >\n> >     \treturn true;\n> >     }\n> >\n> > -We will need to use our custom CameraData class frequently throughout the\n> > +We will need to use our custom VividCameraData class frequently throughout the\n> >  pipeline handler, so we add a private convenience helper to our Pipeline handler\n> > -to obtain and cast the custom CameraData instance from a Camera instance.\n> > +to obtain and cast the custom VividCameraData instance from a Camera::Private\n> > +instance.\n> >\n> >  .. code-block:: cpp\n> >\n> >     private:\n> > -       VividCameraData *cameraData(const Camera *camera)\n> > +       VividCameraData *cameraData(Camera *camera)\n> >         {\n> > -               return static_cast<VividCameraData *>(\n> > -                        PipelineHandler::cameraData(camera));\n> > +               return static_cast<VividCameraData *>(camera->_d());\n> >         }\n> >\n> >  At this point, you need to add the following new includes to provide the Camera\n> > @@ -594,12 +595,12 @@ are defined by src/libcamera/`properties_ids.yaml`_.\n> >\n> >  Pipeline handlers can optionally register the list of controls an application\n> >  can set as well as a list of immutable camera properties. Being both\n> > -Camera-specific values, they are represented in the ``CameraData`` base class,\n> > -which provides two members for this purpose: the `CameraData::controlInfo_`_ and\n> > -the `CameraData::properties_`_ fields.\n> > +Camera-specific values, they are represented in the ``Camera::Private`` base\n> > +class, which provides two members for this purpose: the\n> > +`Camera::Private::controlInfo_`_ and the `Camera::Private::properties_`_ fields.\n> >\n> > -.. _CameraData::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#ab9fecd05c655df6084a2233872144a52\n> > -.. _CameraData::properties_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#a84002c29f45bd35566c172bb65e7ec0b\n> > +.. _Camera::Private::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ab4e183eb4dabe929d1b2bbbb519b969f\n> > +.. _Camera::Private::properties_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ad31f12f5ed9c1fbe25750902f4791064\n> >\n> >  The ``controlInfo_`` field represents a map of ``ControlId`` instances\n> >  associated with the limits of valid values supported for the control. More\n> > @@ -617,7 +618,7 @@ Complete the initialization of the ``VividCameraData`` class by adding the\n> >  following code to the ``VividCameraData::init()`` method to initialise the\n> >  controls. For more complex control configurations, this could of course be\n> >  broken out to a separate function, but for now we just initialise the small set\n> > -inline in our CameraData init:\n> > +inline in our VividCameraData init:\n> \n> The rest looks ok\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> >\n> >  .. code-block:: cpp\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 F1EE0C3240\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Aug 2021 17:16:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 738CF6884F;\n\tWed, 11 Aug 2021 19:16:51 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 422E268826\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Aug 2021 19:16:50 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B5840EE;\n\tWed, 11 Aug 2021 19:16:49 +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=\"f6DReMRg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1628702209;\n\tbh=q5px4R3HO/2Eokhauid6HEtrf+K/7lMT2AD28XY99m8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=f6DReMRgvAUMXhgS3lv/LGJ9Za78Sx66q2s8IIejQ/LAm8hWg1UUfvmm2lQtrfKu0\n\tdN9h3u7KwXCQGUBb3ik6CB9Y5VizLZUeK9e0HLPPhnjpRHgPmcNPxV7yEijCIxeSuU\n\tgnB6+SIds4eWISdwcjahxZm5+gcGKtBNtYCSWR/M=","Date":"Wed, 11 Aug 2021 20:16:46 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YRQF/nLWVLy4ZIBf@pendragon.ideasonboard.com>","References":"<20210805175848.24188-1-laurent.pinchart@ideasonboard.com>\n\t<20210805175848.24188-11-laurent.pinchart@ideasonboard.com>\n\t<20210810135931.4zyj4bqoxmc5d6im@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210810135931.4zyj4bqoxmc5d6im@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v2 10/11] Documentation: guides:\n\tpipeline-handler: Migrate to Camera::Private","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>"}}]