android: camera_hal_manager: Support camera hotplug

Extend the support for camera hotplug from libcamera's CameraManager
to CameraHalManager. Use camera module callbacks to let the framework
know about the hotplug events and change the status of cameras being
hotplugged or unplugged via camera_device_status_change().

Introduce a map cameraIdsMap_ which book-keeps all cameras seen in the
past by the CameraHalManager. If the camera is seen for the first time,
a new id is assigned to it. If the camera has been seen before by the
manager, its old id is reused. IDs for internal cameras start with
'0' and for external cameras, they start with '1000'. Accesses to
cameraIdsMap_ and cameras_ are protected by a mutex.

Signed-off-by: Umang Jain <email@uajain.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Umang Jain
2020-08-21 14:46:11 +00:00
committed by Laurent Pinchart
parent 12b939aa53
commit 20be38a0db
2 changed files with 163 additions and 24 deletions
+19
View File
@@ -7,6 +7,8 @@
#ifndef __ANDROID_CAMERA_MANAGER_H__
#define __ANDROID_CAMERA_MANAGER_H__
#include <map>
#include <mutex>
#include <stddef.h>
#include <vector>
@@ -33,10 +35,27 @@ public:
void setCallbacks(const camera_module_callbacks_t *callbacks);
private:
using Mutex = std::mutex;
using MutexLocker = std::unique_lock<std::mutex>;
static constexpr unsigned int firstExternalCameraId_ = 1000;
static int32_t cameraLocation(const libcamera::Camera *cam);
void cameraAdded(std::shared_ptr<libcamera::Camera> cam);
void cameraRemoved(std::shared_ptr<libcamera::Camera> cam);
CameraDevice *cameraDeviceFromHalId(unsigned int id);
libcamera::CameraManager *cameraManager_;
const camera_module_callbacks_t *callbacks_;
std::vector<std::shared_ptr<CameraDevice>> cameras_;
std::map<std::string, unsigned int> cameraIdsMap_;
Mutex mutex_;
unsigned int numInternalCameras_;
unsigned int nextExternalCameraId_;
};
#endif /* __ANDROID_CAMERA_MANAGER_H__ */