From patchwork Sun Jun 30 23:38:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 1547 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 44A6961F3A for ; Mon, 1 Jul 2019 01:38:44 +0200 (CEST) Received: from pendragon.bb.dnainternet.fi (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E5AB4255 for ; Mon, 1 Jul 2019 01:38:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1561937924; bh=yxJZTBRxCfBHP2nhsXl7xFteIyrhQl2XKqPevUtBHfo=; h=From:To:Subject:Date:In-Reply-To:References:From; b=N/isg78xEbAcTAsagcT3qyRFgx0Z7Z5VMnzqRtAsaC1O/vIvcQhJUr0BzzLfXmQ7b arGtCCpVmxcmVFJUQrpwTp3RYFJ8kYRztHDpA8Jj/r153XEBBgClnj+Wl4Lz7B9p9d YSrblj9rp54ebPdx+ubEnNF1FQZCc0r4tVTiybqE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Mon, 1 Jul 2019 02:38:08 +0300 Message-Id: <20190630233817.10130-6-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190630233817.10130-1-laurent.pinchart@ideasonboard.com> References: <20190630233817.10130-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a list of ControlInfo X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Jun 2019 23:38:45 -0000 From: Kieran Bingham Extend the Camera class to expose the controls it supports. Each pipeline should generate a list of controls supported by each camera it creates. These are represented by a ControlInfoMap, and an associated ControlList of default values. Signed-off-by: Kieran Bingham Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- include/libcamera/camera.h | 3 +++ include/libcamera/controls.h | 2 ++ src/libcamera/camera.cpp | 12 ++++++++++++ src/libcamera/controls.cpp | 5 +++++ src/libcamera/include/pipeline_handler.h | 4 ++++ src/libcamera/pipeline_handler.cpp | 19 +++++++++++++++++++ 6 files changed, 45 insertions(+) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index fb2f7ba3423c..6d693d9a6c7a 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -83,6 +84,8 @@ public: int acquire(); int release(); + const ControlInfoMap &controls(); + const std::set &streams() const; std::unique_ptr generateConfiguration(const StreamRoles &roles); int configure(CameraConfiguration *config); diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index ad2d49d522c5..9b37dfb16b89 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -99,6 +99,8 @@ static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs) return !(lhs == rhs); } +using ControlInfoMap = std::unordered_map; + class ControlList { private: diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 617ea99cdf71..592dfd39eacc 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -548,6 +548,18 @@ int Camera::release() return 0; } +/** + * \brief Retrieve the list of controls supported by the camera + * + * Camera controls remain constant through the lifetime of the camera. + * + * \return A ControlInfoMap listing the controls supported by the camera + */ +const ControlInfoMap &Camera::controls() +{ + return pipe_->controls(this); +} + /** * \brief Retrieve all the camera's stream information * diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index 22db2b93eff2..e4c41b97a354 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -315,6 +315,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &rhs) return lhs.id() == rhs; } +/** + * \typedef ControlInfoMap + * \brief A map of ControlId to ControlInfo + */ + /** * \class ControlList * \brief Associates a list of ControlIds with their values for a Camera. diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index a4cbc593a179..f836d5d1a600 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -14,6 +14,7 @@ #include #include +#include #include namespace libcamera { @@ -41,6 +42,7 @@ public: Camera *camera_; PipelineHandler *pipe_; std::list queuedRequests_; + ControlInfoMap controlInfo_; private: CameraData(const CameraData &) = delete; @@ -60,6 +62,8 @@ public: bool lock(); void unlock(); + const ControlInfoMap &controls(Camera *camera); + virtual CameraConfiguration *generateConfiguration(Camera *camera, const StreamRoles &roles) = 0; virtual int configure(Camera *camera, CameraConfiguration *config) = 0; diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index c91ef2f7d336..0283e4e5ad51 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -88,6 +88,14 @@ LOG_DEFINE_CATEGORY(Pipeline) * PipelineHandler::completeRequest() */ +/** + * \var CameraData::controlInfo_ + * \brief The set of controls supported by the camera + * + * The control information shall be initialised by the pipeline handler when + * creating the camera, and shall not be modified afterwards. + */ + /** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices @@ -217,6 +225,17 @@ void PipelineHandler::unlock() media->unlock(); } +/** + * \brief Retrieve the list of controls for a camera + * \param[in] camera The camera + * \return A ControlInfoMap listing the controls support by \a camera + */ +const ControlInfoMap &PipelineHandler::controls(Camera *camera) +{ + CameraData *data = cameraData(camera); + return data->controlInfo_; +} + /** * \fn PipelineHandler::generateConfiguration() * \brief Generate a camera configuration for a specified camera