blob: 3a744af5f2311d2ec3cdcb27f5d9bb2fdf12b87a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* camera_hal_manager.cpp - libcamera Android Camera Manager
*/
#include "camera_hal_manager.h"
#include <libcamera/camera.h>
#include "libcamera/internal/log.h"
#include "camera_device.h"
using namespace libcamera;
LOG_DECLARE_CATEGORY(HAL);
/*
* \class CameraHalManager
*
* The HAL camera manager is initializated at camera_module_t 'hal_init()' time
* and spawns its own thread where libcamera related events are dispatched to.
* It wraps the libcamera CameraManager operations and provides helpers for the
* camera_module_t operations, to retrieve the number of cameras in the system,
* their static information and to open camera devices.
*/
CameraHalManager::CameraHalManager()
: cameraManager_(nullptr)
{
}
CameraHalManager::~CameraHalManager()
{
cameras_.clear();
if (cameraManager_) {
cameraManager_->stop();
delete cameraManager_;
cameraManager_ = nullptr;
}
}
int CameraHalManager::init()
{
cameraManager_ = new CameraManager();
int ret = cameraManager_->start();
if (ret) {
LOG(HAL, Error) << "Failed to start camera manager: "
<< strerror(-ret);
delete cameraManager_;
cameraManager_ = nullptr;
return ret;
}
/*
* For each Camera registered in the system, a CameraDevice
* gets created here to wraps a libcamera Camera instance.
*
* \todo Support camera hotplug.
*/
unsigned int index = 0;
for (auto &cam : cameraManager_->cameras()) {
std::shared_ptr<CameraDevice> camera = CameraDevice::create(index, cam);
ret = camera->initialize();
if (ret)
continue;
cameras_.emplace_back(std::move(camera));
++index;
}
return 0;
}
CameraDevice *CameraHalManager::open(unsigned int id,
const hw_module_t *hardwareModule)
{
if (id >= numCameras()) {
LOG(HAL, Error) << "Invalid camera id '" << id << "'";
return nullptr;
}
CameraDevice *camera = cameras_[id].get();
if (camera->open(hardwareModule))
return nullptr;
LOG(HAL, Info) << "Open camera '" << id << "'";
return camera;
}
unsigned int CameraHalManager::numCameras() const
{
return cameraManager_->cameras().size();
}
int CameraHalManager::getCameraInfo(unsigned int id, struct camera_info *info)
{
if (!info)
return -EINVAL;
if (id >= numCameras()) {
LOG(HAL, Error) << "Invalid camera id '" << id << "'";
return -EINVAL;
}
CameraDevice *camera = cameras_[id].get();
info->facing = camera->facing();
info->orientation = camera->orientation();
info->device_version = CAMERA_DEVICE_API_VERSION_3_3;
info->resource_cost = 0;
info->static_camera_characteristics = camera->getStaticMetadata();
info->conflicting_devices = nullptr;
info->conflicting_devices_length = 0;
return 0;
}
void CameraHalManager::setCallbacks(const camera_module_callbacks_t *callbacks)
{
callbacks_ = callbacks;
}
|