From patchwork Tue Dec 31 05:33:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 2479 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 77E4360465 for ; Tue, 31 Dec 2019 06:33:26 +0100 (CET) Received: from neptunite.amanokami.net (173-16-160-11.client.mchsi.com [173.16.160.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 27787DF; Tue, 31 Dec 2019 06:33:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1577770406; bh=09jD1Lyv4HyQcggTGVUBPjPiatMNZ4nb2uRlbWJEGws=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rN9d9kCBVA+bgT3GWsRVW5IMSNs1IY/TZxB1HPNqAuafhuYSi+jmTP45a9j8l4Zch VNc/fxmj57o4qE5TP/fFwCUFO7GPfm+qIZ+WL73PrYYPv3vpRmhZkQly+/KM1T7Gh2 8xjm0C1fvJCp0/51rBWcW8hscrZIe/2R+3cSO20I= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Mon, 30 Dec 2019 23:33:12 -0600 Message-Id: <20191231053314.20063-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191231053314.20063-1-paul.elder@ideasonboard.com> References: <20191231053314.20063-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/4] libcamera: camera_manager, pipeline_handler: allow retrieving cameras by device numbers X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Dec 2019 05:33:27 -0000 The V4L2 compatibility layer will need a way to map device numbers to libcamera Camera instances. Expose a method in the camera manager to retrieve Camera instances by devnum. The mapping from device numbers to Camera instances is optionally declared by pipeline handlers when they register cameras with the camera manager. Signed-off-by: Paul Elder Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- Changes in v4: - squashed 4/6 from v3 - simplified registering devnum -> camera mappings - old (v3) system: pipeline handlers have their own map, that camera manager aggregates - new (v4) system: pipeline handlers, when they register the camera with the camera manager, (optionally) declare the devnum along with it New in v3 --- include/libcamera/camera_manager.h | 5 +++- src/libcamera/camera_manager.cpp | 37 +++++++++++++++++++++++- src/libcamera/include/pipeline_handler.h | 3 +- src/libcamera/pipeline_handler.cpp | 13 +++++++-- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h index 8331898c..d2d6e443 100644 --- a/include/libcamera/camera_manager.h +++ b/include/libcamera/camera_manager.h @@ -7,6 +7,7 @@ #ifndef __LIBCAMERA_CAMERA_MANAGER_H__ #define __LIBCAMERA_CAMERA_MANAGER_H__ +#include #include #include #include @@ -33,8 +34,9 @@ public: const std::vector> &cameras() const { return cameras_; } std::shared_ptr get(const std::string &name); + std::shared_ptr get(dev_t devnum); - void addCamera(std::shared_ptr camera); + void addCamera(std::shared_ptr camera, dev_t devnum); void removeCamera(Camera *camera); static const std::string &version() { return version_; } @@ -46,6 +48,7 @@ private: std::unique_ptr enumerator_; std::vector> pipes_; std::vector> cameras_; + std::map> camerasByDevnum_; static const std::string version_; static CameraManager *self_; diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 7c6f72bb..b6204872 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -180,15 +180,45 @@ std::shared_ptr CameraManager::get(const std::string &name) return nullptr; } +/** + * \brief Retrieve a camera based on device number + * \param[in] devnum Device number of camera to get + * + * Retrieving a camera based on device number is done by the V4L2 compatibility + * layer to map device nodes to libcamera Camera instances. + * + * Regular applications are recommended to retrieve libcamera Camera instances + * by name instead. + * + * Before calling this function the caller is responsible for ensuring that + * the camera manager is running. + * + * \return Shared pointer to Camera object, which is empty if the camera is + * not found + */ +std::shared_ptr CameraManager::get(dev_t devnum) +{ + auto iter = camerasByDevnum_.find(devnum); + + if (iter == camerasByDevnum_.end()) + return nullptr; + + return iter->second.lock(); +} + /** * \brief Add a camera to the camera manager * \param[in] camera The camera to be added + * \param[in] devnum The device number to associate with \a camera * * This function is called by pipeline handlers to register the cameras they * handle with the camera manager. Registered cameras are immediately made * available to the system. + * + * \a devnum is used by the V4L2 compatibility layer to map V4L2 device nodes + * to libcamera Camera instances. */ -void CameraManager::addCamera(std::shared_ptr camera) +void CameraManager::addCamera(std::shared_ptr camera, dev_t devnum) { for (std::shared_ptr c : cameras_) { if (c->name() == camera->name()) { @@ -200,6 +230,11 @@ void CameraManager::addCamera(std::shared_ptr camera) } cameras_.push_back(std::move(camera)); + + if (devnum) { + unsigned int index = cameras_.size() - 1; + camerasByDevnum_[devnum] = cameras_[index]; + } } /** diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index f3622631..067baef5 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -86,7 +87,7 @@ public: protected: void registerCamera(std::shared_ptr camera, - std::unique_ptr data); + std::unique_ptr data, dev_t devnum = 0); void hotplugMediaDevice(MediaDevice *media); virtual int queueRequestDevice(Camera *camera, Request *request) = 0; diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 5badf31c..942b1a30 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -7,6 +7,8 @@ #include "pipeline_handler.h" +#include + #include #include #include @@ -438,19 +440,26 @@ void PipelineHandler::completeRequest(Camera *camera, Request *request) * \brief Register a camera to the camera manager and pipeline handler * \param[in] camera The camera to be added * \param[in] data Pipeline-specific data for the camera + * \param[in] devnum Device number of the camera (optional) * * This method is called by pipeline handlers to register the cameras they * handle with the camera manager. It associates the pipeline-specific \a data * with the camera, for later retrieval with cameraData(). Ownership of \a data * is transferred to the PipelineHandler. + * + * \a devnum is the device number (as returned by makedev) that the \a camera + * is to be associated with. This is for the V4L2 compatibility layer to map + * device nodes to libcamera Camera instances based on the device number + * registered by this method in \a devnum. */ void PipelineHandler::registerCamera(std::shared_ptr camera, - std::unique_ptr data) + std::unique_ptr data, + dev_t devnum) { data->camera_ = camera.get(); cameraData_[camera.get()] = std::move(data); cameras_.push_back(camera); - manager_->addCamera(std::move(camera)); + manager_->addCamera(std::move(camera), devnum); } /**