1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_manager_impl.h"
17 #include <vector>
18 #include "camera_input_impl.h"
19 #include "camera_log.h"
20 #include "camera_utils.h"
21 #include "camera_util.h"
22 #include "camera_error_code.h"
23 #include "cj_lambda.h"
24
25 static const int32_t SECURE_CAMERA = 12;
26
27 namespace OHOS {
28 namespace CameraStandard {
OnCameraStatusChanged(const CameraStatusInfo & cameraStatusInfo) const29 void CJCameraManagerCallback::OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const
30 {
31 ExecuteCallback(cameraStatusInfo);
32 }
33
OnFlashlightStatusChanged(const std::string & cameraID,const FlashStatus flashStatus) const34 void CJCameraManagerCallback::OnFlashlightStatusChanged(const std::string &cameraID,
35 const FlashStatus flashStatus) const
36 {
37 (void)cameraID;
38 (void)flashStatus;
39 }
40
OnFoldStatusChanged(const FoldStatusInfo & foldStatusInfo) const41 void CJFoldListener::OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const
42 {
43 ExecuteCallback(foldStatusInfo);
44 }
45
OnTorchStatusChange(const TorchStatusInfo & torchStatusInfo) const46 void CJTorchListener::OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const
47 {
48 ExecuteCallback(torchStatusInfo);
49 }
50
CJCameraManager()51 CJCameraManager::CJCameraManager()
52 {
53 cameraManager_ = CameraManager::GetInstance();
54 }
55
~CJCameraManager()56 CJCameraManager::~CJCameraManager()
57 {
58 }
59
GetSupportedCameras(int32_t * errCode)60 CArrCJCameraDevice CJCameraManager::GetSupportedCameras(int32_t *errCode)
61 {
62 CArrCJCameraDevice result = {nullptr, 0};
63 if (cameraManager_ == nullptr) {
64 *errCode = CameraError::CAMERA_SERVICE_ERROR;
65 return result;
66 }
67 std::vector<sptr<CameraDevice>> supportedCameraDevices = cameraManager_->GetSupportedCameras();
68 if (supportedCameraDevices.size() == 0) {
69 return result;
70 }
71 CJCameraDevice *supportedCameras =
72 static_cast<CJCameraDevice *>(malloc(sizeof(CJCameraDevice) * supportedCameraDevices.size()));
73 if (supportedCameras == nullptr) {
74 *errCode = CameraError::CAMERA_SERVICE_ERROR;
75 return result;
76 }
77
78 int i = 0;
79 for (auto it = supportedCameraDevices.begin(); it != supportedCameraDevices.end(); ++it) {
80 sptr<CameraDevice> cameraDevice = *it;
81
82 if (cameraDevice == nullptr) {
83 *errCode = CameraError::CAMERA_SERVICE_ERROR;
84 for (int j = 0; j < i; j++) {
85 free(supportedCameras[j].cameraId);
86 }
87 free(supportedCameras);
88 return result;
89 }
90 char *cameraDeviceId = MallocCString(cameraDevice->GetID());
91 if (cameraDeviceId == nullptr) {
92 *errCode = CameraError::CAMERA_SERVICE_ERROR;
93 for (int j = 0; j < i; j++) {
94 free(supportedCameras[j].cameraId);
95 }
96 free(supportedCameras);
97 return result;
98 }
99
100 supportedCameras[i].cameraId = cameraDeviceId;
101 supportedCameras[i].cameraPosition = static_cast<int32_t>(cameraDevice->GetPosition());
102 supportedCameras[i].cameraType = static_cast<int32_t>(cameraDevice->GetCameraType());
103 supportedCameras[i].connectionType = static_cast<int32_t>(cameraDevice->GetConnectionType());
104 supportedCameras[i].cameraOrientation = cameraDevice->GetCameraOrientation();
105 i++;
106 }
107
108 result.size = static_cast<int64_t>(supportedCameraDevices.size());
109 result.head = supportedCameras;
110 *errCode = CameraError::NO_ERROR;
111 return result;
112 }
113
GetSupportedSceneModes(std::string cameraId,int32_t * errCode)114 CArrI32 CJCameraManager::GetSupportedSceneModes(std::string cameraId, int32_t *errCode)
115 {
116 CArrI32 result = {nullptr, 0};
117 if (cameraManager_ == nullptr) {
118 *errCode = CameraError::CAMERA_SERVICE_ERROR;
119 return result;
120 }
121 sptr<CameraDevice> cameraInfo = cameraManager_->GetCameraDeviceFromId(cameraId);
122 if (cameraInfo == nullptr) {
123 *errCode = CameraError::INVALID_PARAM;
124 return result;
125 }
126
127 std::vector<SceneMode> modeObjList = cameraManager_->GetSupportedModes(cameraInfo);
128 for (auto it = modeObjList.begin(); it != modeObjList.end(); it++) {
129 if (*it == SCAN) {
130 modeObjList.erase(it);
131 break;
132 }
133 }
134 if (modeObjList.empty()) {
135 modeObjList.emplace_back(CAPTURE);
136 modeObjList.emplace_back(VIDEO);
137 }
138
139 int64_t size = 0;
140 for (size_t i = 0; i < modeObjList.size(); i++) {
141 if (modeObjList[i] == CAPTURE || modeObjList[i] == VIDEO || modeObjList[i] == PROFESSIONAL_VIDEO) {
142 size++;
143 }
144 }
145
146 if (size <= 0) {
147 return result;
148 }
149 int32_t *sceneModes = static_cast<int32_t *>(malloc(sizeof(int32_t) * size));
150 if (sceneModes == nullptr) {
151 *errCode = CameraError::CAMERA_SERVICE_ERROR;
152 return result;
153 }
154
155 int64_t index = 0;
156 for (size_t i = 0; i < modeObjList.size(); i++) {
157 if (modeObjList[i] == CAPTURE || modeObjList[i] == VIDEO || modeObjList[i] == PROFESSIONAL_VIDEO) {
158 sceneModes[index] = modeObjList[i];
159 index++;
160 }
161 }
162 result.head = sceneModes;
163 result.size = size;
164 *errCode = CameraError::NO_ERROR;
165 return result;
166 }
167
GetSupportedOutputCapability(sptr<CameraDevice> & camera,int32_t modeType)168 sptr<CameraOutputCapability> CJCameraManager::GetSupportedOutputCapability(sptr<CameraDevice> &camera, int32_t modeType)
169 {
170 if (cameraManager_ == nullptr) {
171 return nullptr;
172 }
173 return cameraManager_->GetSupportedOutputCapability(camera, modeType);
174 }
175
IsCameraMuted()176 bool CJCameraManager::IsCameraMuted()
177 {
178 bool isMuted = CameraManager::GetInstance()->IsCameraMuted();
179 return isMuted;
180 }
181
CreateCameraInputWithCameraDevice(sptr<CameraDevice> & camera,sptr<CameraInput> * pCameraInput)182 int64_t CJCameraManager::CreateCameraInputWithCameraDevice(sptr<CameraDevice> &camera, sptr<CameraInput> *pCameraInput)
183 {
184 if (cameraManager_ == nullptr) {
185 return CameraError::CAMERA_SERVICE_ERROR;
186 }
187 int retCode = cameraManager_->CreateCameraInput(camera, pCameraInput);
188 if (retCode == CamServiceError::CAMERA_NO_PERMISSION) {
189 return CameraErrorCode::OPERATION_NOT_ALLOWED;
190 }
191 return CameraError::NO_ERROR;
192 }
193
CreateCameraInputWithCameraDeviceInfo(CameraPosition position,CameraType cameraType,sptr<CameraInput> * pCameraInput)194 int64_t CJCameraManager::CreateCameraInputWithCameraDeviceInfo(CameraPosition position, CameraType cameraType,
195 sptr<CameraInput> *pCameraInput)
196 {
197 if (cameraManager_ == nullptr) {
198 return CameraError::CAMERA_SERVICE_ERROR;
199 }
200 std::vector<sptr<CameraDevice>> cameraObjList = cameraManager_->GetSupportedCameras();
201 sptr<CameraDevice> cameraInfo = nullptr;
202 for (size_t i = 0; i < cameraObjList.size(); i++) {
203 sptr<CameraDevice> cameraDevice = cameraObjList[i];
204 if (cameraDevice == nullptr) {
205 continue;
206 }
207 if (cameraDevice->GetPosition() == position && cameraDevice->GetCameraType() == cameraType) {
208 cameraInfo = cameraDevice;
209 break;
210 }
211 }
212 return CreateCameraInputWithCameraDevice(cameraInfo, pCameraInput);
213 }
214
CreateSession(int32_t mode)215 sptr<CameraStandard::CaptureSession> CJCameraManager::CreateSession(int32_t mode)
216 {
217 SceneMode sceneMode;
218 if (mode == SECURE_CAMERA) {
219 sceneMode = SceneMode::SECURE;
220 } else {
221 sceneMode = static_cast<SceneMode>(mode);
222 }
223 return CameraManager::GetInstance()->CreateCaptureSession(sceneMode);
224 }
225
IsTorchSupported()226 bool CJCameraManager::IsTorchSupported()
227 {
228 bool isTorchSupported = CameraManager::GetInstance()->IsTorchSupported();
229 return isTorchSupported;
230 }
231
IsTorchModeSupported(int32_t modeType)232 bool CJCameraManager::IsTorchModeSupported(int32_t modeType)
233 {
234 TorchMode mode = TorchMode(modeType);
235 bool isTorchModeSupported = CameraManager::GetInstance()->IsTorchModeSupported(mode);
236 return isTorchModeSupported;
237 }
238
GetTorchMode()239 int32_t CJCameraManager::GetTorchMode()
240 {
241 TorchMode torchMode = CameraManager::GetInstance()->GetTorchMode();
242 return torchMode;
243 }
244
SetTorchMode(int32_t modeType)245 int32_t CJCameraManager::SetTorchMode(int32_t modeType)
246 {
247 TorchMode mode = TorchMode(modeType);
248 return CameraManager::GetInstance()->SetTorchMode(mode);
249 }
250
GetCameraDeviceById(std::string cameraId)251 sptr<CameraDevice> CJCameraManager::GetCameraDeviceById(std::string cameraId)
252 {
253 if (cameraManager_ == nullptr) {
254 return nullptr;
255 }
256 return cameraManager_->GetCameraDeviceFromId(cameraId);
257 }
258
OnCameraStatusChanged(int64_t callbackId)259 void CJCameraManager::OnCameraStatusChanged(int64_t callbackId)
260 {
261 if (cameraManagerCallback_ == nullptr) {
262 cameraManagerCallback_ = std::make_shared<CJCameraManagerCallback>();
263 if (cameraManagerCallback_ == nullptr || cameraManager_ == nullptr) {
264 return;
265 }
266 cameraManager_->RegisterCameraStatusCallback(cameraManagerCallback_);
267 }
268 auto cFunc = reinterpret_cast<void (*)(CJCameraStatusInfo info)>(callbackId);
269 auto callback = [lambda = CJLambda::Create(cFunc)](const CameraStatusInfo &cameraStatusInfo) -> void {
270 auto res = CameraStatusInfoToCJCameraStatusInfo(cameraStatusInfo);
271 lambda(res);
272 free(res.camera.cameraId);
273 };
274 auto callbackRef = std::make_shared<CallbackRef<const CameraStatusInfo &>>(callback, callbackId);
275 cameraManagerCallback_->SaveCallbackRef(callbackRef);
276 }
277
OffCameraStatusChanged(int64_t callbackId)278 void CJCameraManager::OffCameraStatusChanged(int64_t callbackId)
279 {
280 if (cameraManagerCallback_ == nullptr) {
281 return;
282 }
283 cameraManagerCallback_->RemoveCallbackRef(callbackId);
284 }
285
OffAllCameraStatusChanged()286 void CJCameraManager::OffAllCameraStatusChanged()
287 {
288 if (cameraManagerCallback_ == nullptr) {
289 return;
290 }
291 cameraManagerCallback_->RemoveAllCallbackRef();
292 }
293
OnFoldStatusChanged(int64_t callbackId)294 void CJCameraManager::OnFoldStatusChanged(int64_t callbackId)
295 {
296 if (foldListener_ == nullptr) {
297 foldListener_ = std::make_shared<CJFoldListener>();
298 if (foldListener_ == nullptr || cameraManager_ == nullptr) {
299 return;
300 }
301 cameraManager_->RegisterFoldListener(foldListener_);
302 }
303 auto cFunc = reinterpret_cast<void (*)(CJFoldStatusInfo info)>(callbackId);
304 auto callback = [lambda = CJLambda::Create(cFunc)](const FoldStatusInfo &foldStatusInfo) -> void {
305 auto res = FoldStatusInfoToCJFoldStatusInfo(foldStatusInfo);
306 lambda(res);
307 if (res.supportedCameras.head != nullptr) {
308 for (int64_t i = 0; i < res.supportedCameras.size; i++) {
309 free(res.supportedCameras.head[i].cameraId);
310 }
311 free(res.supportedCameras.head);
312 }
313 };
314 auto callbackRef = std::make_shared<CallbackRef<const FoldStatusInfo &>>(callback, callbackId);
315 foldListener_->SaveCallbackRef(callbackRef);
316 }
317
OffFoldStatusChanged(int64_t callbackId)318 void CJCameraManager::OffFoldStatusChanged(int64_t callbackId)
319 {
320 if (foldListener_ == nullptr) {
321 return;
322 }
323 foldListener_->RemoveCallbackRef(callbackId);
324 }
325
OffAllFoldStatusChanged()326 void CJCameraManager::OffAllFoldStatusChanged()
327 {
328 if (foldListener_ == nullptr) {
329 return;
330 }
331 foldListener_->RemoveAllCallbackRef();
332 }
333
OnTorchStatusChange(int64_t callbackId)334 void CJCameraManager::OnTorchStatusChange(int64_t callbackId)
335 {
336 if (torchListener_ == nullptr) {
337 torchListener_ = std::make_shared<CJTorchListener>();
338 if (torchListener_ == nullptr || cameraManager_ == nullptr) {
339 return;
340 }
341 cameraManager_->RegisterTorchListener(torchListener_);
342 }
343 auto cFunc = reinterpret_cast<void (*)(CJTorchStatusInfo info)>(callbackId);
344 auto callback = [lambda = CJLambda::Create(cFunc)](const TorchStatusInfo &torchStatusInfo) -> void {
345 lambda(TorchStatusInfoToCJTorchStatusInfo(torchStatusInfo));
346 };
347 auto callbackRef = std::make_shared<CallbackRef<const TorchStatusInfo &>>(callback, callbackId);
348 torchListener_->SaveCallbackRef(callbackRef);
349 }
350
OffTorchStatusChange(int64_t callbackId)351 void CJCameraManager::OffTorchStatusChange(int64_t callbackId)
352 {
353 if (torchListener_ == nullptr) {
354 return;
355 }
356 torchListener_->RemoveCallbackRef(callbackId);
357 }
358
OffAllTorchStatusChange()359 void CJCameraManager::OffAllTorchStatusChange()
360 {
361 if (torchListener_ == nullptr) {
362 return;
363 }
364 torchListener_->RemoveAllCallbackRef();
365 }
366
367 } // namespace CameraStandard
368 } // namespace OHOS