[{"id":2066,"web_url":"https://patchwork.libcamera.org/comment/2066/","msgid":"<65afd7d3-958a-283a-130b-f74bdac0b7f5@ideasonboard.com>","date":"2019-07-01T09:20:12","subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 01/07/2019 00:38, Laurent Pinchart wrote:\n> From: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> Extend the Camera class to expose the controls it supports. Each\n> pipeline should generate a list of controls supported by each camera it\n> creates. These are represented by a ControlInfoMap, and an associated\n> ControlList of default values.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nExtending the std::hash does make the declaration of ControlInfoMap here\nnicer.\n\nThanks for your updates.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n\n> ---\n>  include/libcamera/camera.h               |  3 +++\n>  include/libcamera/controls.h             |  2 ++\n>  src/libcamera/camera.cpp                 | 12 ++++++++++++\n>  src/libcamera/controls.cpp               |  5 +++++\n>  src/libcamera/include/pipeline_handler.h |  4 ++++\n>  src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++\n>  6 files changed, 45 insertions(+)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index fb2f7ba3423c..6d693d9a6c7a 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -12,6 +12,7 @@\n>  #include <set>\n>  #include <string>\n>  \n> +#include <libcamera/controls.h>\n>  #include <libcamera/request.h>\n>  #include <libcamera/signal.h>\n>  #include <libcamera/stream.h>\n> @@ -83,6 +84,8 @@ public:\n>  \tint acquire();\n>  \tint release();\n>  \n> +\tconst ControlInfoMap &controls();\n> +\n>  \tconst std::set<Stream *> &streams() const;\n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);\n>  \tint configure(CameraConfiguration *config);\n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index ad2d49d522c5..9b37dfb16b89 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -99,6 +99,8 @@ static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;\n> +\n>  class ControlList\n>  {\n>  private:\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 617ea99cdf71..592dfd39eacc 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -548,6 +548,18 @@ int Camera::release()\n>  \treturn 0;\n>  }\n>  \n> +/**\n> + * \\brief Retrieve the list of controls supported by the camera\n> + *\n> + * Camera controls remain constant through the lifetime of the camera.\n> + *\n> + * \\return A ControlInfoMap listing the controls supported by the camera\n> + */\n> +const ControlInfoMap &Camera::controls()\n> +{\n> +\treturn pipe_->controls(this);\n> +}\n> +\n>  /**\n>   * \\brief Retrieve all the camera's stream information\n>   *\n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index 22db2b93eff2..e4c41b97a354 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -315,6 +315,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &rhs)\n>  \treturn lhs.id() == rhs;\n>  }\n>  \n> +/**\n> + * \\typedef ControlInfoMap\n> + * \\brief A map of ControlId to ControlInfo\n> + */\n> +\n>  /**\n>   * \\class ControlList\n>   * \\brief Associates a list of ControlIds with their values for a Camera.\n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index a4cbc593a179..f836d5d1a600 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -14,6 +14,7 @@\n>  #include <string>\n>  #include <vector>\n>  \n> +#include <libcamera/controls.h>\n>  #include <libcamera/stream.h>\n>  \n>  namespace libcamera {\n> @@ -41,6 +42,7 @@ public:\n>  \tCamera *camera_;\n>  \tPipelineHandler *pipe_;\n>  \tstd::list<Request *> queuedRequests_;\n> +\tControlInfoMap controlInfo_;\n>  \n>  private:\n>  \tCameraData(const CameraData &) = delete;\n> @@ -60,6 +62,8 @@ public:\n>  \tbool lock();\n>  \tvoid unlock();\n>  \n> +\tconst ControlInfoMap &controls(Camera *camera);\n> +\n>  \tvirtual CameraConfiguration *generateConfiguration(Camera *camera,\n>  \t\tconst StreamRoles &roles) = 0;\n>  \tvirtual int configure(Camera *camera, CameraConfiguration *config) = 0;\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index c91ef2f7d336..0283e4e5ad51 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -88,6 +88,14 @@ LOG_DEFINE_CATEGORY(Pipeline)\n>   * PipelineHandler::completeRequest()\n>   */\n>  \n> +/**\n> + * \\var CameraData::controlInfo_\n> + * \\brief The set of controls supported by the camera\n> + *\n> + * The control information shall be initialised by the pipeline handler when\n> + * creating the camera, and shall not be modified afterwards.\n> + */\n> +\n>  /**\n>   * \\class PipelineHandler\n>   * \\brief Create and manage cameras based on a set of media devices\n> @@ -217,6 +225,17 @@ void PipelineHandler::unlock()\n>  \t\tmedia->unlock();\n>  }\n>  \n> +/**\n> + * \\brief Retrieve the list of controls for a camera\n> + * \\param[in] camera The camera\n> + * \\return A ControlInfoMap listing the controls support by \\a camera\n> + */\n> +const ControlInfoMap &PipelineHandler::controls(Camera *camera)\n> +{\n> +\tCameraData *data = cameraData(camera);\n> +\treturn data->controlInfo_;\n> +}\n> +\n>  /**\n>   * \\fn PipelineHandler::generateConfiguration()\n>   * \\brief Generate a camera configuration for a specified camera\n>","headers":{"Return-Path":"<kieran.bingham@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 931A261950\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Jul 2019 11:20:15 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D0890524;\n\tMon,  1 Jul 2019 11:20:14 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1561972815;\n\tbh=M9PjIno8z4kdSCrMC/OqYnkEyGFOVpZ2vOaT5pvWAxk=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=X83DEHVmrj2YyRi42CR8LDZtleAfwrvTA6k308ZxLGJBVnJw4emYsKZZrVN3MN8sz\n\t5eXJCcXRm9NvXokiEO9z9myBXkFc1WSSpnv+eq89CvoA/t5SWK3ihYPKrNbQEj2PV6\n\tu7AupeR7a5HVxn6473C3JAWgzb9Wy1O2RaMiMG88=","Reply-To":"kieran.bingham@ideasonboard.com","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20190630233817.10130-1-laurent.pinchart@ideasonboard.com>\n\t<20190630233817.10130-6-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Openpgp":"preference=signencrypt","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tsbsRB8KNNvVXBOVNwko86rQqF9drZuw=","Organization":"Ideas on Board","Message-ID":"<65afd7d3-958a-283a-130b-f74bdac0b7f5@ideasonboard.com>","Date":"Mon, 1 Jul 2019 10:20:12 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101\n\tThunderbird/60.7.0","MIME-Version":"1.0","In-Reply-To":"<20190630233817.10130-6-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","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":"Mon, 01 Jul 2019 09:20:15 -0000"}},{"id":2080,"web_url":"https://patchwork.libcamera.org/comment/2080/","msgid":"<20190701164814.4rm24h5vqcckkolu@uno.localdomain>","date":"2019-07-01T16:48:14","subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"HI Laurent,\n\nOn Mon, Jul 01, 2019 at 02:38:08AM +0300, Laurent Pinchart wrote:\n> From: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n> Extend the Camera class to expose the controls it supports. Each\n> pipeline should generate a list of controls supported by each camera it\n> creates. These are represented by a ControlInfoMap, and an associated\n> ControlList of default values.\n>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/camera.h               |  3 +++\n>  include/libcamera/controls.h             |  2 ++\n>  src/libcamera/camera.cpp                 | 12 ++++++++++++\n>  src/libcamera/controls.cpp               |  5 +++++\n>  src/libcamera/include/pipeline_handler.h |  4 ++++\n>  src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++\n>  6 files changed, 45 insertions(+)\n>\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index fb2f7ba3423c..6d693d9a6c7a 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -12,6 +12,7 @@\n>  #include <set>\n>  #include <string>\n>\n> +#include <libcamera/controls.h>\n>  #include <libcamera/request.h>\n>  #include <libcamera/signal.h>\n>  #include <libcamera/stream.h>\n> @@ -83,6 +84,8 @@ public:\n>  \tint acquire();\n>  \tint release();\n>\n> +\tconst ControlInfoMap &controls();\n\ncan't this be called on const instances?\nOr there is no such a thing as a const Camera instances? Same question\nfor the pipeline handler operation, but in that case I doubt we'll\nhave any const pipeline handler.\n\nThis apart\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\n> +\n>  \tconst std::set<Stream *> &streams() const;\n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);\n>  \tint configure(CameraConfiguration *config);\n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index ad2d49d522c5..9b37dfb16b89 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -99,6 +99,8 @@ static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>\n> +using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;\n> +\n>  class ControlList\n>  {\n>  private:\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 617ea99cdf71..592dfd39eacc 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -548,6 +548,18 @@ int Camera::release()\n>  \treturn 0;\n>  }\n>\n> +/**\n> + * \\brief Retrieve the list of controls supported by the camera\n> + *\n> + * Camera controls remain constant through the lifetime of the camera.\n> + *\n> + * \\return A ControlInfoMap listing the controls supported by the camera\n> + */\n> +const ControlInfoMap &Camera::controls()\n> +{\n> +\treturn pipe_->controls(this);\n> +}\n> +\n>  /**\n>   * \\brief Retrieve all the camera's stream information\n>   *\n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index 22db2b93eff2..e4c41b97a354 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -315,6 +315,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &rhs)\n>  \treturn lhs.id() == rhs;\n>  }\n>\n> +/**\n> + * \\typedef ControlInfoMap\n> + * \\brief A map of ControlId to ControlInfo\n> + */\n> +\n>  /**\n>   * \\class ControlList\n>   * \\brief Associates a list of ControlIds with their values for a Camera.\n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index a4cbc593a179..f836d5d1a600 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -14,6 +14,7 @@\n>  #include <string>\n>  #include <vector>\n>\n> +#include <libcamera/controls.h>\n>  #include <libcamera/stream.h>\n>\n>  namespace libcamera {\n> @@ -41,6 +42,7 @@ public:\n>  \tCamera *camera_;\n>  \tPipelineHandler *pipe_;\n>  \tstd::list<Request *> queuedRequests_;\n> +\tControlInfoMap controlInfo_;\n>\n>  private:\n>  \tCameraData(const CameraData &) = delete;\n> @@ -60,6 +62,8 @@ public:\n>  \tbool lock();\n>  \tvoid unlock();\n>\n> +\tconst ControlInfoMap &controls(Camera *camera);\n> +\n>  \tvirtual CameraConfiguration *generateConfiguration(Camera *camera,\n>  \t\tconst StreamRoles &roles) = 0;\n>  \tvirtual int configure(Camera *camera, CameraConfiguration *config) = 0;\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index c91ef2f7d336..0283e4e5ad51 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -88,6 +88,14 @@ LOG_DEFINE_CATEGORY(Pipeline)\n>   * PipelineHandler::completeRequest()\n>   */\n>\n> +/**\n> + * \\var CameraData::controlInfo_\n> + * \\brief The set of controls supported by the camera\n> + *\n> + * The control information shall be initialised by the pipeline handler when\n> + * creating the camera, and shall not be modified afterwards.\n> + */\n> +\n>  /**\n>   * \\class PipelineHandler\n>   * \\brief Create and manage cameras based on a set of media devices\n> @@ -217,6 +225,17 @@ void PipelineHandler::unlock()\n>  \t\tmedia->unlock();\n>  }\n>\n> +/**\n> + * \\brief Retrieve the list of controls for a camera\n> + * \\param[in] camera The camera\n> + * \\return A ControlInfoMap listing the controls support by \\a camera\n> + */\n> +const ControlInfoMap &PipelineHandler::controls(Camera *camera)\n> +{\n> +\tCameraData *data = cameraData(camera);\n> +\treturn data->controlInfo_;\n> +}\n> +\n>  /**\n>   * \\fn PipelineHandler::generateConfiguration()\n>   * \\brief Generate a camera configuration for a specified camera\n> --\n> Regards,\n>\n> Laurent Pinchart\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 relay11.mail.gandi.net (relay11.mail.gandi.net\n\t[217.70.178.231])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8790760BF8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Jul 2019 18:46:58 +0200 (CEST)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay11.mail.gandi.net (Postfix) with ESMTPSA id 0A149100006;\n\tMon,  1 Jul 2019 16:46:57 +0000 (UTC)"],"Date":"Mon, 1 Jul 2019 18:48:14 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190701164814.4rm24h5vqcckkolu@uno.localdomain>","References":"<20190630233817.10130-1-laurent.pinchart@ideasonboard.com>\n\t<20190630233817.10130-6-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"ynl5iint24posrhx\"","Content-Disposition":"inline","In-Reply-To":"<20190630233817.10130-6-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","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":"Mon, 01 Jul 2019 16:46:58 -0000"}},{"id":2086,"web_url":"https://patchwork.libcamera.org/comment/2086/","msgid":"<20190701171145.GJ5018@pendragon.ideasonboard.com>","date":"2019-07-01T17:11:45","subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Mon, Jul 01, 2019 at 06:48:14PM +0200, Jacopo Mondi wrote:\n> On Mon, Jul 01, 2019 at 02:38:08AM +0300, Laurent Pinchart wrote:\n> > From: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >\n> > Extend the Camera class to expose the controls it supports. Each\n> > pipeline should generate a list of controls supported by each camera it\n> > creates. These are represented by a ControlInfoMap, and an associated\n> > ControlList of default values.\n> >\n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  include/libcamera/camera.h               |  3 +++\n> >  include/libcamera/controls.h             |  2 ++\n> >  src/libcamera/camera.cpp                 | 12 ++++++++++++\n> >  src/libcamera/controls.cpp               |  5 +++++\n> >  src/libcamera/include/pipeline_handler.h |  4 ++++\n> >  src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++\n> >  6 files changed, 45 insertions(+)\n> >\n> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > index fb2f7ba3423c..6d693d9a6c7a 100644\n> > --- a/include/libcamera/camera.h\n> > +++ b/include/libcamera/camera.h\n> > @@ -12,6 +12,7 @@\n> >  #include <set>\n> >  #include <string>\n> >\n> > +#include <libcamera/controls.h>\n> >  #include <libcamera/request.h>\n> >  #include <libcamera/signal.h>\n> >  #include <libcamera/stream.h>\n> > @@ -83,6 +84,8 @@ public:\n> >  \tint acquire();\n> >  \tint release();\n> >\n> > +\tconst ControlInfoMap &controls();\n> \n> can't this be called on const instances?\n> Or there is no such a thing as a const Camera instances? Same question\n> for the pipeline handler operation, but in that case I doubt we'll\n> have any const pipeline handler.\n\nIf we want to call this on const Camera instance we need const\nPipelineHandler instances, and it trickles down to more classes, until\nit creates compilation errors that were hard to fix last time I tried.\nAs we have no const Camera instance, I don't think it's an issue.\n\n> This apart\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > +\n> >  \tconst std::set<Stream *> &streams() const;\n> >  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);\n> >  \tint configure(CameraConfiguration *config);\n> > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> > index ad2d49d522c5..9b37dfb16b89 100644\n> > --- a/include/libcamera/controls.h\n> > +++ b/include/libcamera/controls.h\n> > @@ -99,6 +99,8 @@ static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)\n> >  \treturn !(lhs == rhs);\n> >  }\n> >\n> > +using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;\n> > +\n> >  class ControlList\n> >  {\n> >  private:\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index 617ea99cdf71..592dfd39eacc 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -548,6 +548,18 @@ int Camera::release()\n> >  \treturn 0;\n> >  }\n> >\n> > +/**\n> > + * \\brief Retrieve the list of controls supported by the camera\n> > + *\n> > + * Camera controls remain constant through the lifetime of the camera.\n> > + *\n> > + * \\return A ControlInfoMap listing the controls supported by the camera\n> > + */\n> > +const ControlInfoMap &Camera::controls()\n> > +{\n> > +\treturn pipe_->controls(this);\n> > +}\n> > +\n> >  /**\n> >   * \\brief Retrieve all the camera's stream information\n> >   *\n> > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> > index 22db2b93eff2..e4c41b97a354 100644\n> > --- a/src/libcamera/controls.cpp\n> > +++ b/src/libcamera/controls.cpp\n> > @@ -315,6 +315,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &rhs)\n> >  \treturn lhs.id() == rhs;\n> >  }\n> >\n> > +/**\n> > + * \\typedef ControlInfoMap\n> > + * \\brief A map of ControlId to ControlInfo\n> > + */\n> > +\n> >  /**\n> >   * \\class ControlList\n> >   * \\brief Associates a list of ControlIds with their values for a Camera.\n> > diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> > index a4cbc593a179..f836d5d1a600 100644\n> > --- a/src/libcamera/include/pipeline_handler.h\n> > +++ b/src/libcamera/include/pipeline_handler.h\n> > @@ -14,6 +14,7 @@\n> >  #include <string>\n> >  #include <vector>\n> >\n> > +#include <libcamera/controls.h>\n> >  #include <libcamera/stream.h>\n> >\n> >  namespace libcamera {\n> > @@ -41,6 +42,7 @@ public:\n> >  \tCamera *camera_;\n> >  \tPipelineHandler *pipe_;\n> >  \tstd::list<Request *> queuedRequests_;\n> > +\tControlInfoMap controlInfo_;\n> >\n> >  private:\n> >  \tCameraData(const CameraData &) = delete;\n> > @@ -60,6 +62,8 @@ public:\n> >  \tbool lock();\n> >  \tvoid unlock();\n> >\n> > +\tconst ControlInfoMap &controls(Camera *camera);\n> > +\n> >  \tvirtual CameraConfiguration *generateConfiguration(Camera *camera,\n> >  \t\tconst StreamRoles &roles) = 0;\n> >  \tvirtual int configure(Camera *camera, CameraConfiguration *config) = 0;\n> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> > index c91ef2f7d336..0283e4e5ad51 100644\n> > --- a/src/libcamera/pipeline_handler.cpp\n> > +++ b/src/libcamera/pipeline_handler.cpp\n> > @@ -88,6 +88,14 @@ LOG_DEFINE_CATEGORY(Pipeline)\n> >   * PipelineHandler::completeRequest()\n> >   */\n> >\n> > +/**\n> > + * \\var CameraData::controlInfo_\n> > + * \\brief The set of controls supported by the camera\n> > + *\n> > + * The control information shall be initialised by the pipeline handler when\n> > + * creating the camera, and shall not be modified afterwards.\n> > + */\n> > +\n> >  /**\n> >   * \\class PipelineHandler\n> >   * \\brief Create and manage cameras based on a set of media devices\n> > @@ -217,6 +225,17 @@ void PipelineHandler::unlock()\n> >  \t\tmedia->unlock();\n> >  }\n> >\n> > +/**\n> > + * \\brief Retrieve the list of controls for a camera\n> > + * \\param[in] camera The camera\n> > + * \\return A ControlInfoMap listing the controls support by \\a camera\n> > + */\n> > +const ControlInfoMap &PipelineHandler::controls(Camera *camera)\n> > +{\n> > +\tCameraData *data = cameraData(camera);\n> > +\treturn data->controlInfo_;\n> > +}\n> > +\n> >  /**\n> >   * \\fn PipelineHandler::generateConfiguration()\n> >   * \\brief Generate a camera configuration for a specified camera","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5FC8960BF8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Jul 2019 19:12:05 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CCFDD524;\n\tMon,  1 Jul 2019 19:12:04 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1562001125;\n\tbh=0waBPqufnYpOoH/8HwB1T77KTwXfoktJNNYbu9V6JCQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=lBOa79WH2UFo6rJtXhmE2Z7VS1nzmio8YDF/VFOBxBdaufmNAFfNRL6QxS7j9b63o\n\twsIt/tCH3IlnGtyy53NPJp5idv1hDmiH89/711halSeC8UZQcTFtUnKkJmor5VW7VK\n\tZTYXwbbKlx68eUv5JyW9ADRoCbzwSYMM/mfcYUlo=","Date":"Mon, 1 Jul 2019 20:11:45 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190701171145.GJ5018@pendragon.ideasonboard.com>","References":"<20190630233817.10130-1-laurent.pinchart@ideasonboard.com>\n\t<20190630233817.10130-6-laurent.pinchart@ideasonboard.com>\n\t<20190701164814.4rm24h5vqcckkolu@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190701164814.4rm24h5vqcckkolu@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a\n\tlist of ControlInfo","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":"Mon, 01 Jul 2019 17:12:05 -0000"}}]