[{"id":509,"web_url":"https://patchwork.libcamera.org/comment/509/","msgid":"<20190123085635.n3whaxmdlnral7po@uno.localdomain>","date":"2019-01-23T08:56:35","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n   thanks for this, very welcome\n\nOn Wed, Jan 23, 2019 at 12:29:53AM +0100, Niklas Söderlund wrote:\n> The PipelineHandler which creates a Camera is responsible for serving\n> any operation requested by the user. In order to do so the Camera needs\n> to store a reference to its creator.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  include/libcamera/camera.h           |  8 ++++++--\n>  src/libcamera/camera.cpp             | 15 +++++++++------\n>  src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-\n>  src/libcamera/pipeline/uvcvideo.cpp  |  2 +-\n>  src/libcamera/pipeline/vimc.cpp      | 10 ++--------\n>  5 files changed, 20 insertions(+), 18 deletions(-)\n>\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -12,10 +12,13 @@\n>\n>  namespace libcamera {\n>\n> +class PipelineHandler;\n> +\n>  class Camera final\n>  {\n>  public:\n> -\tstatic std::shared_ptr<Camera> create(const std::string &name);\n> +\tstatic std::shared_ptr<Camera> create(const std::string &name,\n> +\t\t\t\t\t      class PipelineHandler *pipe);\n>\n>  \tCamera(const Camera &) = delete;\n>  \tvoid operator=(const Camera &) = delete;\n> @@ -23,10 +26,11 @@ public:\n>  \tconst std::string &name() const;\n>\n>  private:\n> -\texplicit Camera(const std::string &name);\n> +\texplicit Camera(const std::string &name, class PipelineHandler *pipe);\n\nYou can drop the 'explicit' here, as it avoid copy-construction and\nconversion-contruction, which can't happen with 2 parameters (if I got\nthis right :)\n\nI'm fine with rest, with the minor thing that I feel more natural to\nhave 'this' passed as first parameter of the Camera constructor.\n\nThanks\n  j\n\n>  \t~Camera();\n>\n>  \tstd::string name_;\n> +\tclass PipelineHandler *pipe_;\n>  };\n>\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index acf912bee95cbec4..f198eb4978b12239 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -52,17 +52,20 @@ namespace libcamera {\n>  /**\n>   * \\brief Create a camera instance\n>   * \\param[in] name The name of the camera device\n> + * \\param[in] pipe The pipeline handler responsible for the camera device\n>   *\n>   * The caller is responsible for guaranteeing unicity of the camera name.\n>   *\n>   * \\return A shared pointer to the newly created camera object\n>   */\n> -std::shared_ptr<Camera> Camera::create(const std::string &name)\n> +std::shared_ptr<Camera> Camera::create(const std::string &name,\n> +\t\t\t\t       class PipelineHandler *pipe)\n>  {\n>  \tstruct Allocator : std::allocator<Camera> {\n> -\t\tvoid construct(void *p, const std::string &name)\n> +\t\tvoid construct(void *p, const std::string &name,\n> +\t\t\t       class PipelineHandler *pipe)\n>  \t\t{\n> -\t\t\t::new(p) Camera(name);\n> +\t\t\t::new(p) Camera(name, pipe);\n>  \t\t}\n>  \t\tvoid destroy(Camera *p)\n>  \t\t{\n> @@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)\n>  \t\t}\n>  \t};\n>\n> -\treturn std::allocate_shared<Camera>(Allocator(), name);\n> +\treturn std::allocate_shared<Camera>(Allocator(), name, pipe);\n>  }\n>\n>  /**\n> @@ -83,8 +86,8 @@ const std::string &Camera::name() const\n>  \treturn name_;\n>  }\n>\n> -Camera::Camera(const std::string &name)\n> -\t: name_(name)\n> +Camera::Camera(const std::string &name, class PipelineHandler *pipe)\n> +\t: name_(name), pipe_(pipe)\n>  {\n>  }\n>\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n>  \t\t\tcontinue;\n>\n>  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> -\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> +\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName,\n> +\t\t\t\t\t\t\t\tthis);\n>  \t\tmanager->addCamera(std::move(camera));\n>\n>  \t\tLOG(IPU3, Info)\n> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> index 3ba69da8b77586e3..3651250b683e7810 100644\n> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> @@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera\n>\n>  \tdev_->acquire();\n>\n> -\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model());\n> +\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);\n>  \tmanager->addCamera(std::move(camera));\n>\n>  \treturn true;\n> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> index 82b9237a3d7d93e5..81d8319eb88e06d2 100644\n> --- a/src/libcamera/pipeline/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc.cpp\n> @@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator\n>\n>  \tdev_->acquire();\n>\n> -\t/*\n> -\t * NOTE: A more complete Camera implementation could\n> -\t * be passed the MediaDevice(s) it controls here or\n> -\t * a reference to the PipelineHandler. Which method\n> -\t * will be chosen depends on how the Camera\n> -\t * object is modeled.\n> -\t */\n> -\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\");\n> +\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\",\n> +\t\t\t\t\t\t\tthis);\n>  \tmanager->addCamera(std::move(camera));\n>\n>  \treturn true;\n> --\n> 2.20.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EC04560B1B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 09:56:23 +0100 (CET)","from uno.localdomain (unknown [37.177.134.137])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 15BD0200011;\n\tWed, 23 Jan 2019 08:56:22 +0000 (UTC)"],"Date":"Wed, 23 Jan 2019 09:56:35 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190123085635.n3whaxmdlnral7po@uno.localdomain>","References":"<20190122232955.31783-1-niklas.soderlund@ragnatech.se>\n\t<20190122232955.31783-2-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"u6dkus3qxu7uhucd\"","Content-Disposition":"inline","In-Reply-To":"<20190122232955.31783-2-niklas.soderlund@ragnatech.se>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Wed, 23 Jan 2019 08:56:24 -0000"}},{"id":511,"web_url":"https://patchwork.libcamera.org/comment/511/","msgid":"<20190123091044.GI4127@bigcity.dyn.berto.se>","date":"2019-01-23T09:10:44","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your feedback.\n\nOn 2019-01-23 09:56:35 +0100, Jacopo Mondi wrote:\n> Hi Niklas,\n>    thanks for this, very welcome\n> \n> On Wed, Jan 23, 2019 at 12:29:53AM +0100, Niklas Söderlund wrote:\n> > The PipelineHandler which creates a Camera is responsible for serving\n> > any operation requested by the user. In order to do so the Camera needs\n> > to store a reference to its creator.\n> >\n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  include/libcamera/camera.h           |  8 ++++++--\n> >  src/libcamera/camera.cpp             | 15 +++++++++------\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-\n> >  src/libcamera/pipeline/uvcvideo.cpp  |  2 +-\n> >  src/libcamera/pipeline/vimc.cpp      | 10 ++--------\n> >  5 files changed, 20 insertions(+), 18 deletions(-)\n> >\n> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644\n> > --- a/include/libcamera/camera.h\n> > +++ b/include/libcamera/camera.h\n> > @@ -12,10 +12,13 @@\n> >\n> >  namespace libcamera {\n> >\n> > +class PipelineHandler;\n> > +\n> >  class Camera final\n> >  {\n> >  public:\n> > -\tstatic std::shared_ptr<Camera> create(const std::string &name);\n> > +\tstatic std::shared_ptr<Camera> create(const std::string &name,\n> > +\t\t\t\t\t      class PipelineHandler *pipe);\n> >\n> >  \tCamera(const Camera &) = delete;\n> >  \tvoid operator=(const Camera &) = delete;\n> > @@ -23,10 +26,11 @@ public:\n> >  \tconst std::string &name() const;\n> >\n> >  private:\n> > -\texplicit Camera(const std::string &name);\n> > +\texplicit Camera(const std::string &name, class PipelineHandler *pipe);\n> \n> You can drop the 'explicit' here, as it avoid copy-construction and\n> conversion-contruction, which can't happen with 2 parameters (if I got\n> this right :)\n\nThanks, did not know that will fix.\n\n> \n> I'm fine with rest, with the minor thing that I feel more natural to\n> have 'this' passed as first parameter of the Camera constructor.\n\nI agree, I will swap the arguments around!\n\n> \n> Thanks\n>   j\n> \n> >  \t~Camera();\n> >\n> >  \tstd::string name_;\n> > +\tclass PipelineHandler *pipe_;\n> >  };\n> >\n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index acf912bee95cbec4..f198eb4978b12239 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -52,17 +52,20 @@ namespace libcamera {\n> >  /**\n> >   * \\brief Create a camera instance\n> >   * \\param[in] name The name of the camera device\n> > + * \\param[in] pipe The pipeline handler responsible for the camera device\n> >   *\n> >   * The caller is responsible for guaranteeing unicity of the camera name.\n> >   *\n> >   * \\return A shared pointer to the newly created camera object\n> >   */\n> > -std::shared_ptr<Camera> Camera::create(const std::string &name)\n> > +std::shared_ptr<Camera> Camera::create(const std::string &name,\n> > +\t\t\t\t       class PipelineHandler *pipe)\n> >  {\n> >  \tstruct Allocator : std::allocator<Camera> {\n> > -\t\tvoid construct(void *p, const std::string &name)\n> > +\t\tvoid construct(void *p, const std::string &name,\n> > +\t\t\t       class PipelineHandler *pipe)\n> >  \t\t{\n> > -\t\t\t::new(p) Camera(name);\n> > +\t\t\t::new(p) Camera(name, pipe);\n> >  \t\t}\n> >  \t\tvoid destroy(Camera *p)\n> >  \t\t{\n> > @@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)\n> >  \t\t}\n> >  \t};\n> >\n> > -\treturn std::allocate_shared<Camera>(Allocator(), name);\n> > +\treturn std::allocate_shared<Camera>(Allocator(), name, pipe);\n> >  }\n> >\n> >  /**\n> > @@ -83,8 +86,8 @@ const std::string &Camera::name() const\n> >  \treturn name_;\n> >  }\n> >\n> > -Camera::Camera(const std::string &name)\n> > -\t: name_(name)\n> > +Camera::Camera(const std::string &name, class PipelineHandler *pipe)\n> > +\t: name_(name), pipe_(pipe)\n> >  {\n> >  }\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n> >  \t\t\tcontinue;\n> >\n> >  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> > -\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> > +\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName,\n> > +\t\t\t\t\t\t\t\tthis);\n> >  \t\tmanager->addCamera(std::move(camera));\n> >\n> >  \t\tLOG(IPU3, Info)\n> > diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> > index 3ba69da8b77586e3..3651250b683e7810 100644\n> > --- a/src/libcamera/pipeline/uvcvideo.cpp\n> > +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> > @@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera\n> >\n> >  \tdev_->acquire();\n> >\n> > -\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model());\n> > +\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);\n> >  \tmanager->addCamera(std::move(camera));\n> >\n> >  \treturn true;\n> > diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> > index 82b9237a3d7d93e5..81d8319eb88e06d2 100644\n> > --- a/src/libcamera/pipeline/vimc.cpp\n> > +++ b/src/libcamera/pipeline/vimc.cpp\n> > @@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator\n> >\n> >  \tdev_->acquire();\n> >\n> > -\t/*\n> > -\t * NOTE: A more complete Camera implementation could\n> > -\t * be passed the MediaDevice(s) it controls here or\n> > -\t * a reference to the PipelineHandler. Which method\n> > -\t * will be chosen depends on how the Camera\n> > -\t * object is modeled.\n> > -\t */\n> > -\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\");\n> > +\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\",\n> > +\t\t\t\t\t\t\tthis);\n> >  \tmanager->addCamera(std::move(camera));\n> >\n> >  \treturn true;\n> > --\n> > 2.20.1\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com\n\t[IPv6:2a00:1450:4864:20::12c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6D43760B1B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 10:10:46 +0100 (CET)","by mail-lf1-x12c.google.com with SMTP id l10so1001135lfh.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 01:10:46 -0800 (PST)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\tu79-v6sm439015lje.36.2019.01.23.01.10.44\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tWed, 23 Jan 2019 01:10:44 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=bhI99FuxFm1eZ3zYS1P98B6cKzDn2YomKijxJ04f8z8=;\n\tb=O6CjYLSP/K5aEbQtfejW1kuJ2Tnd5Drmq6I74Znk/NvBbvednTK9Z528m7WVisSddn\n\tu9IehjxZpq2gQqfLpEK0zBisP+0ME2zhujrepVrglOLqYt7DEzCk6MaRLV5HGulG7tf7\n\tn0NUVuWW2qpoaSNn79SCEMdex/mY68QZhSh1YfZZkgWfcBPUeJcSOaVHOXXGJvnQw6zU\n\tIdZ/h56bEzqriR3Y33HJop+8kXNISVspyIQmfyX5u9tz2+t/yv7HXEZwXklYlnS+AflU\n\tw3PKWUSE8x2z6tTmlbIL93NbfkWnrlxpcz6MqHOOFnDwFpjOkX3jvB/NZYfkG2uNVx5/\n\tkOAA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=bhI99FuxFm1eZ3zYS1P98B6cKzDn2YomKijxJ04f8z8=;\n\tb=Tf9FOWnVrjsbEfmOtXmcSwKf0OG6AdpNNc4FMCBvDdb0G9rXZLKyKViXG51rref2X+\n\t4BU9Y+zNXelxpsBT5tho6h7qtBF3WbxZTxWNjT5PTuyDx+Rhn4aFPVP9RNkyABTjoh8h\n\tO1hiKIEdFgGSwKTHDaOmYZv/fzNROxYrAdwP0zmr9GjG9eCtB/q14O7Qxe3NEuDc8m8E\n\tgpe3XVVwIKM6ewnrCVkJh2tdM0EGQY0otPrSLWFEyHEIQIleHTUCp9jHslBTS5D/3NnW\n\tv2J3gWjGOV3C55IsjQfNgwD6jesOklBh6V80EyIPPAhaHAYFUF0Y3KUAcuNSUFWNCCOc\n\tc4Fw==","X-Gm-Message-State":"AJcUukexrmiG1hgVWIKL96paeDgRcyOk+GoWwWv8QP4JjD8HQL+qtvqL\n\tgqAxayelUgIstwgN7BG+4ZYCPA==","X-Google-Smtp-Source":"ALg8bN4ZMtRcf6YecUEJcLh3tEvonoEY1XnVFORXBkzODlMf7tNSo1jsPo1qHVDqIi54DpvQli0R9w==","X-Received":"by 2002:a19:10a4:: with SMTP id 36mr1128950lfq.60.1548234645443; \n\tWed, 23 Jan 2019 01:10:45 -0800 (PST)","Date":"Wed, 23 Jan 2019 10:10:44 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190123091044.GI4127@bigcity.dyn.berto.se>","References":"<20190122232955.31783-1-niklas.soderlund@ragnatech.se>\n\t<20190122232955.31783-2-niklas.soderlund@ragnatech.se>\n\t<20190123085635.n3whaxmdlnral7po@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190123085635.n3whaxmdlnral7po@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Wed, 23 Jan 2019 09:10:46 -0000"}},{"id":549,"web_url":"https://patchwork.libcamera.org/comment/549/","msgid":"<20190123180359.GA4675@pendragon.ideasonboard.com>","date":"2019-01-23T18:03:59","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Wed, Jan 23, 2019 at 10:10:44AM +0100, Niklas Söderlund wrote:\n> On 2019-01-23 09:56:35 +0100, Jacopo Mondi wrote:\n> > On Wed, Jan 23, 2019 at 12:29:53AM +0100, Niklas Söderlund wrote:\n> >> The PipelineHandler which creates a Camera is responsible for serving\n> >> any operation requested by the user. In order to do so the Camera needs\n> >> to store a reference to its creator.\n> >>\n> >> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> >> ---\n> >>  include/libcamera/camera.h           |  8 ++++++--\n> >>  src/libcamera/camera.cpp             | 15 +++++++++------\n> >>  src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-\n> >>  src/libcamera/pipeline/uvcvideo.cpp  |  2 +-\n> >>  src/libcamera/pipeline/vimc.cpp      | 10 ++--------\n> >>  5 files changed, 20 insertions(+), 18 deletions(-)\n> >>\n> >> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> >> index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644\n> >> --- a/include/libcamera/camera.h\n> >> +++ b/include/libcamera/camera.h\n> >> @@ -12,10 +12,13 @@\n> >>\n> >>  namespace libcamera {\n> >>\n> >> +class PipelineHandler;\n> >> +\n> >>  class Camera final\n> >>  {\n> >>  public:\n> >> -\tstatic std::shared_ptr<Camera> create(const std::string &name);\n> >> +\tstatic std::shared_ptr<Camera> create(const std::string &name,\n> >> +\t\t\t\t\t      class PipelineHandler *pipe);\n> >>\n> >>  \tCamera(const Camera &) = delete;\n> >>  \tvoid operator=(const Camera &) = delete;\n> >> @@ -23,10 +26,11 @@ public:\n> >>  \tconst std::string &name() const;\n> >>\n> >>  private:\n> >> -\texplicit Camera(const std::string &name);\n> >> +\texplicit Camera(const std::string &name, class PipelineHandler *pipe);\n> > \n> > You can drop the 'explicit' here, as it avoid copy-construction and\n> > conversion-contruction, which can't happen with 2 parameters (if I got\n> > this right :)\n> \n> Thanks, did not know that will fix.\n> \n> > \n> > I'm fine with rest, with the minor thing that I feel more natural to\n> > have 'this' passed as first parameter of the Camera constructor.\n> \n> I agree, I will swap the arguments around!\n\nI would have said the other way around, I think that the camera is first\nqualified by its name, then by its pipeline handler, but it's not a big\ndeal :-)\n\n> >>  \t~Camera();\n> >>\n> >>  \tstd::string name_;\n> >> +\tclass PipelineHandler *pipe_;\n\nThis screams of lifetime management issues. How about storing it as a\nstd::shared_ptr<>, given that it will potentially be shared by multiple\ncameras, and should not be destroyed as long as the camera object keeps\na reference to the pipeline handler (otherwise the pipe->*() call\nfowarding will bring painful surprises) ?\n\n> >>  };\n> >>\n> >>  } /* namespace libcamera */\n> >> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> >> index acf912bee95cbec4..f198eb4978b12239 100644\n> >> --- a/src/libcamera/camera.cpp\n> >> +++ b/src/libcamera/camera.cpp\n> >> @@ -52,17 +52,20 @@ namespace libcamera {\n> >>  /**\n> >>   * \\brief Create a camera instance\n> >>   * \\param[in] name The name of the camera device\n> >> + * \\param[in] pipe The pipeline handler responsible for the camera device\n> >>   *\n> >>   * The caller is responsible for guaranteeing unicity of the camera name.\n> >>   *\n> >>   * \\return A shared pointer to the newly created camera object\n> >>   */\n> >> -std::shared_ptr<Camera> Camera::create(const std::string &name)\n> >> +std::shared_ptr<Camera> Camera::create(const std::string &name,\n> >> +\t\t\t\t       class PipelineHandler *pipe)\n> >>  {\n> >>  \tstruct Allocator : std::allocator<Camera> {\n> >> -\t\tvoid construct(void *p, const std::string &name)\n> >> +\t\tvoid construct(void *p, const std::string &name,\n> >> +\t\t\t       class PipelineHandler *pipe)\n> >>  \t\t{\n> >> -\t\t\t::new(p) Camera(name);\n> >> +\t\t\t::new(p) Camera(name, pipe);\n> >>  \t\t}\n> >>  \t\tvoid destroy(Camera *p)\n> >>  \t\t{\n> >> @@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)\n> >>  \t\t}\n> >>  \t};\n> >>\n> >> -\treturn std::allocate_shared<Camera>(Allocator(), name);\n> >> +\treturn std::allocate_shared<Camera>(Allocator(), name, pipe);\n> >>  }\n> >>\n> >>  /**\n> >> @@ -83,8 +86,8 @@ const std::string &Camera::name() const\n> >>  \treturn name_;\n> >>  }\n> >>\n> >> -Camera::Camera(const std::string &name)\n> >> -\t: name_(name)\n> >> +Camera::Camera(const std::string &name, class PipelineHandler *pipe)\n> >> +\t: name_(name), pipe_(pipe)\n> >>  {\n> >>  }\n> >>\n> >> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644\n> >> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> @@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n> >>  \t\t\tcontinue;\n> >>\n> >>  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> >> -\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> >> +\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName,\n> >> +\t\t\t\t\t\t\t\tthis);\n> >>  \t\tmanager->addCamera(std::move(camera));\n> >>\n> >>  \t\tLOG(IPU3, Info)\n> >> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> >> index 3ba69da8b77586e3..3651250b683e7810 100644\n> >> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> >> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> >> @@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera\n> >>\n> >>  \tdev_->acquire();\n> >>\n> >> -\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model());\n> >> +\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);\n> >>  \tmanager->addCamera(std::move(camera));\n> >>\n> >>  \treturn true;\n> >> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> >> index 82b9237a3d7d93e5..81d8319eb88e06d2 100644\n> >> --- a/src/libcamera/pipeline/vimc.cpp\n> >> +++ b/src/libcamera/pipeline/vimc.cpp\n> >> @@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator\n> >>\n> >>  \tdev_->acquire();\n> >>\n> >> -\t/*\n> >> -\t * NOTE: A more complete Camera implementation could\n> >> -\t * be passed the MediaDevice(s) it controls here or\n> >> -\t * a reference to the PipelineHandler. Which method\n> >> -\t * will be chosen depends on how the Camera\n> >> -\t * object is modeled.\n> >> -\t */\n> >> -\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\");\n> >> +\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\",\n> >> +\t\t\t\t\t\t\tthis);\n> >>  \tmanager->addCamera(std::move(camera));\n> >>\n> >>  \treturn true;","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 031E260C7D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 19:04:01 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 42B7D23D;\n\tWed, 23 Jan 2019 19:04:01 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1548266641;\n\tbh=N8KrRSZ1u0uTyMENFSVZzm+TKHab4QsxwleLaq6SPYg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=vesgEe5Kl3otuwJuFBNVqmXzHC2ZGQoRh56BMVOGsmUJpsMQTMZl53WfWoZMq7YtC\n\tScdzr10qK8IVtRZwXmH2amBRWaSUqQKARgLjLbcEpCZff4bzHwaDeevDFAQn7aUUDx\n\tUnuhTAxXtzrOLAQXwFXjezL0ORvTauGQ9jk0rIrA=","Date":"Wed, 23 Jan 2019 20:03:59 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","Message-ID":"<20190123180359.GA4675@pendragon.ideasonboard.com>","References":"<20190122232955.31783-1-niklas.soderlund@ragnatech.se>\n\t<20190122232955.31783-2-niklas.soderlund@ragnatech.se>\n\t<20190123085635.n3whaxmdlnral7po@uno.localdomain>\n\t<20190123091044.GI4127@bigcity.dyn.berto.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190123091044.GI4127@bigcity.dyn.berto.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Wed, 23 Jan 2019 18:04:02 -0000"}},{"id":551,"web_url":"https://patchwork.libcamera.org/comment/551/","msgid":"<20190123182306.GR4127@bigcity.dyn.berto.se>","date":"2019-01-23T18:23:06","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nOn 2019-01-23 20:03:59 +0200, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Wed, Jan 23, 2019 at 10:10:44AM +0100, Niklas Söderlund wrote:\n> > On 2019-01-23 09:56:35 +0100, Jacopo Mondi wrote:\n> > > On Wed, Jan 23, 2019 at 12:29:53AM +0100, Niklas Söderlund wrote:\n> > >> The PipelineHandler which creates a Camera is responsible for serving\n> > >> any operation requested by the user. In order to do so the Camera needs\n> > >> to store a reference to its creator.\n> > >>\n> > >> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > >> ---\n> > >>  include/libcamera/camera.h           |  8 ++++++--\n> > >>  src/libcamera/camera.cpp             | 15 +++++++++------\n> > >>  src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-\n> > >>  src/libcamera/pipeline/uvcvideo.cpp  |  2 +-\n> > >>  src/libcamera/pipeline/vimc.cpp      | 10 ++--------\n> > >>  5 files changed, 20 insertions(+), 18 deletions(-)\n> > >>\n> > >> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > >> index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644\n> > >> --- a/include/libcamera/camera.h\n> > >> +++ b/include/libcamera/camera.h\n> > >> @@ -12,10 +12,13 @@\n> > >>\n> > >>  namespace libcamera {\n> > >>\n> > >> +class PipelineHandler;\n> > >> +\n> > >>  class Camera final\n> > >>  {\n> > >>  public:\n> > >> -\tstatic std::shared_ptr<Camera> create(const std::string &name);\n> > >> +\tstatic std::shared_ptr<Camera> create(const std::string &name,\n> > >> +\t\t\t\t\t      class PipelineHandler *pipe);\n> > >>\n> > >>  \tCamera(const Camera &) = delete;\n> > >>  \tvoid operator=(const Camera &) = delete;\n> > >> @@ -23,10 +26,11 @@ public:\n> > >>  \tconst std::string &name() const;\n> > >>\n> > >>  private:\n> > >> -\texplicit Camera(const std::string &name);\n> > >> +\texplicit Camera(const std::string &name, class PipelineHandler *pipe);\n> > > \n> > > You can drop the 'explicit' here, as it avoid copy-construction and\n> > > conversion-contruction, which can't happen with 2 parameters (if I got\n> > > this right :)\n> > \n> > Thanks, did not know that will fix.\n> > \n> > > \n> > > I'm fine with rest, with the minor thing that I feel more natural to\n> > > have 'this' passed as first parameter of the Camera constructor.\n> > \n> > I agree, I will swap the arguments around!\n> \n> I would have said the other way around, I think that the camera is first\n> qualified by its name, then by its pipeline handler, but it's not a big\n> deal :-)\n> \n> > >>  \t~Camera();\n> > >>\n> > >>  \tstd::string name_;\n> > >> +\tclass PipelineHandler *pipe_;\n> \n> This screams of lifetime management issues. How about storing it as a\n> std::shared_ptr<>, given that it will potentially be shared by multiple\n> cameras, and should not be destroyed as long as the camera object keeps\n> a reference to the pipeline handler (otherwise the pipe->*() call\n> fowarding will bring painful surprises) ?\n\nIn v2 I moved the lifetime management to the base class PipelineHandler \nso the specific implementations wont need to care about the Camera \nobjects at all. And as we with that can guarantee that \nCamera::disconnect() is called before the PipelineHandler is deleted \nthis wont happen.\n\nAt lest not until we go multithreaded, but that will add a new fauna of \nissues to solve. So for now I would like to keep the approach I will \npost later tonight in v2, we can always make it a shared pointer later \nand use the same design.\n\n> \n> > >>  };\n> > >>\n> > >>  } /* namespace libcamera */\n> > >> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > >> index acf912bee95cbec4..f198eb4978b12239 100644\n> > >> --- a/src/libcamera/camera.cpp\n> > >> +++ b/src/libcamera/camera.cpp\n> > >> @@ -52,17 +52,20 @@ namespace libcamera {\n> > >>  /**\n> > >>   * \\brief Create a camera instance\n> > >>   * \\param[in] name The name of the camera device\n> > >> + * \\param[in] pipe The pipeline handler responsible for the camera device\n> > >>   *\n> > >>   * The caller is responsible for guaranteeing unicity of the camera name.\n> > >>   *\n> > >>   * \\return A shared pointer to the newly created camera object\n> > >>   */\n> > >> -std::shared_ptr<Camera> Camera::create(const std::string &name)\n> > >> +std::shared_ptr<Camera> Camera::create(const std::string &name,\n> > >> +\t\t\t\t       class PipelineHandler *pipe)\n> > >>  {\n> > >>  \tstruct Allocator : std::allocator<Camera> {\n> > >> -\t\tvoid construct(void *p, const std::string &name)\n> > >> +\t\tvoid construct(void *p, const std::string &name,\n> > >> +\t\t\t       class PipelineHandler *pipe)\n> > >>  \t\t{\n> > >> -\t\t\t::new(p) Camera(name);\n> > >> +\t\t\t::new(p) Camera(name, pipe);\n> > >>  \t\t}\n> > >>  \t\tvoid destroy(Camera *p)\n> > >>  \t\t{\n> > >> @@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)\n> > >>  \t\t}\n> > >>  \t};\n> > >>\n> > >> -\treturn std::allocate_shared<Camera>(Allocator(), name);\n> > >> +\treturn std::allocate_shared<Camera>(Allocator(), name, pipe);\n> > >>  }\n> > >>\n> > >>  /**\n> > >> @@ -83,8 +86,8 @@ const std::string &Camera::name() const\n> > >>  \treturn name_;\n> > >>  }\n> > >>\n> > >> -Camera::Camera(const std::string &name)\n> > >> -\t: name_(name)\n> > >> +Camera::Camera(const std::string &name, class PipelineHandler *pipe)\n> > >> +\t: name_(name), pipe_(pipe)\n> > >>  {\n> > >>  }\n> > >>\n> > >> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > >> index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644\n> > >> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > >> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > >> @@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n> > >>  \t\t\tcontinue;\n> > >>\n> > >>  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> > >> -\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> > >> +\t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName,\n> > >> +\t\t\t\t\t\t\t\tthis);\n> > >>  \t\tmanager->addCamera(std::move(camera));\n> > >>\n> > >>  \t\tLOG(IPU3, Info)\n> > >> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> > >> index 3ba69da8b77586e3..3651250b683e7810 100644\n> > >> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> > >> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> > >> @@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera\n> > >>\n> > >>  \tdev_->acquire();\n> > >>\n> > >> -\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model());\n> > >> +\tstd::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);\n> > >>  \tmanager->addCamera(std::move(camera));\n> > >>\n> > >>  \treturn true;\n> > >> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> > >> index 82b9237a3d7d93e5..81d8319eb88e06d2 100644\n> > >> --- a/src/libcamera/pipeline/vimc.cpp\n> > >> +++ b/src/libcamera/pipeline/vimc.cpp\n> > >> @@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator\n> > >>\n> > >>  \tdev_->acquire();\n> > >>\n> > >> -\t/*\n> > >> -\t * NOTE: A more complete Camera implementation could\n> > >> -\t * be passed the MediaDevice(s) it controls here or\n> > >> -\t * a reference to the PipelineHandler. Which method\n> > >> -\t * will be chosen depends on how the Camera\n> > >> -\t * object is modeled.\n> > >> -\t */\n> > >> -\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\");\n> > >> +\tstd::shared_ptr<Camera> camera = Camera::create(\"Dummy VIMC Camera\",\n> > >> +\t\t\t\t\t\t\tthis);\n> > >>  \tmanager->addCamera(std::move(camera));\n> > >>\n> > >>  \treturn true;\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com\n\t[IPv6:2a00:1450:4864:20::12f])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2EEF060C7D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 19:23:08 +0100 (CET)","by mail-lf1-x12f.google.com with SMTP id a8so2320776lfk.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 10:23:08 -0800 (PST)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\t10sm598084lff.62.2019.01.23.10.23.06\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tWed, 23 Jan 2019 10:23:06 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=rUk1zPvmaQwjWTpqt7xBNU4IXN7AUEIpgtdec9pSjPQ=;\n\tb=cax7k4QKfLElAQJoYrdOiHVhzoOiJX6wlq4JF00x5XYjMO+O1sVVC93yPaZ71hhMq9\n\ti2YhxQXUVTbD4m+e5WL7OZQ82NCNH/aAdgFyt9jyY5bq6Fj/2QmjeEdHpXyhCHBX0NiU\n\t7xYJschwimZGmcKFC2PJVGe4guvu1SNYUkQewKp39M6jO0Mp2wGS6D8P9P0gIj2Md8IB\n\tb9ia8X3d5YalgVw47wrqTZhMq5GVvm72L+OExLEmfrfp4q+slr+/5cOfIW4EN22yC0M2\n\tpuIoZqi5TdoMKvr3mZR20mYeyKHH5qRvjSBHQdGHRbXYlRTMIVUjAL6QwIsdu/aKNWjC\n\tuIeQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=rUk1zPvmaQwjWTpqt7xBNU4IXN7AUEIpgtdec9pSjPQ=;\n\tb=KBlLFOtBEigF1KlqEKM6HxpUzn08/2WTw7i+3HHb8PFhuthI0JqwXLkBPhgmAjRVML\n\tlMmDlm7e+/RxAXF3ZM7B7qOtvUQI599FXb8KMjEldbU+lWACm/uvt3MBWfdTenA6FDyw\n\txN7pQwi99Ul5esP/MRxcsBLSbVgcVzJ4od9JfTSAV0zoC2+ilmLx30r2qad1hzMCQ9zB\n\tZiavS5EA/wWFAHQ4TCWeq6ZZbGWr0LZS9O1uSzkyITCfyZei0E69jryt3Zez5IoWvJuI\n\thn8fSwjY8y8qjXiidvekVbw5e68/kWItTt3MfRJu3mAkyu/TkVBir7fmltvmfs7muCtj\n\tMMxw==","X-Gm-Message-State":"AJcUukfvIyuRodOzHsDm4xu0HL/mBVkTi8Mv77caeCFXLulOKhlW0A9A\n\tnAiXsTUjOFrJWFYnAfAbcQMKUw==","X-Google-Smtp-Source":"ALg8bN7v0mTo6a+7urHmFA8JMAhnwls11MZbxkEFQpgUeMFsotYqncCZaNvStGV7YX5b7DHCdxdvlw==","X-Received":"by 2002:a19:c650:: with SMTP id w77mr2880839lff.56.1548267787166;\n\tWed, 23 Jan 2019 10:23:07 -0800 (PST)","Date":"Wed, 23 Jan 2019 19:23:06 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","Message-ID":"<20190123182306.GR4127@bigcity.dyn.berto.se>","References":"<20190122232955.31783-1-niklas.soderlund@ragnatech.se>\n\t<20190122232955.31783-2-niklas.soderlund@ragnatech.se>\n\t<20190123085635.n3whaxmdlnral7po@uno.localdomain>\n\t<20190123091044.GI4127@bigcity.dyn.berto.se>\n\t<20190123180359.GA4675@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190123180359.GA4675@pendragon.ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: camera: create a\n\tassociation with the responsible pipeline handler","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Wed, 23 Jan 2019 18:23:08 -0000"}}]