• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "hcamera_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