• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "hcamera_host_manager.h"
17 
18 #include "camera_report_uitls.h"
19 #include "camera_util.h"
20 #include "display_manager.h"
21 #include "hcamera_device.h"
22 #include "icamera_service_callback.h"
23 #include "ipc_skeleton.h"
24 #include "iproxy_broker.h"
25 #include "metadata_utils.h"
26 #include "os_account_manager.h"
27 #include "v1_2/icamera_host_callback.h"
28 #include <cstddef>
29 #include <cstdint>
30 #include <iterator>
31 
32 namespace OHOS {
33 namespace CameraStandard {
34 
35 const std::string HCameraHostManager::LOCAL_SERVICE_NAME = "camera_service";
36 const std::string HCameraHostManager::DISTRIBUTED_SERVICE_NAME = "distributed_camera_provider_service";
37 constexpr uint32_t MILLISEC_TIME = 1000;
38 
39 using namespace OHOS::HDI::Camera::V1_0;
40 struct HCameraHostManager::CameraDeviceInfo {
41     std::string cameraId;
42     std::shared_ptr<OHOS::Camera::CameraMetadata> ability;
43     std::mutex mutex;
44 
CameraDeviceInfoOHOS::CameraStandard::HCameraHostManager::CameraDeviceInfo45     explicit CameraDeviceInfo(const std::string& cameraId, sptr<ICameraDevice> device = nullptr)
46         : cameraId(cameraId), ability(nullptr)
47     {
48     }
49 
50     ~CameraDeviceInfo() = default;
51 };
52 
53 class HCameraHostManager::CameraHostInfo : public OHOS::HDI::Camera::V1_2::ICameraHostCallback {
54 public:
55     class CameraHostDeathRecipient : public IRemoteObject::DeathRecipient {
56     public:
CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> & hostInfo)57         explicit CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> &hostInfo)
58             : cameraHostInfo_(hostInfo)
59         {
60         }
61         virtual ~CameraHostDeathRecipient() = default;
OnRemoteDied(const wptr<IRemoteObject> & remote)62         void OnRemoteDied(const wptr<IRemoteObject> &remote) override
63         {
64             MEDIA_ERR_LOG("Remote died, do clean works.");
65             auto cameraHostInfo = cameraHostInfo_.promote();
66             CHECK_ERROR_RETURN(cameraHostInfo == nullptr);
67             cameraHostInfo->NotifyCameraHostDied();
68             cameraHostInfo->CameraHostDied();
69         }
70 
71     private:
72         wptr<HCameraHostManager::CameraHostInfo> cameraHostInfo_;
73     };
74 
CameraHostInfo(std::shared_ptr<StatusCallback> statusCallback,std::shared_ptr<CameraHostDeadCallback> cameraHostDeadCallback,std::string name)75     explicit CameraHostInfo(std::shared_ptr<StatusCallback> statusCallback,
76         std::shared_ptr<CameraHostDeadCallback> cameraHostDeadCallback, std::string name)
77         : statusCallback_(statusCallback), cameraHostDeadCallback_(cameraHostDeadCallback), name_(std::move(name)),
78           majorVer_(0), minorVer_(0), cameraHostProxy_(nullptr) {};
79     ~CameraHostInfo();
80     bool Init();
81     void CameraHostDied();
82     bool IsCameraSupported(const std::string& cameraId);
83     const std::string& GetName();
84     int32_t GetCameraHostVersion();
85     int32_t GetCameras(std::vector<std::string>& cameraIds);
86     int32_t GetCameraAbility(std::string& cameraId, std::shared_ptr<OHOS::Camera::CameraMetadata>& ability);
87     int32_t OpenCamera(std::string& cameraId, const sptr<ICameraDeviceCallback>& callback,
88                        sptr<OHOS::HDI::Camera::V1_0::ICameraDevice>& pDevice, bool isEnableSecCam = false);
89     int32_t SetFlashlight(const std::string& cameraId, bool isEnable);
90     int32_t SetTorchLevel(float level);
91     int32_t Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam, bool muteMode);
92     int32_t PreCameraSwitch(const std::string& cameraId);
93     bool IsNeedRestore(int32_t opMode,
94         std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings, std::string& cameraId);
95     void NotifyDeviceStateChangeInfo(int notifyType, int deviceState);
96     bool CheckUserHasChanged(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings);
97 
98     int32_t GetCameraResourceCost(const std::string& cameraId,
99         OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost);
100 
101     // CameraHostCallbackStub
102     int32_t OnCameraStatus(const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status) override;
103     int32_t OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status) override;
104     int32_t OnFlashlightStatus_V1_2(FlashlightStatus status) override;
105     int32_t OnCameraEvent(const std::string &cameraId, CameraEvent event) override;
106 
107 private:
108     std::shared_ptr<CameraDeviceInfo> FindCameraDeviceInfo(const std::string& cameraId);
109     void NotifyCameraHostDied();
110     void AddDevice(const std::string& cameraId);
111     void RemoveDevice(const std::string& cameraId);
112     void Cast2MultiVersionCameraHost();
113     void UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting);
114 
115     std::weak_ptr<StatusCallback> statusCallback_;
116     std::weak_ptr<CameraHostDeadCallback> cameraHostDeadCallback_;
117     std::string name_;
118     uint32_t majorVer_;
119     uint32_t minorVer_;
120     sptr<OHOS::HDI::Camera::V1_0::ICameraHost> cameraHostProxy_;
121     sptr<OHOS::HDI::Camera::V1_1::ICameraHost> cameraHostProxyV1_1_;
122     sptr<OHOS::HDI::Camera::V1_2::ICameraHost> cameraHostProxyV1_2_;
123     sptr<OHOS::HDI::Camera::V1_3::ICameraHost> cameraHostProxyV1_3_;
124 
125     sptr<CameraHostDeathRecipient> cameraHostDeathRecipient_ = nullptr;
126 
127     std::mutex mutex_;
128     std::vector<std::string> cameraIds_;
129     std::vector<std::shared_ptr<CameraDeviceInfo>> devices_;
130 };
131 
~CameraHostInfo()132 HCameraHostManager::CameraHostInfo::~CameraHostInfo()
133 {
134     std::lock_guard<std::mutex> lock(mutex_);
135     MEDIA_INFO_LOG("CameraHostInfo ~CameraHostInfo");
136     if (cameraHostProxy_ && cameraHostDeathRecipient_) {
137         const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<ICameraHost>(cameraHostProxy_);
138         remote->RemoveDeathRecipient(cameraHostDeathRecipient_);
139         cameraHostDeathRecipient_ = nullptr;
140     }
141     cameraHostProxy_ = nullptr;
142     cameraHostProxyV1_1_ = nullptr;
143     cameraHostProxyV1_2_ = nullptr;
144     cameraHostProxyV1_3_ = nullptr;
145     for (unsigned i = 0; i < devices_.size(); i++) {
146         devices_.at(i) = nullptr;
147     }
148     cameraIds_.clear();
149     devices_.clear();
150 }
151 
Cast2MultiVersionCameraHost()152 void HCameraHostManager::CameraHostInfo::Cast2MultiVersionCameraHost()
153 {
154     cameraHostProxy_->GetVersion(majorVer_, minorVer_);
155     MEDIA_INFO_LOG("CameraHostInfo::Init cameraHostProxy_version %{public}u _ %{public}u", majorVer_, minorVer_);
156     if (GetCameraHostVersion() > GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
157         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_3");
158         auto castResult_V1_3 = OHOS::HDI::Camera::V1_3::ICameraHost::CastFrom(cameraHostProxy_);
159         if (castResult_V1_3 != nullptr) {
160             cameraHostProxyV1_3_ = castResult_V1_3;
161         }
162     }
163     if (GetCameraHostVersion() > GetVersionId(1, 1)) {
164         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_2");
165         auto castResult_V1_2 = OHOS::HDI::Camera::V1_2::ICameraHost::CastFrom(cameraHostProxy_);
166         if (castResult_V1_2 != nullptr) {
167             cameraHostProxyV1_2_ = castResult_V1_2;
168         }
169     }
170     if (GetCameraHostVersion() > GetVersionId(1, 0)) {
171         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_1");
172         auto castResult_V1_1 = OHOS::HDI::Camera::V1_1::ICameraHost::CastFrom(cameraHostProxy_);
173         if (castResult_V1_1 != nullptr) {
174             cameraHostProxyV1_1_ = castResult_V1_1;
175         }
176     }
177 }
178 
Init()179 bool HCameraHostManager::CameraHostInfo::Init()
180 {
181     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ != nullptr, true, "CameraHostInfo::Init, no camera host proxy");
182     cameraHostProxy_ = OHOS::HDI::Camera::V1_0::ICameraHost::Get(name_.c_str(), false);
183     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, false, "Failed to get ICameraHost");
184     Cast2MultiVersionCameraHost();
185 
186     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
187         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_3");
188         cameraHostProxyV1_3_->SetCallback_V1_2(this);
189     } else if (cameraHostProxyV1_2_ != nullptr &&
190         GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
191         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_2");
192         cameraHostProxyV1_2_->SetCallback_V1_2(this);
193     } else {
194         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_0");
195         cameraHostProxy_->SetCallback(this);
196     }
197     cameraHostDeathRecipient_ = new CameraHostDeathRecipient(this);
198     const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ICameraHost>(cameraHostProxy_);
199     CHECK_ERROR_PRINT_LOG(!remote->AddDeathRecipient(cameraHostDeathRecipient_),
200         "AddDeathRecipient for CameraHost failed.");
201     std::lock_guard<std::mutex> lock(mutex_);
202     CamRetCode ret = (CamRetCode)(cameraHostProxy_->GetCameraIds(cameraIds_));
203     if (ret != HDI::Camera::V1_0::NO_ERROR) {
204         MEDIA_ERR_LOG("Init, GetCameraIds failed, ret = %{public}d", ret);
205         CameraReportUtils::ReportCameraError(
206             "CameraHostInfo::Init", ret, true, CameraReportUtils::GetCallerInfo());
207         return false;
208     }
209     for (const auto& cameraId : cameraIds_) {
210         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
211     }
212     return true;
213 }
214 
CameraHostDied()215 void HCameraHostManager::CameraHostInfo::CameraHostDied()
216 {
217     auto hostDeadCallback = cameraHostDeadCallback_.lock();
218     CHECK_ERROR_RETURN_LOG(hostDeadCallback == nullptr,
219         "%{public}s CameraHostDied but hostDeadCallback is null.", name_.c_str());
220     hostDeadCallback->OnCameraHostDied(name_);
221 }
222 
IsCameraSupported(const std::string & cameraId)223 bool HCameraHostManager::CameraHostInfo::IsCameraSupported(const std::string& cameraId)
224 {
225     std::lock_guard<std::mutex> lock(mutex_);
226     return std::any_of(cameraIds_.begin(), cameraIds_.end(),
227                        [&cameraId](const auto& camId) { return camId == cameraId; });
228 }
229 
GetName()230 const std::string& HCameraHostManager::CameraHostInfo::GetName()
231 {
232     return name_;
233 }
234 
GetCameraHostVersion()235 int32_t HCameraHostManager::CameraHostInfo::GetCameraHostVersion()
236 {
237     MEDIA_DEBUG_LOG("cameraHostProxy_ GetVersion majorVer_: %{public}u, minorVers_: %{public}u", majorVer_, minorVer_);
238     return GetVersionId(majorVer_, minorVer_);
239 }
240 
GetCameras(std::vector<std::string> & cameraIds)241 int32_t HCameraHostManager::CameraHostInfo::GetCameras(std::vector<std::string>& cameraIds)
242 {
243     std::lock_guard<std::mutex> lock(mutex_);
244     for (auto id : cameraIds_) {
245         MEDIA_INFO_LOG("CameraHostInfo::GetCameras, current camera %{public}s", id.c_str());
246     }
247     cameraIds.insert(cameraIds.end(), cameraIds_.begin(), cameraIds_.end());
248     return CAMERA_OK;
249 }
250 
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & ability)251 int32_t HCameraHostManager::CameraHostInfo::GetCameraAbility(std::string& cameraId,
252     std::shared_ptr<OHOS::Camera::CameraMetadata>& ability)
253 {
254     auto deviceInfo = FindCameraDeviceInfo(cameraId);
255     CHECK_ERROR_RETURN_RET_LOG(deviceInfo == nullptr, CAMERA_UNKNOWN_ERROR,
256         "CameraHostInfo::GetCameraAbility deviceInfo is null");
257     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
258     if (deviceInfo->ability) {
259         ability = deviceInfo->ability;
260     } else {
261         CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
262             "CameraHostInfo::GetCameraAbility cameraHostProxy_ is null");
263         if (!deviceInfo->ability) {
264             std::vector<uint8_t> cameraAbility;
265             CamRetCode rc = (CamRetCode)(cameraHostProxy_->GetCameraAbility(cameraId, cameraAbility));
266             if (rc != HDI::Camera::V1_0::NO_ERROR) {
267                 MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility failed with error Code:%{public}d", rc);
268                 CameraReportUtils::ReportCameraError(
269                     "CameraHostInfo::GetCameraAbility", rc, true, CameraReportUtils::GetCallerInfo());
270                 return HdiToServiceError(rc);
271             }
272             OHOS::Camera::MetadataUtils::ConvertVecToMetadata(cameraAbility, ability);
273             if (ability == nullptr) {
274                 ability = std::make_shared<OHOS::Camera::CameraMetadata>(0, 0);
275             }
276             deviceInfo->ability = ability;
277         }
278     }
279     return CAMERA_OK;
280 }
281 
OpenCamera(std::string & cameraId,const sptr<ICameraDeviceCallback> & callback,sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> & pDevice,bool isEnableSecCam)282 int32_t HCameraHostManager::CameraHostInfo::OpenCamera(std::string& cameraId,
283     const sptr<ICameraDeviceCallback>& callback,
284     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice>& pDevice,
285     bool isEnableSecCam)
286 {
287     MEDIA_INFO_LOG("CameraHostInfo::OpenCamera %{public}s", cameraId.c_str());
288     auto deviceInfo = FindCameraDeviceInfo(cameraId);
289     CHECK_ERROR_RETURN_RET_LOG(deviceInfo == nullptr, CAMERA_UNKNOWN_ERROR,
290         "CameraHostInfo::GetCameraAbility deviceInfo is null");
291     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
292     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
293         "CameraHostInfo::OpenCamera cameraHostProxy_ is null");
294     CamRetCode rc;
295     // try to get higher version
296     sptr<OHOS::HDI::Camera::V1_1::ICameraDevice> hdiDevice_v1_1;
297     sptr<OHOS::HDI::Camera::V1_2::ICameraDevice> hdiDevice_v1_2;
298     sptr<OHOS::HDI::Camera::V1_3::ICameraDevice> hdiDevice_v1_3;
299     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
300         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_3");
301         if (isEnableSecCam) {
302             MEDIA_INFO_LOG("CameraHostInfo::OpenCamera OpenSecureCamera");
303             rc = (CamRetCode)(cameraHostProxyV1_3_->OpenSecureCamera(cameraId, callback, hdiDevice_v1_3));
304         } else {
305             rc = (CamRetCode)(cameraHostProxyV1_3_->OpenCamera_V1_3(cameraId, callback, hdiDevice_v1_3));
306         }
307         pDevice = hdiDevice_v1_3.GetRefPtr();
308     } else if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() >=
309         GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
310         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_2");
311         rc = (CamRetCode)(cameraHostProxyV1_2_->OpenCamera_V1_2(cameraId, callback, hdiDevice_v1_2));
312         pDevice = hdiDevice_v1_2.GetRefPtr();
313     } else if (cameraHostProxyV1_1_ != nullptr
314         && GetCameraHostVersion() == GetVersionId(HDI_VERSION_1, HDI_VERSION_1)) {
315         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_1");
316         rc = (CamRetCode)(cameraHostProxyV1_1_->OpenCamera_V1_1(cameraId, callback, hdiDevice_v1_1));
317         pDevice = hdiDevice_v1_1.GetRefPtr();
318     } else {
319         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_0");
320         rc = (CamRetCode)(cameraHostProxy_->OpenCamera(cameraId, callback, pDevice));
321     }
322     if (rc != HDI::Camera::V1_0::NO_ERROR) {
323         MEDIA_ERR_LOG("CameraHostInfo::OpenCamera failed with error Code:%{public}d", rc);
324         CameraReportUtils::ReportCameraError(
325             "CameraHostInfo::OpenCamera", rc, true, CameraReportUtils::GetCallerInfo());
326         pDevice = nullptr;
327         return HdiToServiceError(rc);
328     }
329     return CAMERA_OK;
330 }
331 
SetFlashlight(const std::string & cameraId,bool isEnable)332 int32_t HCameraHostManager::CameraHostInfo::SetFlashlight(const std::string& cameraId, bool isEnable)
333 {
334     std::lock_guard<std::mutex> lock(mutex_);
335     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
336         "CameraHostInfo::SetFlashlight cameraHostProxy_ is null");
337     CamRetCode rc = (CamRetCode)(cameraHostProxy_->SetFlashlight(cameraId, isEnable));
338     if (rc != HDI::Camera::V1_0::NO_ERROR) {
339         MEDIA_ERR_LOG("CameraHostInfo::SetFlashlight failed with error Code:%{public}d", rc);
340         CameraReportUtils::ReportCameraError(
341             "CameraHostInfo::SetFlashlight", rc, true, CameraReportUtils::GetCallerInfo());
342         return HdiToServiceError(rc);
343     }
344     return CAMERA_OK;
345 }
346 
SetTorchLevel(float level)347 int32_t HCameraHostManager::CameraHostInfo::SetTorchLevel(float level)
348 {
349     std::lock_guard<std::mutex> lock(mutex_);
350     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxyV1_2_ == nullptr, CAMERA_UNKNOWN_ERROR,
351         "CameraHostInfo::SetTorchLevel cameraHostProxyV1_2_ is null");
352     HDI::Camera::V1_2::CamRetCode rc = (HDI::Camera::V1_2::CamRetCode)(cameraHostProxyV1_2_->SetFlashlight_V1_2(level));
353     if (rc != HDI::Camera::V1_2::NO_ERROR) {
354         MEDIA_ERR_LOG("CameraHostInfo::SetTorchLevel failed with error Code:%{public}d", rc);
355         CameraReportUtils::ReportCameraError(
356             "CameraHostInfo::SetTorchLevel", rc, true, CameraReportUtils::GetCallerInfo());
357         return HdiToServiceErrorV1_2(rc);
358     }
359     return CAMERA_OK;
360 }
361 
UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting)362 void HCameraHostManager::CameraHostInfo::UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting)
363 {
364     MEDIA_DEBUG_LOG("CameraHostInfo::UpdateMuteSetting enter");
365     int32_t count = 1;
366     uint8_t mode = OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK;
367     if (setting == nullptr) {
368         MEDIA_DEBUG_LOG("CameraHostInfo::UpdateMuteSetting setting is null");
369         constexpr int32_t DEFAULT_ITEMS = 1;
370         constexpr int32_t DEFAULT_DATA_LENGTH = 1;
371         setting = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
372     }
373     setting->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
374 }
375 
Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam,bool muteMode)376 int32_t HCameraHostManager::CameraHostInfo::Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam, bool muteMode)
377 {
378     CHECK_ERROR_RETURN_RET(CheckUserHasChanged(cameraRestoreParam->GetSetting()), CAMERA_UNKNOWN_ERROR);
379     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
380         "CameraHostInfo::Prelaunch cameraHostProxy_ is null");
381     CHECK_ERROR_RETURN_RET_LOG(GetCameraHostVersion() < GetVersionId(1, 1), CAMERA_UNKNOWN_ERROR,
382         "CameraHostInfo::Prelaunch not support host V1_0!");
383     MEDIA_INFO_LOG("CameraHostInfo::prelaunch for cameraId %{public}s", (cameraRestoreParam->GetCameraId()).c_str());
384     for (auto& streamInfo : cameraRestoreParam->GetStreamInfo()) {
385         MEDIA_DEBUG_LOG("CameraHostInfo::prelaunch for stream id is:%{public}d", streamInfo.v1_0.streamId_);
386     }
387     OHOS::HDI::Camera::V1_1::PrelaunchConfig prelaunchConfig;
388     std::vector<uint8_t> settings;
389     prelaunchConfig.cameraId = cameraRestoreParam->GetCameraId();
390     prelaunchConfig.streamInfos_V1_1 = cameraRestoreParam->GetStreamInfo();
391     DumpMetadata(cameraRestoreParam->GetSetting());
392     CHECK_EXECUTE(muteMode, UpdateMuteSetting(cameraRestoreParam->GetSetting()));
393     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraRestoreParam->GetSetting(), settings);
394     prelaunchConfig.setting = settings;
395     int32_t opMode = cameraRestoreParam->GetCameraOpMode();
396     bool isNeedRestore = IsNeedRestore(opMode, cameraRestoreParam->GetSetting(), prelaunchConfig.cameraId);
397     CamRetCode rc;
398     if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
399         if (isNeedRestore) {
400             MEDIA_INFO_LOG("CameraHostInfo::PrelaunchWithOpMode ICameraHost V1_2 %{public}d", opMode);
401             rc = (CamRetCode)(cameraHostProxyV1_2_->PrelaunchWithOpMode(prelaunchConfig, opMode));
402         } else {
403             MEDIA_INFO_LOG("CameraHostInfo::Prelaunch ICameraHost V1_2 %{public}d", opMode);
404             rc = (CamRetCode)(cameraHostProxyV1_2_->Prelaunch(prelaunchConfig));
405         }
406     } else if (cameraHostProxyV1_1_ != nullptr && GetCameraHostVersion() == GetVersionId(1, 1)) {
407         MEDIA_DEBUG_LOG("CameraHostInfo::Prelaunch ICameraHost V1_1");
408         rc = (CamRetCode)(cameraHostProxyV1_1_->Prelaunch(prelaunchConfig));
409     } else {
410         rc = HDI::Camera::V1_0::NO_ERROR;
411     }
412     CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
413         "CameraHostInfo::Prelaunch failed with error Code:%{public}d", rc);
414     return CAMERA_OK;
415 }
416 
IsNeedRestore(int32_t opMode,std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings,std::string & cameraId)417 bool HCameraHostManager::CameraHostInfo::IsNeedRestore(int32_t opMode,
418     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings, std::string& cameraId)
419 {
420     CHECK_ERROR_RETURN_RET(cameraSettings == nullptr, false);
421     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
422     int32_t ret = GetCameraAbility(cameraId, cameraAbility);
423     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || cameraAbility == nullptr, false,
424         "CameraHostInfo::IsNeedRestore failed");
425     if (opMode == 0) { // 0 is normal mode
426         MEDIA_INFO_LOG("operationMode:%{public}d", opMode);
427         return true;
428     }
429     camera_metadata_item_t item;
430     ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility->get(), OHOS_ABILITY_CAMERA_MODES, &item);
431     if (ret != CAM_META_SUCCESS || item.count == 0) {
432         MEDIA_ERR_LOG("Failed to find stream extend configuration return code %{public}d", ret);
433         ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility->get(),
434             OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
435         if (ret == CAM_META_SUCCESS && item.count != 0) {
436             MEDIA_INFO_LOG("basic config no need valid mode");
437             return true;
438         }
439         return false;
440     }
441 
442     for (uint32_t i = 0; i < item.count; i++) {
443         if (opMode == item.data.u8[i]) {
444             MEDIA_DEBUG_LOG("operationMode:%{public}d found in supported streams", opMode);
445             return true;
446         }
447     }
448     MEDIA_ERR_LOG("operationMode:%{public}d not found in supported streams", opMode);
449     return false;
450 }
PreCameraSwitch(const std::string & cameraId)451 int32_t HCameraHostManager::CameraHostInfo::PreCameraSwitch(const std::string& cameraId)
452 {
453     std::lock_guard<std::mutex> lock(mutex_);
454     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
455         "CameraHostInfo::PreCameraSwitch cameraHostProxy_ is null");
456     CHECK_ERROR_RETURN_RET_LOG(GetCameraHostVersion() <= GetVersionId(1, 1), CAMERA_UNKNOWN_ERROR,
457         "CameraHostInfo::PreCameraSwitch not support host V1_0 and V1_1!");
458     if (cameraHostProxyV1_2_ != nullptr) {
459         MEDIA_DEBUG_LOG("CameraHostInfo::PreCameraSwitch ICameraHost V1_2");
460         CamRetCode rc = (CamRetCode)(cameraHostProxyV1_2_->PreCameraSwitch(cameraId));
461         CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
462             "CameraHostInfo::PreCameraSwitch failed with error Code:%{public}d", rc);
463     }
464     return CAMERA_OK;
465 }
466 
NotifyDeviceStateChangeInfo(int notifyType,int deviceState)467 void HCameraHostManager::CameraHostInfo::NotifyDeviceStateChangeInfo(int notifyType, int deviceState)
468 {
469     std::lock_guard<std::mutex> lock(mutex_);
470     CHECK_ERROR_RETURN_LOG(cameraHostProxy_ == nullptr, "CameraHostInfo::Prelaunch cameraHostProxy_ is null");
471     MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo notifyType = %{public}d, deviceState = %{public}d",
472         notifyType, deviceState);
473     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
474         MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo ICameraHost V1_2");
475         cameraHostProxyV1_3_->NotifyDeviceStateChangeInfo(notifyType, deviceState);
476     } else if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
477         MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo ICameraHost V1_2");
478         cameraHostProxyV1_2_->NotifyDeviceStateChangeInfo(notifyType, deviceState);
479     }
480 }
481 
CheckUserHasChanged(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings)482 bool HCameraHostManager::CameraHostInfo::CheckUserHasChanged(
483     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings)
484 {
485     CHECK_ERROR_RETURN_RET_LOG(cameraSettings == nullptr, false, "camera settings is nullptr.");
486     int32_t userId;
487     int32_t uid = IPCSkeleton::GetCallingUid();
488     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
489     camera_metadata_item_t item;
490     int32_t ret = OHOS::Camera::FindCameraMetadataItem(cameraSettings->get(), OHOS_CAMERA_USER_ID, &item);
491     if (ret == CAM_META_SUCCESS && userId != item.data.i32[0]) {
492         MEDIA_INFO_LOG("userId changed from %{public}d to %{public}d", item.data.i32[0], userId);
493         return true;
494     }
495     return false;
496 }
497 
GetCameraResourceCost(const std::string & cameraId,OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost & resourceCost)498 int32_t HCameraHostManager::CameraHostInfo::GetCameraResourceCost(const std::string& cameraId,
499     OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)
500 {
501     std::lock_guard<std::mutex> lock(mutex_);
502     if (cameraHostProxyV1_3_ != nullptr &&
503         cameraHostProxyV1_3_->GetResourceCost(cameraId, resourceCost) ==
504         HDI::Camera::V1_0::CamRetCode::NO_ERROR) {
505         return CAMERA_OK;
506     }
507     return CAMERA_UNSUPPORTED;
508 }
509 
OnCameraStatus(const std::string & cameraId,HDI::Camera::V1_0::CameraStatus status)510 int32_t HCameraHostManager::CameraHostInfo::OnCameraStatus(
511     const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status)
512 {
513     auto statusCallback = statusCallback_.lock();
514     if (statusCallback == nullptr) {
515         MEDIA_WARNING_LOG("CameraHostInfo::OnCameraStatus for %{public}s with status %{public}d "
516                           "failed due to no callback",
517             cameraId.c_str(), status);
518         return CAMERA_UNKNOWN_ERROR;
519     }
520     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
521     switch (status) {
522         case UN_AVAILABLE: {
523             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s unavailable", cameraId.c_str());
524             svcStatus = CAMERA_STATUS_UNAVAILABLE;
525             break;
526         }
527         case AVAILABLE: {
528             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s available", cameraId.c_str());
529             svcStatus = CAMERA_STATUS_AVAILABLE;
530             AddDevice(cameraId);
531             break;
532         }
533         default:
534             MEDIA_ERR_LOG("Unknown camera status: %{public}d", status);
535             return CAMERA_UNKNOWN_ERROR;
536     }
537     statusCallback->OnCameraStatus(cameraId, svcStatus);
538     return CAMERA_OK;
539 }
540 
NotifyCameraHostDied()541 void HCameraHostManager::CameraHostInfo::NotifyCameraHostDied()
542 {
543     auto statusCallback = statusCallback_.lock();
544     if (statusCallback == nullptr) {
545         MEDIA_WARNING_LOG("CameraHostInfo::NotifyCameraHostDied failed due to no callback!");
546         return;
547     }
548     std::vector<std::string> cameraIds;
549     if (statusCallback && this->GetCameras(cameraIds) == CAMERA_OK) {
550         for (const auto& cameraId : cameraIds) {
551             statusCallback->OnCameraStatus(cameraId, CAMERA_SERVER_UNAVAILABLE);
552         }
553     }
554 }
555 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)556 int32_t HCameraHostManager::CameraHostInfo::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
557 {
558     auto statusCallback = statusCallback_.lock();
559     if (statusCallback == nullptr) {
560         MEDIA_WARNING_LOG("CameraHostInfo::OnFlashlightStatus for %{public}s with status %{public}d "
561                           "failed due to no callback",
562             cameraId.c_str(), status);
563         return CAMERA_UNKNOWN_ERROR;
564     }
565     FlashStatus flashStatus = FLASH_STATUS_OFF;
566     switch (status) {
567         case FLASHLIGHT_OFF:
568             flashStatus = FLASH_STATUS_OFF;
569             MEDIA_INFO_LOG(
570                 "CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is off", cameraId.c_str());
571             break;
572 
573         case FLASHLIGHT_ON:
574             flashStatus = FLASH_STATUS_ON;
575             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is on", cameraId.c_str());
576             break;
577 
578         case FLASHLIGHT_UNAVAILABLE:
579             flashStatus = FLASH_STATUS_UNAVAILABLE;
580             MEDIA_INFO_LOG(
581                 "CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is unavailable", cameraId.c_str());
582             break;
583 
584         default:
585             MEDIA_ERR_LOG("Unknown flashlight status: %{public}d for camera %{public}s", status, cameraId.c_str());
586             return CAMERA_UNKNOWN_ERROR;
587     }
588     statusCallback->OnFlashlightStatus(cameraId, flashStatus);
589     return CAMERA_OK;
590 }
591 
OnFlashlightStatus_V1_2(FlashlightStatus status)592 int32_t HCameraHostManager::CameraHostInfo::OnFlashlightStatus_V1_2(FlashlightStatus status)
593 {
594     auto statusCallback = statusCallback_.lock();
595     if (statusCallback == nullptr) {
596         MEDIA_WARNING_LOG(
597             "CameraHostInfo::OnFlashlightStatus_V1_2 with status %{public}d failed due to no callback", status);
598         return CAMERA_UNKNOWN_ERROR;
599     }
600     TorchStatus torchStatus = TORCH_STATUS_OFF;
601     switch (status) {
602         case FLASHLIGHT_OFF:
603             torchStatus = TORCH_STATUS_OFF;
604             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is off");
605             break;
606 
607         case FLASHLIGHT_ON:
608             torchStatus = TORCH_STATUS_ON;
609             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is on");
610             break;
611 
612         case FLASHLIGHT_UNAVAILABLE:
613             torchStatus = TORCH_STATUS_UNAVAILABLE;
614             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is unavailable");
615             break;
616 
617         default:
618             MEDIA_ERR_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, Unknown flashlight status: %{public}d", status);
619             return CAMERA_UNKNOWN_ERROR;
620     }
621     statusCallback->OnTorchStatus(torchStatus);
622     return CAMERA_OK;
623 }
624 
OnCameraEvent(const std::string & cameraId,CameraEvent event)625 int32_t HCameraHostManager::CameraHostInfo::OnCameraEvent(const std::string& cameraId, CameraEvent event)
626 {
627     auto statusCallback = statusCallback_.lock();
628     if (statusCallback == nullptr) {
629         MEDIA_WARNING_LOG(
630             "CameraHostInfo::OnCameraEvent for %{public}s with status %{public}d failed due to no callback",
631             cameraId.c_str(), event);
632         return CAMERA_UNKNOWN_ERROR;
633     }
634     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
635     switch (event) {
636         case CAMERA_EVENT_DEVICE_RMV: {
637             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent, camera %{public}s unavailable", cameraId.c_str());
638             svcStatus = CAMERA_STATUS_DISAPPEAR;
639             RemoveDevice(cameraId);
640             break;
641         }
642         case CAMERA_EVENT_DEVICE_ADD: {
643             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent camera %{public}s available", cameraId.c_str());
644             svcStatus = CAMERA_STATUS_APPEAR;
645             AddDevice(cameraId);
646             break;
647         }
648         default:
649             MEDIA_ERR_LOG("Unknown camera event: %{public}d", event);
650             return CAMERA_UNKNOWN_ERROR;
651     }
652     statusCallback->OnCameraStatus(cameraId, svcStatus);
653     return CAMERA_OK;
654 }
655 
FindCameraDeviceInfo(const std::string & cameraId)656 std::shared_ptr<HCameraHostManager::CameraDeviceInfo> HCameraHostManager::CameraHostInfo::FindCameraDeviceInfo
657    (const std::string& cameraId)
658 {
659     std::lock_guard<std::mutex> lock(mutex_);
660     std::vector<std::shared_ptr<CameraDeviceInfo>>::iterator it = std::find_if(devices_.begin(), devices_.end(),
661         [cameraId](const auto& deviceInfo) { return deviceInfo->cameraId == cameraId; });
662     if (it != devices_.end()) {
663         MEDIA_INFO_LOG("CameraHostInfo::FindCameraDeviceInfo succeed for %{public}s", cameraId.c_str());
664         return (*it);
665     }
666     MEDIA_WARNING_LOG("CameraHostInfo::FindCameraDeviceInfo failed for %{public}s", cameraId.c_str());
667     return nullptr;
668 }
669 
AddDevice(const std::string & cameraId)670 void HCameraHostManager::CameraHostInfo::AddDevice(const std::string& cameraId)
671 {
672     std::lock_guard<std::mutex> lock(mutex_);
673     if (std::none_of(devices_.begin(), devices_.end(),
674                      [&cameraId](auto& devInfo) { return devInfo->cameraId == cameraId; })) {
675         cameraIds_.push_back(cameraId);
676         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
677         MEDIA_INFO_LOG("CameraHostInfo::AddDevice, camera %{public}s added", cameraId.c_str());
678     } else {
679         MEDIA_WARNING_LOG("CameraHostInfo::AddDevice, camera %{public}s already exists", cameraId.c_str());
680     }
681 }
682 
RemoveDevice(const std::string & cameraId)683 void HCameraHostManager::CameraHostInfo::RemoveDevice(const std::string& cameraId)
684 {
685     std::lock_guard<std::mutex> lock(mutex_);
686     MEDIA_INFO_LOG("CameraHostInfo::RemoveDevice, camera %{public}s removed", cameraId.c_str());
687     cameraIds_.erase(std::remove(cameraIds_.begin(), cameraIds_.end(), cameraId), cameraIds_.end());
688     devices_.erase(std::remove_if(devices_.begin(), devices_.end(),
689         [&cameraId](const auto& devInfo) { return devInfo->cameraId == cameraId; }),
690         devices_.end());
691     for (auto id : cameraIds_) {
692         MEDIA_INFO_LOG("CameraHostInfo::RemoveDevice, current camera %{public}s", id.c_str());
693     }
694 }
695 
HCameraHostManager(std::shared_ptr<StatusCallback> statusCallback)696 HCameraHostManager::HCameraHostManager(std::shared_ptr<StatusCallback> statusCallback)
697     : statusCallback_(statusCallback), cameraHostInfos_(), muteMode_(false)
698 {
699     MEDIA_INFO_LOG("HCameraHostManager construct called");
700 }
701 
~HCameraHostManager()702 HCameraHostManager::~HCameraHostManager()
703 {
704     MEDIA_INFO_LOG("HCameraHostManager deconstruct called");
705     std::lock_guard<std::mutex> lock(deviceMutex_);
706     for (auto it = cameraDevices_.begin(); it != cameraDevices_.end(); it++) {
707         if (it->second) {
708             it->second = nullptr;
709         }
710     }
711     cameraDevices_.clear();
712 
713     for (unsigned i = 0; i < cameraHostInfos_.size(); i++) {
714         cameraHostInfos_[i] = nullptr;
715     }
716     cameraHostInfos_.clear();
717 }
718 
Init()719 int32_t HCameraHostManager::Init()
720 {
721     MEDIA_INFO_LOG("HCameraHostManager::Init");
722     using namespace OHOS::HDI::ServiceManager::V1_0;
723     auto svcMgr = IServiceManager::Get();
724     CHECK_ERROR_RETURN_RET_LOG(svcMgr == nullptr, CAMERA_UNKNOWN_ERROR,
725         "HCameraHostManager::Init IServiceManager failed!");
726 
727     ::OHOS::sptr<IServStatListener> listener(
728         new RegisterServStatListener(RegisterServStatListener::StatusCallback([&](const ServiceStatus& status) {
729             using namespace OHOS::HDI::ServiceManager::V1_0;
730 
731             switch (status.status) {
732                 case SERVIE_STATUS_START:
733                     AddCameraHost(status.serviceName);
734                     break;
735                 case SERVIE_STATUS_STOP:
736                     RemoveCameraHost(status.serviceName);
737                     break;
738                 default:
739                     MEDIA_ERR_LOG("HCameraHostManager::OnReceive unexpected service status %{public}d", status.status);
740             }
741         })
742     ));
743 
744     auto rt = svcMgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_CAMERA);
745     CHECK_ERROR_RETURN_RET_LOG(rt != 0, CAMERA_UNKNOWN_ERROR,
746         "HCameraHostManager::Init RegisterServiceStatusListener failed!");
747     registerServStatListener_ = listener;
748 
749     return CAMERA_OK;
750 }
751 
DeInit()752 void HCameraHostManager::DeInit()
753 {
754     using namespace OHOS::HDI::ServiceManager::V1_0;
755     auto svcMgr = IServiceManager::Get();
756     CHECK_ERROR_RETURN_LOG(svcMgr == nullptr, "HCameraHostManager::DeInit(): IServiceManager failed");
757     auto rt = svcMgr->UnregisterServiceStatusListener(registerServStatListener_);
758     CHECK_ERROR_PRINT_LOG(rt != 0, "HCameraHostManager::DeInit(): UnregisterServiceStatusListener failed!");
759     registerServStatListener_ = nullptr;
760 }
761 
AddCameraDevice(const std::string & cameraId,sptr<ICameraDeviceService> cameraDevice)762 void HCameraHostManager::AddCameraDevice(const std::string& cameraId, sptr<ICameraDeviceService> cameraDevice)
763 {
764     std::lock_guard<std::mutex> lock(deviceMutex_);
765     auto it = cameraDevices_.find(cameraId);
766     if (it != cameraDevices_.end()) {
767         it->second = nullptr;
768         cameraDevices_.erase(cameraId);
769     }
770     cameraDevices_[cameraId] = cameraDevice;
771     auto statusCallback = statusCallback_.lock();
772     CHECK_EXECUTE(statusCallback != nullptr,
773         statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_UNAVAILABLE, CallbackInvoker::APPLICATION));
774 }
775 
RemoveCameraDevice(const std::string & cameraId)776 void HCameraHostManager::RemoveCameraDevice(const std::string& cameraId)
777 {
778     MEDIA_DEBUG_LOG("HCameraHostManager::RemoveCameraDevice start");
779     std::lock_guard<std::mutex> lock(deviceMutex_);
780     auto it = cameraDevices_.find(cameraId);
781     if (it != cameraDevices_.end()) {
782         it->second = nullptr;
783     }
784     cameraDevices_.erase(cameraId);
785     auto statusCallback = statusCallback_.lock();
786     CHECK_EXECUTE(statusCallback,
787         statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_AVAILABLE, CallbackInvoker::APPLICATION));
788     MEDIA_DEBUG_LOG("HCameraHostManager::RemoveCameraDevice end");
789 }
790 
CloseCameraDevice(const std::string & cameraId)791 void HCameraHostManager::CloseCameraDevice(const std::string& cameraId)
792 {
793     sptr<ICameraDeviceService> deviceToDisconnect = nullptr;
794     {
795         std::lock_guard<std::mutex> lock(deviceMutex_);
796         auto iter = cameraDevices_.find(cameraId);
797         if (iter != cameraDevices_.end()) {
798             deviceToDisconnect = iter->second;
799         }
800     }
801     if (deviceToDisconnect) {
802         MEDIA_DEBUG_LOG("HCameraDevice::CloseCameraDevice should clean %{public}s device", cameraId.c_str());
803         HCameraDevice* devicePtr = static_cast<HCameraDevice*>(deviceToDisconnect.GetRefPtr());
804         devicePtr->RemoveResourceWhenHostDied();
805     }
806 }
807 
GetCameras(std::vector<std::string> & cameraIds)808 int32_t HCameraHostManager::GetCameras(std::vector<std::string>& cameraIds)
809 {
810     CAMERA_SYNC_TRACE;
811     MEDIA_INFO_LOG("HCameraHostManager::GetCameras");
812     CHECK_EXECUTE(!IsCameraHostInfoAdded(LOCAL_SERVICE_NAME), AddCameraHost(LOCAL_SERVICE_NAME));
813     std::lock_guard<std::mutex> lock(mutex_);
814     cameraIds.clear();
815     for (const auto& cameraHost : cameraHostInfos_) {
816         cameraHost->GetCameras(cameraIds);
817     }
818     return CAMERA_OK;
819 }
820 
GetCameraIdSortedByCameraType(std::vector<std::string> & cameraIds)821 int32_t HCameraHostManager::GetCameraIdSortedByCameraType(std::vector<std::string>& cameraIds)
822 {
823     CAMERA_SYNC_TRACE;
824     MEDIA_INFO_LOG("HCameraHostManager::GetCameraIdSortedByCameraType");
825     if (!IsCameraHostInfoAdded(LOCAL_SERVICE_NAME)) {
826         AddCameraHost(LOCAL_SERVICE_NAME);
827     }
828     cameraIds.clear();
829     for (const auto& cameraHost : cameraHostInfos_) {
830         cameraHost->GetCameras(cameraIds);
831     }
832     std::vector<camera_type_enum_t> cameraTypes;
833     for (auto id : cameraIds) {
834         std::shared_ptr<OHOS::Camera::CameraMetadata> ability;
835         GetCameraAbility(id, ability);
836         int32_t cameratypenow = 0;
837         camera_metadata_item_t item;
838         int32_t ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CAMERA_TYPE, &item);
839         if (item.count < 1) {
840             cameraTypes.emplace_back(static_cast<camera_type_enum_t>(cameratypenow));
841             continue;
842         }
843         cameratypenow = (ret == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_TYPE_UNSPECIFIED;
844         cameraTypes.emplace_back(static_cast<camera_type_enum_t>(cameratypenow));
845     }
846 
847     std::sort(cameraIds.begin(), cameraIds.end(), [&](const std::string& first, const std::string& second) {
848         size_t indexFirst = std::distance(cameraIds.begin(), std::find(cameraIds.begin(), cameraIds.end(), first));
849         size_t indexSecond = std::distance(cameraIds.begin(), std::find(cameraIds.begin(), cameraIds.end(), second));
850         return cameraTypes[indexFirst] < cameraTypes[indexSecond];
851     });
852     return CAMERA_OK;
853 }
854 
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & ability)855 int32_t HCameraHostManager::GetCameraAbility(std::string &cameraId,
856                                              std::shared_ptr<OHOS::Camera::CameraMetadata> &ability)
857 {
858     auto cameraHostInfo = FindCameraHostInfo(cameraId);
859     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
860         "HCameraHostManager::GetCameraAbility failed with invalid device info.");
861     return cameraHostInfo->GetCameraAbility(cameraId, ability);
862 }
863 
GetVersionByCamera(const std::string & cameraId)864 int32_t HCameraHostManager::GetVersionByCamera(const std::string& cameraId)
865 {
866     MEDIA_INFO_LOG("GetVersionByCamera camera = %{public}s", cameraId.c_str());
867     auto cameraHostInfo = FindCameraHostInfo(cameraId);
868     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, 0, "GetVersionByCamera failed with invalid device info");
869     return cameraHostInfo->GetCameraHostVersion();
870 }
871 
OpenCameraDevice(std::string & cameraId,const sptr<ICameraDeviceCallback> & callback,sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> & pDevice,bool isEnableSecCam)872 int32_t HCameraHostManager::OpenCameraDevice(std::string &cameraId,
873     const sptr<ICameraDeviceCallback> &callback,
874     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> &pDevice,
875     bool isEnableSecCam)
876 {
877     MEDIA_INFO_LOG("HCameraHostManager::OpenCameraDevice try to open camera = %{public}s", cameraId.c_str());
878     auto cameraHostInfo = FindCameraHostInfo(cameraId);
879     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
880         "HCameraHostManager::OpenCameraDevice failed with invalid device info.");
881     return cameraHostInfo->OpenCamera(cameraId, callback, pDevice, isEnableSecCam);
882 }
883 
SetTorchLevel(float level)884 int32_t HCameraHostManager::SetTorchLevel(float level)
885 {
886     CHECK_EXECUTE(!IsCameraHostInfoAdded(LOCAL_SERVICE_NAME), AddCameraHost(LOCAL_SERVICE_NAME));
887     auto cameraHostInfo = FindLocalCameraHostInfo();
888     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
889         "HCameraHostManager::SetTorchLevel failed with not exist support device info");
890     return cameraHostInfo->SetTorchLevel(level);
891 }
892 
SetFlashlight(const std::string & cameraId,bool isEnable)893 int32_t HCameraHostManager::SetFlashlight(const std::string& cameraId, bool isEnable)
894 {
895     auto cameraHostInfo = FindCameraHostInfo(cameraId);
896     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
897         "HCameraHostManager::SetFlashlight failed with invalid device info");
898     return cameraHostInfo->SetFlashlight(cameraId, isEnable);
899 }
900 
Prelaunch(const std::string & cameraId,std::string clientName)901 int32_t HCameraHostManager::Prelaunch(const std::string& cameraId, std::string clientName)
902 {
903     MEDIA_DEBUG_LOG("HCameraHostManager::Prelaunch start");
904     auto cameraHostInfo = FindCameraHostInfo(cameraId);
905     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
906         "HCameraHostManager::Prelaunch failed with invalid device info");
907     sptr<HCameraRestoreParam> cameraRestoreParam = GetRestoreParam(clientName, cameraId);
908     int foldStatus = static_cast<int>(OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus());
909     int restoreFoldStatus = cameraRestoreParam->GetFlodStatus();
910     MEDIA_DEBUG_LOG("HCameraHostManager::Prelaunch foldStatus:%{public}d, restoreFoldStatus:%{public}d",
911         foldStatus, restoreFoldStatus);
912     if (foldStatus != restoreFoldStatus && restoreFoldStatus != 0) {
913         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam %d", foldStatus);
914         return 0;
915     }
916     int32_t res = cameraHostInfo->Prelaunch(cameraRestoreParam, muteMode_);
917     if (res == 0 && cameraRestoreParam->GetRestoreParamType() ==
918         RestoreParamTypeOhos::PERSISTENT_DEFAULT_PARAM_OHOS) {
919         return CAMERA_OK;
920     }
921     // 使用后删除存储的动态数据
922     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
923     auto it = transitentParamMap_.find(clientName);
924     CHECK_EXECUTE(it != transitentParamMap_.end() && CheckCameraId(it->second, cameraId),
925         transitentParamMap_.erase(clientName));
926     return 0;
927 }
928 
PreSwitchCamera(const std::string & cameraId)929 int32_t HCameraHostManager::PreSwitchCamera(const std::string& cameraId)
930 {
931     auto cameraHostInfo = FindCameraHostInfo(cameraId);
932     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
933         "HCameraHostManager::PreSwitchCamera failed with invalid device info");
934     return cameraHostInfo->PreCameraSwitch(cameraId);
935 }
936 
NotifyDeviceStateChangeInfo(int notifyType,int deviceState)937 void HCameraHostManager::NotifyDeviceStateChangeInfo(int notifyType, int deviceState)
938 {
939     auto cameraHostInfo = FindLocalCameraHostInfo();
940     CHECK_ERROR_RETURN_LOG(cameraHostInfo == nullptr,
941         "HCameraHostManager::NotifyDeviceStateChangeInfo failed with not exist support device info");
942 
943     cameraHostInfo->NotifyDeviceStateChangeInfo(notifyType, deviceState);
944 }
945 
SaveRestoreParam(sptr<HCameraRestoreParam> cameraRestoreParam)946 void HCameraHostManager::SaveRestoreParam(sptr<HCameraRestoreParam> cameraRestoreParam)
947 {
948     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
949     CHECK_ERROR_RETURN_LOG(cameraRestoreParam == nullptr, "HCameraRestoreParam is nullptr");
950     std::string clientName = cameraRestoreParam->GetClientName();
951     if (cameraRestoreParam->GetRestoreParamType() == RestoreParamTypeOhos::PERSISTENT_DEFAULT_PARAM_OHOS) {
952         DeleteRestoreParam(clientName, cameraRestoreParam->GetCameraId());
953         (persistentParamMap_[clientName])[cameraRestoreParam->GetCameraId()] = cameraRestoreParam;
954         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam save persistent param");
955     } else {
956         auto itTransitent = transitentParamMap_.find(clientName);
957         CHECK_EXECUTE(itTransitent != transitentParamMap_.end(), transitentParamMap_.erase(clientName));
958         transitentParamMap_[clientName] = cameraRestoreParam;
959         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam save transist param");
960         isHasSavedParam = true;
961     }
962 }
963 
UpdateRestoreParamCloseTime(const std::string & clientName,const std::string & cameraId)964 void HCameraHostManager::UpdateRestoreParamCloseTime(const std::string& clientName, const std::string& cameraId)
965 {
966     MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParamCloseTime enter");
967     timeval closeTime;
968     gettimeofday(&closeTime, nullptr);
969     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
970     auto itPersistent = persistentParamMap_.find(clientName);
971     if (itPersistent != persistentParamMap_.end()) {
972         MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParamCloseTime find persistentParam");
973         std::map<std::string, sptr<HCameraRestoreParam>>::iterator iter = (persistentParamMap_[clientName]).begin();
974         while (iter != (persistentParamMap_[clientName]).end()) {
975             auto cameraRestoreParam = iter->second;
976             if (cameraId == cameraRestoreParam->GetCameraId()) {
977                 cameraRestoreParam->SetCloseCameraTime(closeTime);
978                 MEDIA_DEBUG_LOG("HCameraHostManager::Update persistent closeTime");
979             } else {
980                 cameraRestoreParam->SetCloseCameraTime({0, 0});
981             }
982             ++iter;
983         }
984     }
985 
986     auto itTransitent = transitentParamMap_.find(clientName);
987     if (!isHasSavedParam && itTransitent != transitentParamMap_.end()) {
988         transitentParamMap_.erase(clientName);
989         return;
990     }
991 
992     if (itTransitent != transitentParamMap_.end()) {
993         MEDIA_INFO_LOG("HCameraHostManager::Update transient CloseTime ");
994         transitentParamMap_[clientName]->SetCloseCameraTime(closeTime);
995         isHasSavedParam = false;
996     }
997 }
998 
DeleteRestoreParam(const std::string & clientName,const std::string & cameraId)999 void HCameraHostManager::DeleteRestoreParam(const std::string& clientName, const std::string& cameraId)
1000 {
1001     MEDIA_DEBUG_LOG("HCameraHostManager::DeleteRestoreParam enter");
1002     auto itPersistent = persistentParamMap_.find(clientName);
1003     if (itPersistent != persistentParamMap_.end()) {
1004         auto iterParamMap = (itPersistent->second).find(cameraId);
1005         if (iterParamMap != (itPersistent->second).end()) {
1006             iterParamMap->second = nullptr;
1007             (itPersistent->second).erase(cameraId);
1008         }
1009     }
1010 }
1011 
GetRestoreParam(const std::string & clientName,const std::string & cameraId)1012 sptr<HCameraRestoreParam> HCameraHostManager::GetRestoreParam(const std::string& clientName,
1013     const std::string& cameraId)
1014 {
1015     MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam enter");
1016     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
1017     std::vector<StreamInfo_V1_1> streamInfos;
1018     RestoreParamTypeOhos restoreParamType = RestoreParamTypeOhos::NO_NEED_RESTORE_PARAM_OHOS;
1019     sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(clientName, cameraId,
1020         streamInfos, nullptr, restoreParamType, 0);
1021     auto it = persistentParamMap_.find(clientName);
1022     if (it != persistentParamMap_.end()) {
1023         MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam find persistent param");
1024         UpdateRestoreParam(cameraRestoreParam);
1025     } else {
1026         cameraRestoreParam = GetTransitentParam(clientName, cameraId);
1027         MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam find transist param");
1028     }
1029     return cameraRestoreParam;
1030 }
1031 
UpdateRestoreParam(sptr<HCameraRestoreParam> & cameraRestoreParam)1032 void HCameraHostManager::UpdateRestoreParam(sptr<HCameraRestoreParam> &cameraRestoreParam)
1033 {
1034     CHECK_ERROR_RETURN_LOG(cameraRestoreParam == nullptr, "HCameraHostManager::UpdateRestoreParam is nullptr");
1035     std::string clientName = cameraRestoreParam->GetClientName();
1036     std::string cameraId = cameraRestoreParam->GetCameraId();
1037     std::map<std::string, sptr<HCameraRestoreParam>>::iterator iter = (persistentParamMap_[clientName]).begin();
1038     while (iter != (persistentParamMap_[clientName]).end()) {
1039         auto restoreParam = iter->second;
1040         timeval closeTime = restoreParam->GetCloseCameraTime();
1041         MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam closeTime.tv_sec");
1042         if (closeTime.tv_sec != 0 && CheckCameraId(restoreParam, cameraId)) {
1043             timeval openTime;
1044             gettimeofday(&openTime, nullptr);
1045             int64_t sec_diff = openTime.tv_sec - closeTime.tv_sec;
1046             int64_t usec_diff = openTime.tv_usec - closeTime.tv_usec;
1047             if (usec_diff < 0) {
1048                 sec_diff -= 1;
1049                 usec_diff += MILLISEC_TIME * MILLISEC_TIME;
1050             }
1051             int64_t timeInterval = sec_diff * MILLISEC_TIME + usec_diff / MILLISEC_TIME;
1052             if ((restoreParam->GetStartActiveTime() * 60 * MILLISEC_TIME) < timeInterval) { // 60 is 60 Seconds
1053                 MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam get persistent");
1054                 cameraRestoreParam = restoreParam;
1055             } else {
1056                 MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam get transistent ");
1057                 cameraRestoreParam = GetTransitentParam(clientName, cameraId);
1058             }
1059             cameraRestoreParam->UpdateExposureSetting(timeInterval);
1060             break;
1061         }
1062         ++iter;
1063     }
1064 }
1065 
GetTransitentParam(const std::string & clientName,const std::string & cameraId)1066 sptr<HCameraRestoreParam> HCameraHostManager::GetTransitentParam(const std::string& clientName,
1067     const std::string& cameraId)
1068 {
1069     std::vector<StreamInfo_V1_1> streamInfos;
1070     RestoreParamTypeOhos restoreParamType = RestoreParamTypeOhos::NO_NEED_RESTORE_PARAM_OHOS;
1071     sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(clientName, cameraId,
1072         streamInfos, nullptr, restoreParamType, 0);
1073     auto iter = transitentParamMap_.find(clientName);
1074     if (iter != transitentParamMap_.end() && (CheckCameraId(transitentParamMap_[clientName], cameraId))) {
1075         cameraRestoreParam = transitentParamMap_[clientName];
1076         MEDIA_DEBUG_LOG("HCameraHostManager::GetTransitentParam end");
1077     }
1078     return cameraRestoreParam;
1079 }
1080 
CheckCameraId(sptr<HCameraRestoreParam> cameraRestoreParam,const std::string & cameraId)1081 bool HCameraHostManager::CheckCameraId(sptr<HCameraRestoreParam> cameraRestoreParam, const std::string& cameraId)
1082 {
1083     CHECK_ERROR_RETURN_RET(cameraRestoreParam == nullptr, false);
1084     CHECK_ERROR_RETURN_RET(cameraRestoreParam->GetCameraId() == cameraId, true);
1085     return false;
1086 }
1087 
1088 
AddCameraHost(const std::string & svcName)1089 void HCameraHostManager::AddCameraHost(const std::string& svcName)
1090 {
1091     MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host %{public}s added", svcName.c_str());
1092     std::lock_guard<std::mutex> lock(mutex_);
1093     if (std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1094                     [&svcName](const auto& camHost) { return camHost->GetName() == svcName; })) {
1095         MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host  %{public}s already exists", svcName.c_str());
1096         return;
1097     }
1098     if (cameraHostDeadCallback_ == nullptr) {
1099         cameraHostDeadCallback_ = std::make_shared<CameraHostDeadCallback>(this);
1100     }
1101     auto statusCallback = statusCallback_.lock();
1102     sptr<HCameraHostManager::CameraHostInfo> cameraHost =
1103         new (std::nothrow) HCameraHostManager::CameraHostInfo(statusCallback, cameraHostDeadCallback_, svcName);
1104     CHECK_ERROR_RETURN_LOG(cameraHost == nullptr, "failed to new cameraHost!");
1105     CHECK_ERROR_RETURN_LOG(!cameraHost->Init(), "HCameraHostManager::AddCameraHost failed due to init failure");
1106     cameraHostInfos_.push_back(cameraHost);
1107     std::vector<std::string> cameraIds;
1108     if (statusCallback && cameraHost->GetCameras(cameraIds) == CAMERA_OK) {
1109         for (const auto& cameraId : cameraIds) {
1110             statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_AVAILABLE);
1111         }
1112     }
1113     CHECK_EXECUTE(statusCallback && svcName == LOCAL_SERVICE_NAME, statusCallback->OnTorchStatus(TORCH_STATUS_OFF));
1114 }
1115 
RemoveCameraHost(const std::string & svcName)1116 void HCameraHostManager::RemoveCameraHost(const std::string& svcName)
1117 {
1118     std::lock_guard<std::mutex> lock(mutex_);
1119     MEDIA_INFO_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s removed", svcName.c_str());
1120     std::vector<sptr<CameraHostInfo>>::iterator it = std::find_if(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1121         [&svcName](const auto& camHost) { return camHost->GetName() == svcName; });
1122     if (it == cameraHostInfos_.end()) {
1123         MEDIA_WARNING_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s doesn't exist",
1124             svcName.c_str());
1125         return;
1126     }
1127     std::vector<std::string> cameraIds;
1128     if ((*it)->GetCameras(cameraIds) == CAMERA_OK) {
1129         for (const auto& cameraId : cameraIds) {
1130             (*it)->OnCameraStatus(cameraId, UN_AVAILABLE);
1131             CloseCameraDevice(cameraId);
1132         }
1133     }
1134     *it = nullptr;
1135     cameraHostInfos_.erase(it);
1136     auto statusCallback = statusCallback_.lock();
1137     CHECK_EXECUTE(statusCallback && svcName == LOCAL_SERVICE_NAME,
1138         statusCallback->OnTorchStatus(TORCH_STATUS_UNAVAILABLE));
1139 }
1140 
FindCameraHostInfo(const std::string & cameraId)1141 sptr<HCameraHostManager::CameraHostInfo> HCameraHostManager::FindCameraHostInfo(const std::string& cameraId)
1142 {
1143     std::lock_guard<std::mutex> lock(mutex_);
1144     for (const auto& cameraHostInfo : cameraHostInfos_) {
1145         CHECK_ERROR_RETURN_RET(cameraHostInfo->IsCameraSupported(cameraId), cameraHostInfo);
1146     }
1147     return nullptr;
1148 }
1149 
FindLocalCameraHostInfo()1150 sptr<HCameraHostManager::CameraHostInfo> HCameraHostManager::FindLocalCameraHostInfo()
1151 {
1152     std::lock_guard<std::mutex> lock(mutex_);
1153     std::vector<sptr<CameraHostInfo>>::iterator it = std::find_if(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1154         [](const auto& cameraHostInfo) { return cameraHostInfo->GetName() == LOCAL_SERVICE_NAME; });
1155     CHECK_ERROR_RETURN_RET(it != cameraHostInfos_.end(), (*it));
1156     return nullptr;
1157 }
1158 
IsCameraHostInfoAdded(const std::string & svcName)1159 bool HCameraHostManager::IsCameraHostInfoAdded(const std::string& svcName)
1160 {
1161     std::lock_guard<std::mutex> lock(mutex_);
1162     return std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1163                        [&svcName](const auto& camHost) {return camHost->GetName() == svcName; });
1164 }
1165 
GetRegisterServStatListener()1166 ::OHOS::sptr<HDI::ServiceManager::V1_0::IServStatListener> HCameraHostManager::GetRegisterServStatListener()
1167 {
1168     return registerServStatListener_;
1169 }
1170 
SetMuteMode(bool muteMode)1171 void HCameraHostManager::SetMuteMode(bool muteMode)
1172 {
1173     muteMode_ = muteMode;
1174 }
1175 
GetCameraResourceCost(const std::string & cameraId,OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost & resourceCost)1176 int32_t HCameraHostManager::GetCameraResourceCost(const std::string& cameraId,
1177     OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)
1178 {
1179     auto cameraHostInfo = FindCameraHostInfo(cameraId);
1180     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
1181         "HCameraHostManager::GetCameraResourceCost failed with invalid device info");
1182     return cameraHostInfo->GetCameraResourceCost(cameraId, resourceCost);
1183 }
1184 
OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus & status)1185 void RegisterServStatListener::OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status)
1186 {
1187     MEDIA_INFO_LOG("HCameraHostManager::OnReceive for camerahost %{public}s, status %{public}d, deviceClass %{public}d",
1188         status.serviceName.c_str(), status.status, status.deviceClass);
1189 
1190     CHECK_ERROR_RETURN_LOG(status.deviceClass != DEVICE_CLASS_CAMERA,
1191         "HCameraHostManager::OnReceive invalid device class %{public}d", status.deviceClass);
1192     callback_(status);
1193 }
1194 
GetPhysicCameraId(int32_t position,std::string & cameraid)1195 void HCameraHostManager::GetPhysicCameraId(int32_t position, std::string &cameraid)
1196 {
1197     std::vector<std::string> cameraIds;
1198     MEDIA_DEBUG_LOG("GetPhysicCameraId target position %{public}d", position);
1199     GetCameraIdSortedByCameraType(cameraIds);
1200     for (auto iterOfCameraIds : cameraIds) {
1201         std::shared_ptr<OHOS::Camera::CameraMetadata> ability;
1202         GetCameraAbility(iterOfCameraIds, ability);
1203         camera_metadata_item_t itemp;
1204         int issup = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CAMERA_CONCURRENT_TYPE, &itemp);
1205         MEDIA_DEBUG_LOG("GetPhysicCameraId cameraid = %{public}s CONCURRENT_TYPE is support limted = %{public}d",
1206             iterOfCameraIds.c_str(), issup);
1207         issup = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CONCURRENT_SUPPORTED_CAMERAS, &itemp);
1208         MEDIA_DEBUG_LOG("GetPhysicCameraId cameraid = %{public}s CONCURRENT_SUPPORTED_CAMERAS"
1209             "is support limted = %{public}d",
1210             iterOfCameraIds.c_str(), issup);
1211         issup = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CAMERA_LIMITED_CAPABILITIES, &itemp);
1212         MEDIA_DEBUG_LOG("GetPhysicCameraId cameraid = %{public}s LIMITED_CAPABILITIES "
1213             "is support limted = %{public}d",
1214             iterOfCameraIds.c_str(), issup);
1215 
1216         int32_t positionNow;
1217         int32_t cameratypeNow;
1218         camera_metadata_item_t item;
1219         int ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CAMERA_POSITION, &item);
1220         positionNow = (ret == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_POSITION_OTHER;
1221         ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CAMERA_TYPE, &item);
1222         cameratypeNow = (ret == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_TYPE_UNSPECIFIED;
1223         if (positionNow != position || cameratypeNow == OHOS_CAMERA_TYPE_UNSPECIFIED) {
1224             MEDIA_DEBUG_LOG("iter cameraId : %{public}s continue, position: %{public}d, type: %{public}d",
1225                 iterOfCameraIds.c_str(), positionNow, cameratypeNow);
1226             continue;
1227         }
1228         ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_ABILITY_CONCURRENT_SUPPORTED_CAMERAS, &item);
1229         if (ret == CAM_META_SUCCESS) {
1230             cameraid = iterOfCameraIds;
1231             break;
1232         }
1233     }
1234 }
1235 } // namespace CameraStandard
1236 } // namespace OHOS
1237