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