• 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 {
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