• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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