• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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