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