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_device.h"
17
18 #include <cstdint>
19 #include <memory>
20 #include <mutex>
21 #include <nlohmann/json.hpp>
22 #include <vector>
23
24 #include "camera_device_ability_items.h"
25 #include "camera_error_code.h"
26 #include "camera_log.h"
27 #include "camera_fwk_metadata_utils.h"
28 #include "camera_metadata_info.h"
29 #include "camera_metadata_operator.h"
30 #include "camera_service_ipc_interface_code.h"
31 #include "camera_util.h"
32 #include "device_protection_ability_connection.h"
33 #include "display_manager.h"
34 #include "extension_manager_client.h"
35 #include "hcamera_device_manager.h"
36 #include "ipc_skeleton.h"
37 #include "ipc_types.h"
38 #ifdef MEMMGR_OVERRID
39 #include "mem_mgr_client.h"
40 #include "mem_mgr_constant.h"
41 #endif
42 #include "metadata_utils.h"
43 #include "v1_0/types.h"
44 #include "os_account_manager.h"
45 #include "deferred_processing_service.h"
46 #include "iservice_registry.h"
47 #include "system_ability_definition.h"
48 #include "camera_timer.h"
49 #include "camera_report_uitls.h"
50 #include "common_event_manager.h"
51 #include "common_event_support.h"
52 #include "common_event_data.h"
53 #include "want.h"
54
55 namespace OHOS {
56 namespace CameraStandard {
57 using namespace OHOS::HDI::Camera::V1_0;
58 std::mutex HCameraDevice::g_deviceOpenCloseMutex_;
59 static const int32_t DEFAULT_SETTING_ITEM_COUNT = 100;
60 static const int32_t DEFAULT_SETTING_ITEM_LENGTH = 100;
61 static const float SMOOTH_ZOOM_DIVISOR = 100.0f;
62 static const std::vector<camera_device_metadata_tag> DEVICE_OPEN_LIFECYCLE_TAGS = { OHOS_CONTROL_MUTE_MODE };
63 constexpr int32_t DEFAULT_USER_ID = -1;
64 static const uint32_t DEVICE_EJECT_LIMIT = 5;
65 static const uint32_t DEVICE_EJECT_INTERVAL = 1000;
66 static const uint32_t SYSDIALOG_ZORDER_UPPER = 2;
67 sptr<OHOS::Rosen::DisplayManager::IFoldStatusListener> listener;
68 CallerInfo caller_;
69
70 const std::vector<std::tuple<uint32_t, std::string, std::string>> HCameraDevice::reportTagInfos_ = {
71 {OHOS_CONTROL_FLASH_MODE, "OHOS_CONTROL_FLASH_MODE", DFX_UB_SET_FLASHMODE},
72 {OHOS_CONTROL_FOCUS_MODE, "OHOS_CONTROL_FOCUS_MODE", DFX_UB_SET_FOCUSMODE},
73 {OHOS_CONTROL_QUALITY_PRIORITIZATION, "OHOS_CONTROL_QUALITY_PRIORITIZATION", DFX_UB_SET_QUALITY_PRIORITIZATION},
74 {OHOS_CONTROL_EXPOSURE_MODE, "OHOS_CONTROL_EXPOSURE_MODE", DFX_UB_SET_EXPOSUREMODE},
75 {OHOS_CONTROL_VIDEO_STABILIZATION_MODE, "OHOS_CONTROL_VIDEO_STABILIZATION_MODE", DFX_UB_SET_VIDEOSTABILIZATIONMODE},
76 {OHOS_CONTROL_FILTER_TYPE, "OHOS_CONTROL_FILTER_TYPE", DFX_UB_SET_FILTER},
77 {OHOS_CONTROL_PORTRAIT_EFFECT_TYPE, "OHOS_CONTROL_PORTRAIT_EFFECT_TYPE", DFX_UB_SET_PORTRAITEFFECT},
78 {OHOS_CONTROL_BEAUTY_AUTO_VALUE, "OHOS_CONTROL_BEAUTY_AUTO_VALUE", DFX_UB_SET_BEAUTY_AUTOVALUE},
79 {OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, "OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE", DFX_UB_SET_BEAUTY_SKINSMOOTH},
80 {OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, "OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE", DFX_UB_SET_BEAUTY_FACESLENDER},
81 {OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, "OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE", DFX_UB_SET_BEAUTY_SKINTONE},
82 {OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, "OHOS_CONTROL_AE_EXPOSURE_COMPENSATION", DFX_UB_SET_EXPOSUREBIAS},
83 {OHOS_CONTROL_FPS_RANGES, "OHOS_CONTROL_FPS_RANGES", DFX_UB_SET_FRAMERATERANGE},
84 {OHOS_CONTROL_ZOOM_RATIO, "OHOS_CONTROL_ZOOM_RATIO", DFX_UB_SET_ZOOMRATIO},
85 {OHOS_CONTROL_BEAUTY_TYPE, "OHOS_CONTROL_BEAUTY_TYPE", DFX_UB_NOT_REPORT},
86 {OHOS_CONTROL_LIGHT_PAINTING_TYPE, "OHOS_CONTROL_LIGHT_PAINTING_TYPE", DFX_UB_NOT_REPORT},
87 {OHOS_CONTROL_LIGHT_PAINTING_FLASH, "OHOS_CONTROL_LIGHT_PAINTING_FLASH", DFX_UB_NOT_REPORT},
88 {OHOS_CONTROL_MANUAL_EXPOSURE_TIME, "OHOS_CONTROL_MANUAL_EXPOSURE_TIME", DFX_UB_NOT_REPORT},
89 {OHOS_CONTROL_CAMERA_USED_AS_POSITION, "OHOS_CONTROL_CAMERA_USED_AS_POSITION", DFX_UB_NOT_REPORT},
90 };
91
92 const std::unordered_map<DeviceProtectionStatus, CamServiceError> g_deviceProtectionToServiceError_ = {
93 {OHOS_DEVICE_SWITCH_FREQUENT, CAMERA_DEVICE_SWITCH_FREQUENT},
94 {OHOS_DEVICE_FALL_PROTECTION, CAMERA_DEVICE_LENS_RETRACTED}
95 };
96
97 const std::unordered_map<DeviceProtectionStatus, DeviceProtectionAbilityCallBack> g_deviceProtectionToCallBack_ = {
98 {OHOS_DEVICE_EXTERNAL_PRESS, HCameraDevice::DeviceFaultCallBack},
99 {OHOS_DEVICE_EJECT_BLOCK, HCameraDevice::DeviceEjectCallBack}
100 };
101
102 class HCameraDevice::FoldScreenListener : public OHOS::Rosen::DisplayManager::IFoldStatusListener {
103 public:
FoldScreenListener(sptr<HCameraHostManager> & cameraHostManager,const std::string cameraId)104 explicit FoldScreenListener(sptr<HCameraHostManager> &cameraHostManager, const std::string cameraId)
105 : cameraHostManager_(cameraHostManager), cameraId_(cameraId)
106 {
107 MEDIA_DEBUG_LOG("FoldScreenListener enter");
108 }
109
110 virtual ~FoldScreenListener() = default;
OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)111 void OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus) override
112 {
113 FoldStatus currentFoldStatus = FoldStatus::UNKNOWN_FOLD;
114 if (foldStatus == OHOS::Rosen::FoldStatus::HALF_FOLD) {
115 currentFoldStatus = FoldStatus::EXPAND;
116 }
117 if (cameraHostManager_ == nullptr || mLastFoldStatus == currentFoldStatus) {
118 MEDIA_DEBUG_LOG("no need set fold status");
119 return;
120 }
121 mLastFoldStatus = currentFoldStatus;
122 MEDIA_INFO_LOG("OnFoldStatusChanged, foldStatus: %{public}d", foldStatus);
123 cameraHostManager_->NotifyDeviceStateChangeInfo(DeviceType::FOLD_TYPE, (int)currentFoldStatus);
124 }
125 private:
126 sptr<HCameraHostManager> cameraHostManager_;
127 std::string cameraId_;
128 FoldStatus mLastFoldStatus = FoldStatus::UNKNOWN_FOLD;
129 };
130
HCameraDevice(sptr<HCameraHostManager> & cameraHostManager,std::string cameraID,const uint32_t callingTokenId)131 HCameraDevice::HCameraDevice(
132 sptr<HCameraHostManager>& cameraHostManager, std::string cameraID, const uint32_t callingTokenId)
133 : cachedSettings_(
134 std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_SETTING_ITEM_COUNT, DEFAULT_SETTING_ITEM_LENGTH)),
135 cameraHostManager_(cameraHostManager), cameraID_(cameraID), callerToken_(callingTokenId),
136 deviceOpenLifeCycleSettings_(std::make_shared<OHOS::Camera::CameraMetadata>(
137 DEVICE_OPEN_LIFECYCLE_TAGS.size(), DEFAULT_SETTING_ITEM_LENGTH)), clientUserId_(0), zoomTimerId_(0),
138 deviceMuteMode_(false), isHasOpenSecure(false)
139 {
140 MEDIA_INFO_LOG("HCameraDevice::HCameraDevice Contructor Camera: %{public}s", cameraID.c_str());
141 isOpenedCameraDevice_.store(false);
142 sptr<CameraPrivacy> cameraPrivacy = new CameraPrivacy(this, callingTokenId, IPCSkeleton::GetCallingPid());
143 SetCameraPrivacy(cameraPrivacy);
144 }
145
~HCameraDevice()146 HCameraDevice::~HCameraDevice()
147 {
148 UnPrepareZoom();
149 CameraTimer::GetInstance().Unregister(zoomTimerId_);
150 SetCameraPrivacy(nullptr);
151 {
152 std::lock_guard<std::mutex> lock(movingPhotoStartTimeCallbackLock_);
153 movingPhotoStartTimeCallback_ = nullptr;
154 }
155 {
156 std::lock_guard<std::mutex> lock(movingPhotoEndTimeCallbackLock_);
157 movingPhotoEndTimeCallback_ = nullptr;
158 }
159 MEDIA_INFO_LOG("HCameraDevice::~HCameraDevice Destructor Camera: %{public}s", cameraID_.c_str());
160 }
161
GetCameraId()162 std::string HCameraDevice::GetCameraId()
163 {
164 return cameraID_;
165 }
166
GetCameraType()167 int32_t HCameraDevice::GetCameraType()
168 {
169 if (clientName_ == SYSTEM_CAMERA) {
170 return SYSTEM;
171 }
172 return OTHER;
173 }
174
IsOpenedCameraDevice()175 bool HCameraDevice::IsOpenedCameraDevice()
176 {
177 return isOpenedCameraDevice_.load();
178 }
179
SetDeviceMuteMode(bool muteMode)180 void HCameraDevice::SetDeviceMuteMode(bool muteMode)
181 {
182 deviceMuteMode_ = muteMode;
183 }
184
GetDeviceMuteMode()185 bool HCameraDevice::GetDeviceMuteMode()
186 {
187 return deviceMuteMode_;
188 }
189
EnableMovingPhoto(bool isMovingPhotoEnabled)190 void HCameraDevice::EnableMovingPhoto(bool isMovingPhotoEnabled)
191 {
192 isMovingPhotoEnabled_ = isMovingPhotoEnabled;
193 }
194
CreateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)195 void HCameraDevice::CreateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
196 {
197 constexpr int32_t DEFAULT_ITEMS = 1;
198 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
199 int32_t count = 1;
200 uint8_t mode = OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK;
201 settings = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
202 settings->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
203 }
204
ResetDeviceSettings()205 int32_t HCameraDevice::ResetDeviceSettings()
206 {
207 CAMERA_SYNC_TRACE;
208 sptr<OHOS::HDI::Camera::V1_2::ICameraDevice> hdiCameraDeviceV1_2;
209 MEDIA_INFO_LOG("HCameraDevice::ResetDeviceSettings enter");
210 {
211 std::lock_guard<std::mutex> lock(opMutex_);
212 CHECK_ERROR_RETURN_RET(hdiCameraDevice_ == nullptr, CAMERA_OK);
213 hdiCameraDeviceV1_2 = HDI::Camera::V1_2::ICameraDevice::CastFrom(hdiCameraDevice_);
214 }
215 if (hdiCameraDeviceV1_2 != nullptr) {
216 int32_t errCode = hdiCameraDeviceV1_2->Reset();
217 CHECK_ERROR_RETURN_RET_LOG(errCode != HDI::Camera::V1_0::CamRetCode::NO_ERROR, CAMERA_UNKNOWN_ERROR,
218 "HCameraDevice::ResetDeviceSettings occur error");
219 ResetCachedSettings();
220 if (deviceMuteMode_) {
221 std::shared_ptr<OHOS::Camera::CameraMetadata> settings = nullptr;
222 CreateMuteSetting(settings);
223 UpdateSetting(settings);
224 }
225 }
226 MEDIA_INFO_LOG("HCameraDevice::ResetDeviceSettings end");
227 return CAMERA_OK;
228 }
229
DispatchDefaultSettingToHdi()230 int32_t HCameraDevice::DispatchDefaultSettingToHdi()
231 {
232 CAMERA_SYNC_TRACE;
233 MEDIA_INFO_LOG("HCameraDevice::DispatchDefaultSettingToHdi enter");
234
235 std::shared_ptr<OHOS::Camera::CameraMetadata> lifeCycleSettings;
236 {
237 std::lock_guard<std::mutex> lifeLock(deviceOpenLifeCycleMutex_);
238 if (deviceOpenLifeCycleSettings_->get()->item_count == 0) {
239 MEDIA_INFO_LOG("HCameraDevice::DispatchDefaultSettingToHdi skip, data is empty");
240 return CAMERA_OK;
241 }
242 lifeCycleSettings = CameraFwkMetadataUtils::CopyMetadata(deviceOpenLifeCycleSettings_);
243 }
244
245 if (IsCameraDebugOn()) {
246 auto metadataHeader = lifeCycleSettings->get();
247 for (uint32_t index = 0; index < metadataHeader->item_count; index++) {
248 camera_metadata_item_t item;
249 int32_t result = OHOS::Camera::GetCameraMetadataItem(metadataHeader, index, &item);
250 if (result == CAM_META_SUCCESS) {
251 MEDIA_INFO_LOG("HCameraDevice::DispatchDefaultSettingToHdi tag:%{public}d", item.item);
252 } else {
253 MEDIA_ERR_LOG(
254 "HCameraDevice::DispatchDefaultSettingToHdi tag:%{public}d error:%{public}d", item.item, result);
255 }
256 }
257 }
258
259 std::lock_guard<std::mutex> lock(opMutex_);
260 CHECK_ERROR_RETURN_RET(hdiCameraDevice_ == nullptr, CAMERA_INVALID_STATE);
261 std::vector<uint8_t> hdiMetadata;
262 bool isSuccess = OHOS::Camera::MetadataUtils::ConvertMetadataToVec(lifeCycleSettings, hdiMetadata);
263 CHECK_ERROR_RETURN_RET_LOG(!isSuccess, CAMERA_UNKNOWN_ERROR,
264 "HCameraDevice::DispatchDefaultSettingToHdi metadata ConvertMetadataToVec fail");
265 ReportMetadataDebugLog(lifeCycleSettings);
266 CamRetCode rc = (CamRetCode)hdiCameraDevice_->UpdateSettings(hdiMetadata);
267 if (rc != HDI::Camera::V1_0::NO_ERROR) {
268 MEDIA_ERR_LOG("HCameraDevice::DispatchDefaultSettingToHdi UpdateSettings error: %{public}d", rc);
269 CameraReportUtils::ReportCameraError(
270 "HCameraDevice::DispatchDefaultSettingToHdi", rc, true, CameraReportUtils::GetCallerInfo());
271 return HdiToServiceError(rc);
272 }
273 return CAMERA_OK;
274 }
275
ResetCachedSettings()276 void HCameraDevice::ResetCachedSettings()
277 {
278 std::lock_guard<std::mutex> cachedLock(cachedSettingsMutex_);
279 cachedSettings_ =
280 std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_SETTING_ITEM_COUNT, DEFAULT_SETTING_ITEM_LENGTH);
281 }
282
CloneCachedSettings()283 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraDevice::CloneCachedSettings()
284 {
285 std::lock_guard<std::mutex> cachedLock(cachedSettingsMutex_);
286 return CameraFwkMetadataUtils::CopyMetadata(cachedSettings_);
287 }
288
GetDeviceAbility()289 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraDevice::GetDeviceAbility()
290 {
291 CAMERA_SYNC_TRACE;
292 std::lock_guard<std::mutex> lock(deviceAbilityMutex_);
293 CHECK_ERROR_RETURN_RET(deviceAbility_ != nullptr, deviceAbility_);
294 int32_t errCode = cameraHostManager_->GetCameraAbility(cameraID_, deviceAbility_);
295 CHECK_ERROR_RETURN_RET_LOG(errCode != CAMERA_OK, nullptr,
296 "HCameraDevice::GetSettings Failed to get Camera Ability: %{public}d", errCode);
297 return deviceAbility_;
298 }
299
Open()300 int32_t HCameraDevice::Open()
301 {
302 CAMERA_SYNC_TRACE;
303 std::lock_guard<std::mutex> lock(g_deviceOpenCloseMutex_);
304 CHECK_ERROR_PRINT_LOG(isOpenedCameraDevice_.load(), "HCameraDevice::Open failed, camera is busy");
305 CHECK_ERROR_RETURN_RET_LOG(!IsInForeGround(callerToken_), CAMERA_ALLOC_ERROR,
306 "HCameraDevice::Open IsAllowedUsingPermission failed");
307 MEDIA_INFO_LOG("HCameraDevice::Open Camera:[%{public}s]", cameraID_.c_str());
308 int32_t result = OpenDevice();
309 return result;
310 }
311
OpenSecureCamera(uint64_t * secureSeqId)312 int32_t HCameraDevice::OpenSecureCamera(uint64_t* secureSeqId)
313 {
314 CAMERA_SYNC_TRACE;
315 std::lock_guard<std::mutex> lock(g_deviceOpenCloseMutex_);
316 CHECK_ERROR_PRINT_LOG(isOpenedCameraDevice_.load(), "HCameraDevice::Open failed, camera is busy");
317 CHECK_ERROR_RETURN_RET_LOG(!IsInForeGround(callerToken_), CAMERA_ALLOC_ERROR,
318 "HCameraDevice::Open IsAllowedUsingPermission failed");
319 MEDIA_INFO_LOG("HCameraDevice::OpenSecureCamera Camera:[%{public}s]", cameraID_.c_str());
320 int32_t errCode = OpenDevice(true);
321 auto hdiCameraDeviceV1_3 = HDI::Camera::V1_3::ICameraDevice::CastFrom(hdiCameraDevice_);
322 if (hdiCameraDeviceV1_3 != nullptr) {
323 errCode = hdiCameraDeviceV1_3->GetSecureCameraSeq(*secureSeqId);
324 CHECK_ERROR_RETURN_RET_LOG(errCode != HDI::Camera::V1_0::CamRetCode::NO_ERROR, CAMERA_UNKNOWN_ERROR,
325 "HCameraDevice::GetSecureCameraSeq occur error");
326 mSecureCameraSeqId = *secureSeqId;
327 isHasOpenSecure = true;
328 } else {
329 MEDIA_INFO_LOG("V1_3::ICameraDevice::CastFrom failed");
330 }
331 MEDIA_INFO_LOG("CaptureSession::OpenSecureCamera secureSeqId = %{public}" PRIu64, *secureSeqId);
332 return errCode;
333 }
334
GetSecureCameraSeq(uint64_t * secureSeqId)335 int64_t HCameraDevice::GetSecureCameraSeq(uint64_t* secureSeqId)
336 {
337 if (!isHasOpenSecure) {
338 *secureSeqId = 0;
339 return CAMERA_OK;
340 }
341 auto hdiCameraDeviceV1_3 = HDI::Camera::V1_3::ICameraDevice::CastFrom(hdiCameraDevice_);
342 if (hdiCameraDeviceV1_3 != nullptr) {
343 *secureSeqId = mSecureCameraSeqId;
344 MEDIA_DEBUG_LOG("CaptureSession::GetSecureCameraSeq secureSeqId = %{public}" PRId64, *secureSeqId);
345 return CAMERA_UNKNOWN_ERROR;
346 } else {
347 MEDIA_INFO_LOG("V1_3::ICameraDevice::CastFrom failed");
348 }
349 return CAMERA_OK;
350 }
351
Close()352 int32_t HCameraDevice::Close()
353 {
354 CAMERA_SYNC_TRACE;
355 std::lock_guard<std::mutex> lock(g_deviceOpenCloseMutex_);
356 MEDIA_INFO_LOG("HCameraDevice::Close Closing camera device: %{public}s", cameraID_.c_str());
357 int32_t result = CloseDevice();
358 return result;
359 }
360
OpenDevice(bool isEnableSecCam)361 int32_t HCameraDevice::OpenDevice(bool isEnableSecCam)
362 {
363 MEDIA_INFO_LOG("HCameraDevice::OpenDevice start cameraId: %{public}s", cameraID_.c_str());
364 CAMERA_SYNC_TRACE;
365 int32_t errorCode = CheckPermissionBeforeOpenDevice();
366 CHECK_AND_RETURN_RET(errorCode == CAMERA_OK, errorCode);
367 bool canOpenDevice = CanOpenCamera();
368 CHECK_ERROR_RETURN_RET_LOG(!canOpenDevice, CAMERA_DEVICE_CONFLICT, "HCameraDevice::Refuse to turn on the camera");
369 CHECK_ERROR_RETURN_RET_LOG(!HandlePrivacyBeforeOpenDevice(), CAMERA_OPERATION_NOT_ALLOWED, "privacy not allow!");
370 int pid = IPCSkeleton::GetCallingPid();
371 int uid = IPCSkeleton::GetCallingUid();
372 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, clientUserId_);
373 clientName_ = GetClientBundle(uid);
374 #ifdef MEMMGR_OVERRID
375 RequireMemory(Memory::CAMERA_START);
376 #endif
377 CameraReportUtils::GetInstance().SetOpenCamPerfStartInfo(cameraID_.c_str(), CameraReportUtils::GetCallerInfo());
378 errorCode = cameraHostManager_->OpenCameraDevice(cameraID_, this, hdiCameraDevice_, isEnableSecCam);
379 if (errorCode != CAMERA_OK) {
380 MEDIA_ERR_LOG("HCameraDevice::OpenDevice Failed to open camera");
381 HandlePrivacyWhenOpenDeviceFail();
382 return CAMERA_UNKNOWN_ERROR;
383 } else {
384 ResetHdiStreamId();
385 isOpenedCameraDevice_.store(true);
386 HCameraDeviceManager::GetInstance()->AddDevice(IPCSkeleton::GetCallingPid(), this);
387 }
388 errorCode = InitStreamOperator();
389 CHECK_ERROR_RETURN_RET_LOG(errorCode != CAMERA_OK, errorCode,
390 "HCameraDevice::OpenDevice InitStreamOperator fail err code is:%{public}d", errorCode);
391 std::lock_guard<std::mutex> lockSetting(opMutex_);
392 if (hdiCameraDevice_ != nullptr) {
393 cameraHostManager_->AddCameraDevice(cameraID_, this);
394 if (updateSettings_ != nullptr || deviceMuteMode_) {
395 if (deviceMuteMode_) {
396 CreateMuteSetting(updateSettings_);
397 }
398 errorCode = UpdateDeviceSetting();
399 CHECK_AND_RETURN_RET(errorCode == CAMERA_OK, errorCode);
400 errorCode = HdiToServiceError((CamRetCode)(hdiCameraDevice_->SetResultMode(ON_CHANGED)));
401 }
402 }
403 HandleFoldableDevice();
404 POWERMGR_SYSEVENT_CAMERA_CONNECT(pid, uid, cameraID_.c_str(), clientName_);
405 NotifyCameraSessionStatus(true);
406 NotifyCameraStatus(CAMERA_OPEN);
407 MEDIA_INFO_LOG("HCameraDevice::OpenDevice end cameraId: %{public}s", cameraID_.c_str());
408 return errorCode;
409 }
410
411 #ifdef MEMMGR_OVERRID
RequireMemory(const std::string & reason)412 int32_t HCameraDevice::RequireMemory(const std::string& reason)
413 {
414 int32_t pid = getpid();
415 int32_t requiredMemSizeKB = 0;
416 int32_t ret = Memory::MemMgrClient::GetInstance().RequireBigMem(pid, reason,
417 requiredMemSizeKB, clientName_);
418 MEDIA_INFO_LOG("HCameraDevice::RequireMemory reason:%{public}s, clientName:%{public}s, ret:%{public}d",
419 reason.c_str(), clientName_.c_str(), ret);
420 return ret;
421 }
422 #endif
423
CheckPermissionBeforeOpenDevice()424 int32_t HCameraDevice::CheckPermissionBeforeOpenDevice()
425 {
426 MEDIA_DEBUG_LOG("enter checkPermissionBeforeOpenDevice");
427 if (IsHapTokenId(callerToken_)) {
428 auto cameraPrivacy = GetCameraPrivacy();
429 CHECK_ERROR_RETURN_RET_LOG(cameraPrivacy == nullptr, CAMERA_OPERATION_NOT_ALLOWED, "cameraPrivacy is null");
430 CHECK_ERROR_RETURN_RET_LOG(!cameraPrivacy->IsAllowUsingCamera(), CAMERA_OPERATION_NOT_ALLOWED,
431 "OpenDevice is not allowed!");
432 }
433 return CAMERA_OK;
434 }
435
HandlePrivacyBeforeOpenDevice()436 bool HCameraDevice::HandlePrivacyBeforeOpenDevice()
437 {
438 MEDIA_INFO_LOG("enter HandlePrivacyBeforeOpenDevice");
439 CHECK_ERROR_RETURN_RET_LOG(!IsHapTokenId(callerToken_), true, "system ability called not need privacy");
440 auto cameraPrivacy = GetCameraPrivacy();
441 CHECK_ERROR_RETURN_RET_LOG(cameraPrivacy == nullptr, false, "cameraPrivacy is null");
442 CHECK_ERROR_RETURN_RET_LOG(!cameraPrivacy->StartUsingPermissionCallback(), false, "start using permission failed");
443 CHECK_ERROR_RETURN_RET_LOG(!cameraPrivacy->RegisterPermissionCallback(), false, "register permission failed");
444 CHECK_ERROR_RETURN_RET_LOG(!cameraPrivacy->AddCameraPermissionUsedRecord(), false, "add permission record failed");
445 return true;
446 }
447
HandlePrivacyWhenOpenDeviceFail()448 void HCameraDevice::HandlePrivacyWhenOpenDeviceFail()
449 {
450 MEDIA_INFO_LOG("enter HandlePrivacyWhenOpenDeviceFail");
451 auto cameraPrivacy = GetCameraPrivacy();
452 if (cameraPrivacy != nullptr) {
453 cameraPrivacy->StopUsingPermissionCallback();
454 cameraPrivacy->UnregisterPermissionCallback();
455 }
456 }
457
HandlePrivacyAfterCloseDevice()458 void HCameraDevice::HandlePrivacyAfterCloseDevice()
459 {
460 MEDIA_INFO_LOG("enter HandlePrivacyAfterCloseDevice");
461 auto cameraPrivacy = GetCameraPrivacy();
462 if (cameraPrivacy != nullptr) {
463 cameraPrivacy->StopUsingPermissionCallback();
464 cameraPrivacy->UnregisterPermissionCallback();
465 }
466 }
467
UpdateDeviceSetting()468 int32_t HCameraDevice::UpdateDeviceSetting()
469 {
470 std::vector<uint8_t> setting;
471 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(updateSettings_, setting);
472 ReportMetadataDebugLog(updateSettings_);
473 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->UpdateSettings(setting));
474 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
475 "HCameraDevice::OpenDevice Update setting failed with error Code: %{public}d", rc);
476 updateSettings_ = nullptr;
477 MEDIA_DEBUG_LOG("HCameraDevice::Open Updated device settings");
478 return CAMERA_OK;
479 }
480
ReportDeviceProtectionStatus(const std::shared_ptr<OHOS::Camera::CameraMetadata> & metadata)481 void HCameraDevice::ReportDeviceProtectionStatus(const std::shared_ptr<OHOS::Camera::CameraMetadata> &metadata)
482 {
483 CHECK_ERROR_RETURN_LOG(metadata == nullptr, "metadata is null");
484 camera_metadata_item_t item;
485 int ret = OHOS::Camera::FindCameraMetadataItem(metadata->get(), OHOS_DEVICE_PROTECTION_STATE, &item);
486 if (ret != CAM_META_SUCCESS || item.count == 0) {
487 return;
488 }
489 int32_t status = item.data.i32[0];
490 MEDIA_INFO_LOG("HCameraDevice::ReportDeviceProtectionStatus status: %{public}d", status);
491 if (!CanReportDeviceProtectionStatus(status)) {
492 return;
493 }
494 if (clientName_ == SYSTEM_CAMERA) {
495 auto callback = GetDeviceServiceCallback();
496 auto itr = g_deviceProtectionToServiceError_.find(static_cast<DeviceProtectionStatus>(status));
497 if (itr != g_deviceProtectionToServiceError_.end()) {
498 callback->OnError(itr->second, 0);
499 }
500 }
501 ShowDeviceProtectionDialog(static_cast<DeviceProtectionStatus>(status));
502 }
503
CanReportDeviceProtectionStatus(int32_t status)504 bool HCameraDevice::CanReportDeviceProtectionStatus(int32_t status)
505 {
506 std::lock_guard<std::mutex> lock(deviceProtectionStatusMutex_);
507 bool ret = (status != lastDeviceProtectionStatus_);
508 lastDeviceProtectionStatus_ = status;
509 return ret;
510 }
511
DeviceEjectCallBack()512 void HCameraDevice::DeviceEjectCallBack()
513 {
514 MEDIA_INFO_LOG("HCameraDevice::DeviceEjectCallBack enter");
515 uint8_t value = 1;
516 uint32_t count = 1;
517 constexpr int32_t DEFAULT_ITEMS = 1;
518 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
519 std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata =
520 std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
521 bool status = changedMetadata->addEntry(OHOS_CONTROL_EJECT_RETRY, &value, count);
522 CHECK_ERROR_RETURN_LOG(!status, "HCameraDevice::DropDetectionCallback Failed to set fall protection");
523
524 std::vector<sptr<HCameraDeviceHolder>> deviceHolderVector =
525 HCameraDeviceManager::GetInstance()->GetActiveCameraHolders();
526 for (sptr<HCameraDeviceHolder> activeDeviceHolder : deviceHolderVector) {
527 sptr<HCameraDevice> activeDevice = activeDeviceHolder->GetDevice();
528 if (activeDevice != nullptr && activeDevice->IsOpenedCameraDevice()) {
529 activeDevice->lastDeviceEjectTime_ = GetTimestamp();
530 activeDevice->UpdateSetting(changedMetadata);
531 MEDIA_INFO_LOG("HCameraService::DeviceEjectCallBack UpdateSetting");
532 }
533 }
534 }
535
DeviceFaultCallBack()536 void HCameraDevice::DeviceFaultCallBack()
537 {
538 MEDIA_INFO_LOG("HCameraDevice::DeviceFaultCallBack enter");
539 }
540
ShowDeviceProtectionDialog(DeviceProtectionStatus status)541 bool HCameraDevice::ShowDeviceProtectionDialog(DeviceProtectionStatus status)
542 {
543 if (status == OHOS_DEVICE_EJECT_BLOCK) {
544 int64_t timestamp = GetTimestamp(); if (timestamp - lastDeviceEjectTime_ < DEVICE_EJECT_INTERVAL) {
545 deviceEjectTimes_.operator++();
546 }
547 if (deviceEjectTimes_ > DEVICE_EJECT_LIMIT) {
548 status = OHOS_DEVICE_EXTERNAL_PRESS;
549 deviceEjectTimes_.store(0);
550 }
551 }
552
553 AAFwk::Want want;
554 std::string bundleName = "com.ohos.sceneboard";
555 std::string abilityName = "com.ohos.sceneboard.systemdialog";
556 want.SetElementName(bundleName, abilityName);
557
558 const int32_t code = 4;
559 std::string commandStr = BuildDeviceProtectionDialogCommand(status);
560 auto itr = g_deviceProtectionToCallBack_.find(static_cast<DeviceProtectionStatus>(status));
561 if (itr == g_deviceProtectionToCallBack_.end()) {
562 return false;
563 }
564 DeviceProtectionAbilityCallBack callback = itr->second;
565
566 sptr<DeviceProtectionAbilityConnection> connection = sptr<DeviceProtectionAbilityConnection> (new (std::nothrow)
567 DeviceProtectionAbilityConnection(commandStr, code, callback));
568 if (connection == nullptr) {
569 MEDIA_ERR_LOG("connection is nullptr");
570 return false;
571 }
572 std::string identity = IPCSkeleton::ResetCallingIdentity();
573 auto connectResult = AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want,
574 connection, nullptr, DEFAULT_USER_ID);
575 IPCSkeleton::SetCallingIdentity(identity);
576 if (connectResult != 0) {
577 MEDIA_ERR_LOG("ConnectServiceExtensionAbility Failed!");
578 return false;
579 }
580 return true;
581 }
582
BuildDeviceProtectionDialogCommand(DeviceProtectionStatus status)583 std::string HCameraDevice::BuildDeviceProtectionDialogCommand(DeviceProtectionStatus status)
584 {
585 nlohmann::json extraInfo;
586 switch (static_cast<int32_t>(status)) {
587 // 按压受阻
588 case OHOS_DEVICE_EJECT_BLOCK:
589 extraInfo["title"] = "camera_device_eject_lab";
590 extraInfo["content"] = "camera_device_eject_desc";
591 extraInfo["button"] = "camera_use_continue";
592 break;
593 // 故障上报弹窗
594 case OHOS_DEVICE_EXTERNAL_PRESS:
595 extraInfo["title"] = "camera_device_block_lab";
596 extraInfo["content"] = "camera_device_block_desc";
597 extraInfo["button"] = "camera_device_block_confirm";
598 break;
599 }
600 nlohmann::json dialogInfo;
601 dialogInfo["sysDialogZOrder"] = SYSDIALOG_ZORDER_UPPER;
602 dialogInfo["extraInfo"] = extraInfo;
603 std::string commandStr = dialogInfo.dump();
604 MEDIA_INFO_LOG("BuildDeviceProtectionDialogCommand, commandStr = %{public}s", commandStr.c_str());
605 return commandStr;
606 }
607
HandleFoldableDevice()608 void HCameraDevice::HandleFoldableDevice()
609 {
610 bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
611 MEDIA_DEBUG_LOG("HCameraDevice::OpenDevice isFoldable is %d", isFoldable);
612 if (isFoldable) {
613 RegisterFoldStatusListener();
614 }
615 }
616
CloseDevice()617 int32_t HCameraDevice::CloseDevice()
618 {
619 MEDIA_DEBUG_LOG("HCameraDevice::CloseDevice start");
620 CAMERA_SYNC_TRACE;
621 {
622 std::lock_guard<std::mutex> lock(opMutex_);
623 CHECK_ERROR_RETURN_RET_LOG(!isOpenedCameraDevice_.load(), CAMERA_OK,
624 "HCameraDevice::CloseDevice device has benn closed");
625 bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
626 if (isFoldable) {
627 UnRegisterFoldStatusListener();
628 }
629 if (hdiCameraDevice_ != nullptr) {
630 isOpenedCameraDevice_.store(false);
631 MEDIA_INFO_LOG("Closing camera device: %{public}s start", cameraID_.c_str());
632 hdiCameraDevice_->Close();
633 ResetCachedSettings();
634 ResetDeviceOpenLifeCycleSettings();
635 HCameraDeviceManager::GetInstance()->RemoveDevice(cameraID_);
636 MEDIA_INFO_LOG("Closing camera device: %{public}s end", cameraID_.c_str());
637 hdiCameraDevice_ = nullptr;
638 HandlePrivacyAfterCloseDevice();
639 } else {
640 MEDIA_INFO_LOG("hdiCameraDevice is null");
641 }
642 if (streamOperator_) {
643 streamOperator_ = nullptr;
644 }
645 SetStreamOperatorCallback(nullptr);
646 }
647 if (cameraHostManager_) {
648 cameraHostManager_->RemoveCameraDevice(cameraID_);
649 cameraHostManager_->UpdateRestoreParamCloseTime(clientName_, cameraID_);
650 }
651 {
652 std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
653 deviceSvcCallback_ = nullptr;
654 }
655 POWERMGR_SYSEVENT_CAMERA_DISCONNECT(cameraID_.c_str());
656 MEDIA_DEBUG_LOG("HCameraDevice::CloseDevice end");
657 NotifyCameraSessionStatus(false);
658 NotifyCameraStatus(CAMERA_CLOSE);
659 #ifdef MEMMGR_OVERRID
660 RequireMemory(Memory::CAMERA_END);
661 #endif
662 return CAMERA_OK;
663 }
664
Release()665 int32_t HCameraDevice::Release()
666 {
667 Close();
668 return CAMERA_OK;
669 }
670
GetEnabledResults(std::vector<int32_t> & results)671 int32_t HCameraDevice::GetEnabledResults(std::vector<int32_t> &results)
672 {
673 std::lock_guard<std::mutex> lock(opMutex_);
674 CHECK_ERROR_RETURN_RET_LOG(!hdiCameraDevice_, CAMERA_UNKNOWN_ERROR,
675 "HCameraDevice::GetEnabledResults GetEnabledResults hdiCameraDevice_ is nullptr");
676 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->GetEnabledResults(results));
677 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
678 "HCameraDevice::GetEnabledResults failed with error Code:%{public}d", rc);
679 return CAMERA_OK;
680 }
681
CheckZoomChange(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)682 void HCameraDevice::CheckZoomChange(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
683 {
684 int32_t ret;
685 camera_metadata_item_t item;
686 ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_PREPARE_ZOOM, &item);
687 if (ret == CAM_META_SUCCESS) {
688 if (item.data.u8[0] == OHOS_CAMERA_ZOOMSMOOTH_PREPARE_ENABLE) {
689 MEDIA_ERR_LOG("OHOS_CAMERA_ZOOMSMOOTH_PREPARE_ENABLE");
690 inPrepareZoom_ = true;
691 ResetZoomTimer();
692 } else if (item.data.u8[0] == OHOS_CAMERA_ZOOMSMOOTH_PREPARE_DISABLE) {
693 MEDIA_ERR_LOG("OHOS_CAMERA_ZOOMSMOOTH_PREPARE_DISABLE");
694 inPrepareZoom_ = false;
695 ResetZoomTimer();
696 }
697 return;
698 }
699 ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_ZOOM_RATIO, &item);
700 if (ret != CAM_META_SUCCESS) {
701 ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_SMOOTH_ZOOM_RATIOS, &item);
702 }
703 if (ret == CAM_META_SUCCESS && inPrepareZoom_) {
704 ResetZoomTimer();
705 }
706 return;
707 }
708
CheckMovingPhotoSupported(int32_t mode)709 bool HCameraDevice::CheckMovingPhotoSupported(int32_t mode)
710 {
711 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
712 int32_t ret = cameraHostManager_->GetCameraAbility(cameraID_, cameraAbility);
713 CHECK_AND_RETURN_RET(cameraAbility != nullptr, false);
714 camera_metadata_item_t metadataItem;
715 std::vector<int32_t> modes = {};
716 ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility->get(), OHOS_ABILITY_MOVING_PHOTO,
717 &metadataItem);
718 if (ret == CAM_META_SUCCESS && metadataItem.count > 0) {
719 uint32_t step = 3;
720 for (uint32_t index = 0; index < metadataItem.count - 1;) {
721 if (metadataItem.data.i32[index + 1] == 1) {
722 modes.push_back(metadataItem.data.i32[index]);
723 }
724 MEDIA_DEBUG_LOG("IsMovingPhotoSupported mode:%{public}d", metadataItem.data.i32[index]);
725 index += step;
726 }
727 }
728 return std::find(modes.begin(), modes.end(), mode) != modes.end();
729 }
730
ResetZoomTimer()731 void HCameraDevice::ResetZoomTimer()
732 {
733 CameraTimer::GetInstance().Unregister(zoomTimerId_);
734 if (!inPrepareZoom_) {
735 return;
736 }
737 MEDIA_INFO_LOG("register zoom timer callback");
738 uint32_t waitMs = 5 * 1000;
739 auto thisPtr = wptr<HCameraDevice>(this);
740 zoomTimerId_ = CameraTimer::GetInstance().Register([thisPtr]() {
741 auto devicePtr = thisPtr.promote();
742 if (devicePtr != nullptr) {
743 devicePtr->UnPrepareZoom();
744 }
745 }, waitMs, true);
746 }
747
UnPrepareZoom()748 void HCameraDevice::UnPrepareZoom()
749 {
750 MEDIA_INFO_LOG("entered.");
751 std::lock_guard<std::mutex> lock(unPrepareZoomMutex_);
752 if (inPrepareZoom_) {
753 inPrepareZoom_ = false;
754 uint32_t count = 1;
755 uint32_t prepareZoomType = OHOS_CAMERA_ZOOMSMOOTH_PREPARE_DISABLE;
756 std::shared_ptr<OHOS::Camera::CameraMetadata> metadata = std::make_shared<OHOS::Camera::CameraMetadata>(1, 1);
757 metadata->addEntry(OHOS_CONTROL_PREPARE_ZOOM, &prepareZoomType, count);
758 UpdateSetting(metadata);
759 }
760 }
761
UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)762 int32_t HCameraDevice::UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
763 {
764 CAMERA_SYNC_TRACE;
765 MEDIA_INFO_LOG("HCameraDevice::UpdateSetting prepare execute");
766 CHECK_ERROR_RETURN_RET_LOG(settings == nullptr, CAMERA_INVALID_ARG, "settings is null");
767 CheckZoomChange(settings);
768
769 uint32_t count = OHOS::Camera::GetCameraMetadataItemCount(settings->get());
770 CHECK_ERROR_RETURN_RET_LOG(!count, CAMERA_OK, "Nothing to update");
771 std::lock_guard<std::mutex> lock(opMutex_);
772 if (updateSettings_ == nullptr || !CameraFwkMetadataUtils::MergeMetadata(settings, updateSettings_)) {
773 updateSettings_ = settings;
774 }
775 MEDIA_INFO_LOG("Updated device settings hdiCameraDevice_(%{public}d)", hdiCameraDevice_ != nullptr);
776 if (hdiCameraDevice_ != nullptr) {
777 std::vector<uint8_t> hdiSettings;
778 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(updateSettings_, hdiSettings);
779 ReportMetadataDebugLog(updateSettings_);
780 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->UpdateSettings(hdiSettings));
781 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
782 "Failed with error Code: %{public}d", rc);
783 UpdateDeviceOpenLifeCycleSettings(updateSettings_);
784 {
785 std::lock_guard<std::mutex> cachedLock(cachedSettingsMutex_);
786 CameraFwkMetadataUtils::MergeMetadata(settings, cachedSettings_);
787 }
788 updateSettings_ = nullptr;
789 }
790 MEDIA_INFO_LOG("HCameraDevice::UpdateSetting execute success");
791 return CAMERA_OK;
792 }
793
SetUsedAsPosition(uint8_t value)794 int32_t HCameraDevice::SetUsedAsPosition(uint8_t value)
795 {
796 MEDIA_INFO_LOG("HCameraDevice::SetUsedAsPosition as %{public}d", value);
797 usedAsPosition_ = value;
798 // lockforControl
799 return CAMERA_OK;
800 }
801
GetUsedAsPosition()802 uint8_t HCameraDevice::GetUsedAsPosition()
803 {
804 MEDIA_INFO_LOG("HCameraDevice::GetUsedAsPosition success");
805 return usedAsPosition_;
806 }
807
UpdateSettingOnce(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)808 int32_t HCameraDevice::UpdateSettingOnce(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
809 {
810 CAMERA_SYNC_TRACE;
811 MEDIA_INFO_LOG("HCameraDevice::UpdateSettingOnce prepare execute");
812 CHECK_ERROR_RETURN_RET_LOG(settings == nullptr, CAMERA_INVALID_ARG, "settings is null");
813 CheckZoomChange(settings);
814
815 uint32_t count = OHOS::Camera::GetCameraMetadataItemCount(settings->get());
816 CHECK_ERROR_RETURN_RET_LOG(!count, CAMERA_OK, "Nothing to update");
817 std::lock_guard<std::mutex> lock(opMutex_);
818 MEDIA_INFO_LOG("Updated device settings once hdiCameraDevice_(%{public}d)", hdiCameraDevice_ != nullptr);
819 if (hdiCameraDevice_ != nullptr) {
820 std::vector<uint8_t> hdiSettings;
821 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(settings, hdiSettings);
822 ReportMetadataDebugLog(settings);
823 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->UpdateSettings(hdiSettings));
824 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
825 "Failed with error Code: %{public}d", rc);
826 }
827 MEDIA_INFO_LOG("HCameraDevice::UpdateSettingOnce execute success");
828 return CAMERA_OK;
829 }
830
GetStatus(std::shared_ptr<OHOS::Camera::CameraMetadata> & metaIn,std::shared_ptr<OHOS::Camera::CameraMetadata> & metaOut)831 int32_t HCameraDevice::GetStatus(std::shared_ptr<OHOS::Camera::CameraMetadata> &metaIn,
832 std::shared_ptr<OHOS::Camera::CameraMetadata> &metaOut)
833 {
834 CAMERA_SYNC_TRACE;
835 CHECK_ERROR_RETURN_RET_LOG(metaIn == nullptr, CAMERA_INVALID_ARG, "HCameraDevice::GetStatus metaIn is null");
836 uint32_t count = OHOS::Camera::GetCameraMetadataItemCount(metaIn->get());
837 CHECK_ERROR_RETURN_RET_LOG(!count, CAMERA_OK, "HCameraDevice::GetStatus Nothing to query");
838
839 sptr<OHOS::HDI::Camera::V1_2::ICameraDevice> hdiCameraDeviceV1_2;
840 if (cameraHostManager_->GetVersionByCamera(cameraID_) >= GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
841 MEDIA_DEBUG_LOG("HCameraDevice::GetStatus ICameraDevice cast to V1_2");
842 hdiCameraDeviceV1_2 = OHOS::HDI::Camera::V1_2::ICameraDevice::CastFrom(hdiCameraDevice_);
843 if (hdiCameraDeviceV1_2 == nullptr) {
844 MEDIA_ERR_LOG("HCameraDevice::GetStatus ICameraDevice cast to V1_2 error");
845 hdiCameraDeviceV1_2 = static_cast<OHOS::HDI::Camera::V1_2::ICameraDevice *>(hdiCameraDevice_.GetRefPtr());
846 }
847 }
848
849 MEDIA_DEBUG_LOG("HCameraDevice::GetStatus hdiCameraDeviceV1_2(%{public}d)", hdiCameraDeviceV1_2 != nullptr);
850 if (hdiCameraDeviceV1_2 != nullptr) {
851 std::vector<uint8_t> hdiMetaIn;
852 std::vector<uint8_t> hdiMetaOut;
853 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(metaIn, hdiMetaIn);
854 CamRetCode rc = (CamRetCode)(hdiCameraDeviceV1_2->GetStatus(hdiMetaIn, hdiMetaOut));
855 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
856 "HCameraDevice::GetStatus Failed with error Code: %{public}d", rc);
857 if (hdiMetaOut.size() != 0) {
858 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(hdiMetaOut, metaOut);
859 }
860 }
861 return CAMERA_OK;
862 }
863
ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)864 void HCameraDevice::ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
865 {
866 caller_ = CameraReportUtils::GetCallerInfo();
867 for (const auto &tagInfo : reportTagInfos_) {
868 std::string tagName, dfxUbStr;
869 uint32_t tag;
870 std::tie(tag, tagName, dfxUbStr) = tagInfo;
871 DebugLogTag(settings, tag, tagName, dfxUbStr);
872 }
873
874 DebugLogForSmoothZoom(settings, OHOS_CONTROL_SMOOTH_ZOOM_RATIOS);
875 DebugLogForAfRegions(settings, OHOS_CONTROL_AF_REGIONS);
876 DebugLogForAeRegions(settings, OHOS_CONTROL_AE_REGIONS);
877 }
878
DebugLogTag(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,uint32_t tag,std::string tagName,std::string dfxUbStr)879 void HCameraDevice::DebugLogTag(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings,
880 uint32_t tag, std::string tagName, std::string dfxUbStr)
881 {
882 camera_metadata_item_t item;
883 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), tag, &item);
884 if (ret != CAM_META_SUCCESS || item.count <= 0) {
885 MEDIA_DEBUG_LOG("Failed to find %{public}s tag", tagName.c_str());
886 return;
887 }
888 uint32_t dataType = item.data_type;
889 std::string valueStr;
890 if (dataType == META_TYPE_BYTE) {
891 valueStr = std::to_string(item.data.u8[0]);
892 } else if (dataType == META_TYPE_INT32) {
893 valueStr = std::to_string(item.data.i32[0]);
894 } else if (dataType == META_TYPE_UINT32) {
895 valueStr = std::to_string(item.data.ui32[0]);
896 } else if (dataType == META_TYPE_FLOAT) {
897 valueStr = std::to_string(item.data.f[0]);
898 } else if (dataType == META_TYPE_INT64) {
899 valueStr = std::to_string(item.data.i64[0]);
900 } else if (dataType == META_TYPE_DOUBLE) {
901 valueStr = std::to_string(item.data.d[0]);
902 } else {
903 MEDIA_ERR_LOG("unknown dataType");
904 return;
905 }
906 MEDIA_DEBUG_LOG("Find %{public}s value = %{public}s", tagName.c_str(), valueStr.c_str());
907
908 if (dfxUbStr != DFX_UB_NOT_REPORT) {
909 CameraReportUtils::GetInstance().ReportUserBehavior(dfxUbStr, valueStr, caller_);
910 }
911 }
912
DebugLogForSmoothZoom(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,uint32_t tag)913 void HCameraDevice::DebugLogForSmoothZoom(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag)
914 {
915 // debug log for smooth zoom
916 camera_metadata_item_t item;
917 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), tag, &item);
918 if (ret != CAM_META_SUCCESS) {
919 MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_SMOOTH_ZOOM_RATIOS tag");
920 } else {
921 MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_SMOOTH_ZOOM_RATIOS count = %{public}d", item.count);
922 if (item.count > 1) {
923 uint32_t targetZoom = item.data.ui32[item.count - 2];
924 float zoomRatio = targetZoom / SMOOTH_ZOOM_DIVISOR;
925 MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_SMOOTH_ZOOM_RATIOS value = %{public}f", zoomRatio);
926 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_SET_SMOOTHZOOM,
927 std::to_string(zoomRatio), caller_);
928 }
929 }
930 }
931
DebugLogForAfRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,uint32_t tag)932 void HCameraDevice::DebugLogForAfRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag)
933 {
934 // debug log for af regions
935 camera_metadata_item_t item;
936 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), tag, &item);
937 if (ret != CAM_META_SUCCESS) {
938 MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_AF_REGIONS tag");
939 } else {
940 std::stringstream ss;
941 ss << "x=" << item.data.f[0] << " y=" << item.data.f[1];
942 std::string str = ss.str();
943 MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_AF_REGIONS %{public}s", str.c_str());
944 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_SET_FOCUSPOINT, str, caller_);
945 }
946 }
947
DebugLogForAeRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,uint32_t tag)948 void HCameraDevice::DebugLogForAeRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag)
949 {
950 // debug log for ae regions
951 camera_metadata_item_t item;
952 int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), tag, &item);
953 if (ret != CAM_META_SUCCESS) {
954 MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_AE_REGIONS tag");
955 } else {
956 std::stringstream ss;
957 ss << "x=" << item.data.f[0] << " y=" << item.data.f[1];
958 std::string str = ss.str();
959 MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_AE_REGIONS %{public}s", str.c_str());
960 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_SET_METERINGPOINT, str, caller_);
961 }
962 }
963
RegisterFoldStatusListener()964 void HCameraDevice::RegisterFoldStatusListener()
965 {
966 listener = new FoldScreenListener(cameraHostManager_, cameraID_);
967 if (cameraHostManager_) {
968 int foldStatus = (int)OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus();
969 cameraHostManager_->NotifyDeviceStateChangeInfo(DeviceType::FOLD_TYPE, foldStatus);
970 }
971 auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(listener);
972 if (ret != OHOS::Rosen::DMError::DM_OK) {
973 MEDIA_DEBUG_LOG("HCameraDevice::RegisterFoldStatusListener failed");
974 listener = nullptr;
975 } else {
976 MEDIA_DEBUG_LOG("HCameraDevice::RegisterFoldStatusListener success");
977 }
978 }
979
UnRegisterFoldStatusListener()980 void HCameraDevice::UnRegisterFoldStatusListener()
981 {
982 if (listener == nullptr) {
983 MEDIA_ERR_LOG("HCameraDevice::unRegisterFoldStatusListener listener is null");
984 return;
985 }
986 auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterFoldStatusListener(listener);
987 if (ret != OHOS::Rosen::DMError::DM_OK) {
988 MEDIA_DEBUG_LOG("HCameraDevice::UnRegisterFoldStatusListener failed");
989 }
990 }
991
EnableResult(std::vector<int32_t> & results)992 int32_t HCameraDevice::EnableResult(std::vector<int32_t> &results)
993 {
994 CHECK_ERROR_RETURN_RET_LOG(results.empty(), CAMERA_INVALID_ARG, "HCameraDevice::EnableResult results is empty");
995 std::lock_guard<std::mutex> lock(opMutex_);
996 CHECK_ERROR_RETURN_RET_LOG(hdiCameraDevice_ == nullptr, CAMERA_UNKNOWN_ERROR,
997 "HCameraDevice::hdiCameraDevice_ is null");
998
999 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->EnableResult(results));
1000 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
1001 "HCameraDevice::EnableResult failed with error Code:%{public}d", rc);
1002 return CAMERA_OK;
1003 }
1004
DisableResult(std::vector<int32_t> & results)1005 int32_t HCameraDevice::DisableResult(std::vector<int32_t> &results)
1006 {
1007 CHECK_ERROR_RETURN_RET_LOG(results.empty(), CAMERA_INVALID_ARG, "HCameraDevice::DisableResult results is empty");
1008 std::lock_guard<std::mutex> lock(opMutex_);
1009 CHECK_ERROR_RETURN_RET_LOG(hdiCameraDevice_ == nullptr, CAMERA_UNKNOWN_ERROR,
1010 "HCameraDevice::hdiCameraDevice_ is null");
1011
1012 CamRetCode rc = (CamRetCode)(hdiCameraDevice_->DisableResult(results));
1013 CHECK_ERROR_RETURN_RET_LOG(rc != HDI::Camera::V1_0::NO_ERROR, HdiToServiceError(rc),
1014 "HCameraDevice::DisableResult failed with error Code:%{public}d", rc);
1015 return CAMERA_OK;
1016 }
1017
SetCallback(sptr<ICameraDeviceServiceCallback> & callback)1018 int32_t HCameraDevice::SetCallback(sptr<ICameraDeviceServiceCallback>& callback)
1019 {
1020 if (callback == nullptr) {
1021 MEDIA_WARNING_LOG("HCameraDevice::SetCallback callback is null");
1022 }
1023 std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
1024 deviceSvcCallback_ = callback;
1025 return CAMERA_OK;
1026 }
1027
GetDeviceServiceCallback()1028 sptr<ICameraDeviceServiceCallback> HCameraDevice::GetDeviceServiceCallback()
1029 {
1030 std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
1031 return deviceSvcCallback_;
1032 }
1033
UpdateDeviceOpenLifeCycleSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> changedSettings)1034 void HCameraDevice::UpdateDeviceOpenLifeCycleSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> changedSettings)
1035 {
1036 if (changedSettings == nullptr) {
1037 return;
1038 }
1039 std::lock_guard<std::mutex> lock(deviceOpenLifeCycleMutex_);
1040 for (auto itemTag : DEVICE_OPEN_LIFECYCLE_TAGS) {
1041 camera_metadata_item_t item;
1042 int32_t result = OHOS::Camera::FindCameraMetadataItem(changedSettings->get(), itemTag, &item);
1043 if (result != CAM_META_SUCCESS) {
1044 continue;
1045 }
1046 bool updateSuccess = CameraFwkMetadataUtils::UpdateMetadataTag(item, deviceOpenLifeCycleSettings_);
1047 if (!updateSuccess) {
1048 MEDIA_ERR_LOG("HCameraDevice::UpdateDeviceOpenLifeCycleSettings tag:%{public}d fail", itemTag);
1049 } else {
1050 MEDIA_INFO_LOG("HCameraDevice::UpdateDeviceOpenLifeCycleSettings tag:%{public}d success", itemTag);
1051 }
1052 }
1053 }
1054
ResetDeviceOpenLifeCycleSettings()1055 void HCameraDevice::ResetDeviceOpenLifeCycleSettings()
1056 {
1057 MEDIA_INFO_LOG("HCameraDevice::ResetDeviceOpenLifeCycleSettings");
1058 std::lock_guard<std::mutex> lock(deviceOpenLifeCycleMutex_);
1059 deviceOpenLifeCycleSettings_ =
1060 std::make_shared<OHOS::Camera::CameraMetadata>(DEVICE_OPEN_LIFECYCLE_TAGS.size(), DEFAULT_SETTING_ITEM_LENGTH);
1061 }
1062
InitStreamOperator()1063 int32_t HCameraDevice::InitStreamOperator()
1064 {
1065 std::lock_guard<std::mutex> lock(opMutex_);
1066 CHECK_ERROR_RETURN_RET_LOG(hdiCameraDevice_ == nullptr, CAMERA_UNKNOWN_ERROR,
1067 "HCameraDevice::InitStreamOperator hdiCameraDevice_ is null");
1068 CamRetCode rc;
1069 sptr<OHOS::HDI::Camera::V1_1::ICameraDevice> hdiCameraDeviceV1_1;
1070 sptr<OHOS::HDI::Camera::V1_2::ICameraDevice> hdiCameraDeviceV1_2;
1071 sptr<OHOS::HDI::Camera::V1_3::ICameraDevice> hdiCameraDeviceV1_3;
1072 int32_t versionRes = cameraHostManager_->GetVersionByCamera(cameraID_);
1073 if (versionRes >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
1074 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice cast to V1_3");
1075 hdiCameraDeviceV1_3 = OHOS::HDI::Camera::V1_3::ICameraDevice::CastFrom(hdiCameraDevice_);
1076 } else if (versionRes >= GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
1077 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice cast to V1_2");
1078 hdiCameraDeviceV1_2 = OHOS::HDI::Camera::V1_2::ICameraDevice::CastFrom(hdiCameraDevice_);
1079 } else if (versionRes == GetVersionId(HDI_VERSION_1, HDI_VERSION_1)) {
1080 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice cast to V1_1");
1081 hdiCameraDeviceV1_1 = OHOS::HDI::Camera::V1_1::ICameraDevice::CastFrom(hdiCameraDevice_);
1082 if (hdiCameraDeviceV1_1 == nullptr) {
1083 MEDIA_ERR_LOG("HCameraDevice::InitStreamOperator ICameraDevice cast to V1_1 error");
1084 hdiCameraDeviceV1_1 = static_cast<OHOS::HDI::Camera::V1_1::ICameraDevice*>(hdiCameraDevice_.GetRefPtr());
1085 }
1086 }
1087
1088 if (hdiCameraDeviceV1_3 != nullptr && versionRes >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
1089 sptr<OHOS::HDI::Camera::V1_3::IStreamOperator> streamOperator_v1_3;
1090 rc = (CamRetCode)(hdiCameraDeviceV1_3->GetStreamOperator_V1_3(this, streamOperator_v1_3));
1091 streamOperator_ = streamOperator_v1_3;
1092 } else if (hdiCameraDeviceV1_2 != nullptr && versionRes >= GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
1093 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice V1_2");
1094 sptr<OHOS::HDI::Camera::V1_2::IStreamOperator> streamOperator_v1_2;
1095 rc = (CamRetCode)(hdiCameraDeviceV1_2->GetStreamOperator_V1_2(this, streamOperator_v1_2));
1096 streamOperator_ = streamOperator_v1_2;
1097 } else if (hdiCameraDeviceV1_1 != nullptr && versionRes == GetVersionId(HDI_VERSION_1, HDI_VERSION_1)) {
1098 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice V1_1");
1099 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> streamOperator_v1_1;
1100 rc = (CamRetCode)(hdiCameraDeviceV1_1->GetStreamOperator_V1_1(this, streamOperator_v1_1));
1101 streamOperator_ = streamOperator_v1_1;
1102 } else {
1103 MEDIA_DEBUG_LOG("HCameraDevice::InitStreamOperator ICameraDevice V1_0");
1104 rc = (CamRetCode)(hdiCameraDevice_->GetStreamOperator(this, streamOperator_));
1105 }
1106 if (rc != HDI::Camera::V1_0::NO_ERROR) {
1107 MEDIA_ERR_LOG("HCameraDevice::InitStreamOperator failed with error Code:%{public}d", rc);
1108 CameraReportUtils::ReportCameraError(
1109 "HCameraDevice::InitStreamOperator", rc, true, CameraReportUtils::GetCallerInfo());
1110 streamOperator_ = nullptr;
1111 return HdiToServiceError(rc);
1112 }
1113 return CAMERA_OK;
1114 }
1115
ReleaseStreams(std::vector<int32_t> & releaseStreamIds)1116 int32_t HCameraDevice::ReleaseStreams(std::vector<int32_t>& releaseStreamIds)
1117 {
1118 CAMERA_SYNC_TRACE;
1119 std::lock_guard<std::mutex> lock(opMutex_);
1120 if (streamOperator_ != nullptr && !releaseStreamIds.empty()) {
1121 MEDIA_INFO_LOG("HCameraDevice::ReleaseStreams %{public}s",
1122 Container2String(releaseStreamIds.begin(), releaseStreamIds.end()).c_str());
1123 int32_t rc = streamOperator_->ReleaseStreams(releaseStreamIds);
1124 if (rc != HDI::Camera::V1_0::NO_ERROR) {
1125 MEDIA_ERR_LOG("HCameraDevice::ClearStreamOperator ReleaseStreams fail, error Code:%{public}d", rc);
1126 CameraReportUtils::ReportCameraError(
1127 "HCameraDevice::ReleaseStreams", rc, true, CameraReportUtils::GetCallerInfo());
1128 }
1129 }
1130 return CAMERA_OK;
1131 }
1132
GetStreamOperator()1133 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> HCameraDevice::GetStreamOperator()
1134 {
1135 std::lock_guard<std::mutex> lock(opMutex_);
1136 return streamOperator_;
1137 }
1138
OnError(const OHOS::HDI::Camera::V1_0::ErrorType type,const int32_t errorMsg)1139 int32_t HCameraDevice::OnError(const OHOS::HDI::Camera::V1_0::ErrorType type, const int32_t errorMsg)
1140 {
1141 auto errType = static_cast<OHOS::HDI::Camera::V1_3::ErrorType>(type);
1142 NotifyCameraStatus(HdiToCameraErrorType(errType));
1143 auto callback = GetDeviceServiceCallback();
1144 if (callback != nullptr) {
1145 int32_t errorType;
1146 if (type == OHOS::HDI::Camera::V1_0::REQUEST_TIMEOUT) {
1147 errorType = CAMERA_DEVICE_REQUEST_TIMEOUT;
1148 } else if (type == OHOS::HDI::Camera::V1_0::DEVICE_PREEMPT) {
1149 errorType = CAMERA_DEVICE_PREEMPTED;
1150 } else if (type == DEVICE_DISCONNECT) {
1151 errorType = CAMERA_DEVICE_CLOSED;
1152 } else {
1153 errorType = CAMERA_UNKNOWN_ERROR;
1154 }
1155 callback->OnError(errorType, errorMsg);
1156 CAMERA_SYSEVENT_FAULT(CreateMsg("CameraDeviceServiceCallback::OnError() is called!, errorType: %d,"
1157 "errorMsg: %d",
1158 errorType, errorMsg));
1159 }
1160 return CAMERA_OK;
1161 }
1162
CheckOnResultData(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult)1163 void HCameraDevice::CheckOnResultData(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult)
1164 {
1165 if (cameraResult == nullptr) {
1166 MEDIA_ERR_LOG("HCameraDevice::OnResult cameraResult is nullptr");
1167 return;
1168 }
1169 camera_metadata_item_t item;
1170 common_metadata_header_t* metadata = cameraResult->get();
1171 int ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FLASH_MODE, &item);
1172 if (ret == 0) {
1173 MEDIA_DEBUG_LOG("Flash mode: %{public}d", item.data.u8[0]);
1174 }
1175 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FLASH_STATE, &item);
1176 if (ret == 0) {
1177 MEDIA_DEBUG_LOG("Flash state: %{public}d", item.data.u8[0]);
1178 }
1179 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FOCUS_MODE, &item);
1180 if (ret == CAM_META_SUCCESS) {
1181 MEDIA_DEBUG_LOG("Focus mode: %{public}d", item.data.u8[0]);
1182 }
1183 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_QUALITY_PRIORITIZATION, &item);
1184 if (ret == CAM_META_SUCCESS) {
1185 MEDIA_DEBUG_LOG("quality prioritization: %{public}d", item.data.u8[0]);
1186 }
1187 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FOCUS_STATE, &item);
1188 if (ret == CAM_META_SUCCESS) {
1189 MEDIA_DEBUG_LOG("Focus state: %{public}d", item.data.u8[0]);
1190 }
1191 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_STATISTICS_FACE_RECTANGLES, &item);
1192 if (ret != CAM_META_SUCCESS) {
1193 MEDIA_ERR_LOG("cannot find OHOS_STATISTICS_FACE_RECTANGLES: %{public}d", ret);
1194 }
1195 MEDIA_DEBUG_LOG("ProcessFaceRectangles: %{public}d count: %{public}d", item.item, item.count);
1196 constexpr int32_t rectangleUnitLen = 4;
1197
1198 if (item.count % rectangleUnitLen) {
1199 MEDIA_DEBUG_LOG("Metadata item: %{public}d count: %{public}d is invalid", item.item, item.count);
1200 }
1201 const int32_t offsetX = 0;
1202 const int32_t offsetY = 1;
1203 const int32_t offsetW = 2;
1204 const int32_t offsetH = 3;
1205 float* start = item.data.f;
1206 float* end = item.data.f + item.count;
1207 for (; start < end; start += rectangleUnitLen) {
1208 MEDIA_DEBUG_LOG("Metadata item: %{public}f, %{public}f, %{public}f, %{public}f", start[offsetX], start[offsetY],
1209 start[offsetW], start[offsetH]);
1210 }
1211 }
1212
OnResult(const uint64_t timestamp,const std::vector<uint8_t> & result)1213 int32_t HCameraDevice::OnResult(const uint64_t timestamp, const std::vector<uint8_t>& result)
1214 {
1215 CHECK_ERROR_RETURN_RET_LOG(result.size() == 0, CAMERA_INVALID_ARG, "onResult get null meta from HAL");
1216 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult = nullptr;
1217 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(result, cameraResult);
1218 if (cameraResult == nullptr) {
1219 cameraResult = std::make_shared<OHOS::Camera::CameraMetadata>(0, 0);
1220 }
1221 if (IsCameraDebugOn()) {
1222 CameraFwkMetadataUtils::DumpMetadataInfo(cameraResult);
1223 }
1224 auto callback = GetDeviceServiceCallback();
1225 if (callback != nullptr) {
1226 callback->OnResult(timestamp, cameraResult);
1227 }
1228 ReportDeviceProtectionStatus(cameraResult);
1229 if (IsCameraDebugOn()) {
1230 CheckOnResultData(cameraResult);
1231 }
1232 if (isMovingPhotoEnabled_) {
1233 GetMovingPhotoStartAndEndTime(cameraResult);
1234 }
1235 return CAMERA_OK;
1236 }
1237
OnResult(int32_t streamId,const std::vector<uint8_t> & result)1238 int32_t HCameraDevice::OnResult(int32_t streamId, const std::vector<uint8_t>& result)
1239 {
1240 CHECK_ERROR_RETURN_RET_LOG(result.size() == 0, CAMERA_INVALID_ARG, "onResult get null meta from HAL");
1241 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult = nullptr;
1242 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(result, cameraResult);
1243 if (cameraResult == nullptr) {
1244 cameraResult = std::make_shared<OHOS::Camera::CameraMetadata>(0, 0);
1245 }
1246 auto streamOperatorCallback = GetStreamOperatorCallback();
1247 if (streamOperatorCallback != nullptr) {
1248 streamOperatorCallback->OnResult(streamId, result);
1249 }
1250 if (IsCameraDebugOn()) {
1251 CheckOnResultData(cameraResult);
1252 }
1253 return CAMERA_OK;
1254 }
1255
GetMovingPhotoStartAndEndTime(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult)1256 void HCameraDevice::GetMovingPhotoStartAndEndTime(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult)
1257 {
1258 MEDIA_DEBUG_LOG("HCameraDevice::GetMovingPhotoStartAndEndTime enter.");
1259 {
1260 std::lock_guard<std::mutex> lock(movingPhotoStartTimeCallbackLock_);
1261 if (movingPhotoStartTimeCallback_) {
1262 camera_metadata_item_t item;
1263 int ret = OHOS::Camera::FindCameraMetadataItem(cameraResult->get(), OHOS_MOVING_PHOTO_START, &item);
1264 if (ret == CAM_META_SUCCESS && item.count != 0) {
1265 int64_t captureId = item.data.i64[0];
1266 int64_t startTime = item.data.i64[1];
1267 movingPhotoStartTimeCallback_(static_cast<int32_t>(captureId), startTime);
1268 }
1269 }
1270 }
1271 std::lock_guard<std::mutex> lock(movingPhotoEndTimeCallbackLock_);
1272 if (movingPhotoEndTimeCallback_) {
1273 camera_metadata_item_t item;
1274 int ret = OHOS::Camera::FindCameraMetadataItem(cameraResult->get(), OHOS_MOVING_PHOTO_END, &item);
1275 if (ret == CAM_META_SUCCESS && item.count != 0) {
1276 int64_t captureId = item.data.i64[0];
1277 int64_t endTime = item.data.i64[1];
1278 movingPhotoEndTimeCallback_(static_cast<int32_t>(captureId), endTime);
1279 }
1280 }
1281 }
1282
SetMovingPhotoStartTimeCallback(std::function<void (int64_t,int64_t)> callback)1283 void HCameraDevice::SetMovingPhotoStartTimeCallback(std::function<void(int64_t, int64_t)> callback)
1284 {
1285 std::lock_guard<std::mutex> lock(movingPhotoStartTimeCallbackLock_);
1286 movingPhotoStartTimeCallback_ = callback;
1287 }
1288
SetMovingPhotoEndTimeCallback(std::function<void (int64_t,int64_t)> callback)1289 void HCameraDevice::SetMovingPhotoEndTimeCallback(std::function<void(int64_t, int64_t)> callback)
1290 {
1291 std::lock_guard<std::mutex> lock(movingPhotoEndTimeCallbackLock_);
1292 movingPhotoEndTimeCallback_ = callback;
1293 }
1294
GetCallerToken()1295 int32_t HCameraDevice::GetCallerToken()
1296 {
1297 return callerToken_;
1298 }
1299
CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1> & streamInfos)1300 int32_t HCameraDevice::CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos)
1301 {
1302 CamRetCode hdiRc = HDI::Camera::V1_0::NO_ERROR;
1303 uint32_t major;
1304 uint32_t minor;
1305 CHECK_ERROR_RETURN_RET_LOG(streamInfos.empty(), CAMERA_OK, "HCameraDevice::CreateStreams streamInfos is empty!");
1306 std::lock_guard<std::mutex> lock(opMutex_);
1307 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> streamOperatorV1_1;
1308 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator = streamOperator_;
1309 CHECK_ERROR_RETURN_RET_LOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1310 "HCameraDevice::CreateStreams GetStreamOperator is null!");
1311 // get higher streamOperator version
1312 streamOperator->GetVersion(major, minor);
1313 MEDIA_INFO_LOG("streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
1314 if (major >= HDI_VERSION_1 && minor >= HDI_VERSION_1) {
1315 streamOperatorV1_1 = OHOS::HDI::Camera::V1_1::IStreamOperator::CastFrom(streamOperator);
1316 if (streamOperatorV1_1 == nullptr) {
1317 MEDIA_ERR_LOG("HCameraDevice::CreateStreams IStreamOperator cast to V1_1 error");
1318 streamOperatorV1_1 = static_cast<OHOS::HDI::Camera::V1_1::IStreamOperator*>(streamOperator.GetRefPtr());
1319 }
1320 }
1321 if (streamOperatorV1_1 != nullptr) {
1322 MEDIA_INFO_LOG("HCameraDevice::CreateStreams streamOperator V1_1");
1323 for (auto streamInfo : streamInfos) {
1324 if (streamInfo.extendedStreamInfos.size() > 0) {
1325 MEDIA_INFO_LOG("HCameraDevice::CreateStreams streamOperator V1_1 type %{public}d",
1326 streamInfo.extendedStreamInfos[0].type);
1327 }
1328 }
1329 hdiRc = (CamRetCode)(streamOperatorV1_1->CreateStreams_V1_1(streamInfos));
1330 } else {
1331 MEDIA_INFO_LOG("HCameraDevice::CreateStreams streamOperator V1_0");
1332 std::vector<StreamInfo> streamInfos_V1_0;
1333 for (auto streamInfo : streamInfos) {
1334 streamInfos_V1_0.emplace_back(streamInfo.v1_0);
1335 }
1336 hdiRc = (CamRetCode)(streamOperator->CreateStreams(streamInfos_V1_0));
1337 }
1338 if (hdiRc != HDI::Camera::V1_0::NO_ERROR) {
1339 MEDIA_ERR_LOG("HCameraDevice::CreateStreams(), Failed to commit %{public}d", hdiRc);
1340 CameraReportUtils::ReportCameraError(
1341 "HCameraDevice::CreateStreams", hdiRc, true, CameraReportUtils::GetCallerInfo());
1342 std::vector<int32_t> streamIds;
1343 for (auto& streamInfo : streamInfos) {
1344 streamIds.emplace_back(streamInfo.v1_0.streamId_);
1345 }
1346 CHECK_ERROR_PRINT_LOG(!streamIds.empty() &&
1347 streamOperator->ReleaseStreams(streamIds) != HDI::Camera::V1_0::NO_ERROR,
1348 "HCameraDevice::CreateStreams(), Failed to release streams");
1349 }
1350 for (auto& info : streamInfos) {
1351 MEDIA_INFO_LOG("HCameraDevice::CreateStreams stream id is:%{public}d", info.v1_0.streamId_);
1352 }
1353 return HdiToServiceError(hdiRc);
1354 }
1355
CommitStreams(std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceSettings,int32_t operationMode)1356 int32_t HCameraDevice::CommitStreams(
1357 std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode)
1358 {
1359 CamRetCode hdiRc = HDI::Camera::V1_0::NO_ERROR;
1360 uint32_t major;
1361 uint32_t minor;
1362 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator;
1363 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> streamOperatorV1_1;
1364 std::lock_guard<std::mutex> lock(opMutex_);
1365 streamOperator = streamOperator_;
1366 CHECK_ERROR_RETURN_RET_LOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1367 "HCameraDevice::CommitStreams GetStreamOperator is null!");
1368 // get higher streamOperator version
1369 streamOperator->GetVersion(major, minor);
1370 MEDIA_INFO_LOG(
1371 "HCameraDevice::CommitStreams streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
1372 if (major >= HDI_VERSION_1 && minor >= HDI_VERSION_1) {
1373 MEDIA_DEBUG_LOG("HCameraDevice::CommitStreams IStreamOperator cast to V1_1");
1374 streamOperatorV1_1 = OHOS::HDI::Camera::V1_1::IStreamOperator::CastFrom(streamOperator);
1375 if (streamOperatorV1_1 == nullptr) {
1376 MEDIA_ERR_LOG("HCameraDevice::CommitStreams IStreamOperator cast to V1_1 error");
1377 streamOperatorV1_1 = static_cast<OHOS::HDI::Camera::V1_1::IStreamOperator*>(streamOperator.GetRefPtr());
1378 }
1379 }
1380
1381 std::vector<uint8_t> setting;
1382 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(deviceSettings, setting);
1383 MEDIA_INFO_LOG("HCameraDevice::CommitStreams, commit mode %{public}d", operationMode);
1384 if (streamOperatorV1_1 != nullptr) {
1385 MEDIA_DEBUG_LOG("HCameraDevice::CommitStreams IStreamOperator V1_1");
1386 hdiRc = (CamRetCode)(streamOperatorV1_1->CommitStreams_V1_1(
1387 static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(operationMode), setting));
1388 } else {
1389 MEDIA_DEBUG_LOG("HCameraDevice::CommitStreams IStreamOperator V1_0");
1390 OperationMode opMode = OperationMode::NORMAL;
1391 hdiRc = (CamRetCode)(streamOperator->CommitStreams(opMode, setting));
1392 }
1393 if (hdiRc != HDI::Camera::V1_0::NO_ERROR) {
1394 MEDIA_ERR_LOG("HCameraDevice::CommitStreams failed with error Code:%d", hdiRc);
1395 CameraReportUtils::ReportCameraError(
1396 "HCameraDevice::CommitStreams", hdiRc, true, CameraReportUtils::GetCallerInfo());
1397 }
1398 MEDIA_DEBUG_LOG("HCameraDevice::CommitStreams end");
1399 return HdiToServiceError(hdiRc);
1400 }
1401
CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1> & streamInfos,std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceSettings,int32_t operationMode)1402 int32_t HCameraDevice::CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos,
1403 std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode)
1404 {
1405 int retCode = CreateStreams(streamInfos);
1406 CHECK_AND_RETURN_RET(retCode == CAMERA_OK, retCode);
1407 return CommitStreams(deviceSettings, operationMode);
1408 }
1409
CanOpenCamera()1410 bool HCameraDevice::CanOpenCamera()
1411 {
1412 sptr<HCameraDevice> cameraNeedEvict;
1413 bool ret = HCameraDeviceManager::GetInstance()->GetConflictDevices(cameraNeedEvict, this);
1414 if (cameraNeedEvict != nullptr) {
1415 MEDIA_DEBUG_LOG("HCameraDevice::CanOpenCamera open current device need to close other devices");
1416 cameraNeedEvict->OnError(DEVICE_PREEMPT, 0);
1417 cameraNeedEvict->CloseDevice();
1418 }
1419 return ret;
1420 }
1421
UpdateStreams(std::vector<StreamInfo_V1_1> & streamInfos)1422 int32_t HCameraDevice::UpdateStreams(std::vector<StreamInfo_V1_1>& streamInfos)
1423 {
1424 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator;
1425 sptr<OHOS::HDI::Camera::V1_2::IStreamOperator> streamOperatorV1_2;
1426 streamOperator = GetStreamOperator();
1427 CHECK_ERROR_RETURN_RET_LOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1428 "HCameraDevice::UpdateStreamInfos GetStreamOperator is null!");
1429 uint32_t major;
1430 uint32_t minor;
1431 streamOperator->GetVersion(major, minor);
1432 MEDIA_INFO_LOG("UpdateStreamInfos: streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
1433 if (major >= HDI_VERSION_1 && minor >= HDI_VERSION_2) {
1434 streamOperatorV1_2 = OHOS::HDI::Camera::V1_2::IStreamOperator::CastFrom(streamOperator);
1435 if (streamOperatorV1_2 == nullptr) {
1436 MEDIA_ERR_LOG("HCaptureSession::UpdateStreamInfos IStreamOperator cast to V1_2 error");
1437 streamOperatorV1_2 = static_cast<OHOS::HDI::Camera::V1_2::IStreamOperator*>(streamOperator.GetRefPtr());
1438 }
1439 }
1440 CamRetCode hdiRc = HDI::Camera::V1_0::CamRetCode::NO_ERROR;
1441 if (streamOperatorV1_2 != nullptr) {
1442 MEDIA_DEBUG_LOG("HCaptureSession::UpdateStreamInfos streamOperator V1_2");
1443 hdiRc = (CamRetCode)(streamOperatorV1_2->UpdateStreams(streamInfos));
1444 } else {
1445 MEDIA_DEBUG_LOG("HCaptureSession::UpdateStreamInfos failed, streamOperator V1_2 is null.");
1446 return CAMERA_UNKNOWN_ERROR;
1447 }
1448 return HdiToServiceError(hdiRc);
1449 }
1450
OperatePermissionCheck(uint32_t interfaceCode)1451 int32_t HCameraDevice::OperatePermissionCheck(uint32_t interfaceCode)
1452 {
1453 uint32_t callerToken = IPCSkeleton::GetCallingTokenID();
1454 int32_t errCode = CheckPermission(OHOS_PERMISSION_CAMERA, callerToken);
1455 if (errCode != CAMERA_OK) {
1456 return errCode;
1457 }
1458 switch (static_cast<CameraDeviceInterfaceCode>(interfaceCode)) {
1459 case CameraDeviceInterfaceCode::CAMERA_DEVICE_OPEN:
1460 case CameraDeviceInterfaceCode::CAMERA_DEVICE_CLOSE:
1461 case CameraDeviceInterfaceCode::CAMERA_DEVICE_RELEASE:
1462 case CameraDeviceInterfaceCode::CAMERA_DEVICE_SET_CALLBACK:
1463 case CameraDeviceInterfaceCode::CAMERA_DEVICE_UPDATE_SETTNGS:
1464 case CameraDeviceInterfaceCode::CAMERA_DEVICE_SET_USED_POS:
1465 case CameraDeviceInterfaceCode::CAMERA_DEVICE_GET_ENABLED_RESULT:
1466 case CameraDeviceInterfaceCode::CAMERA_DEVICE_ENABLED_RESULT:
1467 case CameraDeviceInterfaceCode::CAMERA_DEVICE_DISABLED_RESULT: {
1468 if (callerToken_ != callerToken) {
1469 MEDIA_ERR_LOG("HCameraDevice::OperatePermissionCheck fail, callerToken not legal");
1470 return CAMERA_OPERATION_NOT_ALLOWED;
1471 }
1472 break;
1473 }
1474 default:
1475 break;
1476 }
1477 return CAMERA_OK;
1478 }
1479
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamIds)1480 int32_t HCameraDevice::OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds)
1481 {
1482 auto streamOperatorCallback = GetStreamOperatorCallback();
1483 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1484 return streamOperatorCallback->OnCaptureStarted(captureId, streamIds);
1485 }
1486
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo> & infos)1487 int32_t HCameraDevice::OnCaptureStarted_V1_2(
1488 int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo>& infos)
1489 {
1490 auto streamOperatorCallback = GetStreamOperatorCallback();
1491 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1492 return streamOperatorCallback->OnCaptureStarted_V1_2(captureId, infos);
1493 }
1494
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)1495 int32_t HCameraDevice::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos)
1496 {
1497 auto streamOperatorCallback = GetStreamOperatorCallback();
1498 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1499 return streamOperatorCallback->OnCaptureEnded(captureId, infos);
1500 }
1501
OnCaptureEndedExt(int32_t captureId,const std::vector<OHOS::HDI::Camera::V1_3::CaptureEndedInfoExt> & infos)1502 int32_t HCameraDevice::OnCaptureEndedExt(int32_t captureId,
1503 const std::vector<OHOS::HDI::Camera::V1_3::CaptureEndedInfoExt>& infos)
1504 {
1505 auto streamOperatorCallback = GetStreamOperatorCallback();
1506 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1507 return streamOperatorCallback->OnCaptureEndedExt(captureId, infos);
1508 }
1509
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)1510 int32_t HCameraDevice::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos)
1511 {
1512 auto streamOperatorCallback = GetStreamOperatorCallback();
1513 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1514 return streamOperatorCallback->OnCaptureError(captureId, infos);
1515 }
1516
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1517 int32_t HCameraDevice::OnFrameShutter(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1518 {
1519 auto streamOperatorCallback = GetStreamOperatorCallback();
1520 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1521 return streamOperatorCallback->OnFrameShutter(captureId, streamIds, timestamp);
1522 }
1523
OnFrameShutterEnd(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1524 int32_t HCameraDevice::OnFrameShutterEnd(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1525 {
1526 auto streamOperatorCallback = GetStreamOperatorCallback();
1527 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1528 return streamOperatorCallback->OnFrameShutterEnd(captureId, streamIds, timestamp);
1529 }
1530
OnCaptureReady(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1531 int32_t HCameraDevice::OnCaptureReady(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1532 {
1533 auto streamOperatorCallback = GetStreamOperatorCallback();
1534 CHECK_AND_RETURN_RET(streamOperatorCallback != nullptr, CAMERA_INVALID_STATE);
1535 return streamOperatorCallback->OnCaptureReady(captureId, streamIds, timestamp);
1536 }
1537
NotifyCameraSessionStatus(bool running)1538 void HCameraDevice::NotifyCameraSessionStatus(bool running)
1539 {
1540 bool isSystemCamera = (clientName_ == SYSTEM_CAMERA);
1541 DeferredProcessing::DeferredProcessingService::GetInstance().NotifyCameraSessionStatus(clientUserId_, cameraID_,
1542 running, isSystemCamera);
1543 return;
1544 }
1545
RemoveResourceWhenHostDied()1546 void HCameraDevice::RemoveResourceWhenHostDied()
1547 {
1548 MEDIA_DEBUG_LOG("HCameraDevice::RemoveResourceWhenHostDied start");
1549 CAMERA_SYNC_TRACE;
1550 bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
1551 if (isFoldable) {
1552 UnRegisterFoldStatusListener();
1553 }
1554 HCameraDeviceManager::GetInstance()->RemoveDevice(cameraID_);
1555 if (cameraHostManager_) {
1556 cameraHostManager_->RemoveCameraDevice(cameraID_);
1557 cameraHostManager_->UpdateRestoreParamCloseTime(clientName_, cameraID_);
1558 }
1559 POWERMGR_SYSEVENT_CAMERA_DISCONNECT(cameraID_.c_str());
1560 NotifyCameraSessionStatus(false);
1561 NotifyCameraStatus(CAMERA_CLOSE);
1562 HandlePrivacyAfterCloseDevice();
1563 #ifdef MEMMGR_OVERRID
1564 RequireMemory(Memory::CAMERA_END);
1565 #endif
1566 MEDIA_DEBUG_LOG("HCameraDevice::RemoveResourceWhenHostDied end");
1567 }
1568
NotifyCameraStatus(int32_t state)1569 void HCameraDevice::NotifyCameraStatus(int32_t state)
1570 {
1571 OHOS::AAFwk::Want want;
1572 MEDIA_DEBUG_LOG("HCameraDevice::NotifyCameraStatus strat");
1573 want.SetAction(COMMON_EVENT_CAMERA_STATUS);
1574 want.SetParam(CLIENT_USER_ID, clientUserId_);
1575 want.SetParam(CAMERA_ID, cameraID_);
1576 want.SetParam(CAMERA_STATE, state);
1577 int32_t type = GetCameraType();
1578 want.SetParam(IS_SYSTEM_CAMERA, type);
1579 MEDIA_DEBUG_LOG(
1580 "OnCameraStatusChanged userId: %{public}d, cameraId: %{public}s, state: %{public}d, cameraType: %{public}d: ",
1581 clientUserId_, cameraID_.c_str(), state, type);
1582 EventFwk::CommonEventData CommonEventData { want };
1583 EventFwk::CommonEventPublishInfo publishInfo;
1584 std::vector<std::string> permissionVec { OHOS_PERMISSION_MANAGE_CAMERA_CONFIG };
1585 publishInfo.SetSubscriberPermissions(permissionVec);
1586 EventFwk::CommonEventManager::PublishCommonEvent(CommonEventData, publishInfo);
1587 MEDIA_DEBUG_LOG("HCameraDevice::NotifyCameraStatus end");
1588 }
1589 } // namespace CameraStandard
1590 } // namespace OHOS
1591