1 /*
2 * Copyright (c) 2023-2023 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
18 #include <unistd.h>
19
20 #include "camera_device.h"
21 #include "camera_log.h"
22 #include "camera_util.h"
23 #include "image_receiver.h"
24 #include "securec.h"
25 #include "surface_utils.h"
26
27 using namespace std;
28 using namespace OHOS;
29 using namespace OHOS::CameraStandard;
30 const char* DEFAULT_SURFACEID = "photoOutput";
31 thread_local OHOS::sptr<OHOS::Surface> Camera_Manager::photoSurface_ = nullptr;
32 NDKCallbackMap<CameraManager_Callbacks*, OHOS::CameraStandard::InnerCameraManagerCameraStatusCallback>
33 Camera_Manager::cameraStatusCallbackMap_;
34
35 NDKCallbackMap<OH_CameraManager_OnFoldStatusInfoChange, OHOS::CameraStandard::InnerCameraManagerFoldStatusCallback>
36 Camera_Manager::cameraFoldStatusCallbackMap_;
37
38 NDKCallbackMap<OH_CameraManager_TorchStatusCallback, OHOS::CameraStandard::InnerCameraManagerTorchStatusCallback>
39 Camera_Manager::torchStatusCallbackMap_;
40
41 const std::unordered_map<SceneMode, Camera_SceneMode> g_fwModeToNdk_ = {
42 {SceneMode::CAPTURE, Camera_SceneMode::NORMAL_PHOTO},
43 {SceneMode::VIDEO, Camera_SceneMode::NORMAL_VIDEO},
44 {SceneMode::SECURE, Camera_SceneMode::SECURE_PHOTO},
45 };
46 const std::unordered_map<Camera_SceneMode, SceneMode> g_ndkToFwMode_ = {
47 {Camera_SceneMode::NORMAL_PHOTO, SceneMode::CAPTURE},
48 {Camera_SceneMode::NORMAL_VIDEO, SceneMode::VIDEO},
49 {Camera_SceneMode::SECURE_PHOTO, SceneMode::SECURE},
50 };
51 const std::unordered_map<CameraPosition, Camera_Position> g_FwkCameraPositionToNdk_ = {
52 {CameraPosition::CAMERA_POSITION_UNSPECIFIED, Camera_Position::CAMERA_POSITION_UNSPECIFIED},
53 {CameraPosition::CAMERA_POSITION_BACK, Camera_Position::CAMERA_POSITION_BACK},
54 {CameraPosition::CAMERA_POSITION_FRONT, Camera_Position::CAMERA_POSITION_FRONT},
55 };
56 const std::unordered_map<Camera_Position, CameraPosition> g_NdkCameraPositionToFwk_ = {
57 {Camera_Position::CAMERA_POSITION_UNSPECIFIED, CameraPosition::CAMERA_POSITION_UNSPECIFIED},
58 {Camera_Position::CAMERA_POSITION_BACK, CameraPosition::CAMERA_POSITION_BACK},
59 {Camera_Position::CAMERA_POSITION_FRONT, CameraPosition::CAMERA_POSITION_FRONT},
60 };
61 const std::unordered_map<Camera_TorchMode, TorchMode> g_ndkToFwTorchMode_ = {
62 {Camera_TorchMode::OFF, TorchMode::TORCH_MODE_OFF},
63 {Camera_TorchMode::ON, TorchMode::TORCH_MODE_ON},
64 {Camera_TorchMode::AUTO, TorchMode::TORCH_MODE_AUTO}
65 };
66
67 namespace OHOS::CameraStandard {
68 class InnerCameraManagerCameraStatusCallback : public CameraManagerCallback {
69 public:
InnerCameraManagerCameraStatusCallback(Camera_Manager * cameraManager,CameraManager_Callbacks * callback)70 InnerCameraManagerCameraStatusCallback(Camera_Manager* cameraManager, CameraManager_Callbacks* callback)
71 : cameraManager_(cameraManager), callback_(*callback)
72 {}
~InnerCameraManagerCameraStatusCallback()73 ~InnerCameraManagerCameraStatusCallback() {}
74
OnCameraStatusChanged(const CameraStatusInfo & cameraStatusInfo) const75 void OnCameraStatusChanged(const CameraStatusInfo& cameraStatusInfo) const override
76 {
77 MEDIA_DEBUG_LOG("OnCameraStatusChanged is called!");
78 Camera_StatusInfo statusInfo;
79 Camera_Device cameraDevice;
80 statusInfo.camera = &cameraDevice;
81 string cameraId = cameraStatusInfo.cameraDevice->GetID();
82 statusInfo.camera->cameraId = cameraId.data();
83 MEDIA_INFO_LOG("cameraId is %{public}s", statusInfo.camera->cameraId);
84 statusInfo.camera->cameraPosition = static_cast<Camera_Position>(cameraStatusInfo.cameraDevice->GetPosition());
85 statusInfo.camera->cameraType = static_cast<Camera_Type>(cameraStatusInfo.cameraDevice->GetCameraType());
86 statusInfo.camera->connectionType =
87 static_cast<Camera_Connection>(cameraStatusInfo.cameraDevice->GetConnectionType());
88 statusInfo.status = static_cast<Camera_Status>(cameraStatusInfo.cameraStatus);
89 CHECK_EXECUTE(cameraManager_ != nullptr && callback_.onCameraStatus != nullptr,
90 callback_.onCameraStatus(cameraManager_, &statusInfo));
91 }
92
OnFlashlightStatusChanged(const std::string & cameraID,const FlashStatus flashStatus) const93 void OnFlashlightStatusChanged(const std::string& cameraID, const FlashStatus flashStatus) const override
94 {
95 MEDIA_DEBUG_LOG("OnFlashlightStatusChanged is called!");
96 (void)cameraID;
97 (void)flashStatus;
98 }
99
100 private:
101 Camera_Manager* cameraManager_;
102 CameraManager_Callbacks callback_;
103 };
104
105 class InnerCameraManagerTorchStatusCallback : public TorchListener {
106 public:
InnerCameraManagerTorchStatusCallback(Camera_Manager * cameraManager,OH_CameraManager_TorchStatusCallback torchStatusCallback)107 InnerCameraManagerTorchStatusCallback(
108 Camera_Manager* cameraManager, OH_CameraManager_TorchStatusCallback torchStatusCallback)
109 : cameraManager_(cameraManager), torchStatusCallback_(torchStatusCallback) {};
110 ~InnerCameraManagerTorchStatusCallback() = default;
111
OnTorchStatusChange(const TorchStatusInfo & torchStatusInfo) const112 void OnTorchStatusChange(const TorchStatusInfo& torchStatusInfo) const override
113 {
114 MEDIA_DEBUG_LOG("OnTorchStatusChange is called!");
115 if (cameraManager_ != nullptr && torchStatusCallback_ != nullptr) {
116 Camera_TorchStatusInfo statusInfo;
117 statusInfo.isTorchAvailable = torchStatusInfo.isTorchAvailable;
118 statusInfo.isTorchActive = torchStatusInfo.isTorchActive;
119 statusInfo.torchLevel = torchStatusInfo.torchLevel;
120 torchStatusCallback_(cameraManager_, &statusInfo);
121 }
122 }
123
124 private:
125 Camera_Manager* cameraManager_;
126 OH_CameraManager_TorchStatusCallback torchStatusCallback_ = nullptr;
127 };
128
129 class InnerCameraManagerFoldStatusCallback : public FoldListener {
130 public:
InnerCameraManagerFoldStatusCallback(Camera_Manager * cameraManager,OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)131 InnerCameraManagerFoldStatusCallback(
132 Camera_Manager* cameraManager, OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)
133 : cameraManager_(cameraManager), foldStatusCallback_(foldStatusCallback) {};
134 ~InnerCameraManagerFoldStatusCallback() = default;
135
OnFoldStatusChanged(const FoldStatusInfo & foldStatusInfo) const136 void OnFoldStatusChanged(const FoldStatusInfo& foldStatusInfo) const override
137 {
138 MEDIA_DEBUG_LOG("OnFoldStatusChanged is called!");
139 if (cameraManager_ != nullptr && (foldStatusCallback_ != nullptr)) {
140 Camera_FoldStatusInfo statusInfo;
141 auto cameraSize = foldStatusInfo.supportedCameras.size();
142 CHECK_ERROR_RETURN_LOG(cameraSize <= 0, "Invalid size.");
143 Camera_Device supportedCameras[cameraSize];
144 Camera_Device* supportedCamerasPtr[cameraSize];
145 uint32_t outSize = 0;
146 string cameraIds[cameraSize];
147 for (size_t index = 0; index < cameraSize; index++) {
148 Camera_Device* cameraDevice = &supportedCameras[outSize];
149 cameraDevice->cameraPosition =
150 static_cast<Camera_Position>(foldStatusInfo.supportedCameras[index]->GetPosition());
151 cameraIds[outSize] = foldStatusInfo.supportedCameras[index]->GetID();
152 cameraDevice->cameraId = cameraIds[outSize].data();
153 cameraDevice->cameraType =
154 static_cast<Camera_Type>(foldStatusInfo.supportedCameras[index]->GetCameraType());
155 cameraDevice->connectionType =
156 static_cast<Camera_Connection>(foldStatusInfo.supportedCameras[index]->GetConnectionType());
157 supportedCamerasPtr[outSize] = cameraDevice;
158 outSize++;
159 }
160 statusInfo.supportedCameras = supportedCamerasPtr;
161 statusInfo.cameraSize = outSize;
162 statusInfo.foldStatus = (Camera_FoldStatus)foldStatusInfo.foldStatus;
163 foldStatusCallback_(cameraManager_, &statusInfo);
164 }
165 }
166
167 private:
168 Camera_Manager* cameraManager_;
169 OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback_ = nullptr;
170 };
171 } // namespace OHOS::CameraStandard
172
Camera_Manager()173 Camera_Manager::Camera_Manager()
174 {
175 MEDIA_DEBUG_LOG("Camera_Manager Constructor is called");
176 cameraManager_ = CameraManager::GetInstance();
177 }
178
~Camera_Manager()179 Camera_Manager::~Camera_Manager()
180 {
181 MEDIA_DEBUG_LOG("~Camera_Manager is called");
182 if (cameraManager_) {
183 cameraManager_ = nullptr;
184 }
185 }
186
RegisterCallback(CameraManager_Callbacks * cameraStatusCallback)187 Camera_ErrorCode Camera_Manager::RegisterCallback(CameraManager_Callbacks* cameraStatusCallback)
188 {
189 auto innerCallback = make_shared<InnerCameraManagerCameraStatusCallback>(this, cameraStatusCallback);
190 if (cameraStatusCallbackMap_.SetMapValue(cameraStatusCallback, innerCallback)) {
191 cameraManager_->RegisterCameraStatusCallback(innerCallback);
192 }
193 return CAMERA_OK;
194 }
195
UnregisterCallback(CameraManager_Callbacks * cameraStatusCallback)196 Camera_ErrorCode Camera_Manager::UnregisterCallback(CameraManager_Callbacks* cameraStatusCallback)
197 {
198 auto callback = cameraStatusCallbackMap_.RemoveValue(cameraStatusCallback);
199 if (callback != nullptr) {
200 cameraManager_->UnregisterCameraStatusCallback(callback);
201 }
202 return CAMERA_OK;
203 }
204
RegisterTorchStatusCallback(OH_CameraManager_TorchStatusCallback torchStatusCallback)205 Camera_ErrorCode Camera_Manager::RegisterTorchStatusCallback(OH_CameraManager_TorchStatusCallback torchStatusCallback)
206 {
207 auto innerTorchStatusCallback = make_shared<InnerCameraManagerTorchStatusCallback>(this, torchStatusCallback);
208 if (torchStatusCallbackMap_.SetMapValue(torchStatusCallback, innerTorchStatusCallback)) {
209 cameraManager_->RegisterTorchListener(innerTorchStatusCallback);
210 }
211 return CAMERA_OK;
212 }
213
UnregisterTorchStatusCallback(OH_CameraManager_TorchStatusCallback torchStatusCallback)214 Camera_ErrorCode Camera_Manager::UnregisterTorchStatusCallback(OH_CameraManager_TorchStatusCallback torchStatusCallback)
215 {
216 auto callback = torchStatusCallbackMap_.RemoveValue(torchStatusCallback);
217 if (callback != nullptr) {
218 cameraManager_->UnregisterTorchListener(callback);
219 }
220 return CAMERA_OK;
221 }
222
GetSupportedCameras(Camera_Device ** cameras,uint32_t * size)223 Camera_ErrorCode Camera_Manager::GetSupportedCameras(Camera_Device** cameras, uint32_t* size)
224 {
225 std::vector<sptr<CameraDevice>> cameraObjList = CameraManager::GetInstance()->GetSupportedCameras();
226 uint32_t cameraSize = cameraObjList.size();
227 uint32_t cameraMaxSize = 32;
228 CHECK_ERROR_RETURN_RET_LOG(cameraSize == 0 || cameraSize > cameraMaxSize, CAMERA_INVALID_ARGUMENT,
229 "Invalid camera size.");
230 Camera_Device* outCameras = new Camera_Device[cameraSize];
231 for (size_t index = 0; index < cameraSize; index++) {
232 const string cameraGetID = cameraObjList[index]->GetID();
233 size_t dstSize = cameraGetID.size() + 1;
234 char* dst = new char[dstSize];
235 if (!dst) {
236 MEDIA_ERR_LOG("Allocate memory for cameraId Failed!");
237 delete[] outCameras;
238 return CAMERA_SERVICE_FATAL_ERROR;
239 }
240 strlcpy(dst, cameraGetID.c_str(), dstSize);
241 outCameras[index].cameraId = dst;
242 outCameras[index].cameraPosition = static_cast<Camera_Position>(cameraObjList[index]->GetPosition());
243 outCameras[index].cameraType = static_cast<Camera_Type>(cameraObjList[index]->GetCameraType());
244 outCameras[index].connectionType = static_cast<Camera_Connection>(cameraObjList[index]->GetConnectionType());
245 }
246 *size = cameraSize;
247 *cameras = outCameras;
248 return CAMERA_OK;
249 }
250
DeleteSupportedCameras(Camera_Device * cameras,uint32_t size)251 Camera_ErrorCode Camera_Manager::DeleteSupportedCameras(Camera_Device* cameras, uint32_t size)
252 {
253 if (cameras != nullptr) {
254 for (size_t index = 0; index < size; index++) {
255 if (&cameras[index] != nullptr) {
256 delete[] cameras[index].cameraId;
257 }
258 }
259 delete[] cameras;
260 }
261 return CAMERA_OK;
262 }
263
GetSupportedCameraOutputCapability(const Camera_Device * camera,Camera_OutputCapability ** cameraOutputCapability)264 Camera_ErrorCode Camera_Manager::GetSupportedCameraOutputCapability(const Camera_Device* camera,
265 Camera_OutputCapability** cameraOutputCapability)
266 {
267 sptr<CameraDevice> cameraDevice = CameraManager::GetInstance()->GetCameraDeviceFromId(camera->cameraId);
268 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_INVALID_ARGUMENT,
269 "Camera_Manager::GetSupportedCameraOutputCapability get cameraDevice fail!");
270 Camera_OutputCapability* outCapability = new Camera_OutputCapability;
271 CHECK_ERROR_RETURN_RET_LOG(outCapability == nullptr, CAMERA_SERVICE_FATAL_ERROR,
272 "Camera_Manager::GetSupportedCameraOutputCapability failed to allocate memory for outCapability!");
273
274 sptr<CameraOutputCapability> innerCameraOutputCapability =
275 CameraManager::GetInstance()->GetSupportedOutputCapability(cameraDevice);
276 if (innerCameraOutputCapability == nullptr) {
277 MEDIA_ERR_LOG("Camera_Manager::GetSupportedCameraOutputCapability innerCameraOutputCapability is null!");
278 delete outCapability;
279 return CAMERA_INVALID_ARGUMENT;
280 }
281 std::vector<Profile> previewProfiles = innerCameraOutputCapability->GetPreviewProfiles();
282 std::vector<Profile> photoProfiles = innerCameraOutputCapability->GetPhotoProfiles();
283 std::vector<VideoProfile> videoProfiles = innerCameraOutputCapability->GetVideoProfiles();
284
285 std::vector<MetadataObjectType> metadataTypeList = innerCameraOutputCapability->GetSupportedMetadataObjectType();
286
287 std::vector<Profile> uniquePreviewProfiles;
288 for (const auto& profile : previewProfiles) {
289 if (std::find(uniquePreviewProfiles.begin(), uniquePreviewProfiles.end(),
290 profile) == uniquePreviewProfiles.end()) {
291 uniquePreviewProfiles.push_back(profile);
292 }
293 }
294 GetSupportedPreviewProfiles(outCapability, uniquePreviewProfiles);
295 GetSupportedPhotoProfiles(outCapability, photoProfiles);
296 GetSupportedVideoProfiles(outCapability, videoProfiles);
297 GetSupportedMetadataTypeList(outCapability, metadataTypeList);
298
299 *cameraOutputCapability = outCapability;
300 MEDIA_INFO_LOG("GetSupportedCameraOutputCapability success.");
301 return CAMERA_OK;
302 }
303
GetSupportedPreviewProfiles(Camera_OutputCapability * outCapability,std::vector<Profile> & previewProfiles)304 Camera_ErrorCode Camera_Manager::GetSupportedPreviewProfiles(Camera_OutputCapability* outCapability,
305 std::vector<Profile> &previewProfiles)
306 {
307 outCapability->previewProfilesSize = previewProfiles.size();
308 if (previewProfiles.size() == 0) {
309 MEDIA_ERR_LOG("Invalid preview profiles size.");
310 outCapability->previewProfiles = nullptr;
311 return CAMERA_INVALID_ARGUMENT;
312 }
313 outCapability->previewProfiles = new Camera_Profile* [previewProfiles.size()];
314 CHECK_ERROR_PRINT_LOG(!outCapability->previewProfiles, "Failed to allocate memory for preview profiles");
315 MEDIA_DEBUG_LOG("GetSupportedCameraOutputCapability previewOutput size enter");
316 for (size_t index = 0; index < previewProfiles.size(); index++) {
317 Camera_Profile* outPreviewProfile = new Camera_Profile;
318 CHECK_ERROR_PRINT_LOG(!outPreviewProfile, "Failed to allocate memory for PreviewProfile");
319 outPreviewProfile->format = static_cast<Camera_Format>(previewProfiles[index].GetCameraFormat());
320 outPreviewProfile->size.width = previewProfiles[index].GetSize().width;
321 outPreviewProfile->size.height = previewProfiles[index].GetSize().height;
322 outCapability->previewProfiles[index] = outPreviewProfile;
323 }
324 MEDIA_DEBUG_LOG("GetSupportedCameraOutputCapability previewOutput size exit");
325 return CAMERA_OK;
326 }
327
GetSupportedPhotoProfiles(Camera_OutputCapability * outCapability,std::vector<Profile> & photoProfiles)328 Camera_ErrorCode Camera_Manager::GetSupportedPhotoProfiles(Camera_OutputCapability* outCapability,
329 std::vector<Profile> &photoProfiles)
330 {
331 outCapability->photoProfilesSize = photoProfiles.size();
332 if (photoProfiles.size() == 0) {
333 MEDIA_ERR_LOG("Invalid photo profiles size.");
334 outCapability->photoProfiles = nullptr;
335 return CAMERA_INVALID_ARGUMENT;
336 }
337 outCapability->photoProfiles = new Camera_Profile* [photoProfiles.size()];
338 CHECK_ERROR_PRINT_LOG(!outCapability->photoProfiles, "Failed to allocate memory for photo profiles");
339 for (size_t index = 0; index < photoProfiles.size(); index++) {
340 Camera_Profile* outPhotoProfile = new Camera_Profile;
341 CHECK_ERROR_PRINT_LOG(!outPhotoProfile, "Failed to allocate memory for PhotoProfile");
342 outPhotoProfile->format = static_cast<Camera_Format>(photoProfiles[index].GetCameraFormat());
343 outPhotoProfile->size.width = photoProfiles[index].GetSize().width;
344 outPhotoProfile->size.height = photoProfiles[index].GetSize().height;
345 outCapability->photoProfiles[index] = outPhotoProfile;
346 }
347 return CAMERA_OK;
348 }
349
GetSupportedVideoProfiles(Camera_OutputCapability * outCapability,std::vector<VideoProfile> & videoProfiles)350 Camera_ErrorCode Camera_Manager::GetSupportedVideoProfiles(Camera_OutputCapability* outCapability,
351 std::vector<VideoProfile> &videoProfiles)
352 {
353 outCapability->videoProfilesSize = videoProfiles.size();
354 if (videoProfiles.size() == 0) {
355 MEDIA_ERR_LOG("Invalid video profiles size.");
356 outCapability->videoProfiles = nullptr;
357 return CAMERA_INVALID_ARGUMENT;
358 }
359 outCapability->videoProfiles = new Camera_VideoProfile* [videoProfiles.size()];
360 CHECK_ERROR_PRINT_LOG(!outCapability->videoProfiles, "Failed to allocate memory for video profiles");
361 for (size_t index = 0; index < videoProfiles.size(); index++) {
362 Camera_VideoProfile* outVideoProfile = new Camera_VideoProfile;
363 CHECK_ERROR_PRINT_LOG(!outVideoProfile, "Failed to allocate memory for VideoProfile");
364 outVideoProfile->format = static_cast<Camera_Format>(videoProfiles[index].GetCameraFormat());
365 outVideoProfile->size.width = videoProfiles[index].GetSize().width;
366 outVideoProfile->size.height = videoProfiles[index].GetSize().height;
367 outVideoProfile->range.min = static_cast<uint32_t>(videoProfiles[index].framerates_[0]);
368 outVideoProfile->range.max = static_cast<uint32_t>(videoProfiles[index].framerates_[1]);
369 outCapability->videoProfiles[index] = outVideoProfile;
370 }
371 return CAMERA_OK;
372 }
373
GetSupportedMetadataTypeList(Camera_OutputCapability * outCapability,std::vector<MetadataObjectType> & metadataTypeList)374 Camera_ErrorCode Camera_Manager::GetSupportedMetadataTypeList(Camera_OutputCapability* outCapability,
375 std::vector<MetadataObjectType> &metadataTypeList)
376 {
377 outCapability->metadataProfilesSize = metadataTypeList.size();
378 if (metadataTypeList.size() == 0) {
379 MEDIA_ERR_LOG("Invalid metadata type size.");
380 outCapability->supportedMetadataObjectTypes = nullptr;
381 return CAMERA_INVALID_ARGUMENT;
382 }
383 outCapability->supportedMetadataObjectTypes = new Camera_MetadataObjectType* [metadataTypeList.size()];
384 CHECK_ERROR_PRINT_LOG(!outCapability->supportedMetadataObjectTypes,
385 "Failed to allocate memory for supportedMetadataObjectTypes");
386 for (size_t index = 0; index < metadataTypeList.size(); index++) {
387 Camera_MetadataObjectType* outmetadataObject = new Camera_MetadataObjectType {};
388 *outmetadataObject = static_cast<Camera_MetadataObjectType>(metadataTypeList[index]);
389 outCapability->supportedMetadataObjectTypes[index] = outmetadataObject;
390 }
391 return CAMERA_OK;
392 }
393
GetSupportedCameraOutputCapabilityWithSceneMode(const Camera_Device * camera,Camera_SceneMode sceneMode,Camera_OutputCapability ** cameraOutputCapability)394 Camera_ErrorCode Camera_Manager::GetSupportedCameraOutputCapabilityWithSceneMode(const Camera_Device* camera,
395 Camera_SceneMode sceneMode, Camera_OutputCapability** cameraOutputCapability)
396 {
397 sptr<CameraDevice> cameraDevice = CameraManager::GetInstance()->GetCameraDeviceFromId(camera->cameraId);
398 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_INVALID_ARGUMENT,
399 "Camera_Manager::GetSupportedCameraOutputCapabilityWithSceneMode get cameraDevice fail!");
400
401 auto itr = g_ndkToFwMode_.find(static_cast<Camera_SceneMode>(sceneMode));
402 CHECK_ERROR_RETURN_RET_LOG(itr == g_ndkToFwMode_.end(), CAMERA_INVALID_ARGUMENT,
403 "Camera_Manager::GetSupportedCameraOutputCapabilityWithSceneMode "
404 "sceneMode = %{public}d not supported!", sceneMode);
405
406 SceneMode innerSceneMode = static_cast<SceneMode>(itr->second);
407 sptr<CameraOutputCapability> innerCameraOutputCapability =
408 CameraManager::GetInstance()->GetSupportedOutputCapability(cameraDevice, innerSceneMode);
409 CHECK_ERROR_RETURN_RET_LOG(innerCameraOutputCapability == nullptr, CAMERA_INVALID_ARGUMENT,
410 "Camera_Manager::GetSupportedCameraOutputCapabilityWithSceneMode innerCameraOutputCapability is null!");
411
412 Camera_OutputCapability* outCapability = new Camera_OutputCapability;
413 CHECK_ERROR_RETURN_RET_LOG(outCapability == nullptr, CAMERA_SERVICE_FATAL_ERROR,
414 "Camera_Manager::GetSupportedCameraOutputCapabilityWithSceneMode failed to allocate memory for outCapability!");
415 std::vector<Profile> previewProfiles = innerCameraOutputCapability->GetPreviewProfiles();
416 std::vector<Profile> uniquePreviewProfiles;
417 for (const auto& profile : previewProfiles) {
418 if (std::find(uniquePreviewProfiles.begin(), uniquePreviewProfiles.end(),
419 profile) == uniquePreviewProfiles.end()) {
420 uniquePreviewProfiles.push_back(profile);
421 }
422 }
423 std::vector<Profile> photoProfiles = innerCameraOutputCapability->GetPhotoProfiles();
424 std::vector<VideoProfile> videoProfiles = innerCameraOutputCapability->GetVideoProfiles();
425 std::vector<MetadataObjectType> metadataTypeList =
426 innerCameraOutputCapability->GetSupportedMetadataObjectType();
427 GetSupportedPreviewProfiles(outCapability, uniquePreviewProfiles);
428 GetSupportedPhotoProfiles(outCapability, photoProfiles);
429 GetSupportedVideoProfiles(outCapability, videoProfiles);
430 GetSupportedMetadataTypeList(outCapability, metadataTypeList);
431 *cameraOutputCapability = outCapability;
432 return CAMERA_OK;
433 }
434
DeleteSupportedCameraOutputCapability(Camera_OutputCapability * cameraOutputCapability)435 Camera_ErrorCode Camera_Manager::DeleteSupportedCameraOutputCapability(Camera_OutputCapability* cameraOutputCapability)
436 {
437 CHECK_ERROR_RETURN_RET_LOG(cameraOutputCapability == nullptr, CAMERA_OK,
438 "Camera_Manager::DeleteSupportedCameraOutputCapability cameraOutputCapability is nullptr");
439
440 if (cameraOutputCapability->previewProfiles != nullptr) {
441 for (size_t index = 0; index < cameraOutputCapability->previewProfilesSize; index++) {
442 if (cameraOutputCapability->previewProfiles[index] != nullptr) {
443 delete cameraOutputCapability->previewProfiles[index];
444 }
445 }
446 delete[] cameraOutputCapability->previewProfiles;
447 }
448
449 if (cameraOutputCapability->photoProfiles != nullptr) {
450 for (size_t index = 0; index < cameraOutputCapability->photoProfilesSize; index++) {
451 if (cameraOutputCapability->photoProfiles[index] != nullptr) {
452 delete cameraOutputCapability->photoProfiles[index];
453 }
454 }
455 delete[] cameraOutputCapability->photoProfiles;
456 }
457
458 if (cameraOutputCapability->videoProfiles != nullptr) {
459 for (size_t index = 0; index < cameraOutputCapability->videoProfilesSize; index++) {
460 if (cameraOutputCapability->videoProfiles[index] != nullptr) {
461 delete cameraOutputCapability->videoProfiles[index];
462 }
463 }
464 delete[] cameraOutputCapability->videoProfiles;
465 }
466
467 if (cameraOutputCapability->supportedMetadataObjectTypes != nullptr) {
468 for (size_t index = 0; index < cameraOutputCapability->metadataProfilesSize; index++) {
469 if (cameraOutputCapability->supportedMetadataObjectTypes[index] != nullptr) {
470 delete cameraOutputCapability->supportedMetadataObjectTypes[index];
471 }
472 }
473 delete[] cameraOutputCapability->supportedMetadataObjectTypes;
474 }
475 delete cameraOutputCapability;
476 return CAMERA_OK;
477 }
IsCameraMuted(bool * isCameraMuted)478 Camera_ErrorCode Camera_Manager::IsCameraMuted(bool* isCameraMuted)
479 {
480 MEDIA_ERR_LOG("Camera_Manager IsCameraMuted is called");
481 *isCameraMuted = CameraManager::GetInstance()->IsCameraMuted();
482 MEDIA_ERR_LOG("IsCameraMuted is %{public}d", *isCameraMuted);
483 return CAMERA_OK;
484 }
485
CreateCaptureSession(Camera_CaptureSession ** captureSession)486 Camera_ErrorCode Camera_Manager::CreateCaptureSession(Camera_CaptureSession** captureSession)
487 {
488 sptr<CaptureSession> innerCaptureSession = CameraManager::GetInstance()->CreateCaptureSession(SceneMode::NORMAL);
489 CHECK_ERROR_RETURN_RET_LOG(innerCaptureSession == nullptr, CAMERA_SERVICE_FATAL_ERROR,
490 "Camera_Manager::CreateCaptureSession create innerCaptureSession fail!");
491 Camera_CaptureSession* outSession = new Camera_CaptureSession(innerCaptureSession);
492 *captureSession = outSession;
493 return CAMERA_OK;
494 }
495
CreateCameraInput(const Camera_Device * camera,Camera_Input ** cameraInput)496 Camera_ErrorCode Camera_Manager::CreateCameraInput(const Camera_Device* camera, Camera_Input** cameraInput)
497 {
498 MEDIA_INFO_LOG("CameraId is: %{public}s", camera->cameraId);
499 sptr<CameraDevice> cameraDevice = CameraManager::GetInstance()->GetCameraDeviceFromId(camera->cameraId);
500 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_INVALID_ARGUMENT,
501 "Camera_Manager::CreateCameraInput get cameraDevice fail!");
502
503 sptr<CameraInput> innerCameraInput = nullptr;
504 int32_t retCode = CameraManager::GetInstance()->CreateCameraInput(cameraDevice, &innerCameraInput);
505 CHECK_ERROR_RETURN_RET(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR);
506 Camera_Input* outInput = new Camera_Input(innerCameraInput);
507 *cameraInput = outInput;
508 return CAMERA_OK;
509 }
510
CreateCameraInputWithPositionAndType(Camera_Position position,Camera_Type type,Camera_Input ** cameraInput)511 Camera_ErrorCode Camera_Manager::CreateCameraInputWithPositionAndType(Camera_Position position, Camera_Type type,
512 Camera_Input** cameraInput)
513 {
514 MEDIA_ERR_LOG("Camera_Manager CreateCameraInputWithPositionAndType is called");
515 sptr<CameraInput> innerCameraInput = nullptr;
516 CameraPosition innerPosition = CameraPosition::CAMERA_POSITION_UNSPECIFIED;
517 auto itr = g_NdkCameraPositionToFwk_.find(position);
518 if (itr != g_NdkCameraPositionToFwk_.end()) {
519 innerPosition = itr->second;
520 } else {
521 MEDIA_ERR_LOG("Camera_Manager::CreateCameraInputWithPositionAndType innerPosition not found!");
522 return CAMERA_INVALID_ARGUMENT;
523 }
524 CameraType innerType = static_cast<CameraType>(type);
525
526 innerCameraInput = CameraManager::GetInstance()->CreateCameraInput(innerPosition, innerType);
527 CHECK_ERROR_RETURN_RET_LOG(innerCameraInput == nullptr, CAMERA_SERVICE_FATAL_ERROR,
528 "Failed to CreateCameraInputWithPositionAndType");
529
530 Camera_Input* outInput = new Camera_Input(innerCameraInput);
531 *cameraInput = outInput;
532 return CAMERA_OK;
533 }
534
CreatePreviewOutput(const Camera_Profile * profile,const char * surfaceId,Camera_PreviewOutput ** previewOutput)535 Camera_ErrorCode Camera_Manager::CreatePreviewOutput(const Camera_Profile* profile,
536 const char* surfaceId, Camera_PreviewOutput** previewOutput)
537 {
538 sptr<PreviewOutput> innerPreviewOutput = nullptr;
539 Size size;
540 size.width = profile->size.width;
541 size.height = profile->size.height;
542 Profile innerProfile(static_cast<CameraFormat>(profile->format), size);
543
544 uint64_t iSurfaceId;
545 std::istringstream iss(surfaceId);
546 iss >> iSurfaceId;
547 sptr<Surface> surface = SurfaceUtils::GetInstance()->GetSurface(iSurfaceId);
548 if (!surface) {
549 surface = Media::ImageReceiver::getSurfaceById(surfaceId);
550 }
551 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT, "Failed to get previewOutput surface");
552
553 surface->SetUserData(CameraManager::surfaceFormat, std::to_string(innerProfile.GetCameraFormat()));
554 int32_t retCode = CameraManager::GetInstance()->CreatePreviewOutput(innerProfile, surface, &innerPreviewOutput);
555 CHECK_ERROR_RETURN_RET(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR);
556 Camera_PreviewOutput* out = new Camera_PreviewOutput(innerPreviewOutput);
557 *previewOutput = out;
558 MEDIA_ERR_LOG("Camera_Manager::CreatePreviewOutput");
559 return CAMERA_OK;
560 }
561
CreatePreviewOutputUsedInPreconfig(const char * surfaceId,Camera_PreviewOutput ** previewOutput)562 Camera_ErrorCode Camera_Manager::CreatePreviewOutputUsedInPreconfig(const char* surfaceId,
563 Camera_PreviewOutput** previewOutput)
564 {
565 sptr<PreviewOutput> innerPreviewOutput = nullptr;
566 uint64_t iSurfaceId;
567 std::istringstream iss(surfaceId);
568 iss >> iSurfaceId;
569 sptr<Surface> surface = SurfaceUtils::GetInstance()->GetSurface(iSurfaceId);
570 if (!surface) {
571 surface = Media::ImageReceiver::getSurfaceById(surfaceId);
572 }
573 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT,
574 "Camera_Manager::CreatePreviewOutputUsedInPreconfig get previewOutput surface fail!");
575 int32_t retCode = CameraManager::GetInstance()->CreatePreviewOutputWithoutProfile(surface, &innerPreviewOutput);
576 CHECK_ERROR_RETURN_RET_LOG(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR,
577 "Camera_Manager::CreatePreviewOutputUsedInPreconfig create innerPreviewOutput fail!");
578 CHECK_ERROR_RETURN_RET_LOG(innerPreviewOutput == nullptr, CAMERA_SERVICE_FATAL_ERROR,
579 "Camera_Manager::CreatePreviewOutputUsedInPreconfig create innerPreviewOutput fail!");
580 Camera_PreviewOutput* out = new Camera_PreviewOutput(innerPreviewOutput);
581 *previewOutput = out;
582 return CAMERA_OK;
583 }
584
CreatePhotoOutput(const Camera_Profile * profile,const char * surfaceId,Camera_PhotoOutput ** photoOutput)585 Camera_ErrorCode Camera_Manager::CreatePhotoOutput(const Camera_Profile* profile,
586 const char* surfaceId, Camera_PhotoOutput** photoOutput)
587 {
588 MEDIA_ERR_LOG("Camera_Manager CreatePhotoOutput is called");
589 sptr<PhotoOutput> innerPhotoOutput = nullptr;
590 Size size;
591 size.width = profile->size.width;
592 size.height = profile->size.height;
593 Profile innerProfile(static_cast<CameraFormat>(profile->format), size);
594
595 sptr<Surface> surface = Media::ImageReceiver::getSurfaceById(surfaceId);
596 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT, "Failed to get photoOutput surface");
597
598 surface->SetUserData(CameraManager::surfaceFormat, std::to_string(innerProfile.GetCameraFormat()));
599 sptr<IBufferProducer> surfaceProducer = surface->GetProducer();
600 int32_t retCode =
601 CameraManager::GetInstance()->CreatePhotoOutput(innerProfile, surfaceProducer, &innerPhotoOutput, surface);
602 CHECK_ERROR_RETURN_RET(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR);
603 Camera_PhotoOutput* out = new Camera_PhotoOutput(innerPhotoOutput);
604 *photoOutput = out;
605 return CAMERA_OK;
606 }
607
CreatePhotoOutputWithoutSurface(const Camera_Profile * profile,Camera_PhotoOutput ** photoOutput)608 Camera_ErrorCode Camera_Manager::CreatePhotoOutputWithoutSurface(const Camera_Profile* profile,
609 Camera_PhotoOutput** photoOutput)
610 {
611 MEDIA_ERR_LOG("Camera_Manager CreatePhotoOutputWithoutSurface is called");
612 sptr<PhotoOutput> innerPhotoOutput = nullptr;
613 Size size;
614 size.width = profile->size.width;
615 size.height = profile->size.height;
616 Profile innerProfile(static_cast<CameraFormat>(profile->format), size);
617
618 sptr<Surface> surface = Surface::CreateSurfaceAsConsumer(DEFAULT_SURFACEID);
619 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT,
620 "Failed to get photoOutput surface");
621
622 photoSurface_ = surface;
623 surface->SetUserData(CameraManager::surfaceFormat, std::to_string(innerProfile.GetCameraFormat()));
624 sptr<IBufferProducer> surfaceProducer = surface->GetProducer();
625 CHECK_ERROR_RETURN_RET_LOG(surfaceProducer == nullptr, CAMERA_SERVICE_FATAL_ERROR, "Get producer failed");
626
627 int32_t retCode = CameraManager::GetInstance()->CreatePhotoOutput(innerProfile,
628 surfaceProducer, &innerPhotoOutput, surface);
629 CHECK_ERROR_RETURN_RET_LOG((retCode != CameraErrorCode::SUCCESS || innerPhotoOutput == nullptr),
630 CAMERA_SERVICE_FATAL_ERROR, "Create photo output failed");
631
632 innerPhotoOutput->SetNativeSurface(true);
633 Camera_PhotoOutput* out = new Camera_PhotoOutput(innerPhotoOutput);
634 CHECK_ERROR_RETURN_RET_LOG(out == nullptr, CAMERA_SERVICE_FATAL_ERROR, "Create Camera_PhotoOutput failed");
635 out->SetPhotoSurface(surface);
636 *photoOutput = out;
637 return CAMERA_OK;
638 }
639
CreatePhotoOutputUsedInPreconfig(const char * surfaceId,Camera_PhotoOutput ** photoOutput)640 Camera_ErrorCode Camera_Manager::CreatePhotoOutputUsedInPreconfig(const char* surfaceId,
641 Camera_PhotoOutput** photoOutput)
642 {
643 sptr<PhotoOutput> innerPhotoOutput = nullptr;
644 sptr<Surface> surface = nullptr;
645 if (strcmp(surfaceId, "")) {
646 surface = Media::ImageReceiver::getSurfaceById(surfaceId);
647 } else {
648 surface = Surface::CreateSurfaceAsConsumer("photoOutput");
649 }
650 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT,
651 "Camera_Manager::CreatePhotoOutputUsedInPreconfig get photoOutput surface fail!");
652 sptr<IBufferProducer> surfaceProducer = surface->GetProducer();
653 CHECK_ERROR_RETURN_RET_LOG(surfaceProducer == nullptr, CAMERA_INVALID_ARGUMENT,
654 "Camera_Manager::CreatePhotoOutputUsedInPreconfig get surfaceProducer fail!");
655 int32_t retCode =
656 CameraManager::GetInstance()->CreatePhotoOutputWithoutProfile(surfaceProducer, &innerPhotoOutput, surface);
657 CHECK_ERROR_RETURN_RET_LOG(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR,
658 "Camera_Manager::CreatePhotoOutputUsedInPreconfig create innerPhotoOutput fail!");
659 CHECK_ERROR_RETURN_RET_LOG(innerPhotoOutput == nullptr, CAMERA_SERVICE_FATAL_ERROR,
660 "Camera_Manager::CreatePhotoOutputUsedInPreconfig create innerPhotoOutput fail!");
661 Camera_PhotoOutput* out = new Camera_PhotoOutput(innerPhotoOutput);
662 *photoOutput = out;
663 return CAMERA_OK;
664 }
665
CreateVideoOutput(const Camera_VideoProfile * profile,const char * surfaceId,Camera_VideoOutput ** videoOutput)666 Camera_ErrorCode Camera_Manager::CreateVideoOutput(const Camera_VideoProfile* profile,
667 const char* surfaceId, Camera_VideoOutput** videoOutput)
668 {
669 sptr<VideoOutput> innerVideoOutput = nullptr;
670 Size size;
671 size.width = profile->size.width;
672 size.height = profile->size.height;
673 std::vector<int32_t> framerates = {profile->range.min, profile->range.max};
674 VideoProfile innerProfile(static_cast<CameraFormat>(profile->format), size, framerates);
675
676 uint64_t iSurfaceId;
677 std::istringstream iss(surfaceId);
678 iss >> iSurfaceId;
679 sptr<Surface> surface = SurfaceUtils::GetInstance()->GetSurface(iSurfaceId);
680 if (!surface) {
681 surface = Media::ImageReceiver::getSurfaceById(surfaceId);
682 }
683 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT, "Failed to get videoOutput surface");
684
685 surface->SetUserData(CameraManager::surfaceFormat, std::to_string(innerProfile.GetCameraFormat()));
686 int32_t retCode = CameraManager::GetInstance()->CreateVideoOutput(innerProfile, surface, &innerVideoOutput);
687 CHECK_ERROR_RETURN_RET(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR);
688 Camera_VideoOutput* out = new Camera_VideoOutput(innerVideoOutput);
689 *videoOutput = out;
690 return CAMERA_OK;
691 }
692
CreateVideoOutputUsedInPreconfig(const char * surfaceId,Camera_VideoOutput ** videoOutput)693 Camera_ErrorCode Camera_Manager::CreateVideoOutputUsedInPreconfig(const char* surfaceId,
694 Camera_VideoOutput** videoOutput)
695 {
696 sptr<VideoOutput> innerVideoOutput = nullptr;
697 uint64_t iSurfaceId;
698 std::istringstream iss(surfaceId);
699 iss >> iSurfaceId;
700 sptr<Surface> surface = SurfaceUtils::GetInstance()->GetSurface(iSurfaceId);
701 CHECK_ERROR_RETURN_RET_LOG(surface == nullptr, CAMERA_INVALID_ARGUMENT,
702 "Camera_Manager::CreateVideoOutputUsedInPreconfig get videoOutput surface fail!");
703 int32_t retCode = CameraManager::GetInstance()->CreateVideoOutputWithoutProfile(surface, &innerVideoOutput);
704 CHECK_ERROR_RETURN_RET_LOG(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR,
705 "Camera_Manager::CreateVideoOutputUsedInPreconfig create innerVideoOutput fail!");
706 CHECK_ERROR_RETURN_RET_LOG(innerVideoOutput == nullptr, CAMERA_SERVICE_FATAL_ERROR,
707 "Camera_Manager::CreateVideoOutputUsedInPreconfig create innerVideoOutput fail!");
708 Camera_VideoOutput* out = new Camera_VideoOutput(innerVideoOutput);
709 *videoOutput = out;
710 return CAMERA_OK;
711 }
712
CreateMetadataOutput(const Camera_MetadataObjectType * type,Camera_MetadataOutput ** metadataOutput)713 Camera_ErrorCode Camera_Manager::CreateMetadataOutput(const Camera_MetadataObjectType* type,
714 Camera_MetadataOutput** metadataOutput)
715 {
716 MEDIA_ERR_LOG("Camera_Manager CreateMetadataOutput is called");
717 sptr<MetadataOutput> innerMetadataOutput = nullptr;
718 vector<MetadataObjectType> metadataObjectTypes = { MetadataObjectType::FACE };
719 int32_t retCode = CameraManager::GetInstance()->CreateMetadataOutput(innerMetadataOutput, metadataObjectTypes);
720 CHECK_ERROR_RETURN_RET(retCode != CameraErrorCode::SUCCESS, CAMERA_SERVICE_FATAL_ERROR);
721 Camera_MetadataOutput* out = new Camera_MetadataOutput(innerMetadataOutput);
722 *metadataOutput = out;
723 return CAMERA_OK;
724 }
725
GetCameraOrientation(Camera_Device * camera,uint32_t * orientation)726 Camera_ErrorCode Camera_Manager::GetCameraOrientation(Camera_Device* camera, uint32_t* orientation)
727 {
728 sptr<CameraDevice> cameraDevice = nullptr;
729 std::vector<sptr<CameraDevice>> cameraObjList = CameraManager::GetInstance()->GetSupportedCameras();
730 MEDIA_DEBUG_LOG("the cameraObjList size is %{public}zu",
731 cameraObjList.size());
732 for (size_t index = 0; index < cameraObjList.size(); index++) {
733 sptr<CameraDevice> innerCameraDevice = cameraObjList[index];
734 if (innerCameraDevice == nullptr) {
735 continue;
736 }
737 if (innerCameraDevice->GetID() == camera->cameraId) {
738 cameraDevice = innerCameraDevice;
739 break;
740 }
741 }
742
743 if (cameraDevice == nullptr) {
744 return CAMERA_SERVICE_FATAL_ERROR;
745 } else {
746 *orientation = cameraDevice->GetCameraOrientation();
747 return CAMERA_OK;
748 }
749 }
750
GetHostDeviceName(Camera_Device * camera,char ** hostDeviceName)751 Camera_ErrorCode Camera_Manager::GetHostDeviceName(Camera_Device* camera, char** hostDeviceName)
752 {
753 CameraDevice* device = nullptr;
754 auto cameras = CameraManager::GetInstance()->GetSupportedCameras();
755 MEDIA_DEBUG_LOG("the cameraObjList size is %{public}zu", cameras.size());
756 for (auto& innerCamera : cameras) {
757 if (innerCamera->GetID() == std::string(camera->cameraId)) {
758 device = innerCamera;
759 break;
760 }
761 }
762
763 if (device == nullptr) {
764 return CAMERA_SERVICE_FATAL_ERROR;
765 } else {
766 std::string deviceName = device->GetHostName();
767 *hostDeviceName = (char*)malloc(deviceName.size() + 1);
768 if (memcpy_s(*hostDeviceName, deviceName.size() + 1, deviceName.c_str(), deviceName.size()) != EOK) {
769 free(*hostDeviceName);
770 *hostDeviceName = nullptr;
771 return CAMERA_SERVICE_FATAL_ERROR;
772 }
773 (*hostDeviceName)[deviceName.size()] = '\0';
774 return CAMERA_OK;
775 }
776 }
777
GetHostDeviceType(Camera_Device * camera,Camera_HostDeviceType * hostDeviceType)778 Camera_ErrorCode Camera_Manager::GetHostDeviceType(Camera_Device* camera, Camera_HostDeviceType* hostDeviceType)
779 {
780 CameraDevice* device = nullptr;
781 auto cameras = CameraManager::GetInstance()->GetSupportedCameras();
782 MEDIA_DEBUG_LOG("the cameraObjList size is %{public}zu", cameras.size());
783 for (auto& innerCamera : cameras) {
784 if (innerCamera->GetID() == std::string(camera->cameraId)) {
785 device = innerCamera;
786 break;
787 }
788 }
789
790 if (device == nullptr) {
791 return CAMERA_SERVICE_FATAL_ERROR;
792 } else {
793 switch (device->GetDeviceType()) {
794 case Camera_HostDeviceType::HOST_DEVICE_TYPE_PHONE:
795 *hostDeviceType = Camera_HostDeviceType::HOST_DEVICE_TYPE_PHONE;
796 break;
797 case Camera_HostDeviceType::HOST_DEVICE_TYPE_TABLET:
798 *hostDeviceType = Camera_HostDeviceType::HOST_DEVICE_TYPE_TABLET;
799 break;
800 default:
801 *hostDeviceType = Camera_HostDeviceType::HOST_DEVICE_TYPE_UNKNOWN_TYPE;
802 break;
803 }
804 return CAMERA_OK;
805 }
806 }
807
GetSupportedSceneModes(Camera_Device * camera,Camera_SceneMode ** sceneModes,uint32_t * size)808 Camera_ErrorCode Camera_Manager::GetSupportedSceneModes(Camera_Device* camera,
809 Camera_SceneMode** sceneModes, uint32_t* size)
810 {
811 sptr<CameraDevice> cameraDevice = CameraManager::GetInstance()->GetCameraDeviceFromId(camera->cameraId);
812 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_INVALID_ARGUMENT,
813 "Camera_Manager::GetSupportedSceneModes get cameraDevice fail!");
814
815 std::vector<SceneMode> innerSceneMode = CameraManager::GetInstance()->GetSupportedModes(cameraDevice);
816 for (auto it = innerSceneMode.begin(); it != innerSceneMode.end(); it++) {
817 if (*it == SCAN) {
818 innerSceneMode.erase(it);
819 break;
820 }
821 }
822 if (innerSceneMode.empty()) {
823 innerSceneMode.emplace_back(CAPTURE);
824 innerSceneMode.emplace_back(VIDEO);
825 }
826 MEDIA_INFO_LOG("Camera_Manager::GetSupportedSceneModes size = [%{public}zu]", innerSceneMode.size());
827
828 std::vector<Camera_SceneMode> cameraSceneMode;
829 for (size_t index = 0; index < innerSceneMode.size(); index++) {
830 auto itr = g_fwModeToNdk_.find(static_cast<SceneMode>(innerSceneMode[index]));
831 CHECK_EXECUTE(itr != g_fwModeToNdk_.end(),
832 cameraSceneMode.push_back(static_cast<Camera_SceneMode>(itr->second)));
833 }
834
835 Camera_SceneMode* sceneMode = new Camera_SceneMode[cameraSceneMode.size()];
836 CHECK_ERROR_RETURN_RET_LOG(sceneMode == nullptr, CAMERA_SERVICE_FATAL_ERROR,
837 "Camera_Manager::GetSupportedSceneModes allocate memory for sceneMode fail!");
838 for (size_t index = 0; index < cameraSceneMode.size(); index++) {
839 sceneMode[index] = cameraSceneMode[index];
840 }
841
842 *sceneModes = sceneMode;
843 *size = cameraSceneMode.size();
844 return CAMERA_OK;
845 }
846
DeleteSceneModes(Camera_SceneMode * sceneModes)847 Camera_ErrorCode Camera_Manager::DeleteSceneModes(Camera_SceneMode* sceneModes)
848 {
849 if (sceneModes != nullptr) {
850 delete[] sceneModes;
851 }
852
853 return CAMERA_OK;
854 }
855
IsTorchSupported(bool * isTorchSupported)856 Camera_ErrorCode Camera_Manager::IsTorchSupported(bool* isTorchSupported)
857 {
858 MEDIA_DEBUG_LOG("Camera_Manager::IsTorchSupported is called");
859
860 *isTorchSupported = CameraManager::GetInstance()->IsTorchSupported();
861 MEDIA_DEBUG_LOG("IsTorchSupported[%{public}d]", *isTorchSupported);
862 return CAMERA_OK;
863 }
864
IsTorchSupportedByTorchMode(Camera_TorchMode torchMode,bool * isTorchSupported)865 Camera_ErrorCode Camera_Manager::IsTorchSupportedByTorchMode(Camera_TorchMode torchMode, bool* isTorchSupported)
866 {
867 MEDIA_DEBUG_LOG("Camera_Manager::IsTorchSupportedByTorchMode is called");
868
869 auto itr = g_ndkToFwTorchMode_.find(torchMode);
870 CHECK_ERROR_RETURN_RET_LOG(itr == g_ndkToFwTorchMode_.end(), CAMERA_INVALID_ARGUMENT,
871 "torchMode[%{public}d] is invalid", torchMode);
872 *isTorchSupported = CameraManager::GetInstance()->IsTorchModeSupported(itr->second);
873 MEDIA_DEBUG_LOG("IsTorchSupportedByTorchMode[%{public}d]", *isTorchSupported);
874 return CAMERA_OK;
875 }
876
SetTorchMode(Camera_TorchMode torchMode)877 Camera_ErrorCode Camera_Manager::SetTorchMode(Camera_TorchMode torchMode)
878 {
879 MEDIA_DEBUG_LOG("Camera_Manager::SetTorchMode is called");
880
881 auto itr = g_ndkToFwTorchMode_.find(torchMode);
882 CHECK_ERROR_RETURN_RET_LOG(itr == g_ndkToFwTorchMode_.end(), CAMERA_INVALID_ARGUMENT,
883 "torchMode[%{public}d] is invalid", torchMode);
884 int32_t ret = CameraManager::GetInstance()->SetTorchMode(itr->second);
885 return FrameworkToNdkCameraError(ret);
886 }
887
GetCameraDevice(Camera_Position position,Camera_Type type,Camera_Device * camera)888 Camera_ErrorCode Camera_Manager::GetCameraDevice(Camera_Position position, Camera_Type type, Camera_Device *camera)
889 {
890 MEDIA_DEBUG_LOG("Camera_Manager::GetCameraDevice is called");
891
892 Camera_Device* outCameras = new Camera_Device;
893 CameraPosition innerPosition = CameraPosition::CAMERA_POSITION_UNSPECIFIED;
894 auto itr = g_NdkCameraPositionToFwk_.find(position);
895 if (itr != g_NdkCameraPositionToFwk_.end()) {
896 innerPosition = itr->second;
897 } else {
898 MEDIA_ERR_LOG("Camera_Manager::CreateCameraInputWithPositionAndType innerPosition not found!");
899 return CAMERA_INVALID_ARGUMENT;
900 }
901
902 CameraType innerType = static_cast<CameraType>(type);
903
904 sptr<CameraDevice> cameraInfo = nullptr;
905 std::vector<sptr<CameraDevice>> cameraObjList = CameraManager::GetInstance()->GetSupportedCameras();
906 CHECK_ERROR_RETURN_RET_LOG(cameraObjList.size() == 0, CAMERA_SERVICE_FATAL_ERROR,
907 "Camera_Manager::GetSupportedCameras fail!");
908 for (size_t i = 0; i < cameraObjList.size(); i++) {
909 sptr<CameraDevice> cameraDevice = cameraObjList[i];
910 if (cameraDevice == nullptr) {
911 continue;
912 }
913 if (cameraDevice->GetPosition() == innerPosition &&
914 cameraDevice->GetCameraType() == innerType) {
915 cameraInfo = cameraDevice;
916 break;
917 }
918 }
919
920 if (cameraInfo == nullptr) {
921 MEDIA_ERR_LOG("Camera_Manager::GetCameraDevice cameraInfo is null!");
922 return CAMERA_SERVICE_FATAL_ERROR;
923 }
924 outCameras->cameraId = cameraInfo->GetID().data();
925 outCameras->cameraPosition = position;
926 outCameras->cameraType = type;
927 outCameras->connectionType = static_cast<Camera_Connection>(cameraInfo->GetConnectionType());
928 camera = outCameras;
929
930 return CAMERA_OK;
931 }
932
GetCameraConcurrentInfos(const Camera_Device * camera,uint32_t deviceSize,Camera_ConcurrentInfo ** CameraConcurrentInfo,uint32_t * infoSize)933 Camera_ErrorCode Camera_Manager::GetCameraConcurrentInfos(const Camera_Device *camera, uint32_t deviceSize,
934 Camera_ConcurrentInfo **CameraConcurrentInfo, uint32_t *infoSize)
935 {
936 MEDIA_DEBUG_LOG("Camera_Manager::GetCameraConcurrentInfos is called");
937 std::vector<string>cameraIdv = {};
938 std::vector<bool> cameraConcurrentType = {};
939 std::vector<std::vector<SceneMode>> modes = {};
940 std::vector<std::vector<sptr<CameraOutputCapability>>> outputCapabilities = {};
941 vector<sptr<CameraDevice>> cameraDeviceArrray = {};
942 for (uint32_t i = 0; i < deviceSize; i++) {
943 string str(camera[i].cameraId);
944 cameraIdv.push_back(str);
945 }
946 for (auto cameraidonly : cameraIdv) {
947 cameraDeviceArrray.push_back(CameraManager::GetInstance()->GetCameraDeviceFromId(cameraidonly));
948 }
949 bool issupported = CameraManager::GetInstance()->GetConcurrentType(cameraDeviceArrray, cameraConcurrentType);
950 CHECK_ERROR_RETURN_RET_LOG(!issupported, CAMERA_SERVICE_FATAL_ERROR, "CamagerManager::GetConcurrentType() error");
951 issupported = CameraManager::GetInstance()->CheckConcurrentExecution(cameraDeviceArrray);
952 CHECK_ERROR_RETURN_RET_LOG(!issupported, CAMERA_SERVICE_FATAL_ERROR, "CamagerManager::CheckConcurrentExe error");
953 CameraManager::GetInstance()->GetCameraConcurrentInfos(cameraDeviceArrray,
954 cameraConcurrentType, modes, outputCapabilities);
955 Camera_ConcurrentInfo *CameraConcurrentInfothis = new Camera_ConcurrentInfo[deviceSize];
956 SetCameraConcurrentInfothis(camera, deviceSize, CameraConcurrentInfothis, cameraConcurrentType, modes,
957 outputCapabilities);
958 *CameraConcurrentInfo = CameraConcurrentInfothis;
959 *infoSize = deviceSize;
960 return CAMERA_OK;
961 }
962
SetCameraConcurrentInfothis(const Camera_Device * camera,uint32_t deviceSize,Camera_ConcurrentInfo * CameraConcurrentInfothis,std::vector<bool> & cameraConcurrentType,std::vector<std::vector<OHOS::CameraStandard::SceneMode>> & modes,std::vector<std::vector<OHOS::sptr<OHOS::CameraStandard::CameraOutputCapability>>> & outputCapabilities)963 Camera_ErrorCode Camera_Manager::SetCameraConcurrentInfothis(const Camera_Device *camera, uint32_t deviceSize,
964 Camera_ConcurrentInfo *CameraConcurrentInfothis,
965 std::vector<bool> &cameraConcurrentType, std::vector<std::vector<OHOS::CameraStandard::SceneMode>> &modes,
966 std::vector<std::vector<OHOS::sptr<OHOS::CameraStandard::CameraOutputCapability>>> &outputCapabilities)
967 {
968 for (int i = 0; i < deviceSize; i++) {
969 CameraConcurrentInfothis[i].camera = camera[i];
970 if (cameraConcurrentType[i] == false) {
971 CameraConcurrentInfothis[i].type = CONCURRENT_TYPE_LIMITED_CAPABILITY;
972 } else {
973 CameraConcurrentInfothis[i].type = CONCURRENT_TYPE_FULL_CAPABILITY;
974 }
975 Camera_SceneMode* newmodes = new Camera_SceneMode[modes.size()];
976 for (uint32_t j = 0; j < modes[i].size(); j++) {
977 auto itr = g_fwModeToNdk_.find(modes[i][j]);
978 newmodes[j] = itr->second;
979 }
980 CameraConcurrentInfothis[i].sceneModes = newmodes;
981 CameraConcurrentInfothis[i].modeAndCapabilitySize = outputCapabilities[i].size();
982 Camera_OutputCapability* newOutputCapability = new Camera_OutputCapability[outputCapabilities[i].size()];
983 for (uint32_t j = 0; j < outputCapabilities[i].size(); j++) {
984 std::vector<Profile> previewProfiles = outputCapabilities[i][j]->GetPreviewProfiles();
985 std::vector<Profile> photoProfiles = outputCapabilities[i][j]->GetPhotoProfiles();
986 std::vector<VideoProfile> videoProfiles = outputCapabilities[i][j]->GetVideoProfiles();
987 std::vector<MetadataObjectType> metadataTypeList =
988 outputCapabilities[i][j]->GetSupportedMetadataObjectType();
989 std::vector<Profile> uniquePreviewProfiles;
990 for (const auto& profile : previewProfiles) {
991 if (std::find(uniquePreviewProfiles.begin(), uniquePreviewProfiles.end(),
992 profile) == uniquePreviewProfiles.end()) {
993 uniquePreviewProfiles.push_back(profile);
994 }
995 }
996 GetSupportedPreviewProfiles(&newOutputCapability[j], uniquePreviewProfiles);
997 GetSupportedPhotoProfiles(&newOutputCapability[j], photoProfiles);
998 GetSupportedVideoProfiles(&newOutputCapability[j], videoProfiles);
999 GetSupportedMetadataTypeList(&newOutputCapability[j], metadataTypeList);
1000 }
1001 CameraConcurrentInfothis[i].outputCapabilities = newOutputCapability;
1002 }
1003 return CAMERA_OK;
1004 }
1005
RegisterFoldStatusCallback(OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)1006 Camera_ErrorCode Camera_Manager::RegisterFoldStatusCallback(OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)
1007 {
1008 auto innerFoldStatusCallback = make_shared<InnerCameraManagerFoldStatusCallback>(this, foldStatusCallback);
1009 CHECK_ERROR_RETURN_RET_LOG(
1010 innerFoldStatusCallback == nullptr, CAMERA_SERVICE_FATAL_ERROR, "create innerFoldStatusCallback failed!");
1011 if (cameraFoldStatusCallbackMap_.SetMapValue(foldStatusCallback, innerFoldStatusCallback)) {
1012 cameraManager_->RegisterFoldListener(innerFoldStatusCallback);
1013 }
1014 return CAMERA_OK;
1015 }
1016
UnregisterFoldStatusCallback(OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)1017 Camera_ErrorCode Camera_Manager::UnregisterFoldStatusCallback(
1018 OH_CameraManager_OnFoldStatusInfoChange foldStatusCallback)
1019 {
1020 auto callback = cameraFoldStatusCallbackMap_.RemoveValue(foldStatusCallback);
1021 if (callback != nullptr) {
1022 cameraManager_->UnregisterFoldListener(callback);
1023 }
1024 return CAMERA_OK;
1025 }