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>
62 lines
1.5 KiB
C++
62 lines
1.5 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* camera_hal_manager.h - libcamera Android Camera Manager
|
|
*/
|
|
#ifndef __ANDROID_CAMERA_MANAGER_H__
|
|
#define __ANDROID_CAMERA_MANAGER_H__
|
|
|
|
#include <map>
|
|
#include <mutex>
|
|
#include <stddef.h>
|
|
#include <vector>
|
|
|
|
#include <hardware/camera_common.h>
|
|
#include <hardware/hardware.h>
|
|
#include <system/camera_metadata.h>
|
|
|
|
#include <libcamera/camera_manager.h>
|
|
|
|
class CameraDevice;
|
|
|
|
class CameraHalManager
|
|
{
|
|
public:
|
|
CameraHalManager();
|
|
~CameraHalManager();
|
|
|
|
int init();
|
|
|
|
CameraDevice *open(unsigned int id, const hw_module_t *module);
|
|
|
|
unsigned int numCameras() const;
|
|
int getCameraInfo(unsigned int id, struct camera_info *info);
|
|
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__ */
|