1 /*
2 * Copyright (c) 2021-2022 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 <securec.h>
19 #include <unordered_set>
20
21 #include "access_token.h"
22 #include "accesstoken_kit.h"
23 #include "camera_util.h"
24 #include "iservice_registry.h"
25 #include "camera_log.h"
26 #include "system_ability_definition.h"
27 #include "ipc_skeleton.h"
28
29 namespace OHOS {
30 namespace CameraStandard {
31 REGISTER_SYSTEM_ABILITY_BY_ID(HCameraService, CAMERA_SERVICE_ID, true)
32 const std::string OHOS_PERMISSION_CAMERA = "ohos.permission.CAMERA";
33 const std::string OHOS_PERMISSION_MANAGE_CAMERA_CONFIG = "ohos.permission.MANAGE_CAMERA_CONFIG";
HCameraService(int32_t systemAbilityId,bool runOnCreate)34 HCameraService::HCameraService(int32_t systemAbilityId, bool runOnCreate)
35 : SystemAbility(systemAbilityId, runOnCreate),
36 cameraHostManager_(nullptr),
37 streamOperatorCallback_(nullptr),
38 muteMode_(false)
39 {
40 }
41
~HCameraService()42 HCameraService::~HCameraService()
43 {
44 }
45
OnStart()46 void HCameraService::OnStart()
47 {
48 if (cameraHostManager_ == nullptr) {
49 cameraHostManager_ = new(std::nothrow) HCameraHostManager(this);
50 if (cameraHostManager_ == nullptr) {
51 MEDIA_ERR_LOG("HCameraService OnStart failed to create HCameraHostManager obj");
52 return;
53 }
54 }
55 if (cameraHostManager_->Init() != CAMERA_OK) {
56 MEDIA_ERR_LOG("HCameraService OnStart failed to init camera host manager.");
57 }
58 bool res = Publish(this);
59 if (res) {
60 MEDIA_INFO_LOG("HCameraService OnStart res=%{public}d", res);
61 }
62 }
63
OnDump()64 void HCameraService::OnDump()
65 {
66 MEDIA_INFO_LOG("HCameraService::OnDump called");
67 }
68
OnStop()69 void HCameraService::OnStop()
70 {
71 MEDIA_INFO_LOG("HCameraService::OnStop called");
72
73 if (cameraHostManager_) {
74 cameraHostManager_->DeInit();
75 delete cameraHostManager_;
76 cameraHostManager_ = nullptr;
77 }
78 if (streamOperatorCallback_) {
79 streamOperatorCallback_ = nullptr;
80 }
81 }
82
CheckPermission(std::string permissionName,OHOS::Security::AccessToken::AccessTokenID callerToken)83 int32_t CheckPermission(std::string permissionName, OHOS::Security::AccessToken::AccessTokenID callerToken)
84 {
85 int permissionResult
86 = OHOS::Security::AccessToken::TypePermissionState::PERMISSION_DENIED;
87 Security::AccessToken::ATokenTypeEnum tokenType
88 = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
89 if ((tokenType == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE)
90 || (tokenType == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)) {
91 permissionResult = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(
92 callerToken, permissionName);
93 } else {
94 MEDIA_ERR_LOG("HCameraService::CheckPermission: Unsupported Access Token Type");
95 return CAMERA_INVALID_ARG;
96 }
97
98 if (permissionResult != OHOS::Security::AccessToken::TypePermissionState::PERMISSION_GRANTED) {
99 MEDIA_ERR_LOG("HCameraService::CheckPermission: Permission to Access Camera Denied!!!!");
100 return CAMERA_OPERATION_NOT_ALLOWED;
101 } else {
102 MEDIA_DEBUG_LOG("HCameraService::CheckPermission: Permission to Access Camera Granted!!!!");
103 }
104 return CAMERA_OK;
105 }
106
GetCameras(std::vector<std::string> & cameraIds,std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)107 int32_t HCameraService::GetCameras(std::vector<std::string> &cameraIds,
108 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> &cameraAbilityList)
109 {
110 CAMERA_SYNC_TRACE;
111 int32_t ret = cameraHostManager_->GetCameras(cameraIds);
112 if (ret != CAMERA_OK) {
113 MEDIA_ERR_LOG("HCameraService::GetCameras failed");
114 return ret;
115 }
116
117 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
118 for (auto id : cameraIds) {
119 ret = cameraHostManager_->GetCameraAbility(id, cameraAbility);
120 if (ret != CAMERA_OK) {
121 MEDIA_ERR_LOG("HCameraService::GetCameraAbility failed");
122 return ret;
123 }
124
125 if (cameraAbility == nullptr) {
126 MEDIA_ERR_LOG("HCameraService::GetCameraAbility return null");
127 return CAMERA_INVALID_ARG;
128 }
129
130 camera_metadata_item_t item;
131 common_metadata_header_t* metadata = cameraAbility->get();
132 camera_position_enum_t cameraPosition = OHOS_CAMERA_POSITION_OTHER;
133 int ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_POSITION, &item);
134 if (ret == CAM_META_SUCCESS) {
135 cameraPosition = static_cast<camera_position_enum_t>(item.data.u8[0]);
136 }
137
138 camera_type_enum_t cameraType = OHOS_CAMERA_TYPE_UNSPECIFIED;
139 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_TYPE, &item);
140 if (ret == CAM_META_SUCCESS) {
141 cameraType = static_cast<camera_type_enum_t>(item.data.u8[0]);
142 }
143
144 camera_connection_type_t connectionType = OHOS_CAMERA_CONNECTION_TYPE_BUILTIN;
145 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
146 if (ret == CAM_META_SUCCESS) {
147 connectionType = static_cast<camera_connection_type_t>(item.data.u8[0]);
148 }
149
150 bool isMirrorSupported = false;
151 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
152 if (ret == CAM_META_SUCCESS) {
153 isMirrorSupported = ((item.data.u8[0] == 1) || (item.data.u8[0] == 0));
154 }
155
156 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager GetCameras camera ID:%s, Camera position:%d,"
157 " Camera Type:%d, Connection Type:%d, Mirror support:%d", id.c_str(),
158 cameraPosition, cameraType, connectionType, isMirrorSupported));
159 cameraAbilityList.emplace_back(cameraAbility);
160 }
161
162 return ret;
163 }
164
CreateCameraDevice(std::string cameraId,sptr<ICameraDeviceService> & device)165 int32_t HCameraService::CreateCameraDevice(std::string cameraId, sptr<ICameraDeviceService> &device)
166 {
167 CAMERA_SYNC_TRACE;
168 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
169
170 std::string permissionName = OHOS_PERMISSION_CAMERA;
171 int32_t ret = CheckPermission(permissionName, callerToken);
172 if (ret != CAMERA_OK) {
173 return ret;
174 }
175 // if callerToken is invalid, will not call IsAllowedUsingPermission
176 if (IsValidTokenId(callerToken) &&
177 !Security::AccessToken::PrivacyKit::IsAllowedUsingPermission(callerToken, permissionName)) {
178 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice is not allowed!");
179 return CAMERA_ALLOC_ERROR;
180 }
181
182 sptr<HCameraDevice> cameraDevice = new(std::nothrow) HCameraDevice(cameraHostManager_, cameraId, callerToken);
183 if (cameraDevice == nullptr) {
184 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice HCameraDevice allocation failed");
185 return CAMERA_ALLOC_ERROR;
186 }
187
188 // when create camera device, update mute setting truely.
189 if (IsCameraMuteSupported(cameraId)) {
190 if (UpdateMuteSetting(cameraDevice, muteMode_) != CAMERA_OK) {
191 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice UpdateMuteSetting Failed, cameraId: %{public}s",
192 cameraId.c_str());
193 }
194 } else {
195 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice MuteCamera not Supported");
196 }
197 cameraDevice->SetStatusCallback(cameraServiceCallbacks_);
198 devices_[cameraId] = cameraDevice;
199 pid_t pid = IPCSkeleton::GetCallingPid();
200 MEDIA_DEBUG_LOG("HCameraService::CreateCameraDevice Calling pid = %{public}d", pid);
201 camerasForPid_[pid].push_back(cameraId);
202 device = cameraDevice;
203 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager_CreateCameraInput CameraId:%s", cameraId.c_str()));
204 return CAMERA_OK;
205 }
206
CreateCaptureSession(sptr<ICaptureSession> & session)207 int32_t HCameraService::CreateCaptureSession(sptr<ICaptureSession> &session)
208 {
209 CAMERA_SYNC_TRACE;
210 std::lock_guard<std::mutex> lock(mutex_);
211 sptr<HCaptureSession> captureSession;
212 if (streamOperatorCallback_ == nullptr) {
213 streamOperatorCallback_ = new(std::nothrow) StreamOperatorCallback();
214 if (streamOperatorCallback_ == nullptr) {
215 MEDIA_ERR_LOG("HCameraService::CreateCaptureSession streamOperatorCallback_ allocation failed");
216 return CAMERA_ALLOC_ERROR;
217 }
218 }
219
220 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
221 captureSession = new(std::nothrow) HCaptureSession(cameraHostManager_, streamOperatorCallback_, callerToken);
222 if (captureSession == nullptr) {
223 MEDIA_ERR_LOG("HCameraService::CreateCaptureSession HCaptureSession allocation failed");
224 return CAMERA_ALLOC_ERROR;
225 }
226 session = captureSession;
227 return CAMERA_OK;
228 }
229
CreatePhotoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamCapture> & photoOutput)230 int32_t HCameraService::CreatePhotoOutput(const sptr<OHOS::IBufferProducer> &producer, int32_t format,
231 int32_t width, int32_t height,
232 sptr<IStreamCapture> &photoOutput)
233 {
234 CAMERA_SYNC_TRACE;
235 if ((producer == nullptr) || (width == 0) || (height == 0)) {
236 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput producer is null");
237 return CAMERA_INVALID_ARG;
238 }
239 sptr<HStreamCapture> streamCapture = new(std::nothrow) HStreamCapture(producer, format, width, height);
240 if (streamCapture == nullptr) {
241 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput HStreamCapture allocation failed");
242 return CAMERA_ALLOC_ERROR;
243 }
244 POWERMGR_SYSEVENT_CAMERA_CONFIG(PHOTO, producer->GetDefaultWidth(),
245 producer->GetDefaultHeight());
246 photoOutput = streamCapture;
247 return CAMERA_OK;
248 }
249
CreateDeferredPreviewOutput(int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)250 int32_t HCameraService::CreateDeferredPreviewOutput(int32_t format,
251 int32_t width, int32_t height,
252 sptr<IStreamRepeat> &previewOutput)
253 {
254 CAMERA_SYNC_TRACE;
255 sptr<HStreamRepeat> streamDeferredPreview;
256
257 if ((width == 0) || (height == 0)) {
258 MEDIA_ERR_LOG("HCameraService::CreateDeferredPreviewOutput producer is null");
259 return CAMERA_INVALID_ARG;
260 }
261 streamDeferredPreview = new(std::nothrow) HStreamRepeat(nullptr, format, width, height, false);
262 if (streamDeferredPreview == nullptr) {
263 MEDIA_ERR_LOG("HCameraService::CreateDeferredPreviewOutput HStreamRepeat allocation failed");
264 return CAMERA_ALLOC_ERROR;
265 }
266 previewOutput = streamDeferredPreview;
267 return CAMERA_OK;
268 }
269
CreatePreviewOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)270 int32_t HCameraService::CreatePreviewOutput(const sptr<OHOS::IBufferProducer> &producer, int32_t format,
271 int32_t width, int32_t height,
272 sptr<IStreamRepeat> &previewOutput)
273 {
274 CAMERA_SYNC_TRACE;
275 sptr<HStreamRepeat> streamRepeatPreview;
276
277 if ((producer == nullptr) || (width == 0) || (height == 0)) {
278 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput producer is null");
279 return CAMERA_INVALID_ARG;
280 }
281 streamRepeatPreview = new(std::nothrow) HStreamRepeat(producer, format, width, height, false);
282 if (streamRepeatPreview == nullptr) {
283 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput HStreamRepeat allocation failed");
284 return CAMERA_ALLOC_ERROR;
285 }
286 POWERMGR_SYSEVENT_CAMERA_CONFIG(PREVIEW, width, height);
287 previewOutput = streamRepeatPreview;
288 return CAMERA_OK;
289 }
290
CreateMetadataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,sptr<IStreamMetadata> & metadataOutput)291 int32_t HCameraService::CreateMetadataOutput(const sptr<OHOS::IBufferProducer> &producer, int32_t format,
292 sptr<IStreamMetadata> &metadataOutput)
293 {
294 CAMERA_SYNC_TRACE;
295 sptr<HStreamMetadata> streamMetadata;
296
297 if (producer == nullptr) {
298 MEDIA_ERR_LOG("HCameraService::CreateMetadataOutput producer is null");
299 return CAMERA_INVALID_ARG;
300 }
301 streamMetadata = new(std::nothrow) HStreamMetadata(producer, format);
302 if (streamMetadata == nullptr) {
303 MEDIA_ERR_LOG("HCameraService::CreateMetadataOutput HStreamMetadata allocation failed");
304 return CAMERA_ALLOC_ERROR;
305 }
306 POWERMGR_SYSEVENT_CAMERA_CONFIG(METADATA, producer->GetDefaultWidth(),
307 producer->GetDefaultHeight());
308 metadataOutput = streamMetadata;
309 return CAMERA_OK;
310 }
311
CreateVideoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & videoOutput)312 int32_t HCameraService::CreateVideoOutput(const sptr<OHOS::IBufferProducer> &producer, int32_t format,
313 int32_t width, int32_t height,
314 sptr<IStreamRepeat> &videoOutput)
315 {
316 CAMERA_SYNC_TRACE;
317 sptr<HStreamRepeat> streamRepeatVideo;
318
319 if ((producer == nullptr) || (width == 0) || (height == 0)) {
320 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput producer is null");
321 return CAMERA_INVALID_ARG;
322 }
323 streamRepeatVideo = new(std::nothrow) HStreamRepeat(producer, format, width, height, true);
324 if (streamRepeatVideo == nullptr) {
325 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput HStreamRepeat allocation failed");
326 return CAMERA_ALLOC_ERROR;
327 }
328 POWERMGR_SYSEVENT_CAMERA_CONFIG(VIDEO, producer->GetDefaultWidth(),
329 producer->GetDefaultHeight());
330 videoOutput = streamRepeatVideo;
331 return CAMERA_OK;
332 }
333
OnCameraStatus(const std::string & cameraId,CameraStatus status)334 void HCameraService::OnCameraStatus(const std::string& cameraId, CameraStatus status)
335 {
336 std::lock_guard<std::mutex> lock(hdiCbMutex_);
337 MEDIA_INFO_LOG("HCameraService::OnCameraStatus "
338 "callbacks.size = %{public}zu, cameraId = %{public}s, status = %{public}d, pid = %{public}d",
339 cameraServiceCallbacks_.size(), cameraId.c_str(), status, IPCSkeleton::GetCallingPid());
340 for (auto it : cameraServiceCallbacks_) {
341 if (!it.second) {
342 MEDIA_ERR_LOG("HCameraService::OnCameraStatus cameraServiceCallback is null, pid = %{public}d",
343 IPCSkeleton::GetCallingPid());
344 continue;
345 }
346 if (it.second) {
347 it.second->OnCameraStatusChanged(cameraId, status);
348 }
349 }
350 }
351
OnFlashlightStatus(const std::string & cameraId,FlashStatus status)352 void HCameraService::OnFlashlightStatus(const std::string& cameraId, FlashStatus status)
353 {
354 std::lock_guard<std::mutex> lock(hdiCbMutex_);
355 MEDIA_INFO_LOG("HCameraService::OnFlashlightStatus "
356 "callbacks.size = %{public}zu, cameraId = %{public}s, status = %{public}d, pid = %{public}d",
357 cameraServiceCallbacks_.size(), cameraId.c_str(), status, IPCSkeleton::GetCallingPid());
358 for (auto it : cameraServiceCallbacks_) {
359 if (!it.second) {
360 MEDIA_ERR_LOG("HCameraService::OnCameraStatus cameraServiceCallback is null, pid = %{public}d",
361 IPCSkeleton::GetCallingPid());
362 continue;
363 }
364 if (it.second) {
365 it.second->OnFlashlightStatusChanged(cameraId, status);
366 }
367 }
368 }
369
SetCallback(sptr<ICameraServiceCallback> & callback)370 int32_t HCameraService::SetCallback(sptr<ICameraServiceCallback> &callback)
371 {
372 std::lock_guard<std::mutex> lock(cbMutex_);
373 pid_t pid = IPCSkeleton::GetCallingPid();
374 MEDIA_INFO_LOG("HCameraService::SetCallback pid = %{public}d", pid);
375 if (callback == nullptr) {
376 MEDIA_ERR_LOG("HCameraService::SetCallback callback is null");
377 return CAMERA_INVALID_ARG;
378 }
379 cameraServiceCallbacks_.insert(std::make_pair(pid, callback));
380 for (auto it : devices_) {
381 MEDIA_INFO_LOG("HCameraService::SetCallback Camera:[%{public}s] SetStatusCallback", it.first.c_str());
382 it.second->SetStatusCallback(cameraServiceCallbacks_);
383 }
384 return CAMERA_OK;
385 }
386
CloseCameraForDestory(pid_t pid)387 int32_t HCameraService::CloseCameraForDestory(pid_t pid)
388 {
389 std::lock_guard<std::mutex> lock(cbMutex_);
390 MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory pid = %{public}d, Camera created size = %{public}zu",
391 pid, camerasForPid_[pid].size());
392 auto cameraIds = camerasForPid_[pid];
393 for (size_t i = 0; i < cameraIds.size(); i++) {
394 for (auto it : devices_) {
395 if (it.first != cameraIds[i] || !it.second) {
396 continue;
397 } else if (it.second->IsOpenedCameraDevice()) {
398 MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory pid = %{public}d,Camera:[%{public}s] need close",
399 pid, it.first.c_str());
400 it.second->Close();
401 it.second = nullptr;
402 }
403 }
404 }
405 cameraIds.clear();
406 size_t eraseSize = camerasForPid_.erase(pid);
407 MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory remove cameraId size = %{public}zu", eraseSize);
408 return CAMERA_OK;
409 }
410
UnSetCallback(pid_t pid)411 int32_t HCameraService::UnSetCallback(pid_t pid)
412 {
413 std::lock_guard<std::mutex> lock(cbMutex_);
414 MEDIA_INFO_LOG("HCameraService::UnSetCallback pid = %{public}d, size = %{public}zu",
415 pid, cameraServiceCallbacks_.size());
416 if (!cameraServiceCallbacks_.empty()) {
417 MEDIA_INFO_LOG("HCameraDevice::SetStatusCallback statusSvcCallbacks_ is not empty, reset it");
418 auto it = cameraServiceCallbacks_.find(pid);
419 if ((it != cameraServiceCallbacks_.end()) && (it->second)) {
420 it->second = nullptr;
421 cameraServiceCallbacks_.erase(it);
422 }
423 }
424 MEDIA_INFO_LOG("HCameraService::UnSetCallback after erase pid = %{public}d, size = %{public}zu",
425 pid, cameraServiceCallbacks_.size());
426 for (auto it : devices_) {
427 MEDIA_INFO_LOG("HCameraService::UnSetCallback Camera:[%{public}s] SetStatusCallback", it.first.c_str());
428 it.second->SetStatusCallback(cameraServiceCallbacks_);
429 }
430 return CAMERA_OK;
431 }
432
SetMuteCallback(sptr<ICameraMuteServiceCallback> & callback)433 int32_t HCameraService::SetMuteCallback(sptr<ICameraMuteServiceCallback> &callback)
434 {
435 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
436 if (callback == nullptr) {
437 MEDIA_ERR_LOG("HCameraService::SetMuteCallback callback is null");
438 return CAMERA_INVALID_ARG;
439 }
440 cameraMuteServiceCallbacks_.insert(std::make_pair(callerToken, callback));
441 return CAMERA_OK;
442 }
443
IsCameraMuteSupported(std::string cameraId)444 bool HCameraService::IsCameraMuteSupported(std::string cameraId)
445 {
446 bool isMuteSupported = false;
447 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
448 int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
449 if (ret != CAMERA_OK) {
450 MEDIA_ERR_LOG("HCameraService::IsCameraMuted GetCameraAbility failed");
451 return false;
452 }
453 camera_metadata_item_t item;
454 common_metadata_header_t* metadata = cameraAbility->get();
455 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_MUTE_MODES, &item);
456 if (ret == CAM_META_SUCCESS) {
457 isMuteSupported = true;
458 } else {
459 isMuteSupported = false;
460 MEDIA_ERR_LOG("HCameraService::IsCameraMuted not find MUTE ability");
461 }
462 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted supported: %{public}d", isMuteSupported);
463 return isMuteSupported;
464 }
465
UpdateMuteSetting(sptr<HCameraDevice> cameraDevice,bool muteMode)466 int32_t HCameraService::UpdateMuteSetting(sptr<HCameraDevice> cameraDevice, bool muteMode)
467 {
468 constexpr uint8_t MUTE_ON = 1;
469 constexpr uint8_t MUTE_OFF = 0;
470 constexpr int32_t DEFAULT_ITEMS = 1;
471 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
472 std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata =
473 std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
474 bool status = false;
475 int32_t ret;
476 int32_t count = 1;
477 uint8_t mode = muteMode ? MUTE_ON : MUTE_OFF;
478 camera_metadata_item_t item;
479
480 MEDIA_DEBUG_LOG("UpdateMuteSetting muteMode: %{public}d", muteMode);
481
482 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_MUTE_MODE, &item);
483 if (ret == CAM_META_ITEM_NOT_FOUND) {
484 status = changedMetadata->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
485 } else if (ret == CAM_META_SUCCESS) {
486 status = changedMetadata->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
487 }
488 ret = cameraDevice->UpdateSetting(changedMetadata);
489 if (!status || ret != CAMERA_OK) {
490 MEDIA_ERR_LOG("UpdateMuteSetting muteMode Failed");
491 return CAMERA_UNKNOWN_ERROR;
492 }
493 return CAMERA_OK;
494 }
495
MuteCamera(bool muteMode)496 int32_t HCameraService::MuteCamera(bool muteMode)
497 {
498 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
499
500 std::string permissionName = OHOS_PERMISSION_MANAGE_CAMERA_CONFIG;
501 int32_t ret = CheckPermission(permissionName, callerToken);
502 if (ret != CAMERA_OK) {
503 MEDIA_ERR_LOG("HCameraService::MuteCamera failed permission is : %{public}s", permissionName.c_str());
504 return ret;
505 }
506
507 bool oldMuteMode = muteMode_;
508 if (muteMode == oldMuteMode) {
509 MEDIA_INFO_LOG("HCameraService::MuteCamera muteMode not changed, muteMode: %{public}d", muteMode);
510 return CAMERA_OK;
511 } else {
512 muteMode_ = muteMode;
513 }
514 if (devices_.empty()) {
515 MEDIA_INFO_LOG("HCameraService::MuteCamera cameraDevice is empty, muteMode = %{public}d", muteMode);
516 if (!cameraMuteServiceCallbacks_.empty()) {
517 for (auto cb : cameraMuteServiceCallbacks_) {
518 cb.second->OnCameraMute(muteMode);
519 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraMute! current Camera muteMode:%d", muteMode));
520 }
521 }
522 return CAMERA_OK;
523 }
524
525 for (auto it : devices_) {
526 if (!IsCameraMuteSupported(it.first)) {
527 MEDIA_ERR_LOG("HCameraService::MuteCamera not Supported Mute,cameraId: %{public}s", it.first.c_str());
528 break;
529 }
530 ret = UpdateMuteSetting(it.second, muteMode);
531 if (ret != CAMERA_OK) {
532 MEDIA_ERR_LOG("HCameraService::MuteCamera UpdateMuteSetting Failed, cameraId: %{public}s",
533 it.first.c_str());
534 muteMode_ = oldMuteMode;
535 break;
536 }
537 }
538 if (!cameraMuteServiceCallbacks_.empty() && ret == CAMERA_OK) {
539 for (auto cb : cameraMuteServiceCallbacks_) {
540 cb.second->OnCameraMute(muteMode);
541 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraMute! current Camera muteMode:%d", muteMode));
542 }
543 }
544 return ret;
545 }
546
IsCameraMuted(bool & muteMode)547 int32_t HCameraService::IsCameraMuted(bool &muteMode)
548 {
549 muteMode = muteMode_;
550 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted success. isMuted: %{public}d", muteMode);
551 return CAMERA_OK;
552 }
553
CameraSummary(std::vector<std::string> cameraIds,std::string & dumpString)554 void HCameraService::CameraSummary(std::vector<std::string> cameraIds,
555 std::string& dumpString)
556 {
557 dumpString += "# Number of Cameras:[" + std::to_string(cameraIds.size()) + "]:\n";
558 dumpString += "# Number of Active Cameras:[" + std::to_string(devices_.size()) + "]:\n";
559 HCaptureSession::CameraSessionSummary(dumpString);
560 }
561
CameraDumpAbility(common_metadata_header_t * metadataEntry,std::string & dumpString)562 void HCameraService::CameraDumpAbility(common_metadata_header_t* metadataEntry,
563 std::string& dumpString)
564 {
565 camera_metadata_item_t item;
566 int ret;
567 dumpString += " ## Camera Ability List: \n";
568
569 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_POSITION, &item);
570 if (ret == CAM_META_SUCCESS) {
571 std::map<int, std::string>::const_iterator iter =
572 g_cameraPos.find(item.data.u8[0]);
573 if (iter != g_cameraPos.end()) {
574 dumpString += " Camera Position:["
575 + iter->second
576 + "]: ";
577 }
578 }
579
580 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_TYPE, &item);
581 if (ret == CAM_META_SUCCESS) {
582 std::map<int, std::string>::const_iterator iter =
583 g_cameraType.find(item.data.u8[0]);
584 if (iter != g_cameraType.end()) {
585 dumpString += "Camera Type:["
586 + iter->second
587 + "]: ";
588 }
589 }
590
591 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
592 if (ret == CAM_META_SUCCESS) {
593 std::map<int, std::string>::const_iterator iter =
594 g_cameraConType.find(item.data.u8[0]);
595 if (iter != g_cameraConType.end()) {
596 dumpString += "Camera Connection Type:["
597 + iter->second
598 + "]:\n";
599 }
600 }
601 }
602
CameraDumpStreaminfo(common_metadata_header_t * metadataEntry,std::string & dumpString)603 void HCameraService::CameraDumpStreaminfo(common_metadata_header_t* metadataEntry,
604 std::string& dumpString)
605 {
606 camera_metadata_item_t item;
607 int ret;
608 constexpr uint32_t unitLen = 3;
609 uint32_t widthOffset = 1;
610 uint32_t heightOffset = 2;
611 dumpString += " ### Camera Available stream configuration List: \n";
612 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry,
613 OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
614 if (ret == CAM_META_SUCCESS) {
615 dumpString += " Number Stream Info: "
616 + std::to_string(item.count/unitLen) + "\n";
617 for (uint32_t index = 0; index < item.count; index += unitLen) {
618 std::map<int, std::string>::const_iterator iter =
619 g_cameraFormat.find(item.data.i32[index]);
620 if (iter != g_cameraFormat.end()) {
621 dumpString += " Format:["
622 + iter->second
623 + "]: ";
624 dumpString += "Size:[Width:"
625 + std::to_string(item.data.i32[index + widthOffset])
626 + " Height:"
627 + std::to_string(item.data.i32[index + heightOffset])
628 + "]:\n";
629 }
630 }
631 }
632 }
633
CameraDumpZoom(common_metadata_header_t * metadataEntry,std::string & dumpString)634 void HCameraService::CameraDumpZoom(common_metadata_header_t* metadataEntry,
635 std::string& dumpString)
636 {
637 dumpString += " ## Zoom Related Info: \n";
638 camera_metadata_item_t item;
639 int ret;
640 int32_t minIndex = 0;
641 int32_t maxIndex = 1;
642 uint32_t zoomRangeCount = 2;
643 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_CAP, &item);
644 if ((ret == CAM_META_SUCCESS) && (item.count == zoomRangeCount)) {
645 dumpString += " Available Zoom Capability:["
646 + std::to_string(item.data.i32[minIndex]) + " "
647 + std::to_string(item.data.i32[maxIndex])
648 + "]:\n";
649 }
650
651 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_SCENE_ZOOM_CAP, &item);
652 if ((ret == CAM_META_SUCCESS) && (item.count == zoomRangeCount)) {
653 dumpString += " Available scene Zoom Capability:["
654 + std::to_string(item.data.i32[minIndex]) + " "
655 + std::to_string(item.data.i32[maxIndex])
656 + "]:\n";
657 }
658
659 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_RATIO_RANGE, &item);
660 if ((ret == CAM_META_SUCCESS) && (item.count == zoomRangeCount)) {
661 dumpString += " Available Zoom Ratio Range:["
662 + std::to_string(item.data.f[minIndex])
663 + std::to_string(item.data.f[maxIndex])
664 + "]:\n";
665 }
666
667 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_CONTROL_ZOOM_RATIO, &item);
668 if (ret == CAM_META_SUCCESS) {
669 dumpString += " Set Zoom Ratio:["
670 + std::to_string(item.data.f[0])
671 + "]:\n";
672 }
673 }
674
CameraDumpFlash(common_metadata_header_t * metadataEntry,std::string & dumpString)675 void HCameraService::CameraDumpFlash(common_metadata_header_t* metadataEntry,
676 std::string& dumpString)
677 {
678 camera_metadata_item_t item;
679 int ret;
680 dumpString += " ## Flash Related Info: \n";
681 dumpString += " Available Flash Modes:[";
682 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FLASH_MODES, &item);
683 if (ret == CAM_META_SUCCESS) {
684 for (uint32_t i = 0; i < item.count; i++) {
685 std::map<int, std::string>::const_iterator iter =
686 g_cameraFlashMode.find(item.data.u8[i]);
687 if (iter != g_cameraFlashMode.end()) {
688 dumpString += " " + iter->second;
689 }
690 }
691 dumpString += "]:\n";
692 }
693
694 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_CONTROL_FLASH_MODE, &item);
695 if (ret == CAM_META_SUCCESS) {
696 std::map<int, std::string>::const_iterator iter =
697 g_cameraFlashMode.find(item.data.u8[0]);
698 if (iter != g_cameraFlashMode.end()) {
699 dumpString += " Set Flash Mode:["
700 + iter->second
701 + "]:\n";
702 }
703 }
704 }
705
CameraDumpAF(common_metadata_header_t * metadataEntry,std::string & dumpString)706 void HCameraService::CameraDumpAF(common_metadata_header_t* metadataEntry,
707 std::string& dumpString)
708 {
709 camera_metadata_item_t item;
710 int ret;
711 dumpString += " ## AF Related Info: \n";
712 dumpString += " Available Focus Modes:[";
713
714 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FOCUS_MODES, &item);
715 if (ret == CAM_META_SUCCESS) {
716 for (uint32_t i = 0; i < item.count; i++) {
717 std::map<int, std::string>::const_iterator iter =
718 g_cameraFocusMode.find(item.data.u8[i]);
719 if (iter != g_cameraFocusMode.end()) {
720 dumpString += " " + iter->second;
721 }
722 }
723 dumpString += "]:\n";
724 }
725
726 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_CONTROL_FOCUS_MODE, &item);
727 if (ret == CAM_META_SUCCESS) {
728 std::map<int, std::string>::const_iterator iter =
729 g_cameraFocusMode.find(item.data.u8[0]);
730 if (iter != g_cameraFocusMode.end()) {
731 dumpString += " Set Focus Mode:["
732 + iter->second
733 + "]:\n";
734 }
735 }
736 }
737
CameraDumpAE(common_metadata_header_t * metadataEntry,std::string & dumpString)738 void HCameraService::CameraDumpAE(common_metadata_header_t* metadataEntry,
739 std::string& dumpString)
740 {
741 camera_metadata_item_t item;
742 int ret;
743 dumpString += " ## AE Related Info: \n";
744 dumpString += " Available Exposure Modes:[";
745
746 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_EXPOSURE_MODES, &item);
747 if (ret == CAM_META_SUCCESS) {
748 for (uint32_t i = 0; i < item.count; i++) {
749 std::map<int, std::string>::const_iterator iter =
750 g_cameraExposureMode.find(item.data.u8[i]);
751 if (iter != g_cameraExposureMode.end()) {
752 dumpString += " " + iter->second;
753 }
754 }
755 dumpString += "]:\n";
756 }
757
758 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_CONTROL_EXPOSURE_MODE, &item);
759 if (ret == CAM_META_SUCCESS) {
760 std::map<int, std::string>::const_iterator iter =
761 g_cameraExposureMode.find(item.data.u8[0]);
762 if (iter != g_cameraExposureMode.end()) {
763 dumpString += " Set exposure Mode:["
764 + iter->second
765 + "]:\n";
766 }
767 }
768 }
769
CameraDumpSensorInfo(common_metadata_header_t * metadataEntry,std::string & dumpString)770 void HCameraService::CameraDumpSensorInfo(common_metadata_header_t* metadataEntry,
771 std::string& dumpString)
772 {
773 camera_metadata_item_t item;
774 int ret;
775 dumpString += " ## Sensor Info Info: \n";
776 int32_t leftIndex = 0;
777 int32_t topIndex = 1;
778 int32_t rightIndex = 2;
779 int32_t bottomIndex = 3;
780 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_SENSOR_INFO_ACTIVE_ARRAY_SIZE, &item);
781 if (ret == CAM_META_SUCCESS) {
782 dumpString += " Array:["
783 + std::to_string(item.data.i32[leftIndex]) + " "
784 + std::to_string(item.data.i32[topIndex]) + " "
785 + std::to_string(item.data.i32[rightIndex]) + " "
786 + std::to_string(item.data.i32[bottomIndex])
787 + "]:\n";
788 }
789 }
790
CameraDumpVideoStabilization(common_metadata_header_t * metadataEntry,std::string & dumpString)791 void HCameraService::CameraDumpVideoStabilization(common_metadata_header_t* metadataEntry,
792 std::string& dumpString)
793 {
794 camera_metadata_item_t item;
795 int ret;
796 dumpString += " ## Video Stabilization Related Info: \n";
797 dumpString += " Available Video Stabilization Modes:[";
798
799 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_VIDEO_STABILIZATION_MODES, &item);
800 if (ret == CAM_META_SUCCESS) {
801 for (uint32_t i = 0; i < item.count; i++) {
802 std::map<int, std::string>::const_iterator iter =
803 g_cameraVideoStabilizationMode.find(item.data.u8[i]);
804 if (iter != g_cameraVideoStabilizationMode.end()) {
805 dumpString += " " + iter->second;
806 }
807 }
808 dumpString += "]:\n";
809 }
810
811 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_CONTROL_VIDEO_STABILIZATION_MODE, &item);
812 if (ret == CAM_META_SUCCESS) {
813 std::map<int, std::string>::const_iterator iter =
814 g_cameraVideoStabilizationMode.find(item.data.u8[0]);
815 if (iter != g_cameraVideoStabilizationMode.end()) {
816 dumpString += " Set Stabilization Mode:["
817 + iter->second
818 + "]:\n";
819 }
820 }
821 }
822
CameraDumpVideoFrameRateRange(common_metadata_header_t * metadataEntry,std::string & dumpString)823 void HCameraService::CameraDumpVideoFrameRateRange(common_metadata_header_t* metadataEntry,
824 std::string& dumpString)
825 {
826 camera_metadata_item_t item;
827 const int32_t FRAME_RATE_RANGE_STEP = 2;
828 int ret;
829 dumpString += " ## Video FrameRateRange Related Info: \n";
830 dumpString += " Available FrameRateRange :\n";
831
832 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FPS_RANGES, &item);
833 if (ret == CAM_META_SUCCESS) {
834 for (uint32_t i = 0; i < (item.count - 1); i += FRAME_RATE_RANGE_STEP) {
835 dumpString += " [ " + std::to_string(item.data.i32[i]) + ", " +
836 std::to_string(item.data.i32[i+1]) + " ]\n";
837 }
838 dumpString += "\n";
839 }
840 }
841
Dump(int fd,const std::vector<std::u16string> & args)842 int32_t HCameraService::Dump(int fd, const std::vector<std::u16string>& args)
843 {
844 std::unordered_set<std::u16string> argSets;
845 std::u16string arg1(u"summary");
846 std::u16string arg2(u"ability");
847 std::u16string arg3(u"clientwiseinfo");
848 for (decltype(args.size()) index = 0; index < args.size(); ++index) {
849 argSets.insert(args[index]);
850 }
851 std::string dumpString;
852 std::vector<std::string> cameraIds;
853 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
854 int32_t capIdx = 0;
855 std::shared_ptr<OHOS::Camera::CameraMetadata> metadata;
856 int ret;
857
858 ret = GetCameras(cameraIds, cameraAbilityList);
859 if ((ret != CAMERA_OK) || cameraIds.empty()
860 || (cameraAbilityList.empty())) {
861 return CAMERA_INVALID_STATE;
862 }
863 if (args.size() == 0 || argSets.count(arg1) != 0) {
864 dumpString += "-------- Summary -------\n";
865 CameraSummary(cameraIds, dumpString);
866 }
867 if (args.size() == 0 || argSets.count(arg2) != 0) {
868 dumpString += "-------- CameraDevice -------\n";
869 for (auto& it : cameraIds) {
870 metadata = cameraAbilityList[capIdx++];
871 common_metadata_header_t* metadataEntry = metadata->get();
872 dumpString += "# Camera ID:[" + it + "]: \n";
873 CameraDumpAbility(metadataEntry, dumpString);
874 CameraDumpStreaminfo(metadataEntry, dumpString);
875 CameraDumpZoom(metadataEntry, dumpString);
876 CameraDumpFlash(metadataEntry, dumpString);
877 CameraDumpAF(metadataEntry, dumpString);
878 CameraDumpAE(metadataEntry, dumpString);
879 CameraDumpSensorInfo(metadataEntry, dumpString);
880 CameraDumpVideoStabilization(metadataEntry, dumpString);
881 CameraDumpVideoFrameRateRange(metadataEntry, dumpString);
882 }
883 }
884 if (args.size() == 0 || argSets.count(arg3) != 0) {
885 dumpString += "-------- Clientwise Info -------\n";
886 HCaptureSession::dumpSessions(dumpString);
887 }
888
889 if (dumpString.size() == 0) {
890 MEDIA_ERR_LOG("Dump string empty!");
891 return CAMERA_INVALID_STATE;
892 }
893
894 (void)write(fd, dumpString.c_str(), dumpString.size());
895 return CAMERA_OK;
896 }
897 } // namespace CameraStandard
898 } // namespace OHOS
899