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