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