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