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_service.h"
17
18 #include <algorithm>
19 #include <memory>
20 #include <mutex>
21 #include <parameter.h>
22 #include <parameters.h>
23 #include <securec.h>
24 #include <string>
25 #include <unordered_set>
26 #include <vector>
27
28 #include "access_token.h"
29 #include "accesstoken_kit.h"
30 #include "camera_info_dumper.h"
31 #include "camera_log.h"
32 #include "camera_report_uitls.h"
33 #include "camera_util.h"
34 #include "datashare_helper.h"
35 #include "datashare_predicates.h"
36 #include "datashare_result_set.h"
37 #include "deferred_processing_service.h"
38 #include "display_manager.h"
39 #include "hcamera_device_manager.h"
40 #include "hcamera_preconfig.h"
41 #ifdef DEVICE_MANAGER
42 #include "device_manager_impl.h"
43 #endif
44 #include "ipc_skeleton.h"
45 #include "iservice_registry.h"
46 #include "os_account_manager.h"
47 #include "system_ability_definition.h"
48 #include "tokenid_kit.h"
49 #include "uri.h"
50
51 namespace OHOS {
52 namespace CameraStandard {
53 REGISTER_SYSTEM_ABILITY_BY_ID(HCameraService, CAMERA_SERVICE_ID, true)
54 #ifdef CAMERA_USE_SENSOR
55 constexpr int32_t SENSOR_SUCCESS = 0;
56 constexpr int32_t POSTURE_INTERVAL = 1000000;
57 #endif
58 constexpr uint8_t POSITION_FOLD_INNER = 3;
59 constexpr uint32_t ROOT_UID = 0;
60 constexpr uint32_t FACE_CLIENT_UID = 1088;
61 constexpr uint32_t RSS_UID = 1096;
62 static std::mutex g_cameraServiceInstanceMutex;
63 static HCameraService* g_cameraServiceInstance = nullptr;
64 static sptr<HCameraService> g_cameraServiceHolder = nullptr;
65 static bool g_isFoldScreen = system::GetParameter("const.window.foldscreen.type", "") != "";
66
67 static const std::string SETTINGS_DATA_BASE_URI =
68 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
69 static const std::string SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
70 static const std::string SETTINGS_DATA_FIELD_KEYWORD = "KEYWORD";
71 static const std::string SETTINGS_DATA_FIELD_VALUE = "VALUE";
72 static const std::string PREDICATES_STRING = "settings.camera.mute_persist";
73 std::vector<uint32_t> restoreMetadataTag { // item.type is uint8
74 OHOS_CONTROL_VIDEO_STABILIZATION_MODE,
75 OHOS_CONTROL_DEFERRED_IMAGE_DELIVERY,
76 OHOS_CONTROL_SUPPORTED_COLOR_MODES,
77 OHOS_CONTROL_PORTRAIT_EFFECT_TYPE,
78 OHOS_CONTROL_FILTER_TYPE,
79 OHOS_CONTROL_EFFECT_SUGGESTION,
80 OHOS_CONTROL_MOTION_DETECTION,
81 OHOS_CONTROL_HIGH_QUALITY_MODE,
82 OHOS_CONTROL_CAMERA_USED_AS_POSITION,
83 OHOS_CONTROL_MOVING_PHOTO,
84 OHOS_CONTROL_AUTO_CLOUD_IMAGE_ENHANCE,
85 OHOS_CONTROL_BEAUTY_TYPE,
86 OHOS_CONTROL_BEAUTY_AUTO_VALUE,
87 };
88 mutex g_dataShareHelperMutex;
89 mutex g_dmDeviceInfoMutex;
90 thread_local uint32_t g_dumpDepth = 0;
91
HCameraService(int32_t systemAbilityId,bool runOnCreate)92 HCameraService::HCameraService(int32_t systemAbilityId, bool runOnCreate)
93 : SystemAbility(systemAbilityId, runOnCreate), muteModeStored_(false), isRegisterSensorSuccess(false)
94 {
95 MEDIA_INFO_LOG("HCameraService Construct begin");
96 g_cameraServiceHolder = this;
97 {
98 std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
99 g_cameraServiceInstance = this;
100 }
101 statusCallback_ = std::make_shared<ServiceHostStatus>(this);
102 cameraHostManager_ = new (std::nothrow) HCameraHostManager(statusCallback_);
103 CHECK_AND_RETURN_LOG(
104 cameraHostManager_ != nullptr, "HCameraService OnStart failed to create HCameraHostManager obj");
105 MEDIA_INFO_LOG("HCameraService Construct end");
106 serviceStatus_ = CameraServiceStatus::SERVICE_NOT_READY;
107 }
108
HCameraService(sptr<HCameraHostManager> cameraHostManager)109 HCameraService::HCameraService(sptr<HCameraHostManager> cameraHostManager)
110 : cameraHostManager_(cameraHostManager), muteModeStored_(false), isRegisterSensorSuccess(false)
111 {}
112
~HCameraService()113 HCameraService::~HCameraService() {}
114
115 #ifdef DEVICE_MANAGER
116 class HCameraService::DeviceInitCallBack : public DistributedHardware::DmInitCallback {
117 void OnRemoteDied() override;
118 };
119
OnRemoteDied()120 void HCameraService::DeviceInitCallBack::OnRemoteDied()
121 {
122 MEDIA_INFO_LOG("CameraManager::DeviceInitCallBack OnRemoteDied");
123 }
124 #endif
125
OnStart()126 void HCameraService::OnStart()
127 {
128 MEDIA_INFO_LOG("HCameraService OnStart begin");
129 CHECK_ERROR_PRINT_LOG(cameraHostManager_->Init() != CAMERA_OK,
130 "HCameraService OnStart failed to init camera host manager.");
131 // initialize deferred processing service.
132 DeferredProcessing::DeferredProcessingService::GetInstance().Initialize();
133 DeferredProcessing::DeferredProcessingService::GetInstance().Start();
134
135 #ifdef CAMERA_USE_SENSOR
136 RegisterSensorCallback();
137 #endif
138 AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
139 cameraDataShareHelper_ = std::make_shared<CameraDataShareHelper>();
140 if (Publish(this)) {
141 MEDIA_INFO_LOG("HCameraService publish OnStart sucess");
142 } else {
143 MEDIA_INFO_LOG("HCameraService publish OnStart failed");
144 }
145 MEDIA_INFO_LOG("HCameraService OnStart end");
146 }
147
OnDump()148 void HCameraService::OnDump()
149 {
150 MEDIA_INFO_LOG("HCameraService::OnDump called");
151 }
152
OnStop()153 void HCameraService::OnStop()
154 {
155 MEDIA_INFO_LOG("HCameraService::OnStop called");
156 cameraHostManager_->DeInit();
157 UnRegisterFoldStatusListener();
158 #ifdef CAMERA_USE_SENSOR
159 UnRegisterSensorCallback();
160 #endif
161 DeferredProcessing::DeferredProcessingService::GetInstance().Stop();
162 }
163
GetMuteModeFromDataShareHelper(bool & muteMode)164 int32_t HCameraService::GetMuteModeFromDataShareHelper(bool &muteMode)
165 {
166 lock_guard<mutex> lock(g_dataShareHelperMutex);
167 CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_INVALID_ARG,
168 "GetMuteModeFromDataShareHelper NULL");
169 std::string value = "";
170 auto ret = cameraDataShareHelper_->QueryOnce(PREDICATES_STRING, value);
171 MEDIA_INFO_LOG("GetMuteModeFromDataShareHelper Query ret = %{public}d, value = %{public}s", ret, value.c_str());
172 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_INVALID_ARG, "GetMuteModeFromDataShareHelper QueryOnce fail.");
173 value = (value == "0" || value == "1") ? value : "0";
174 int32_t muteModeVal = std::stoi(value);
175 CHECK_ERROR_RETURN_RET_LOG(muteModeVal != 0 && muteModeVal != 1, CAMERA_INVALID_ARG,
176 "GetMuteModeFromDataShareHelper Query MuteMode invald, value = %{public}d", muteModeVal);
177 muteMode = (muteModeVal == 1) ? true: false;
178 this->muteModeStored_ = muteMode;
179 return CAMERA_OK;
180 }
181
SetMuteModeByDataShareHelper(bool muteMode)182 int32_t HCameraService::SetMuteModeByDataShareHelper(bool muteMode)
183 {
184 lock_guard<mutex> lock(g_dataShareHelperMutex);
185 CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_ALLOC_ERROR,
186 "GetMuteModeFromDataShareHelper NULL");
187 std::string unMuteModeStr = "0";
188 std::string muteModeStr = "1";
189 std::string value = muteMode? muteModeStr : unMuteModeStr;
190 auto ret = cameraDataShareHelper_->UpdateOnce(PREDICATES_STRING, value);
191 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_ALLOC_ERROR, "SetMuteModeByDataShareHelper UpdateOnce fail.");
192 return CAMERA_OK;
193 }
194
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)195 void HCameraService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
196 {
197 MEDIA_INFO_LOG("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
198 bool muteMode = false;
199 int32_t ret = -1;
200 int32_t cnt = 0;
201 const int32_t retryCnt = 5;
202 const int32_t retryTimeout = 1;
203 switch (systemAbilityId) {
204 case DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID:
205 MEDIA_INFO_LOG("OnAddSystemAbility RegisterObserver start");
206 while (cnt++ < retryCnt) {
207 ret = GetMuteModeFromDataShareHelper(muteMode);
208 MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper, tryCount=%{public}d", cnt);
209 if (ret == CAMERA_OK) {
210 break;
211 }
212 sleep(retryTimeout);
213 }
214 this->SetServiceStatus(CameraServiceStatus::SERVICE_READY);
215 MuteCameraFunc(muteMode);
216 muteModeStored_ = muteMode;
217 MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper Success, muteMode = %{public}d, "
218 "final retryCnt=%{public}d",
219 muteMode, cnt);
220 break;
221 default:
222 MEDIA_INFO_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
223 break;
224 }
225 MEDIA_INFO_LOG("OnAddSystemAbility done");
226 }
227
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)228 void HCameraService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
229 {
230 MEDIA_DEBUG_LOG("HCameraService::OnRemoveSystemAbility systemAbilityId:%{public}d removed", systemAbilityId);
231 }
232
GetCameras(vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)233 int32_t HCameraService::GetCameras(
234 vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
235 {
236 CAMERA_SYNC_TRACE;
237 isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
238 isFoldableInit = true;
239 int32_t ret = cameraHostManager_->GetCameras(cameraIds);
240 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameras failed");
241 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
242 vector<shared_ptr<CameraMetaInfo>> cameraInfos;
243 for (auto id : cameraIds) {
244 ret = cameraHostManager_->GetCameraAbility(id, cameraAbility);
245 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || cameraAbility == nullptr, ret,
246 "HCameraService::GetCameraAbility failed");
247 auto cameraMetaInfo = GetCameraMetaInfo(id, cameraAbility);
248 if (cameraMetaInfo == nullptr) {
249 continue;
250 }
251 cameraInfos.emplace_back(cameraMetaInfo);
252 }
253 FillCameras(cameraInfos, cameraIds, cameraAbilityList);
254 return ret;
255 }
256
GetCameraMetaInfo(std::string & cameraId,shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)257 shared_ptr<CameraMetaInfo>HCameraService::GetCameraMetaInfo(std::string &cameraId,
258 shared_ptr<OHOS::Camera::CameraMetadata>cameraAbility)
259 {
260 camera_metadata_item_t item;
261 common_metadata_header_t* metadata = cameraAbility->get();
262 int32_t res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_POSITION, &item);
263 uint8_t cameraPosition = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_POSITION_OTHER;
264 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLDSCREEN_TYPE, &item);
265 uint8_t foldType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLDSCREEN_OTHER;
266 if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_FOLDSCREEN_OTHER &&
267 system::GetParameter("const.window.foldscreen.type", "")[0] == '1') {
268 return nullptr;
269 }
270 if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_FOLDSCREEN_INNER) {
271 cameraPosition = POSITION_FOLD_INNER;
272 }
273 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_TYPE, &item);
274 uint8_t cameraType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_TYPE_UNSPECIFIED;
275 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
276 uint8_t connectionType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_CONNECTION_TYPE_BUILTIN;
277 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
278 bool isMirrorSupported = (res == CAM_META_SUCCESS) ? (item.count != 0) : false;
279 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLD_STATUS, &item);
280 uint8_t foldStatus = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLD_STATUS_NONFOLDABLE;
281 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_MODES, &item);
282 std::vector<uint8_t> supportModes = {};
283 for (uint32_t i = 0; i < item.count; i++) {
284 supportModes.push_back(item.data.u8[i]);
285 }
286 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager GetCameras camera ID:%s, Camera position:%d, "
287 "Camera Type:%d, Connection Type:%d, Mirror support:%d, Fold status %d",
288 cameraId.c_str(), cameraPosition, cameraType, connectionType, isMirrorSupported, foldStatus));
289 return make_shared<CameraMetaInfo>(cameraId, cameraType, cameraPosition, connectionType,
290 foldStatus, supportModes, cameraAbility);
291 }
292
FillCameras(vector<shared_ptr<CameraMetaInfo>> & cameraInfos,vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)293 void HCameraService::FillCameras(vector<shared_ptr<CameraMetaInfo>>& cameraInfos,
294 vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
295 {
296 vector<shared_ptr<CameraMetaInfo>> choosedCameras = ChooseDeFaultCameras(cameraInfos);
297 cameraIds.clear();
298 cameraAbilityList.clear();
299 for (const auto& camera: choosedCameras) {
300 cameraIds.emplace_back(camera->cameraId);
301 cameraAbilityList.emplace_back(camera->cameraAbility);
302 }
303 int32_t uid = IPCSkeleton::GetCallingUid();
304 if (uid == ROOT_UID || uid == FACE_CLIENT_UID || uid == RSS_UID ||
305 OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(IPCSkeleton::GetCallingFullTokenID())) {
306 vector<shared_ptr<CameraMetaInfo>> physicalCameras = ChoosePhysicalCameras(cameraInfos, choosedCameras);
307 for (const auto& camera: physicalCameras) {
308 cameraIds.emplace_back(camera->cameraId);
309 cameraAbilityList.emplace_back(camera->cameraAbility);
310 }
311 } else {
312 MEDIA_INFO_LOG("current token id not support physical camera");
313 }
314 }
315
ChoosePhysicalCameras(const vector<shared_ptr<CameraMetaInfo>> & cameraInfos,const vector<shared_ptr<CameraMetaInfo>> & choosedCameras)316 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChoosePhysicalCameras(
317 const vector<shared_ptr<CameraMetaInfo>>& cameraInfos, const vector<shared_ptr<CameraMetaInfo>>& choosedCameras)
318 {
319 std::vector<OHOS::HDI::Camera::V1_3::OperationMode> supportedPhysicalCamerasModes = {
320 OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_PHOTO,
321 OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_VIDEO,
322 OHOS::HDI::Camera::V1_3::OperationMode::HIGH_RESOLUTION_PHOTO,
323 };
324 vector<shared_ptr<CameraMetaInfo>> physicalCameraInfos = {};
325 for (auto& camera : cameraInfos) {
326 if (std::any_of(choosedCameras.begin(), choosedCameras.end(), [camera](const auto& defaultCamera) {
327 return camera->cameraId == defaultCamera->cameraId;
328 })
329 ) {
330 MEDIA_INFO_LOG("ChoosePhysicalCameras alreadly has default camera: %{public}s", camera->cameraId.c_str());
331 } else {
332 physicalCameraInfos.push_back(camera);
333 }
334 }
335 vector<shared_ptr<CameraMetaInfo>> physicalCameras = {};
336 for (auto& camera : physicalCameraInfos) {
337 MEDIA_INFO_LOG("ChoosePhysicalCameras camera ID:%s, CameraType: %{public}d, Camera position:%{public}d, "
338 "Connection Type:%{public}d",
339 camera->cameraId.c_str(), camera->cameraType, camera->position, camera->connectionType);
340 bool isSupportPhysicalCamera = std::any_of(camera->supportModes.begin(), camera->supportModes.end(),
341 [&supportedPhysicalCamerasModes](auto mode) -> bool {
342 return any_of(supportedPhysicalCamerasModes.begin(), supportedPhysicalCamerasModes.end(),
343 [mode](auto it)-> bool { return it == mode; });
344 });
345 if (camera->cameraType != camera_type_enum_t::OHOS_CAMERA_TYPE_UNSPECIFIED && isSupportPhysicalCamera) {
346 physicalCameras.emplace_back(camera);
347 MEDIA_INFO_LOG("ChoosePhysicalCameras add camera ID:%{public}s", camera->cameraId.c_str());
348 }
349 }
350 return physicalCameras;
351 }
352
ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)353 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)
354 {
355 vector<shared_ptr<CameraMetaInfo>> choosedCameras;
356 for (auto& camera : cameraInfos) {
357 MEDIA_INFO_LOG("ChooseDeFaultCameras camera ID:%s, Camera position:%{public}d, Connection Type:%{public}d",
358 camera->cameraId.c_str(), camera->position, camera->connectionType);
359 if (any_of(choosedCameras.begin(), choosedCameras.end(),
360 [camera](const auto& defaultCamera) {
361 return (camera->connectionType != OHOS_CAMERA_CONNECTION_TYPE_USB_PLUGIN &&
362 defaultCamera->position == camera->position &&
363 defaultCamera->connectionType == camera->connectionType &&
364 defaultCamera->foldStatus == camera->foldStatus);
365 })
366 ) {
367 MEDIA_INFO_LOG("ChooseDeFaultCameras alreadly has default camera");
368 } else {
369 choosedCameras.emplace_back(camera);
370 MEDIA_INFO_LOG("add camera ID:%{public}s", camera->cameraId.c_str());
371 }
372 }
373 return choosedCameras;
374 }
375
GetCameraIds(vector<string> & cameraIds)376 int32_t HCameraService::GetCameraIds(vector<string>& cameraIds)
377 {
378 CAMERA_SYNC_TRACE;
379 int32_t ret = CAMERA_OK;
380 MEDIA_DEBUG_LOG("HCameraService::GetCameraIds");
381 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
382 ret = GetCameras(cameraIds, cameraAbilityList);
383 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::GetCameraIds failed");
384 return ret;
385 }
386
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & cameraAbility)387 int32_t HCameraService::GetCameraAbility(std::string& cameraId,
388 std::shared_ptr<OHOS::Camera::CameraMetadata>& cameraAbility)
389 {
390 CAMERA_SYNC_TRACE;
391 int32_t ret = CAMERA_OK;
392 MEDIA_DEBUG_LOG("HCameraService::GetCameraAbility");
393
394 std::vector<std::string> cameraIds;
395 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
396 ret = GetCameras(cameraIds, cameraAbilityList);
397 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameraAbility failed");
398
399 int32_t index = 0;
400 for (auto id : cameraIds) {
401 if (id.compare(cameraId) == 0) {
402 break;
403 }
404 index++;
405 }
406 int32_t abilityIndex = 0;
407 for (auto it : cameraAbilityList) {
408 if (abilityIndex == index) {
409 cameraAbility = it;
410 break;
411 }
412 abilityIndex++;
413 }
414 return ret;
415 }
416
CreateCameraDevice(string cameraId,sptr<ICameraDeviceService> & device)417 int32_t HCameraService::CreateCameraDevice(string cameraId, sptr<ICameraDeviceService>& device)
418 {
419 CAMERA_SYNC_TRACE;
420 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
421 MEDIA_INFO_LOG("HCameraService::CreateCameraDevice prepare execute, cameraId:%{public}s", cameraId.c_str());
422
423 string permissionName = OHOS_PERMISSION_CAMERA;
424 int32_t ret = CheckPermission(permissionName, callerToken);
425 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
426 "HCameraService::CreateCameraDevice Check OHOS_PERMISSION_CAMERA fail %{public}d", ret);
427 // if callerToken is invalid, will not call IsAllowedUsingPermission
428 CHECK_ERROR_RETURN_RET_LOG(!IsInForeGround(callerToken), CAMERA_ALLOC_ERROR,
429 "HCameraService::CreateCameraDevice is not allowed!");
430 sptr<HCameraDevice> cameraDevice = new (nothrow) HCameraDevice(cameraHostManager_, cameraId, callerToken);
431 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_ALLOC_ERROR,
432 "HCameraService::CreateCameraDevice HCameraDevice allocation failed");
433 CHECK_ERROR_RETURN_RET_LOG(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE,
434 "HCameraService::CreateCameraDevice CameraService not ready!");
435 {
436 lock_guard<mutex> lock(g_dataShareHelperMutex);
437 // when create camera device, update mute setting truely.
438 if (IsCameraMuteSupported(cameraId)) {
439 if (UpdateMuteSetting(cameraDevice, muteModeStored_) != CAMERA_OK) {
440 MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
441 }
442 } else {
443 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice MuteCamera not Supported");
444 }
445 device = cameraDevice;
446 cameraDevice->SetDeviceMuteMode(muteModeStored_);
447 }
448 #ifdef CAMERA_USE_SENSOR
449 RegisterSensorCallback();
450 #endif
451 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager_CreateCameraInput CameraId:%s", cameraId.c_str()));
452 MEDIA_INFO_LOG("HCameraService::CreateCameraDevice execute success");
453 return CAMERA_OK;
454 }
455
CreateCaptureSession(sptr<ICaptureSession> & session,int32_t opMode)456 int32_t HCameraService::CreateCaptureSession(sptr<ICaptureSession>& session, int32_t opMode)
457 {
458 CAMERA_SYNC_TRACE;
459 std::lock_guard<std::mutex> lock(mutex_);
460 int32_t rc = CAMERA_OK;
461 MEDIA_INFO_LOG("HCameraService::CreateCaptureSession opMode_= %{public}d", opMode);
462
463 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
464 sptr<HCaptureSession> captureSession = HCaptureSession::NewInstance(callerToken, opMode);
465 if (captureSession == nullptr) {
466 rc = CAMERA_ALLOC_ERROR;
467 MEDIA_ERR_LOG("HCameraService::CreateCaptureSession allocation failed");
468 CameraReportUtils::ReportCameraError(
469 "HCameraService::CreateCaptureSession", rc, false, CameraReportUtils::GetCallerInfo());
470 return rc;
471 }
472 session = captureSession;
473 pid_t pid = IPCSkeleton::GetCallingPid();
474 captureSessionsManager_.EnsureInsert(pid, captureSession);
475 return rc;
476 }
477
CreateDeferredPhotoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredPhotoProcessingSession> & session)478 int32_t HCameraService::CreateDeferredPhotoProcessingSession(int32_t userId,
479 sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback>& callback,
480 sptr<DeferredProcessing::IDeferredPhotoProcessingSession>& session)
481 {
482 CAMERA_SYNC_TRACE;
483 MEDIA_INFO_LOG("HCameraService::CreateDeferredPhotoProcessingSession enter.");
484 sptr<DeferredProcessing::IDeferredPhotoProcessingSession> photoSession;
485 int32_t uid = IPCSkeleton::GetCallingUid();
486 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
487 MEDIA_INFO_LOG("CreateDeferredPhotoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
488 photoSession =
489 DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredPhotoProcessingSession(userId,
490 callback);
491 session = photoSession;
492 return CAMERA_OK;
493 }
494
CreateDeferredVideoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredVideoProcessingSession> & session)495 int32_t HCameraService::CreateDeferredVideoProcessingSession(int32_t userId,
496 sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback>& callback,
497 sptr<DeferredProcessing::IDeferredVideoProcessingSession>& session)
498 {
499 CAMERA_SYNC_TRACE;
500 MEDIA_INFO_LOG("HCameraService::CreateDeferredVideoProcessingSession enter.");
501 sptr<DeferredProcessing::IDeferredVideoProcessingSession> videoSession;
502 int32_t uid = IPCSkeleton::GetCallingUid();
503 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
504 MEDIA_INFO_LOG("CreateDeferredVideoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
505 videoSession =
506 DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredVideoProcessingSession(userId,
507 callback);
508 session = videoSession;
509 return CAMERA_OK;
510 }
511
CreatePhotoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamCapture> & photoOutput)512 int32_t HCameraService::CreatePhotoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
513 int32_t height, sptr<IStreamCapture>& photoOutput)
514 {
515 CAMERA_SYNC_TRACE;
516 int32_t rc = CAMERA_OK;
517 MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput prepare execute");
518 if ((producer == nullptr) || (width == 0) || (height == 0)) {
519 rc = CAMERA_INVALID_ARG;
520 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput producer is null");
521 CameraReportUtils::ReportCameraError(
522 "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
523 return rc;
524 }
525 sptr<HStreamCapture> streamCapture = new (nothrow) HStreamCapture(producer, format, width, height);
526 if (streamCapture == nullptr) {
527 rc = CAMERA_ALLOC_ERROR;
528 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput streamCapture is null");
529 CameraReportUtils::ReportCameraError(
530 "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
531 return rc;
532 }
533
534 stringstream ss;
535 ss << "format=" << format << " width=" << width << " height=" << height;
536 CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
537 photoOutput = streamCapture;
538 MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput execute success");
539 return rc;
540 }
541
CreateDeferredPreviewOutput(int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)542 int32_t HCameraService::CreateDeferredPreviewOutput(
543 int32_t format, int32_t width, int32_t height, sptr<IStreamRepeat>& previewOutput)
544 {
545 CAMERA_SYNC_TRACE;
546 sptr<HStreamRepeat> streamDeferredPreview;
547 MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput prepare execute");
548 CHECK_ERROR_RETURN_RET_LOG((width == 0) || (height == 0), CAMERA_INVALID_ARG,
549 "HCameraService::CreateDeferredPreviewOutput producer is null!");
550 streamDeferredPreview = new (nothrow) HStreamRepeat(nullptr, format, width, height, RepeatStreamType::PREVIEW);
551 CHECK_ERROR_RETURN_RET_LOG(streamDeferredPreview == nullptr, CAMERA_ALLOC_ERROR,
552 "HCameraService::CreateDeferredPreviewOutput HStreamRepeat allocation failed");
553 previewOutput = streamDeferredPreview;
554 MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput execute success");
555 return CAMERA_OK;
556 }
557
CreatePreviewOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)558 int32_t HCameraService::CreatePreviewOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
559 int32_t height, sptr<IStreamRepeat>& previewOutput)
560 {
561 CAMERA_SYNC_TRACE;
562 sptr<HStreamRepeat> streamRepeatPreview;
563 int32_t rc = CAMERA_OK;
564 MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput prepare execute");
565
566 if ((producer == nullptr) || (width == 0) || (height == 0)) {
567 rc = CAMERA_INVALID_ARG;
568 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput producer is null");
569 CameraReportUtils::ReportCameraError(
570 "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
571 return rc;
572 }
573 streamRepeatPreview = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::PREVIEW);
574 if (streamRepeatPreview == nullptr) {
575 rc = CAMERA_ALLOC_ERROR;
576 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput HStreamRepeat allocation failed");
577 CameraReportUtils::ReportCameraError(
578 "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
579 return rc;
580 }
581 previewOutput = streamRepeatPreview;
582 MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput execute success");
583 return rc;
584 }
585
CreateDepthDataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamDepthData> & depthDataOutput)586 int32_t HCameraService::CreateDepthDataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
587 int32_t width, int32_t height, sptr<IStreamDepthData>& depthDataOutput)
588 {
589 CAMERA_SYNC_TRACE;
590 sptr<HStreamDepthData> streamDepthData;
591 int32_t rc = CAMERA_OK;
592 MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput prepare execute");
593
594 if ((producer == nullptr) || (width == 0) || (height == 0)) {
595 rc = CAMERA_INVALID_ARG;
596 MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput producer is null");
597 CameraReportUtils::ReportCameraError(
598 "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
599 return rc;
600 }
601 streamDepthData = new (nothrow) HStreamDepthData(producer, format, width, height);
602 if (streamDepthData == nullptr) {
603 rc = CAMERA_ALLOC_ERROR;
604 MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput HStreamRepeat allocation failed");
605 CameraReportUtils::ReportCameraError(
606 "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
607 return rc;
608 }
609 depthDataOutput = streamDepthData;
610 MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput execute success");
611 return rc;
612 }
613
CreateMetadataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,std::vector<int32_t> metadataTypes,sptr<IStreamMetadata> & metadataOutput)614 int32_t HCameraService::CreateMetadataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
615 std::vector<int32_t> metadataTypes, sptr<IStreamMetadata>& metadataOutput)
616 {
617 CAMERA_SYNC_TRACE;
618 sptr<HStreamMetadata> streamMetadata;
619 MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput prepare execute");
620
621 CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
622 "HCameraService::CreateMetadataOutput producer is null");
623 streamMetadata = new (nothrow) HStreamMetadata(producer, format, metadataTypes);
624 CHECK_ERROR_RETURN_RET_LOG(streamMetadata == nullptr, CAMERA_ALLOC_ERROR,
625 "HCameraService::CreateMetadataOutput HStreamMetadata allocation failed");
626
627 metadataOutput = streamMetadata;
628 MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput execute success");
629 return CAMERA_OK;
630 }
631
CreateVideoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & videoOutput)632 int32_t HCameraService::CreateVideoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
633 int32_t height, sptr<IStreamRepeat>& videoOutput)
634 {
635 CAMERA_SYNC_TRACE;
636 sptr<HStreamRepeat> streamRepeatVideo;
637 int32_t rc = CAMERA_OK;
638 MEDIA_INFO_LOG("HCameraService::CreateVideoOutput prepare execute");
639
640 if ((producer == nullptr) || (width == 0) || (height == 0)) {
641 rc = CAMERA_INVALID_ARG;
642 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput producer is null");
643 CameraReportUtils::ReportCameraError(
644 "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
645 return rc;
646 }
647 streamRepeatVideo = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::VIDEO);
648 if (streamRepeatVideo == nullptr) {
649 rc = CAMERA_ALLOC_ERROR;
650 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput HStreamRepeat allocation failed");
651 CameraReportUtils::ReportCameraError(
652 "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
653 return rc;
654 }
655 stringstream ss;
656 ss << "format=" << format << " width=" << width << " height=" << height;
657 CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
658 videoOutput = streamRepeatVideo;
659 MEDIA_INFO_LOG("HCameraService::CreateVideoOutput execute success");
660 return rc;
661 }
662
ShouldSkipStatusUpdates(pid_t pid)663 bool HCameraService::ShouldSkipStatusUpdates(pid_t pid)
664 {
665 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
666 CHECK_AND_RETURN_RET(freezedPidList_.count(pid) != 0, false);
667 MEDIA_INFO_LOG("ShouldSkipStatusUpdates pid = %{public}d", pid);
668 return true;
669 }
670
OnCameraStatus(const string & cameraId,CameraStatus status,CallbackInvoker invoker)671 void HCameraService::OnCameraStatus(const string& cameraId, CameraStatus status, CallbackInvoker invoker)
672 {
673 lock_guard<mutex> lock(cameraCbMutex_);
674 std::string bundleName = "";
675 if (invoker == CallbackInvoker::APPLICATION) {
676 bundleName = GetClientBundle(IPCSkeleton::GetCallingUid());
677 }
678 MEDIA_INFO_LOG("HCameraService::OnCameraStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
679 "status = %{public}d, pid = %{public}d, bundleName = %{public}s", cameraServiceCallbacks_.size(),
680 cameraId.c_str(), status, IPCSkeleton::GetCallingPid(), bundleName.c_str());
681 for (auto it : cameraServiceCallbacks_) {
682 if (it.second == nullptr) {
683 MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
684 continue;
685 }
686 uint32_t pid = it.first;
687 if (ShouldSkipStatusUpdates(pid)) {
688 continue;
689 }
690 it.second->OnCameraStatusChanged(cameraId, status, bundleName);
691 cameraStatusCallbacks_[cameraId] = CameraStatusCallbacksInfo{status, bundleName};
692 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraStatusChanged! for cameraId:%s, current Camera Status:%d",
693 cameraId.c_str(), status));
694 }
695 }
696
OnFlashlightStatus(const string & cameraId,FlashStatus status)697 void HCameraService::OnFlashlightStatus(const string& cameraId, FlashStatus status)
698 {
699 lock_guard<mutex> lock(cameraCbMutex_);
700 MEDIA_INFO_LOG("HCameraService::OnFlashlightStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
701 "status = %{public}d, pid = %{public}d", cameraServiceCallbacks_.size(), cameraId.c_str(), status,
702 IPCSkeleton::GetCallingPid());
703 for (auto it : cameraServiceCallbacks_) {
704 if (it.second == nullptr) {
705 MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
706 continue;
707 }
708 uint32_t pid = it.first;
709 if (ShouldSkipStatusUpdates(pid)) {
710 continue;
711 }
712 it.second->OnFlashlightStatusChanged(cameraId, status);
713 }
714 }
715
OnMute(bool muteMode)716 void HCameraService::OnMute(bool muteMode)
717 {
718 lock_guard<mutex> lock(muteCbMutex_);
719 if (!cameraMuteServiceCallbacks_.empty()) {
720 for (auto it : cameraMuteServiceCallbacks_) {
721 if (it.second == nullptr) {
722 MEDIA_ERR_LOG("HCameraService::OnMute pid:%{public}d cameraMuteServiceCallback is null", it.first);
723 continue;
724 }
725 uint32_t pid = it.first;
726 if (ShouldSkipStatusUpdates(pid)) {
727 continue;
728 }
729 it.second->OnCameraMute(muteMode);
730 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraMute! current Camera muteMode:%d", muteMode));
731 }
732 }
733 if (peerCallback_ != nullptr) {
734 MEDIA_INFO_LOG("HCameraService::NotifyMuteCamera peerCallback current camera muteMode:%{public}d", muteMode);
735 peerCallback_->NotifyMuteCamera(muteMode);
736 }
737 }
738
OnTorchStatus(TorchStatus status)739 void HCameraService::OnTorchStatus(TorchStatus status)
740 {
741 lock_guard<recursive_mutex> lock(torchCbMutex_);
742 torchStatus_ = status;
743 MEDIA_INFO_LOG("HCameraService::OnTorchtStatus callbacks.size = %{public}zu, status = %{public}d, pid = %{public}d",
744 torchServiceCallbacks_.size(), status, IPCSkeleton::GetCallingPid());
745 for (auto it : torchServiceCallbacks_) {
746 if (it.second == nullptr) {
747 MEDIA_ERR_LOG("HCameraService::OnTorchtStatus pid:%{public}d torchServiceCallback is null", it.first);
748 continue;
749 }
750 uint32_t pid = it.first;
751 if (ShouldSkipStatusUpdates(pid)) {
752 continue;
753 }
754 it.second->OnTorchStatusChange(status);
755 }
756 }
757
OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)758 void HCameraService::OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)
759 {
760 MEDIA_INFO_LOG("OnFoldStatusChanged preFoldStatus = %{public}d, foldStatus = %{public}d, pid = %{public}d",
761 preFoldStatus_, foldStatus, IPCSkeleton::GetCallingPid());
762 auto curFoldStatus = (FoldStatus)foldStatus;
763 if ((curFoldStatus == FoldStatus::HALF_FOLD && preFoldStatus_ == FoldStatus::EXPAND) ||
764 (curFoldStatus == FoldStatus::EXPAND && preFoldStatus_ == FoldStatus::HALF_FOLD)) {
765 preFoldStatus_ = curFoldStatus;
766 return;
767 }
768 preFoldStatus_ = curFoldStatus;
769 if (curFoldStatus == FoldStatus::HALF_FOLD) {
770 curFoldStatus = FoldStatus::EXPAND;
771 }
772 lock_guard<recursive_mutex> lock(foldCbMutex_);
773 CHECK_EXECUTE(innerFoldCallback_, innerFoldCallback_->OnFoldStatusChanged(curFoldStatus));
774 CHECK_ERROR_RETURN_LOG(foldServiceCallbacks_.empty(), "OnFoldStatusChanged foldServiceCallbacks is empty");
775 MEDIA_INFO_LOG("OnFoldStatusChanged foldStatusCallback size = %{public}zu", foldServiceCallbacks_.size());
776 for (auto it : foldServiceCallbacks_) {
777 if (it.second == nullptr) {
778 MEDIA_ERR_LOG("OnFoldStatusChanged pid:%{public}d foldStatusCallbacks is null", it.first);
779 continue;
780 }
781 uint32_t pid = it.first;
782 if (ShouldSkipStatusUpdates(pid)) {
783 continue;
784 }
785 it.second->OnFoldStatusChanged(curFoldStatus);
786 }
787 }
788
CloseCameraForDestory(pid_t pid)789 int32_t HCameraService::CloseCameraForDestory(pid_t pid)
790 {
791 MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory enter");
792 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
793 sptr<HCameraDevice> deviceNeedClose = deviceManager->GetCameraByPid(pid);
794 if (deviceNeedClose != nullptr) {
795 deviceNeedClose->Close();
796 }
797 return CAMERA_OK;
798 }
799
ExecutePidSetCallback(sptr<ICameraServiceCallback> & callback,std::vector<std::string> & cameraIds)800 void HCameraService::ExecutePidSetCallback(sptr<ICameraServiceCallback>& callback, std::vector<std::string> &cameraIds)
801 {
802 for (const auto& cameraId : cameraIds) {
803 auto it = cameraStatusCallbacks_.find(cameraId);
804 if (it != cameraStatusCallbacks_.end()) {
805 MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = %{public}d, bundleName = %{public}s",
806 cameraId.c_str(), it->second.status, it->second.bundleName.c_str());
807 callback->OnCameraStatusChanged(cameraId, it->second.status, it->second.bundleName);
808 } else {
809 MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = 2", cameraId.c_str());
810 callback->OnCameraStatusChanged(cameraId, CameraStatus::CAMERA_STATUS_AVAILABLE);
811 }
812 }
813 }
814
SetCameraCallback(sptr<ICameraServiceCallback> & callback)815 int32_t HCameraService::SetCameraCallback(sptr<ICameraServiceCallback>& callback)
816 {
817 std::vector<std::string> cameraIds;
818 GetCameraIds(cameraIds);
819 lock_guard<mutex> lock(cameraCbMutex_);
820 pid_t pid = IPCSkeleton::GetCallingPid();
821 MEDIA_INFO_LOG("HCameraService::SetCameraCallback pid = %{public}d", pid);
822 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
823 "HCameraService::SetCameraCallback callback is null");
824 auto callbackItem = cameraServiceCallbacks_.find(pid);
825 if (callbackItem != cameraServiceCallbacks_.end()) {
826 callbackItem->second = nullptr;
827 (void)cameraServiceCallbacks_.erase(callbackItem);
828 }
829 cameraServiceCallbacks_.insert(make_pair(pid, callback));
830 ExecutePidSetCallback(callback, cameraIds);
831 return CAMERA_OK;
832 }
833
SetMuteCallback(sptr<ICameraMuteServiceCallback> & callback)834 int32_t HCameraService::SetMuteCallback(sptr<ICameraMuteServiceCallback>& callback)
835 {
836 lock_guard<mutex> lock(muteCbMutex_);
837 pid_t pid = IPCSkeleton::GetCallingPid();
838 MEDIA_INFO_LOG("HCameraService::SetMuteCallback pid = %{public}d", pid);
839 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
840 "HCameraService::SetMuteCallback callback is null");
841 // If the callback set by the SA caller is later than the camera service is started,
842 // the callback cannot be triggered to obtain the mute state. Therefore,
843 // when the SA sets the callback, the callback is triggered immediately to return the mute state.
844 constexpr int32_t maxSaUid = 10000;
845 if (IPCSkeleton::GetCallingUid() > 0 && IPCSkeleton::GetCallingUid() < maxSaUid) {
846 callback->OnCameraMute(muteModeStored_);
847 }
848 cameraMuteServiceCallbacks_.insert(make_pair(pid, callback));
849 return CAMERA_OK;
850 }
851
SetTorchCallback(sptr<ITorchServiceCallback> & callback)852 int32_t HCameraService::SetTorchCallback(sptr<ITorchServiceCallback>& callback)
853 {
854 lock_guard<recursive_mutex> lock(torchCbMutex_);
855 pid_t pid = IPCSkeleton::GetCallingPid();
856 MEDIA_INFO_LOG("HCameraService::SetTorchCallback pid = %{public}d", pid);
857 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
858 "HCameraService::SetTorchCallback callback is null");
859 torchServiceCallbacks_.insert(make_pair(pid, callback));
860
861 MEDIA_INFO_LOG("HCameraService::SetTorchCallback notify pid = %{public}d", pid);
862 callback->OnTorchStatusChange(torchStatus_);
863 return CAMERA_OK;
864 }
865
SetFoldStatusCallback(sptr<IFoldServiceCallback> & callback,bool isInnerCallback)866 int32_t HCameraService::SetFoldStatusCallback(sptr<IFoldServiceCallback>& callback, bool isInnerCallback)
867 {
868 lock_guard<recursive_mutex> lock(foldCbMutex_);
869 isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
870 CHECK_EXECUTE((isFoldable && !isFoldRegister), RegisterFoldStatusListener());
871 if (isInnerCallback) {
872 innerFoldCallback_ = callback;
873 } else {
874 pid_t pid = IPCSkeleton::GetCallingPid();
875 MEDIA_INFO_LOG("HCameraService::SetFoldStatusCallback pid = %{public}d", pid);
876 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
877 "HCameraService::SetFoldStatusCallback callback is null");
878 foldServiceCallbacks_.insert(make_pair(pid, callback));
879 }
880 return CAMERA_OK;
881 }
882
UnSetCameraCallback(pid_t pid)883 int32_t HCameraService::UnSetCameraCallback(pid_t pid)
884 {
885 lock_guard<mutex> lock(cameraCbMutex_);
886 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback pid = %{public}d, size = %{public}zu",
887 pid, cameraServiceCallbacks_.size());
888 if (!cameraServiceCallbacks_.empty()) {
889 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback cameraServiceCallbacks_ is not empty, reset it");
890 auto it = cameraServiceCallbacks_.find(pid);
891 if ((it != cameraServiceCallbacks_.end()) && (it->second != nullptr)) {
892 it->second = nullptr;
893 cameraServiceCallbacks_.erase(it);
894 }
895 }
896 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback after erase pid = %{public}d, size = %{public}zu",
897 pid, cameraServiceCallbacks_.size());
898 return CAMERA_OK;
899 }
900
UnSetMuteCallback(pid_t pid)901 int32_t HCameraService::UnSetMuteCallback(pid_t pid)
902 {
903 lock_guard<mutex> lock(muteCbMutex_);
904 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback pid = %{public}d, size = %{public}zu",
905 pid, cameraMuteServiceCallbacks_.size());
906 if (!cameraMuteServiceCallbacks_.empty()) {
907 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback cameraMuteServiceCallbacks_ is not empty, reset it");
908 auto it = cameraMuteServiceCallbacks_.find(pid);
909 if ((it != cameraMuteServiceCallbacks_.end()) && (it->second)) {
910 it->second = nullptr;
911 cameraMuteServiceCallbacks_.erase(it);
912 }
913 }
914
915 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback after erase pid = %{public}d, size = %{public}zu",
916 pid, cameraMuteServiceCallbacks_.size());
917 return CAMERA_OK;
918 }
919
UnSetTorchCallback(pid_t pid)920 int32_t HCameraService::UnSetTorchCallback(pid_t pid)
921 {
922 lock_guard<recursive_mutex> lock(torchCbMutex_);
923 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback pid = %{public}d, size = %{public}zu",
924 pid, torchServiceCallbacks_.size());
925 if (!torchServiceCallbacks_.empty()) {
926 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback torchServiceCallbacks_ is not empty, reset it");
927 auto it = torchServiceCallbacks_.find(pid);
928 if ((it != torchServiceCallbacks_.end()) && (it->second)) {
929 it->second = nullptr;
930 torchServiceCallbacks_.erase(it);
931 }
932 }
933
934 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback after erase pid = %{public}d, size = %{public}zu",
935 pid, torchServiceCallbacks_.size());
936 return CAMERA_OK;
937 }
938
UnSetFoldStatusCallback(pid_t pid)939 int32_t HCameraService::UnSetFoldStatusCallback(pid_t pid)
940 {
941 lock_guard<recursive_mutex> lock(foldCbMutex_);
942 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback pid = %{public}d, size = %{public}zu",
943 pid, foldServiceCallbacks_.size());
944 if (!foldServiceCallbacks_.empty()) {
945 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback foldServiceCallbacks_ is not empty, reset it");
946 auto it = foldServiceCallbacks_.find(pid);
947 if ((it != foldServiceCallbacks_.end()) && (it->second)) {
948 it->second = nullptr;
949 foldServiceCallbacks_.erase(it);
950 }
951 }
952 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback after erase pid = %{public}d, size = %{public}zu",
953 pid, foldServiceCallbacks_.size());
954 innerFoldCallback_ = nullptr;
955 return CAMERA_OK;
956 }
957
RegisterFoldStatusListener()958 void HCameraService::RegisterFoldStatusListener()
959 {
960 MEDIA_INFO_LOG("RegisterFoldStatusListener is called");
961 preFoldStatus_ = (FoldStatus)OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus();
962 auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(this);
963 CHECK_ERROR_RETURN_LOG(ret != OHOS::Rosen::DMError::DM_OK, "RegisterFoldStatusListener failed");
964 isFoldRegister = true;
965 }
966
UnRegisterFoldStatusListener()967 void HCameraService::UnRegisterFoldStatusListener()
968 {
969 MEDIA_INFO_LOG("UnRegisterFoldStatusListener is called");
970 auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterFoldStatusListener(this);
971 preFoldStatus_ = FoldStatus::UNKNOWN_FOLD;
972 CHECK_ERROR_PRINT_LOG(ret != OHOS::Rosen::DMError::DM_OK, "UnRegisterFoldStatusListener failed");
973 isFoldRegister = false;
974 }
975
UnSetAllCallback(pid_t pid)976 int32_t HCameraService::UnSetAllCallback(pid_t pid)
977 {
978 MEDIA_INFO_LOG("HCameraService::UnSetAllCallback enter");
979 UnSetCameraCallback(pid);
980 UnSetMuteCallback(pid);
981 UnSetTorchCallback(pid);
982 UnSetFoldStatusCallback(pid);
983 return CAMERA_OK;
984 }
985
IsCameraMuteSupported(string cameraId)986 bool HCameraService::IsCameraMuteSupported(string cameraId)
987 {
988 bool isMuteSupported = false;
989 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
990 int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
991 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, false, "HCameraService::IsCameraMuted GetCameraAbility failed");
992 camera_metadata_item_t item;
993 common_metadata_header_t* metadata = cameraAbility->get();
994 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_MUTE_MODES, &item);
995 if (ret == CAM_META_SUCCESS) {
996 for (uint32_t i = 0; i < item.count; i++) {
997 MEDIA_INFO_LOG("OHOS_ABILITY_MUTE_MODES %{public}d th is %{public}d", i, item.data.u8[i]);
998 if (item.data.u8[i] == OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK) {
999 isMuteSupported = true;
1000 break;
1001 }
1002 }
1003 } else {
1004 isMuteSupported = false;
1005 MEDIA_ERR_LOG("HCameraService::IsCameraMuted not find MUTE ability");
1006 }
1007 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted supported: %{public}d", isMuteSupported);
1008 return isMuteSupported;
1009 }
1010
UpdateMuteSetting(sptr<HCameraDevice> cameraDevice,bool muteMode)1011 int32_t HCameraService::UpdateMuteSetting(sptr<HCameraDevice> cameraDevice, bool muteMode)
1012 {
1013 constexpr int32_t DEFAULT_ITEMS = 1;
1014 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1015 shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata =
1016 make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1017 bool status = false;
1018 int32_t ret;
1019 int32_t count = 1;
1020 uint8_t mode = muteMode ? OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK : OHOS_CAMERA_MUTE_MODE_OFF;
1021 camera_metadata_item_t item;
1022
1023 MEDIA_DEBUG_LOG("UpdateMuteSetting muteMode: %{public}d", muteMode);
1024
1025 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_MUTE_MODE, &item);
1026 if (ret == CAM_META_ITEM_NOT_FOUND) {
1027 status = changedMetadata->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1028 } else if (ret == CAM_META_SUCCESS) {
1029 status = changedMetadata->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1030 }
1031 ret = cameraDevice->UpdateSetting(changedMetadata);
1032 CHECK_ERROR_RETURN_RET_LOG(!status || ret != CAMERA_OK, CAMERA_UNKNOWN_ERROR, "UpdateMuteSetting muteMode Failed");
1033 return CAMERA_OK;
1034 }
1035
MuteCameraFunc(bool muteMode)1036 int32_t HCameraService::MuteCameraFunc(bool muteMode)
1037 {
1038 {
1039 lock_guard<mutex> lock(g_dataShareHelperMutex);
1040 cameraHostManager_->SetMuteMode(muteMode);
1041 }
1042 int32_t ret = CAMERA_OK;
1043 bool currentMuteMode = muteModeStored_;
1044 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1045 pid_t activeClient = deviceManager->GetActiveClient();
1046 if (activeClient == -1) {
1047 OnMute(muteMode);
1048 int32_t retCode = SetMuteModeByDataShareHelper(muteMode);
1049 muteModeStored_ = muteMode;
1050 if (retCode != CAMERA_OK) {
1051 MEDIA_ERR_LOG("no activeClient, SetMuteModeByDataShareHelper: ret=%{public}d", retCode);
1052 muteModeStored_ = currentMuteMode;
1053 }
1054 return retCode;
1055 }
1056 sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1057 if (activeDevice != nullptr) {
1058 string cameraId = activeDevice->GetCameraId();
1059 CHECK_ERROR_RETURN_RET_LOG(!IsCameraMuteSupported(cameraId), CAMERA_UNSUPPORTED,
1060 "Not Supported Mute,cameraId: %{public}s", cameraId.c_str());
1061 if (activeDevice != nullptr) {
1062 ret = UpdateMuteSetting(activeDevice, muteMode);
1063 }
1064 if (ret != CAMERA_OK) {
1065 MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
1066 muteModeStored_ = currentMuteMode;
1067 }
1068 }
1069 if (ret == CAMERA_OK) {
1070 OnMute(muteMode);
1071 }
1072 if (activeDevice != nullptr) {
1073 activeDevice->SetDeviceMuteMode(muteMode);
1074 }
1075 ret = SetMuteModeByDataShareHelper(muteMode);
1076 if (ret == CAMERA_OK) {
1077 muteModeStored_ = muteMode;
1078 }
1079 return ret;
1080 }
1081
1082 static std::map<PolicyType, Security::AccessToken::PolicyType> g_policyTypeMap_ = {
1083 {PolicyType::EDM, Security::AccessToken::PolicyType::EDM},
1084 {PolicyType::PRIVACY, Security::AccessToken::PolicyType::PRIVACY},
1085 };
1086
MuteCamera(bool muteMode)1087 int32_t HCameraService::MuteCamera(bool muteMode)
1088 {
1089 int32_t ret = CheckPermission(OHOS_PERMISSION_MANAGE_CAMERA_CONFIG, IPCSkeleton::GetCallingTokenID());
1090 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission argumentis failed!");
1091 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1092 to_string(muteMode), CameraReportUtils::GetCallerInfo());
1093 return MuteCameraFunc(muteMode);
1094 }
1095
MuteCameraPersist(PolicyType policyType,bool isMute)1096 int32_t HCameraService::MuteCameraPersist(PolicyType policyType, bool isMute)
1097 {
1098 int32_t ret = CheckPermission(OHOS_PERMISSION_CAMERA_CONTROL, IPCSkeleton::GetCallingTokenID());
1099 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission arguments failed!");
1100 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1101 to_string(isMute), CameraReportUtils::GetCallerInfo());
1102 CHECK_ERROR_RETURN_RET_LOG(g_policyTypeMap_.count(policyType) == 0, CAMERA_INVALID_ARG,
1103 "MuteCameraPersist Failed, invalid param policyType = %{public}d", static_cast<int32_t>(policyType));
1104 bool targetMuteMode = isMute;
1105 const Security::AccessToken::PolicyType secPolicyType = g_policyTypeMap_[policyType];
1106 const Security::AccessToken::CallerType secCaller = Security::AccessToken::CallerType::CAMERA;
1107 ret = Security::AccessToken::PrivacyKit::SetMutePolicy(secPolicyType, secCaller, isMute);
1108 if (ret != Security::AccessToken::RET_SUCCESS) {
1109 MEDIA_ERR_LOG("MuteCameraPersist SetMutePolicy return false, policyType = %{public}d, retCode = %{public}d",
1110 static_cast<int32_t>(policyType), static_cast<int32_t>(ret));
1111 targetMuteMode = muteModeStored_;
1112 }
1113 return MuteCameraFunc(targetMuteMode);
1114 }
1115
PrelaunchCamera()1116 int32_t HCameraService::PrelaunchCamera()
1117 {
1118 CAMERA_SYNC_TRACE;
1119 MEDIA_INFO_LOG("HCameraService::PrelaunchCamera");
1120 CHECK_ERROR_RETURN_RET_LOG(HCameraDeviceManager::GetInstance()->GetCameraStateOfASide().Size() != 0,
1121 CAMERA_DEVICE_CONFLICT, "HCameraService::PrelaunchCamera there is a device active in A side, abort!");
1122 if (preCameraId_.empty()) {
1123 vector<string> cameraIds_;
1124 cameraHostManager_->GetCameras(cameraIds_);
1125 if (cameraIds_.empty()) {
1126 return CAMERA_OK;
1127 }
1128 preCameraId_ = cameraIds_.front();
1129 }
1130 MEDIA_INFO_LOG("HCameraService::PrelaunchCamera preCameraId_ is: %{public}s", preCameraId_.c_str());
1131 CAMERA_SYSEVENT_STATISTIC(CreateMsg("Camera Prelaunch CameraId:%s", preCameraId_.c_str()));
1132 CameraReportUtils::GetInstance().SetOpenCamPerfPreInfo(preCameraId_.c_str(), CameraReportUtils::GetCallerInfo());
1133 int32_t ret = cameraHostManager_->Prelaunch(preCameraId_, preCameraClient_);
1134 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1135 return ret;
1136 }
1137
PreSwitchCamera(const std::string cameraId)1138 int32_t HCameraService::PreSwitchCamera(const std::string cameraId)
1139 {
1140 CAMERA_SYNC_TRACE;
1141 MEDIA_INFO_LOG("HCameraService::PreSwitchCamera");
1142 if (cameraId.empty()) {
1143 return CAMERA_INVALID_ARG;
1144 }
1145 std::vector<std::string> cameraIds_;
1146 cameraHostManager_->GetCameras(cameraIds_);
1147 CHECK_AND_RETURN_RET(!cameraIds_.empty(), CAMERA_INVALID_STATE);
1148 auto it = std::find(cameraIds_.begin(), cameraIds_.end(), cameraId);
1149 CHECK_AND_RETURN_RET(it != cameraIds_.end(), CAMERA_INVALID_ARG);
1150 MEDIA_INFO_LOG("HCameraService::PreSwitchCamera cameraId is: %{public}s", cameraId.c_str());
1151 CameraReportUtils::GetInstance().SetSwitchCamPerfStartInfo(CameraReportUtils::GetCallerInfo());
1152 int32_t ret = cameraHostManager_->PreSwitchCamera(cameraId);
1153 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1154 return ret;
1155 }
1156
SetPrelaunchConfig(string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam)1157 int32_t HCameraService::SetPrelaunchConfig(string cameraId, RestoreParamTypeOhos restoreParamType, int activeTime,
1158 EffectParam effectParam)
1159 {
1160 CAMERA_SYNC_TRACE;
1161 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1162 string permissionName = OHOS_PERMISSION_CAMERA;
1163 int32_t ret = CheckPermission(permissionName, callerToken);
1164 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
1165 "HCameraService::SetPrelaunchConfig failed permission is: %{public}s", permissionName.c_str());
1166
1167 MEDIA_INFO_LOG("HCameraService::SetPrelaunchConfig cameraId %{public}s", (cameraId).c_str());
1168 vector<string> cameraIds_;
1169 cameraHostManager_->GetCameras(cameraIds_);
1170 if ((find(cameraIds_.begin(), cameraIds_.end(), cameraId) != cameraIds_.end()) && IsPrelaunchSupported(cameraId)) {
1171 preCameraId_ = cameraId;
1172 MEDIA_INFO_LOG("CameraHostInfo::prelaunch 111 for cameraId %{public}s", (cameraId).c_str());
1173 sptr<HCaptureSession> captureSession_ = nullptr;
1174 pid_t pid = IPCSkeleton::GetCallingPid();
1175 captureSessionsManager_.Find(pid, captureSession_);
1176 SaveCurrentParamForRestore(cameraId, static_cast<RestoreParamTypeOhos>(restoreParamType), activeTime,
1177 effectParam, captureSession_);
1178 captureSessionsManager_.Clear();
1179 captureSessionsManager_.EnsureInsert(pid, captureSession_);
1180 } else {
1181 MEDIA_ERR_LOG("HCameraService::SetPrelaunchConfig illegal");
1182 ret = CAMERA_INVALID_ARG;
1183 }
1184 return ret;
1185 }
1186
SetTorchLevel(float level)1187 int32_t HCameraService::SetTorchLevel(float level)
1188 {
1189 int32_t ret = cameraHostManager_->SetTorchLevel(level);
1190 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "Failed to SetTorchLevel");
1191 return ret;
1192 }
1193
AllowOpenByOHSide(std::string cameraId,int32_t state,bool & canOpenCamera)1194 int32_t HCameraService::AllowOpenByOHSide(std::string cameraId, int32_t state, bool& canOpenCamera)
1195 {
1196 MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide start");
1197 pid_t activePid = HCameraDeviceManager::GetInstance()->GetActiveClient();
1198 if (activePid == -1) {
1199 MEDIA_INFO_LOG("AllowOpenByOHSide::Open allow open camera");
1200 NotifyCameraState(cameraId, 0);
1201 canOpenCamera = true;
1202 return CAMERA_OK;
1203 }
1204 sptr<HCameraDevice> cameraNeedEvict = HCameraDeviceManager::GetInstance()->GetCameraByPid(activePid);
1205 if (cameraNeedEvict != nullptr) {
1206 cameraNeedEvict->OnError(DEVICE_PREEMPT, 0);
1207 cameraNeedEvict->Close();
1208 NotifyCameraState(cameraId, 0);
1209 canOpenCamera = true;
1210 }
1211 MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide end");
1212 return CAMERA_OK;
1213 }
1214
NotifyCameraState(std::string cameraId,int32_t state)1215 int32_t HCameraService::NotifyCameraState(std::string cameraId, int32_t state)
1216 {
1217 // 把cameraId和前后台状态刷新给device manager
1218 MEDIA_INFO_LOG(
1219 "HCameraService::NotifyCameraState SetStateOfACamera %{public}s:%{public}d", cameraId.c_str(), state);
1220 HCameraDeviceManager::GetInstance()->SetStateOfACamera(cameraId, state);
1221 return CAMERA_OK;
1222 }
1223
SetPeerCallback(sptr<ICameraBroker> & callback)1224 int32_t HCameraService::SetPeerCallback(sptr<ICameraBroker>& callback)
1225 {
1226 MEDIA_INFO_LOG("SetPeerCallback get callback");
1227 CHECK_ERROR_RETURN_RET(callback == nullptr, CAMERA_INVALID_ARG);
1228 peerCallback_ = callback;
1229 MEDIA_INFO_LOG("HCameraService::SetPeerCallback current muteMode:%{public}d", muteModeStored_);
1230 callback->NotifyMuteCamera(muteModeStored_);
1231 HCameraDeviceManager::GetInstance()->SetPeerCallback(callback);
1232 return CAMERA_OK;
1233 }
1234
UnsetPeerCallback()1235 int32_t HCameraService::UnsetPeerCallback()
1236 {
1237 MEDIA_INFO_LOG("UnsetPeerCallback callback");
1238 peerCallback_ = nullptr;
1239 HCameraDeviceManager::GetInstance()->UnsetPeerCallback();
1240 return CAMERA_OK;
1241 }
1242
IsPrelaunchSupported(string cameraId)1243 bool HCameraService::IsPrelaunchSupported(string cameraId)
1244 {
1245 bool isPrelaunchSupported = false;
1246 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
1247 int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
1248 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, isPrelaunchSupported,
1249 "HCameraService::IsCameraMuted GetCameraAbility failed");
1250 camera_metadata_item_t item;
1251 common_metadata_header_t* metadata = cameraAbility->get();
1252 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1253 if (ret == 0) {
1254 MEDIA_INFO_LOG(
1255 "CameraManager::IsPrelaunchSupported() OHOS_ABILITY_PRELAUNCH_AVAILABLE is %{public}d", item.data.u8[0]);
1256 isPrelaunchSupported = (item.data.u8[0] == 1);
1257 } else {
1258 MEDIA_ERR_LOG("Failed to get OHOS_ABILITY_PRELAUNCH_AVAILABLE ret = %{public}d", ret);
1259 }
1260 return isPrelaunchSupported;
1261 }
1262
GetServiceStatus()1263 CameraServiceStatus HCameraService::GetServiceStatus()
1264 {
1265 lock_guard<mutex> lock(serviceStatusMutex_);
1266 return serviceStatus_;
1267 }
1268
SetServiceStatus(CameraServiceStatus serviceStatus)1269 void HCameraService::SetServiceStatus(CameraServiceStatus serviceStatus)
1270 {
1271 lock_guard<mutex> lock(serviceStatusMutex_);
1272 serviceStatus_ = serviceStatus;
1273 MEDIA_DEBUG_LOG("HCameraService::SetServiceStatus success. serviceStatus: %{public}d", serviceStatus);
1274 }
1275
IsCameraMuted(bool & muteMode)1276 int32_t HCameraService::IsCameraMuted(bool& muteMode)
1277 {
1278 lock_guard<mutex> lock(g_dataShareHelperMutex);
1279 CHECK_ERROR_RETURN_RET(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE);
1280 muteMode = muteModeStored_;
1281
1282 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted success. isMuted: %{public}d", muteMode);
1283 return CAMERA_OK;
1284 }
1285
DumpCameraSummary(vector<string> cameraIds,CameraInfoDumper & infoDumper)1286 void HCameraService::DumpCameraSummary(vector<string> cameraIds, CameraInfoDumper& infoDumper)
1287 {
1288 infoDumper.Tip("--------Dump Summary Begin-------");
1289 infoDumper.Title("Number of Cameras:[" + to_string(cameraIds.size()) + "]");
1290 infoDumper.Title("Number of Active Cameras:[" + to_string(1) + "]");
1291 infoDumper.Title("Current session summary:");
1292 HCaptureSession::DumpCameraSessionSummary(infoDumper);
1293 }
1294
DumpCameraInfo(CameraInfoDumper & infoDumper,std::vector<std::string> & cameraIds,std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)1295 void HCameraService::DumpCameraInfo(CameraInfoDumper& infoDumper, std::vector<std::string>& cameraIds,
1296 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
1297 {
1298 infoDumper.Tip("--------Dump CameraDevice Begin-------");
1299 int32_t capIdx = 0;
1300 for (auto& it : cameraIds) {
1301 auto metadata = cameraAbilityList[capIdx++];
1302 common_metadata_header_t* metadataEntry = metadata->get();
1303 infoDumper.Title("Camera ID:[" + it + "]:");
1304 infoDumper.Push();
1305 DumpCameraAbility(metadataEntry, infoDumper);
1306 DumpCameraStreamInfo(metadataEntry, infoDumper);
1307 DumpCameraZoom(metadataEntry, infoDumper);
1308 DumpCameraFlash(metadataEntry, infoDumper);
1309 DumpCameraAF(metadataEntry, infoDumper);
1310 DumpCameraAE(metadataEntry, infoDumper);
1311 DumpCameraSensorInfo(metadataEntry, infoDumper);
1312 DumpCameraVideoStabilization(metadataEntry, infoDumper);
1313 DumpCameraVideoFrameRateRange(metadataEntry, infoDumper);
1314 DumpCameraPrelaunch(metadataEntry, infoDumper);
1315 DumpCameraThumbnail(metadataEntry, infoDumper);
1316 infoDumper.Pop();
1317 }
1318 }
1319
DumpCameraAbility(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1320 void HCameraService::DumpCameraAbility(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1321 {
1322 camera_metadata_item_t item;
1323 int ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_POSITION, &item);
1324 if (ret == CAM_META_SUCCESS) {
1325 map<int, string>::const_iterator iter = g_cameraPos.find(item.data.u8[0]);
1326 if (iter != g_cameraPos.end()) {
1327 infoDumper.Title("Camera Position:[" + iter->second + "]");
1328 }
1329 }
1330
1331 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_TYPE, &item);
1332 if (ret == CAM_META_SUCCESS) {
1333 map<int, string>::const_iterator iter = g_cameraType.find(item.data.u8[0]);
1334 if (iter != g_cameraType.end()) {
1335 infoDumper.Title("Camera Type:[" + iter->second + "]");
1336 }
1337 }
1338
1339 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
1340 if (ret == CAM_META_SUCCESS) {
1341 map<int, string>::const_iterator iter = g_cameraConType.find(item.data.u8[0]);
1342 if (iter != g_cameraConType.end()) {
1343 infoDumper.Title("Camera Connection Type:[" + iter->second + "]");
1344 }
1345 }
1346 }
1347
DumpCameraStreamInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1348 void HCameraService::DumpCameraStreamInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1349 {
1350 camera_metadata_item_t item;
1351 int ret;
1352 constexpr uint32_t unitLen = 3;
1353 uint32_t widthOffset = 1;
1354 uint32_t heightOffset = 2;
1355 infoDumper.Title("Camera Available stream configuration List:");
1356 infoDumper.Push();
1357 ret =
1358 OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
1359 if (ret == CAM_META_SUCCESS) {
1360 infoDumper.Title("Basic Stream Info Size: " + to_string(item.count / unitLen));
1361 for (uint32_t index = 0; index < item.count; index += unitLen) {
1362 map<int, string>::const_iterator iter = g_cameraFormat.find(item.data.i32[index]);
1363 if (iter != g_cameraFormat.end()) {
1364 infoDumper.Msg("Format:[" + iter->second + "] " +
1365 "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1366 " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1367 } else {
1368 infoDumper.Msg("Format:[" + to_string(item.data.i32[index]) + "] " +
1369 "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1370 " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1371 }
1372 }
1373 }
1374
1375 infoDumper.Pop();
1376 }
1377
DumpCameraZoom(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1378 void HCameraService::DumpCameraZoom(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1379 {
1380 camera_metadata_item_t item;
1381 int ret;
1382 int32_t minIndex = 0;
1383 int32_t maxIndex = 1;
1384 uint32_t zoomRangeCount = 2;
1385 infoDumper.Title("Zoom Related Info:");
1386
1387 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_CAP, &item);
1388 if (ret == CAM_META_SUCCESS) {
1389 infoDumper.Msg("OHOS_ABILITY_ZOOM_CAP data size:" + to_string(item.count));
1390 if (item.count == zoomRangeCount) {
1391 infoDumper.Msg("Available Zoom Capability:[" + to_string(item.data.i32[minIndex]) + " " +
1392 to_string(item.data.i32[maxIndex]) + "]");
1393 }
1394 }
1395
1396 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_SCENE_ZOOM_CAP, &item);
1397 if (ret == CAM_META_SUCCESS) {
1398 infoDumper.Msg("OHOS_ABILITY_SCENE_ZOOM_CAP data size:" + to_string(item.count));
1399 if (item.count == zoomRangeCount) {
1400 infoDumper.Msg("Available scene Zoom Capability:[" + to_string(item.data.i32[minIndex]) + " " +
1401 to_string(item.data.i32[maxIndex]) + "]");
1402 }
1403 }
1404
1405 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_RATIO_RANGE, &item);
1406 if (ret == CAM_META_SUCCESS) {
1407 infoDumper.Msg("OHOS_ABILITY_ZOOM_RATIO_RANGE data size:" + to_string(item.count));
1408 if (item.count == zoomRangeCount) {
1409 infoDumper.Msg("Available Zoom Ratio Range:[" + to_string(item.data.f[minIndex]) +
1410 to_string(item.data.f[maxIndex]) + "]");
1411 }
1412 }
1413 }
1414
DumpCameraFlash(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1415 void HCameraService::DumpCameraFlash(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1416 {
1417 camera_metadata_item_t item;
1418 int ret;
1419 infoDumper.Title("Flash Related Info:");
1420 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FLASH_MODES, &item);
1421 if (ret == CAM_META_SUCCESS) {
1422 string flashAbilityString = "Available Flash Modes:[ ";
1423 for (uint32_t i = 0; i < item.count; i++) {
1424 map<int, string>::const_iterator iter = g_cameraFlashMode.find(item.data.u8[i]);
1425 if (iter != g_cameraFlashMode.end()) {
1426 flashAbilityString.append(iter->second + " ");
1427 }
1428 }
1429 flashAbilityString.append("]");
1430 infoDumper.Msg(flashAbilityString);
1431 }
1432 }
1433
DumpCameraAF(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1434 void HCameraService::DumpCameraAF(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1435 {
1436 camera_metadata_item_t item;
1437 int ret;
1438 infoDumper.Title("AF Related Info:");
1439 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FOCUS_MODES, &item);
1440 if (ret == CAM_META_SUCCESS) {
1441 string afAbilityString = "Available Focus Modes:[ ";
1442 for (uint32_t i = 0; i < item.count; i++) {
1443 map<int, string>::const_iterator iter = g_cameraFocusMode.find(item.data.u8[i]);
1444 if (iter != g_cameraFocusMode.end()) {
1445 afAbilityString.append(iter->second + " ");
1446 }
1447 }
1448 afAbilityString.append("]");
1449 infoDumper.Msg(afAbilityString);
1450 }
1451 }
1452
DumpCameraAE(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1453 void HCameraService::DumpCameraAE(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1454 {
1455 camera_metadata_item_t item;
1456 int ret;
1457 infoDumper.Title("AE Related Info:");
1458 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_EXPOSURE_MODES, &item);
1459 if (ret == CAM_META_SUCCESS) {
1460 string aeAbilityString = "Available Exposure Modes:[ ";
1461 for (uint32_t i = 0; i < item.count; i++) {
1462 map<int, string>::const_iterator iter = g_cameraExposureMode.find(item.data.u8[i]);
1463 if (iter != g_cameraExposureMode.end()) {
1464 aeAbilityString.append(iter->second + " ");
1465 }
1466 }
1467 aeAbilityString.append("]");
1468 infoDumper.Msg(aeAbilityString);
1469 }
1470 }
1471
DumpCameraSensorInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1472 void HCameraService::DumpCameraSensorInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1473 {
1474 camera_metadata_item_t item;
1475 int ret;
1476 int32_t leftIndex = 0;
1477 int32_t topIndex = 1;
1478 int32_t rightIndex = 2;
1479 int32_t bottomIndex = 3;
1480 infoDumper.Title("Sensor Related Info:");
1481 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_SENSOR_INFO_ACTIVE_ARRAY_SIZE, &item);
1482 if (ret == CAM_META_SUCCESS) {
1483 infoDumper.Msg("Array:[" +
1484 to_string(item.data.i32[leftIndex]) + " " +
1485 to_string(item.data.i32[topIndex]) + " " +
1486 to_string(item.data.i32[rightIndex]) + " " +
1487 to_string(item.data.i32[bottomIndex]) + "]:\n");
1488 }
1489 }
1490
DumpCameraVideoStabilization(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1491 void HCameraService::DumpCameraVideoStabilization(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1492 {
1493 camera_metadata_item_t item;
1494 int ret;
1495 infoDumper.Title("Video Stabilization Related Info:");
1496 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_VIDEO_STABILIZATION_MODES, &item);
1497 if (ret == CAM_META_SUCCESS) {
1498 std::string infoString = "Available Video Stabilization Modes:[ ";
1499 for (uint32_t i = 0; i < item.count; i++) {
1500 map<int, string>::const_iterator iter = g_cameraVideoStabilizationMode.find(item.data.u8[i]);
1501 if (iter != g_cameraVideoStabilizationMode.end()) {
1502 infoString.append(iter->second + " ");
1503 }
1504 }
1505 infoString.append("]:");
1506 infoDumper.Msg(infoString);
1507 }
1508 }
1509
DumpCameraVideoFrameRateRange(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1510 void HCameraService::DumpCameraVideoFrameRateRange(
1511 common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1512 {
1513 camera_metadata_item_t item;
1514 const int32_t FRAME_RATE_RANGE_STEP = 2;
1515 int ret;
1516 infoDumper.Title("Video FrameRateRange Related Info:");
1517 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FPS_RANGES, &item);
1518 if (ret == CAM_META_SUCCESS && item.count > 0) {
1519 infoDumper.Msg("Available FrameRateRange:");
1520 for (uint32_t i = 0; i < (item.count - 1); i += FRAME_RATE_RANGE_STEP) {
1521 infoDumper.Msg("[ " + to_string(item.data.i32[i]) + ", " + to_string(item.data.i32[i + 1]) + " ]");
1522 }
1523 }
1524 }
1525
DumpCameraPrelaunch(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1526 void HCameraService::DumpCameraPrelaunch(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1527 {
1528 camera_metadata_item_t item;
1529 int ret;
1530 infoDumper.Title("Camera Prelaunch Related Info:");
1531 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1532 if (ret == CAM_META_SUCCESS) {
1533 map<int, string>::const_iterator iter = g_cameraPrelaunchAvailable.find(item.data.u8[0]);
1534 bool isSupport = false;
1535 if (iter != g_cameraPrelaunchAvailable.end()) {
1536 isSupport = true;
1537 }
1538 std::string infoString = "Available Prelaunch Info:[";
1539 infoString.append(isSupport ? "True" : "False");
1540 infoString.append("]");
1541 infoDumper.Msg(infoString);
1542 }
1543 }
1544
DumpCameraThumbnail(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1545 void HCameraService::DumpCameraThumbnail(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1546 {
1547 camera_metadata_item_t item;
1548 int ret;
1549 infoDumper.Title("Camera Thumbnail Related Info:");
1550 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_QUICK_THUMBNAIL_AVAILABLE, &item);
1551 if (ret == CAM_META_SUCCESS) {
1552 map<int, string>::const_iterator iter = g_cameraQuickThumbnailAvailable.find(item.data.u8[0]);
1553 bool isSupport = false;
1554 if (iter != g_cameraQuickThumbnailAvailable.end()) {
1555 isSupport = true;
1556 }
1557 std::string infoString = "Available Thumbnail Info:[";
1558 infoString.append(isSupport ? "True" : "False");
1559 infoString.append("]");
1560 infoDumper.Msg(infoString);
1561 }
1562 }
1563
Dump(int fd,const vector<u16string> & args)1564 int32_t HCameraService::Dump(int fd, const vector<u16string>& args)
1565 {
1566 unordered_set<u16string> argSets;
1567 for (decltype(args.size()) index = 0; index < args.size(); ++index) {
1568 argSets.insert(args[index]);
1569 }
1570 std::string dumpString;
1571 std::vector<std::string> cameraIds;
1572 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
1573 int ret = GetCameras(cameraIds, cameraAbilityList);
1574 CHECK_ERROR_RETURN_RET((ret != CAMERA_OK) || cameraIds.empty() || cameraAbilityList.empty(), OHOS::UNKNOWN_ERROR);
1575 CameraInfoDumper infoDumper(fd);
1576 if (args.empty() || argSets.count(u16string(u"summary"))) {
1577 DumpCameraSummary(cameraIds, infoDumper);
1578 }
1579 if (args.empty() || argSets.count(u16string(u"ability"))) {
1580 DumpCameraInfo(infoDumper, cameraIds, cameraAbilityList);
1581 }
1582 if (args.empty() || argSets.count(u16string(u"preconfig"))) {
1583 infoDumper.Tip("--------Dump PreconfigInfo Begin-------");
1584 DumpPreconfigInfo(infoDumper, cameraHostManager_);
1585 }
1586 if (args.empty() || argSets.count(u16string(u"clientwiseinfo"))) {
1587 infoDumper.Tip("--------Dump Clientwise Info Begin-------");
1588 HCaptureSession::DumpSessions(infoDumper);
1589 }
1590 if (argSets.count(std::u16string(u"debugOn"))) {
1591 SetCameraDebugValue(true);
1592 }
1593 infoDumper.Print();
1594 return OHOS::NO_ERROR;
1595 }
1596
1597 #ifdef CAMERA_USE_SENSOR
RegisterSensorCallback()1598 void HCameraService::RegisterSensorCallback()
1599 {
1600 if (isRegisterSensorSuccess) {
1601 MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback isRegisterSensorSuccess return");
1602 return;
1603 }
1604 MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback start");
1605 user.callback = DropDetectionDataCallbackImpl;
1606 int32_t subscribeRet = SubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1607 MEDIA_INFO_LOG("RegisterSensorCallback, subscribeRet: %{public}d", subscribeRet);
1608 int32_t setBatchRet = SetBatch(SENSOR_TYPE_ID_DROP_DETECTION, &user, POSTURE_INTERVAL, POSTURE_INTERVAL);
1609 MEDIA_INFO_LOG("RegisterSensorCallback, setBatchRet: %{public}d", setBatchRet);
1610 int32_t activateRet = ActivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1611 MEDIA_INFO_LOG("RegisterSensorCallback, activateRet: %{public}d", activateRet);
1612 if (subscribeRet != SENSOR_SUCCESS || setBatchRet != SENSOR_SUCCESS || activateRet != SENSOR_SUCCESS) {
1613 isRegisterSensorSuccess = false;
1614 MEDIA_INFO_LOG("RegisterSensorCallback failed.");
1615 } else {
1616 isRegisterSensorSuccess = true;
1617 }
1618 }
1619
UnRegisterSensorCallback()1620 void HCameraService::UnRegisterSensorCallback()
1621 {
1622 int32_t deactivateRet = DeactivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1623 int32_t unsubscribeRet = UnsubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1624 if (deactivateRet == SENSOR_SUCCESS && unsubscribeRet == SENSOR_SUCCESS) {
1625 MEDIA_INFO_LOG("HCameraService.UnRegisterSensorCallback success.");
1626 }
1627 }
1628
DropDetectionDataCallbackImpl(SensorEvent * event)1629 void HCameraService::DropDetectionDataCallbackImpl(SensorEvent* event)
1630 {
1631 MEDIA_INFO_LOG("HCameraService::DropDetectionDataCallbackImpl prepare execute");
1632 CHECK_ERROR_RETURN_LOG(event == nullptr, "SensorEvent is nullptr.");
1633 CHECK_ERROR_RETURN_LOG(event[0].data == nullptr, "SensorEvent[0].data is nullptr.");
1634 CHECK_ERROR_RETURN_LOG(event[0].dataLen < sizeof(DropDetectionData),
1635 "less than drop detection data size, event.dataLen:%{public}u", event[0].dataLen);
1636 {
1637 std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
1638 g_cameraServiceInstance->cameraHostManager_->NotifyDeviceStateChangeInfo(
1639 DeviceType::FALLING_TYPE, FallingState::FALLING_STATE);
1640 }
1641 }
1642 #endif
1643
SaveCurrentParamForRestore(std::string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam,sptr<HCaptureSession> captureSession)1644 int32_t HCameraService::SaveCurrentParamForRestore(std::string cameraId, RestoreParamTypeOhos restoreParamType,
1645 int activeTime, EffectParam effectParam, sptr<HCaptureSession> captureSession)
1646 {
1647 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore enter");
1648 int32_t rc = CAMERA_OK;
1649 preCameraClient_ = GetClientBundle(IPCSkeleton::GetCallingUid());
1650 sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(
1651 preCameraClient_, cameraId);
1652 cameraRestoreParam->SetRestoreParamType(restoreParamType);
1653 cameraRestoreParam->SetStartActiveTime(activeTime);
1654 int foldStatus = static_cast<int>(OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus());
1655 cameraRestoreParam->SetFoldStatus(foldStatus);
1656 if (captureSession == nullptr || restoreParamType == NO_NEED_RESTORE_PARAM_OHOS) {
1657 cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1658 return rc;
1659 }
1660
1661 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1662 pid_t activeClient = deviceManager->GetActiveClient();
1663 CHECK_ERROR_RETURN_RET_LOG(activeClient == -1, CAMERA_OPERATION_NOT_ALLOWED,
1664 "HCaptureSession::SaveCurrentParamForRestore() Failed to save param");
1665 sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1666 CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_OK);
1667 std::vector<StreamInfo_V1_1> allStreamInfos;
1668
1669 if (activeDevice != nullptr) {
1670 std::shared_ptr<OHOS::Camera::CameraMetadata> defaultSettings = CreateDefaultSettingForRestore(activeDevice);
1671 UpdateSkinSmoothSetting(defaultSettings, effectParam.skinSmoothLevel);
1672 UpdateFaceSlenderSetting(defaultSettings, effectParam.faceSlender);
1673 UpdateSkinToneSetting(defaultSettings, effectParam.skinTone);
1674 cameraRestoreParam->SetSetting(defaultSettings);
1675 }
1676 CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_UNKNOWN_ERROR);
1677 MEDIA_DEBUG_LOG("HCameraService::SaveCurrentParamForRestore param %{public}d", effectParam.skinSmoothLevel);
1678 rc = captureSession->GetCurrentStreamInfos(allStreamInfos);
1679 CHECK_ERROR_RETURN_RET_LOG(rc != CAMERA_OK, rc,
1680 "HCaptureSession::SaveCurrentParamForRestore() Failed to get streams info, %{public}d", rc);
1681 for (auto& info : allStreamInfos) {
1682 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore: streamId is:%{public}d", info.v1_0.streamId_);
1683 }
1684 cameraRestoreParam->SetStreamInfo(allStreamInfos);
1685 cameraRestoreParam->SetCameraOpMode(captureSession->GetopMode());
1686 cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1687 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore end");
1688 return rc;
1689 }
1690
CreateDefaultSettingForRestore(sptr<HCameraDevice> activeDevice)1691 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraService::CreateDefaultSettingForRestore(
1692 sptr<HCameraDevice> activeDevice)
1693 {
1694 constexpr int32_t DEFAULT_ITEMS = 1;
1695 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1696 auto defaultSettings = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1697 float zoomRatio = 1.0f;
1698 int32_t count = 1;
1699 int32_t ret = 0;
1700 camera_metadata_item_t item;
1701 defaultSettings->addEntry(OHOS_CONTROL_ZOOM_RATIO, &zoomRatio, count);
1702 defaultSettings->addEntry(OHOS_CONTROL_TIME_LAPSE_RECORD_STATE, &ret, count);
1703 std::shared_ptr<OHOS::Camera::CameraMetadata> currentSetting = activeDevice->CloneCachedSettings();
1704 CHECK_ERROR_RETURN_RET_LOG(currentSetting == nullptr, defaultSettings,
1705 "HCameraService::CreateDefaultSettingForRestore:currentSetting is null");
1706 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_FPS_RANGES, &item);
1707 if (ret == CAM_META_SUCCESS) {
1708 uint32_t fpscount = item.count;
1709 std::vector<int32_t> fpsRange;
1710 for (uint32_t i = 0; i < fpscount; i++) {
1711 fpsRange.push_back(*(item.data.i32 + i));
1712 }
1713 defaultSettings->addEntry(OHOS_CONTROL_FPS_RANGES, fpsRange.data(), fpscount);
1714 }
1715
1716 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CAMERA_USER_ID, &item);
1717 if (ret == CAM_META_SUCCESS) {
1718 int32_t userId = item.data.i32[0];
1719 defaultSettings->addEntry(OHOS_CAMERA_USER_ID, &userId, count);
1720 }
1721
1722 uint8_t enableValue = true;
1723 defaultSettings->addEntry(OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &enableValue, 1);
1724
1725 for (uint32_t metadataTag : restoreMetadataTag) { // item.type is uint8
1726 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), metadataTag, &item);
1727 if (ret == 0 && item.count != 0) {
1728 defaultSettings->addEntry(item.item, item.data.u8, item.count);
1729 }
1730 }
1731 return defaultSettings;
1732 }
1733
UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinSmoothValue)1734 int32_t HCameraService::UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1735 int skinSmoothValue)
1736 {
1737 if (skinSmoothValue <= 0 || changedMetadata == nullptr) {
1738 return CAMERA_OK;
1739 }
1740 bool status = false;
1741 int32_t count = 1;
1742 int ret;
1743 camera_metadata_item_t item;
1744
1745 MEDIA_DEBUG_LOG("UpdateBeautySetting skinsmooth: %{public}d", skinSmoothValue);
1746 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_SMOOTH;
1747 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1748 if (ret == CAM_META_ITEM_NOT_FOUND) {
1749 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1750 } else if (ret == CAM_META_SUCCESS) {
1751 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1752 }
1753
1754 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &item);
1755 if (ret == CAM_META_ITEM_NOT_FOUND) {
1756 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1757 } else if (ret == CAM_META_SUCCESS) {
1758 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1759 }
1760 if (status) {
1761 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1762 }
1763
1764 return CAMERA_OK;
1765 }
1766
UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int faceSlenderValue)1767 int32_t HCameraService::UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1768 int faceSlenderValue)
1769 {
1770 if (faceSlenderValue <= 0 || changedMetadata == nullptr) {
1771 return CAMERA_OK;
1772 }
1773 bool status = false;
1774 int32_t count = 1;
1775 int ret;
1776 camera_metadata_item_t item;
1777
1778 MEDIA_DEBUG_LOG("UpdateBeautySetting faceSlender: %{public}d", faceSlenderValue);
1779 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_FACE_SLENDER;
1780 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1781 if (ret == CAM_META_ITEM_NOT_FOUND) {
1782 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1783 } else if (ret == CAM_META_SUCCESS) {
1784 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1785 }
1786
1787 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &item);
1788 if (ret == CAM_META_ITEM_NOT_FOUND) {
1789 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1790 } else if (ret == CAM_META_SUCCESS) {
1791 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1792 }
1793 if (status) {
1794 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1795 }
1796
1797 return CAMERA_OK;
1798 }
1799
UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinToneValue)1800 int32_t HCameraService::UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1801 int skinToneValue)
1802 {
1803 if (skinToneValue <= 0 || changedMetadata == nullptr) {
1804 return CAMERA_OK;
1805 }
1806 bool status = false;
1807 int32_t count = 1;
1808 int ret;
1809 camera_metadata_item_t item;
1810
1811 MEDIA_DEBUG_LOG("UpdateBeautySetting skinTone: %{public}d", skinToneValue);
1812 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_TONE;
1813 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1814 if (ret == CAM_META_ITEM_NOT_FOUND) {
1815 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1816 } else if (ret == CAM_META_SUCCESS) {
1817 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1818 }
1819
1820 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &item);
1821 if (ret == CAM_META_ITEM_NOT_FOUND) {
1822 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1823 } else if (ret == CAM_META_SUCCESS) {
1824 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1825 }
1826 if (status) {
1827 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1828 }
1829
1830 return CAMERA_OK;
1831 }
1832
g_toString(std::set<int32_t> & pidList)1833 std::string g_toString(std::set<int32_t>& pidList)
1834 {
1835 std::string ret = "[";
1836 for (const auto& pid : pidList) {
1837 ret += std::to_string(pid) + ",";
1838 }
1839 ret += "]";
1840 return ret;
1841 }
1842
ProxyForFreeze(const std::set<int32_t> & pidList,bool isProxy)1843 int32_t HCameraService::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
1844 {
1845 constexpr int32_t maxSaUid = 10000;
1846 CHECK_ERROR_RETURN_RET_LOG(IPCSkeleton::GetCallingUid() >= maxSaUid, CAMERA_OPERATION_NOT_ALLOWED, "not allow");
1847 MEDIA_INFO_LOG("isProxy value: %{public}d", isProxy);
1848 {
1849 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1850 if (isProxy) {
1851 freezedPidList_.insert(pidList.begin(), pidList.end());
1852 MEDIA_DEBUG_LOG("after freeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1853 return CAMERA_OK;
1854 } else {
1855 for (auto pid : pidList) {
1856 freezedPidList_.erase(pid);
1857 }
1858 MEDIA_DEBUG_LOG("after unfreeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1859 }
1860 }
1861
1862 {
1863 std::lock_guard<std::mutex> lock(cameraCbMutex_);
1864 for (auto pid : pidList) {
1865 auto it = delayCbtaskMap.find(pid);
1866 if (it != delayCbtaskMap.end()) {
1867 it->second();
1868 delayCbtaskMap.erase(it);
1869 }
1870 }
1871 }
1872 return CAMERA_OK;
1873 }
1874
ResetAllFreezeStatus()1875 int32_t HCameraService::ResetAllFreezeStatus()
1876 {
1877 if (IPCSkeleton::GetCallingUid() != 0) {
1878 return CAMERA_OPERATION_NOT_ALLOWED;
1879 }
1880 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1881 freezedPidList_.clear();
1882 MEDIA_INFO_LOG("freezedPidList_ has been clear");
1883 return CAMERA_OK;
1884 }
1885
GetDmDeviceInfo(std::vector<std::string> & deviceInfos)1886 int32_t HCameraService::GetDmDeviceInfo(std::vector<std::string> &deviceInfos)
1887 {
1888 #ifdef DEVICE_MANAGER
1889 lock_guard<mutex> lock(g_dmDeviceInfoMutex);
1890 std::vector <DistributedHardware::DmDeviceInfo> deviceInfoList;
1891 auto &deviceManager = DistributedHardware::DeviceManager::GetInstance();
1892 std::shared_ptr<DistributedHardware::DmInitCallback> initCallback = std::make_shared<DeviceInitCallBack>();
1893 std::string pkgName = std::to_string(IPCSkeleton::GetCallingTokenID());
1894 const string extraInfo = "";
1895 deviceManager.InitDeviceManager(pkgName, initCallback);
1896 deviceManager.RegisterDevStateCallback(pkgName, extraInfo, NULL);
1897 deviceManager.GetTrustedDeviceList(pkgName, extraInfo, deviceInfoList);
1898 deviceManager.UnInitDeviceManager(pkgName);
1899 int size = static_cast<int>(deviceInfoList.size());
1900 MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo size=%{public}d", size);
1901 if (size > 0) {
1902 for (int i = 0; i < size; i++) {
1903 nlohmann::json deviceInfo;
1904 deviceInfo["deviceName"] = deviceInfoList[i].deviceName;
1905 deviceInfo["deviceTypeId"] = deviceInfoList[i].deviceTypeId;
1906 deviceInfo["networkId"] = deviceInfoList[i].networkId;
1907 std::string deviceInfoStr = deviceInfo.dump();
1908 MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo deviceInfo:%{public}s", deviceInfoStr.c_str());
1909 deviceInfos.emplace_back(deviceInfoStr);
1910 }
1911 }
1912 #endif
1913 return CAMERA_OK;
1914 }
1915
GetCameraOutputStatus(int32_t pid,int32_t & status)1916 int32_t HCameraService::GetCameraOutputStatus(int32_t pid, int32_t &status)
1917 {
1918 sptr<HCaptureSession> captureSession = nullptr;
1919 captureSessionsManager_.Find(pid, captureSession);
1920 if (captureSession) {
1921 captureSession->GetOutputStatus(status);
1922 } else {
1923 status = 0;
1924 }
1925 return CAMERA_OK;
1926 }
1927
CreateCameraDataShareHelper()1928 std::shared_ptr<DataShare::DataShareHelper> HCameraService::CameraDataShareHelper::CreateCameraDataShareHelper()
1929 {
1930 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1931 CHECK_ERROR_RETURN_RET_LOG(samgr == nullptr, nullptr, "CameraDataShareHelper GetSystemAbilityManager failed.");
1932 sptr<IRemoteObject> remoteObj = samgr->GetSystemAbility(CAMERA_SERVICE_ID);
1933 CHECK_ERROR_RETURN_RET_LOG(remoteObj == nullptr, nullptr, "CameraDataShareHelper GetSystemAbility Service Failed.");
1934 return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATA_BASE_URI, SETTINGS_DATA_EXT_URI);
1935 }
1936
QueryOnce(const std::string key,std::string & value)1937 int32_t HCameraService::CameraDataShareHelper::QueryOnce(const std::string key, std::string &value)
1938 {
1939 auto dataShareHelper = CreateCameraDataShareHelper();
1940 CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
1941 Uri uri(SETTINGS_DATA_BASE_URI);
1942 DataShare::DataSharePredicates predicates;
1943 predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
1944 std::vector<std::string> columns;
1945 columns.emplace_back(SETTINGS_DATA_FIELD_VALUE);
1946
1947 auto resultSet = dataShareHelper->Query(uri, predicates, columns);
1948 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, CAMERA_INVALID_ARG, "CameraDataShareHelper query fail");
1949
1950 int32_t numRows = 0;
1951 resultSet->GetRowCount(numRows);
1952 CHECK_AND_RETURN_RET_LOG(numRows > 0, CAMERA_INVALID_ARG, "CameraDataShareHelper query failed, row is zero.");
1953
1954 if (resultSet->GoToFirstRow() != DataShare::E_OK) {
1955 MEDIA_INFO_LOG("CameraDataShareHelper Query failed,go to first row error");
1956 resultSet->Close();
1957 return CAMERA_INVALID_ARG;
1958 }
1959
1960 int columnIndex;
1961 resultSet->GetColumnIndex(SETTINGS_DATA_FIELD_VALUE, columnIndex);
1962 resultSet->GetString(columnIndex, value);
1963 resultSet->Close();
1964 dataShareHelper->Release();
1965 MEDIA_INFO_LOG("CameraDataShareHelper query success,value=%{public}s", value.c_str());
1966 return CAMERA_OK;
1967 }
1968
UpdateOnce(const std::string key,std::string value)1969 int32_t HCameraService::CameraDataShareHelper::UpdateOnce(const std::string key, std::string value)
1970 {
1971 auto dataShareHelper = CreateCameraDataShareHelper();
1972 CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
1973 Uri uri(SETTINGS_DATA_BASE_URI);
1974 DataShare::DataSharePredicates predicates;
1975 predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
1976
1977 DataShare::DataShareValuesBucket bucket;
1978 DataShare::DataShareValueObject keywordObj(key);
1979 DataShare::DataShareValueObject valueObj(value);
1980 bucket.Put(SETTINGS_DATA_FIELD_KEYWORD, keywordObj);
1981 bucket.Put(SETTINGS_DATA_FIELD_VALUE, valueObj);
1982
1983 if (dataShareHelper->Update(uri, predicates, bucket) <= 0) {
1984 dataShareHelper->Insert(uri, bucket);
1985 MEDIA_ERR_LOG("CameraDataShareHelper Update:%{public}s failed", key.c_str());
1986 return CAMERA_INVALID_ARG;
1987 }
1988 MEDIA_INFO_LOG("CameraDataShareHelper Update:%{public}s success", key.c_str());
1989 dataShareHelper->Release();
1990 return CAMERA_OK;
1991 }
1992
RequireMemorySize(int32_t requiredMemSizeKB)1993 int32_t HCameraService::RequireMemorySize(int32_t requiredMemSizeKB)
1994 {
1995 #ifdef MEMMGR_OVERRID
1996 int32_t pid = getpid();
1997 const std::string reason = "HW_CAMERA_TO_PHOTO";
1998 std::string clientName = SYSTEM_CAMERA;
1999 int32_t ret = Memory::MemMgrClient::GetInstance().RequireBigMem(pid, reason, requiredMemSizeKB, clientName);
2000 MEDIA_INFO_LOG("HCameraDevice::RequireMemory reason:%{public}s, clientName:%{public}s, ret:%{public}d",
2001 reason.c_str(), clientName.c_str(), ret);
2002 if (ret == 0) {
2003 return CAMERA_OK;
2004 }
2005 #endif
2006 return CAMERA_UNKNOWN_ERROR;
2007 }
2008 } // namespace CameraStandard
2009 } // namespace OHOS
2010