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