• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "v1_0/icamera_host_callback.h"
19 #include "metadata_utils.h"
20 #include "camera_util.h"
21 #include "hdf_io_service_if.h"
22 #include "iproxy_broker.h"
23 #include "iservmgr_hdi.h"
24 #include "camera_log.h"
25 
26 namespace OHOS {
27 namespace CameraStandard {
28 struct HCameraHostManager::CameraDeviceInfo {
29     std::string cameraId;
30     std::shared_ptr<OHOS::Camera::CameraMetadata> ability;
31     std::mutex mutex;
32 
CameraDeviceInfoOHOS::CameraStandard::HCameraHostManager::CameraDeviceInfo33     explicit CameraDeviceInfo(const std::string& cameraId, sptr<ICameraDevice> device = nullptr)
34         : cameraId(cameraId), ability(nullptr)
35     {
36     }
37 
38     ~CameraDeviceInfo() = default;
39 };
40 
41 class HCameraHostManager::CameraHostInfo : public ICameraHostCallback {
42 public:
43     class CameraHostDeathRecipient : public IRemoteObject::DeathRecipient {
44     public:
CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> & hostInfo)45         explicit CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> &hostInfo)
46             : cameraHostInfo_(hostInfo) {};
47         virtual ~CameraHostDeathRecipient() = default;
OnRemoteDied(const wptr<IRemoteObject> & remote)48         void OnRemoteDied(const wptr<IRemoteObject> &remote) override
49         {
50             MEDIA_ERR_LOG("Remote died, do clean works.");
51             if (cameraHostInfo_ == nullptr) {
52                 return;
53             }
54             cameraHostInfo_->CameraHostDied();
55         }
56 
57     private:
58         sptr<HCameraHostManager::CameraHostInfo> cameraHostInfo_;
59     };
60 
61     explicit CameraHostInfo(HCameraHostManager* cameraHostManager, std::string name);
62     ~CameraHostInfo();
63     bool Init();
64     void CameraHostDied();
65     bool IsCameraSupported(const std::string& cameraId);
66     const std::string& GetName();
67     int32_t GetCameras(std::vector<std::string>& cameraIds);
68     int32_t GetCameraAbility(std::string& cameraId, std::shared_ptr<OHOS::Camera::CameraMetadata>& ability);
69     int32_t OpenCamera(std::string& cameraId, const sptr<ICameraDeviceCallback>& callback,
70                        sptr<ICameraDevice>& pDevice);
71     int32_t SetFlashlight(const std::string& cameraId, bool isEnable);
72 
73     // CameraHostCallbackStub
74     int32_t OnCameraStatus(const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status) override;
75     int32_t OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status) override;
76     int32_t OnCameraEvent(const std::string &cameraId, CameraEvent event) override;
77 
78 private:
79     std::shared_ptr<CameraDeviceInfo> FindCameraDeviceInfo(const std::string& cameraId);
80     void AddDevice(const std::string& cameraId);
81     void RemoveDevice(const std::string& cameraId);
82 
83     HCameraHostManager* cameraHostManager_;
84     std::string name_;
85     sptr<ICameraHost> cameraHostProxy_;
86 
87     std::mutex mutex_;
88     std::vector<std::string> cameraIds_;
89     std::vector<std::shared_ptr<CameraDeviceInfo>> devices_;
90 };
91 
CameraHostInfo(HCameraHostManager * cameraHostManager,std::string name)92 HCameraHostManager::CameraHostInfo::CameraHostInfo(HCameraHostManager* cameraHostManager, std::string name)
93     : cameraHostManager_(cameraHostManager), name_(std::move(name)), cameraHostProxy_(nullptr)
94 {
95 }
96 
~CameraHostInfo()97 HCameraHostManager::CameraHostInfo::~CameraHostInfo()
98 {
99     std::lock_guard<std::mutex> lock(mutex_);
100     MEDIA_INFO_LOG("CameraHostInfo ~CameraHostInfo");
101     cameraHostManager_ = nullptr;
102     cameraHostProxy_ = nullptr;
103     for (unsigned i = 0; i < devices_.size(); i++) {
104         devices_.at(i) = nullptr;
105     }
106     cameraIds_.clear();
107     devices_.clear();
108 }
109 
Init()110 bool HCameraHostManager::CameraHostInfo::Init()
111 {
112     if (cameraHostProxy_ != nullptr) {
113         MEDIA_ERR_LOG("CameraHostInfo::Init, no camera host proxy");
114         return true;
115     }
116     cameraHostProxy_ = ICameraHost::Get(name_.c_str(), false);
117     if (cameraHostProxy_ == nullptr) {
118         MEDIA_ERR_LOG("Failed to get ICameraHost");
119         return false;
120     }
121     cameraHostProxy_->SetCallback(this);
122     sptr<CameraHostDeathRecipient> cameraHostDeathRecipient = new CameraHostDeathRecipient(this);
123     const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ICameraHost>(cameraHostProxy_);
124     bool result = remote->AddDeathRecipient(cameraHostDeathRecipient);
125     if (!result) {
126         MEDIA_ERR_LOG("AddDeathRecipient for CameraHost failed.");
127     }
128 
129     std::lock_guard<std::mutex> lock(mutex_);
130     CamRetCode ret = (CamRetCode)(cameraHostProxy_->GetCameraIds(cameraIds_));
131     if (ret != HDI::Camera::V1_0::NO_ERROR) {
132         MEDIA_ERR_LOG("Init, GetCameraIds failed, ret = %{public}d", ret);
133         return false;
134     }
135     for (const auto& cameraId : cameraIds_) {
136         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
137     }
138     return true;
139 }
140 
CameraHostDied()141 void HCameraHostManager::CameraHostInfo::CameraHostDied()
142 {
143     if (cameraHostManager_ == nullptr) {
144         MEDIA_ERR_LOG("CameraHostInfo::cameraHostManager is null.");
145         return;
146     }
147     cameraHostManager_->RemoveCameraHost(name_);
148 }
149 
IsCameraSupported(const std::string & cameraId)150 bool HCameraHostManager::CameraHostInfo::IsCameraSupported(const std::string& cameraId)
151 {
152     std::lock_guard<std::mutex> lock(mutex_);
153     return std::any_of(cameraIds_.begin(), cameraIds_.end(),
154                        [&cameraId](const auto& camId) { return camId == cameraId; });
155 }
156 
GetName()157 const std::string& HCameraHostManager::CameraHostInfo::GetName()
158 {
159     return name_;
160 }
161 
GetCameras(std::vector<std::string> & cameraIds)162 int32_t HCameraHostManager::CameraHostInfo::GetCameras(std::vector<std::string>& cameraIds)
163 {
164     std::lock_guard<std::mutex> lock(mutex_);
165     cameraIds.insert(cameraIds.end(), cameraIds_.begin(), cameraIds_.end());
166     return CAMERA_OK;
167 }
168 
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & ability)169 int32_t HCameraHostManager::CameraHostInfo::GetCameraAbility(std::string& cameraId,
170     std::shared_ptr<OHOS::Camera::CameraMetadata>& ability)
171 {
172     auto deviceInfo = FindCameraDeviceInfo(cameraId);
173     if (deviceInfo == nullptr) {
174         MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility deviceInfo is null");
175         return CAMERA_UNKNOWN_ERROR;
176     }
177 
178     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
179     if (deviceInfo->ability) {
180         ability = deviceInfo->ability;
181     } else {
182         if (cameraHostProxy_ == nullptr) {
183             MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility cameraHostProxy_ is null");
184             return CAMERA_UNKNOWN_ERROR;
185         }
186         if (!deviceInfo->ability) {
187             std::vector<uint8_t> cameraAbility;
188             CamRetCode rc = (CamRetCode)(cameraHostProxy_->GetCameraAbility(cameraId, cameraAbility));
189             if (rc != HDI::Camera::V1_0::NO_ERROR) {
190                 MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility failed with error Code:%{public}d", rc);
191                 return HdiToServiceError(rc);
192             }
193             OHOS::Camera::MetadataUtils::ConvertVecToMetadata(cameraAbility, ability);
194             deviceInfo->ability = ability;
195         }
196     }
197     return CAMERA_OK;
198 }
199 
OpenCamera(std::string & cameraId,const sptr<ICameraDeviceCallback> & callback,sptr<ICameraDevice> & pDevice)200 int32_t HCameraHostManager::CameraHostInfo::OpenCamera(std::string& cameraId,
201     const sptr<ICameraDeviceCallback>& callback,
202     sptr<ICameraDevice>& pDevice)
203 {
204     MEDIA_INFO_LOG("CameraHostInfo::OpenCamera %{public}s", cameraId.c_str());
205     auto deviceInfo = FindCameraDeviceInfo(cameraId);
206     if (deviceInfo == nullptr) {
207         MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility deviceInfo is null");
208         return CAMERA_UNKNOWN_ERROR;
209     }
210 
211     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
212     if (cameraHostProxy_ == nullptr) {
213         MEDIA_ERR_LOG("CameraHostInfo::OpenCamera cameraHostProxy_ is null");
214         return CAMERA_UNKNOWN_ERROR;
215     }
216     CamRetCode rc = (CamRetCode)(cameraHostProxy_->OpenCamera(cameraId, callback, pDevice));
217     if (rc != HDI::Camera::V1_0::NO_ERROR) {
218         MEDIA_ERR_LOG("CameraHostInfo::OpenCamera failed with error Code:%{public}d", rc);
219         return HdiToServiceError(rc);
220     }
221     return CAMERA_OK;
222 }
223 
SetFlashlight(const std::string & cameraId,bool isEnable)224 int32_t HCameraHostManager::CameraHostInfo::SetFlashlight(const std::string& cameraId, bool isEnable)
225 {
226     std::lock_guard<std::mutex> lock(mutex_);
227     if (cameraHostProxy_ == nullptr) {
228         MEDIA_ERR_LOG("CameraHostInfo::SetFlashlight cameraHostProxy_ is null");
229         return CAMERA_UNKNOWN_ERROR;
230     }
231     CamRetCode rc = (CamRetCode)(cameraHostProxy_->SetFlashlight(cameraId, isEnable));
232     if (rc != HDI::Camera::V1_0::NO_ERROR) {
233         MEDIA_ERR_LOG("CameraHostInfo::SetFlashlight failed with error Code:%{public}d", rc);
234         return HdiToServiceError(rc);
235     }
236     return CAMERA_OK;
237 }
238 
OnCameraStatus(const std::string & cameraId,HDI::Camera::V1_0::CameraStatus status)239 int32_t HCameraHostManager::CameraHostInfo::OnCameraStatus(const std::string& cameraId,
240                                                            HDI::Camera::V1_0::CameraStatus status)
241 {
242     if ((cameraHostManager_ == nullptr) || (cameraHostManager_->statusCallback_ == nullptr)) {
243         MEDIA_WARNING_LOG("CameraHostInfo::OnCameraStatus for %{public}s with status %{public}d "
244                           "failed due to no callback",
245                           cameraId.c_str(), status);
246         return CAMERA_UNKNOWN_ERROR;
247     }
248     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
249     switch (status) {
250         case UN_AVAILABLE: {
251             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s unavailable", cameraId.c_str());
252             svcStatus = CAMERA_STATUS_UNAVAILABLE;
253             break;
254         }
255         case AVAILABLE: {
256             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s available", cameraId.c_str());
257             svcStatus = CAMERA_STATUS_AVAILABLE;
258             AddDevice(cameraId);
259             break;
260         }
261         default:
262             MEDIA_ERR_LOG("Unknown camera status: %{public}d", status);
263             return CAMERA_UNKNOWN_ERROR;
264     }
265     cameraHostManager_->statusCallback_->OnCameraStatus(cameraId, svcStatus);
266     return CAMERA_OK;
267 }
268 
OnFlashlightStatus(const std::string & cameraId,FlashlightStatus status)269 int32_t HCameraHostManager::CameraHostInfo::OnFlashlightStatus(const std::string& cameraId,
270     FlashlightStatus status)
271 {
272     if ((cameraHostManager_ == nullptr) || (cameraHostManager_->statusCallback_ == nullptr)) {
273         MEDIA_WARNING_LOG("CameraHostInfo::OnFlashlightStatus for %{public}s with status %{public}d "
274                           "failed due to no callback or cameraHostManager_ is null",
275                           cameraId.c_str(), status);
276         return CAMERA_UNKNOWN_ERROR;
277     }
278     FlashStatus flashStatus = FLASH_STATUS_OFF;
279     switch (status) {
280         case FLASHLIGHT_OFF:
281             flashStatus = FLASH_STATUS_OFF;
282             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is off",
283                            cameraId.c_str());
284             break;
285 
286         case FLASHLIGHT_ON:
287             flashStatus = FLASH_STATUS_ON;
288             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is on",
289                            cameraId.c_str());
290             break;
291 
292         case FLASHLIGHT_UNAVAILABLE:
293             flashStatus = FLASH_STATUS_UNAVAILABLE;
294             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is unavailable",
295                            cameraId.c_str());
296             break;
297 
298         default:
299             MEDIA_ERR_LOG("Unknown flashlight status: %{public}d for camera %{public}s", status, cameraId.c_str());
300             return CAMERA_UNKNOWN_ERROR;
301     }
302     cameraHostManager_->statusCallback_->OnFlashlightStatus(cameraId, flashStatus);
303     return CAMERA_OK;
304 }
305 
OnCameraEvent(const std::string & cameraId,CameraEvent event)306 int32_t HCameraHostManager::CameraHostInfo::OnCameraEvent(const std::string &cameraId, CameraEvent event)
307 {
308     if ((cameraHostManager_ == nullptr) || (cameraHostManager_->statusCallback_ == nullptr)) {
309         MEDIA_WARNING_LOG("CameraHostInfo::OnCameraEvent for %{public}s with status %{public}d "
310                           "failed due to no callback or cameraHostManager_ is null",
311                           cameraId.c_str(), event);
312         return CAMERA_UNKNOWN_ERROR;
313     }
314     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
315     switch (event) {
316         case CAMERA_EVENT_DEVICE_RMV: {
317             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent, camera %{public}s unavailable", cameraId.c_str());
318             svcStatus = CAMERA_STATUS_UNAVAILABLE;
319             RemoveDevice(cameraId);
320             break;
321         }
322         case CAMERA_EVENT_DEVICE_ADD: {
323             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent camera %{public}s available", cameraId.c_str());
324             svcStatus = CAMERA_STATUS_AVAILABLE;
325             AddDevice(cameraId);
326             break;
327         }
328         default:
329             MEDIA_ERR_LOG("Unknown camera event: %{public}d", event);
330             return CAMERA_UNKNOWN_ERROR;
331     }
332     cameraHostManager_->statusCallback_->OnCameraStatus(cameraId, svcStatus);
333     return CAMERA_OK;
334 }
335 
FindCameraDeviceInfo(const std::string & cameraId)336 std::shared_ptr<HCameraHostManager::CameraDeviceInfo> HCameraHostManager::CameraHostInfo::FindCameraDeviceInfo
337    (const std::string& cameraId)
338 {
339     std::lock_guard<std::mutex> lock(mutex_);
340     for (const auto& deviceInfo : devices_) {
341         if (deviceInfo->cameraId == cameraId) {
342             MEDIA_INFO_LOG("CameraHostInfo::FindCameraDeviceInfo succeed for %{public}s", cameraId.c_str());
343             return deviceInfo;
344         }
345     }
346     MEDIA_WARNING_LOG("CameraHostInfo::FindCameraDeviceInfo failed for %{public}s", cameraId.c_str());
347     return nullptr;
348 }
349 
AddDevice(const std::string & cameraId)350 void HCameraHostManager::CameraHostInfo::AddDevice(const std::string& cameraId)
351 {
352     std::lock_guard<std::mutex> lock(mutex_);
353     cameraIds_.push_back(cameraId);
354     if (std::none_of(devices_.begin(), devices_.end(),
355                      [&cameraId](auto& devInfo) { return devInfo->cameraId == cameraId; })) {
356         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
357         MEDIA_INFO_LOG("CameraHostInfo::AddDevice, camera %{public}s added", cameraId.c_str());
358     } else {
359         MEDIA_WARNING_LOG("CameraHostInfo::AddDevice, camera %{public}s already exists", cameraId.c_str());
360     }
361 }
362 
RemoveDevice(const std::string & cameraId)363 void HCameraHostManager::CameraHostInfo::RemoveDevice(const std::string& cameraId)
364 {
365     std::lock_guard<std::mutex> lock(mutex_);
366     cameraIds_.erase(std::remove(cameraIds_.begin(), cameraIds_.end(), cameraId), cameraIds_.end());
367     devices_.erase(std::remove_if(devices_.begin(), devices_.end(),
368         [&cameraId](const auto& devInfo) { return devInfo->cameraId == cameraId; }),
369         devices_.end());
370 }
371 
HCameraHostManager(StatusCallback * statusCallback)372 HCameraHostManager::HCameraHostManager(StatusCallback* statusCallback)
373     : statusCallback_(statusCallback), cameraHostInfos_()
374 {
375 }
376 
~HCameraHostManager()377 HCameraHostManager::~HCameraHostManager()
378 {
379     std::lock_guard<std::mutex> lock(deviceMutex_);
380     statusCallback_ = nullptr;
381     for (auto it = cameraDevices_.begin(); it != cameraDevices_.end(); it++) {
382         if (it->second) {
383             it->second = nullptr;
384         }
385     }
386     cameraDevices_.clear();
387 
388     for (unsigned i = 0; i < cameraHostInfos_.size(); i++) {
389         cameraHostInfos_[i] = nullptr;
390     }
391     cameraHostInfos_.clear();
392 }
393 
Init()394 int32_t HCameraHostManager::Init()
395 {
396     MEDIA_INFO_LOG("HCameraHostManager::Init");
397     using namespace OHOS::HDI::ServiceManager::V1_0;
398     auto svcMgr = IServiceManager::Get();
399     if (svcMgr == nullptr) {
400         MEDIA_ERR_LOG("%s: IServiceManager failed!", __func__);
401         return CAMERA_UNKNOWN_ERROR;
402     }
403     auto rt = svcMgr->RegisterServiceStatusListener(this, DEVICE_CLASS_CAMERA);
404     if (rt != 0) {
405         MEDIA_ERR_LOG("%s: RegisterServiceStatusListener failed!", __func__);
406     }
407     return rt == 0 ? CAMERA_OK : CAMERA_UNKNOWN_ERROR;
408 }
409 
DeInit()410 void HCameraHostManager::DeInit()
411 {
412     using namespace OHOS::HDI::ServiceManager::V1_0;
413     auto svcMgr = IServiceManager::Get();
414     if (svcMgr == nullptr) {
415         MEDIA_ERR_LOG("%s: IServiceManager failed", __func__);
416         return;
417     }
418     auto rt = svcMgr->UnregisterServiceStatusListener(this);
419     if (rt != 0) {
420         MEDIA_ERR_LOG("%s: UnregisterServiceStatusListener failed!", __func__);
421     }
422 }
423 
AddCameraDevice(const std::string & cameraId,sptr<ICameraDeviceService> cameraDevice)424 void HCameraHostManager::AddCameraDevice(const std::string& cameraId, sptr<ICameraDeviceService> cameraDevice)
425 {
426     std::lock_guard<std::mutex> lock(deviceMutex_);
427     auto it = cameraDevices_.find(cameraId);
428     if (it != cameraDevices_.end()) {
429         it->second = nullptr;
430         cameraDevices_.erase(cameraId);
431     }
432     cameraDevices_[cameraId] = cameraDevice;
433 }
434 
RemoveCameraDevice(const std::string & cameraId)435 void HCameraHostManager::RemoveCameraDevice(const std::string& cameraId)
436 {
437     std::lock_guard<std::mutex> lock(deviceMutex_);
438     auto it = cameraDevices_.find(cameraId);
439     if (it != cameraDevices_.end()) {
440         it->second = nullptr;
441     }
442     cameraDevices_.erase(cameraId);
443 }
444 
CloseCameraDevice(const std::string & cameraId)445 void HCameraHostManager::CloseCameraDevice(const std::string& cameraId)
446 {
447     sptr<ICameraDeviceService> deviceToDisconnect = nullptr;
448     {
449         std::lock_guard<std::mutex> lock(deviceMutex_);
450         auto iter = cameraDevices_.find(cameraId);
451         if (iter != cameraDevices_.end()) {
452             deviceToDisconnect = iter->second;
453         }
454     }
455     if (deviceToDisconnect) {
456         deviceToDisconnect->Close();
457     }
458 }
459 
GetCameras(std::vector<std::string> & cameraIds)460 int32_t HCameraHostManager::GetCameras(std::vector<std::string>& cameraIds)
461 {
462     CAMERA_SYNC_TRACE;
463     MEDIA_INFO_LOG("HCameraHostManager::GetCameras");
464     if (!IsCameraHostInfoAdded("camera_service")) {
465         AddCameraHost("camera_service");
466     }
467     std::lock_guard<std::mutex> lock(mutex_);
468     cameraIds.clear();
469     for (const auto& cameraHost : cameraHostInfos_) {
470         cameraHost->GetCameras(cameraIds);
471     }
472     return CAMERA_OK;
473 }
474 
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & ability)475 int32_t HCameraHostManager::GetCameraAbility(std::string &cameraId,
476                                              std::shared_ptr<OHOS::Camera::CameraMetadata> &ability)
477 {
478     auto cameraHostInfo = FindCameraHostInfo(cameraId);
479     if (cameraHostInfo == nullptr) {
480         MEDIA_ERR_LOG("HCameraHostManager::OpenCameraDevice failed with invalid device info.");
481         return CAMERA_INVALID_ARG;
482     }
483     return cameraHostInfo->GetCameraAbility(cameraId, ability);
484 }
485 
CameraConflictDetection(const std::string & cameraId)486 std::vector<sptr<ICameraDeviceService>> HCameraHostManager::CameraConflictDetection(const std::string& cameraId)
487 {
488     std::vector<sptr<ICameraDeviceService>> devicesNeedClose;
489     {
490         std::lock_guard<std::mutex> lock(deviceMutex_);
491         for (auto it = cameraDevices_.begin(); it != cameraDevices_.end(); it++) {
492             if (it->second != nullptr) {
493                 if (it->first == cameraId) {
494                     MEDIA_INFO_LOG("HCameraHostManager::CameraConflictDetection current camera [%{public}s] has Opened,"
495                                    "need close", it->first.c_str());
496                 } else {
497                     MEDIA_INFO_LOG("HCameraHostManager::CameraConflictDetection other camera [%{public}s] has Opened,"
498                                    "need close", it->first.c_str());
499                 }
500                 devicesNeedClose.push_back(it->second);
501             } else {
502                 MEDIA_ERR_LOG("HCameraHostManager::CameraConflictDetection cameraDevice [%{public}s] is null",
503                               it->first.c_str());
504             }
505         }
506     }
507     return devicesNeedClose;
508 }
509 
OpenCameraDevice(std::string & cameraId,const sptr<ICameraDeviceCallback> & callback,sptr<ICameraDevice> & pDevice)510 int32_t HCameraHostManager::OpenCameraDevice(std::string &cameraId,
511                                              const sptr<ICameraDeviceCallback> &callback,
512                                              sptr<ICameraDevice> &pDevice)
513 {
514     MEDIA_INFO_LOG("HCameraHostManager::OpenCameraDevice try to open camera = %{public}s", cameraId.c_str());
515     auto cameraHostInfo = FindCameraHostInfo(cameraId);
516     if (cameraHostInfo == nullptr) {
517         MEDIA_ERR_LOG("HCameraHostManager::OpenCameraDevice failed with invalid device info");
518         return CAMERA_INVALID_ARG;
519     }
520     return cameraHostInfo->OpenCamera(cameraId, callback, pDevice);
521 }
522 
SetFlashlight(const std::string & cameraId,bool isEnable)523 int32_t HCameraHostManager::SetFlashlight(const std::string& cameraId, bool isEnable)
524 {
525     auto cameraHostInfo = FindCameraHostInfo(cameraId);
526     if (cameraHostInfo == nullptr) {
527         MEDIA_ERR_LOG("HCameraHostManager::OpenCameraDevice failed with invalid device info");
528         return CAMERA_INVALID_ARG;
529     }
530     return cameraHostInfo->SetFlashlight(cameraId, isEnable);
531 }
532 
OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus & status)533 void HCameraHostManager::OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status)
534 {
535     MEDIA_INFO_LOG("HCameraHostManager::OnReceive for camera host %{public}s, status %{public}d",
536         status.serviceName.c_str(), status.status);
537     if (status.deviceClass != DEVICE_CLASS_CAMERA || status.serviceName != "distributed_camera_service") {
538         MEDIA_ERR_LOG("HCameraHostManager::OnReceive invalid device class %{public}d", status.deviceClass);
539         return;
540     }
541     using namespace OHOS::HDI::ServiceManager::V1_0;
542     switch (status.status) {
543         case SERVIE_STATUS_START:
544             AddCameraHost(status.serviceName);
545             break;
546         case SERVIE_STATUS_STOP:
547             RemoveCameraHost(status.serviceName);
548             break;
549         default:
550             MEDIA_ERR_LOG("HCameraHostManager::OnReceive unexpected service status %{public}d", status.status);
551     }
552 }
553 
AddCameraHost(const std::string & svcName)554 void HCameraHostManager::AddCameraHost(const std::string& svcName)
555 {
556     MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host %{public}s added", svcName.c_str());
557     std::lock_guard<std::mutex> lock(mutex_);
558     if (std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
559                     [&svcName](const auto& camHost) { return camHost->GetName() == svcName; })) {
560         MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host  %{public}s already exists", svcName.c_str());
561         return;
562     }
563     sptr<HCameraHostManager::CameraHostInfo> cameraHost = new(std::nothrow) HCameraHostManager::CameraHostInfo
564                                                           (this, svcName);
565     if (!cameraHost->Init()) {
566         MEDIA_ERR_LOG("HCameraHostManager::AddCameraHost failed due to init failure");
567         return;
568     }
569     cameraHostInfos_.push_back(cameraHost);
570     std::vector<std::string> cameraIds;
571     if (statusCallback_ && cameraHost->GetCameras(cameraIds) == CAMERA_OK) {
572         for (const auto& cameraId : cameraIds) {
573             statusCallback_->OnCameraStatus(cameraId, CAMERA_STATUS_AVAILABLE);
574         }
575     }
576 }
577 
RemoveCameraHost(const std::string & svcName)578 void HCameraHostManager::RemoveCameraHost(const std::string& svcName)
579 {
580     MEDIA_INFO_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s removed", svcName.c_str());
581     std::lock_guard<std::mutex> lock(mutex_);
582     auto it = std::find_if(cameraHostInfos_.begin(), cameraHostInfos_.end(),
583                            [&svcName](const auto& camHost) { return camHost->GetName() == svcName; });
584     if (it == cameraHostInfos_.end()) {
585         MEDIA_WARNING_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s doesn't exist", svcName.c_str());
586         return;
587     }
588     std::vector<std::string> cameraIds;
589     if ((*it)->GetCameras(cameraIds) == CAMERA_OK) {
590         for (const auto& cameraId : cameraIds) {
591             (*it)->OnCameraStatus(cameraId, UN_AVAILABLE);
592             CloseCameraDevice(cameraId);
593         }
594     }
595     *it = nullptr;
596     cameraHostInfos_.erase(it);
597 }
598 
FindCameraHostInfo(const std::string & cameraId)599 sptr<HCameraHostManager::CameraHostInfo> HCameraHostManager::FindCameraHostInfo(const std::string& cameraId)
600 {
601     std::lock_guard<std::mutex> lock(mutex_);
602     for (const auto& cameraHostInfo : cameraHostInfos_) {
603         if (cameraHostInfo->IsCameraSupported(cameraId)) {
604             return cameraHostInfo;
605         }
606     }
607     return nullptr;
608 }
609 
IsCameraHostInfoAdded(const std::string & svcName)610 bool HCameraHostManager::IsCameraHostInfoAdded(const std::string& svcName)
611 {
612     return std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
613                        [&svcName](const auto& camHost) {return camHost->GetName() == svcName; });
614 }
615 } // namespace CameraStandard
616 } // namespace OHOS
617