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 #ifndef OHOS_CAMERA_H_CAMERA_DEVICE_H
17 #define OHOS_CAMERA_H_CAMERA_DEVICE_H
18 #define EXPORT_API __attribute__((visibility("default")))
19 
20 #include <cstdint>
21 #include <iostream>
22 #include <atomic>
23 #include <mutex>
24 #include <set>
25 
26 #include "camera_privacy.h"
27 #include "v1_0/icamera_device_callback.h"
28 #include "camera_metadata_info.h"
29 #include "camera_util.h"
30 #include "hcamera_device_stub.h"
31 #include "hcamera_host_manager.h"
32 #include "v1_0/icamera_device.h"
33 #include "v1_1/icamera_device.h"
34 #include "v1_2/icamera_device.h"
35 #include "v1_3/icamera_device.h"
36 #include "v1_0/icamera_host.h"
37 
38 namespace OHOS {
39 namespace CameraStandard {
40 constexpr int32_t HDI_STREAM_ID_INIT = 1;
41 using OHOS::HDI::Camera::V1_0::CaptureEndedInfo;
42 using OHOS::HDI::Camera::V1_0::CaptureErrorInfo;
43 using OHOS::HDI::Camera::V1_0::ICameraDeviceCallback;
44 using OHOS::HDI::Camera::V1_3::IStreamOperatorCallback;
45 class EXPORT_API HCameraDevice
46     : public HCameraDeviceStub, public ICameraDeviceCallback, public IStreamOperatorCallback {
47 public:
48     explicit HCameraDevice(
49         sptr<HCameraHostManager>& cameraHostManager, std::string cameraID, const uint32_t callingTokenId);
50     ~HCameraDevice();
51 
52     int32_t Open() override;
53     int32_t OpenSecureCamera(uint64_t* secureSeqId) override;
54     int32_t Close() override;
55     int32_t Release() override;
56     int32_t UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings) override;
57     int32_t SetUsedAsPosition(uint8_t value) override;
58     int32_t UpdateSettingOnce(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
59     int32_t GetStatus(std::shared_ptr<OHOS::Camera::CameraMetadata> &metaIn,
60             std::shared_ptr<OHOS::Camera::CameraMetadata> &metaOut) override;
61     int32_t GetEnabledResults(std::vector<int32_t>& results) override;
62     int32_t EnableResult(std::vector<int32_t>& results) override;
63     int32_t DisableResult(std::vector<int32_t>& results) override;
64     int32_t ReleaseStreams(std::vector<int32_t>& releaseStreamIds);
65     sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> GetStreamOperator();
66     int32_t SetCallback(sptr<ICameraDeviceServiceCallback>& callback) override;
67     int32_t OnError(OHOS::HDI::Camera::V1_0::ErrorType type, int32_t errorCode) override;
68     int32_t OnResult(uint64_t timestamp, const std::vector<uint8_t>& result) override;
69     int32_t OnResult(int32_t streamId, const std::vector<uint8_t>& result) override;
70     std::shared_ptr<OHOS::Camera::CameraMetadata> GetDeviceAbility();
71     std::shared_ptr<OHOS::Camera::CameraMetadata> CloneCachedSettings();
72     std::string GetCameraId();
73     int32_t GetCameraType();
74     bool IsOpenedCameraDevice();
75     int32_t GetCallerToken();
76     int32_t CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos,
77         std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode);
78     int32_t UpdateStreams(std::vector<StreamInfo_V1_1>& streamInfos);
79 
80     int32_t OperatePermissionCheck(uint32_t interfaceCode) override;
81 
82     int32_t OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds) override;
83     int32_t OnCaptureStarted_V1_2(
84         int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo>& infos) override;
85     int32_t OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos) override;
86     int32_t OnCaptureEndedExt(
87         int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_3::CaptureEndedInfoExt>& infos) override;
88     int32_t OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos) override;
89     int32_t OnFrameShutter(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp) override;
90     int32_t OnFrameShutterEnd(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp) override;
91     int32_t OnCaptureReady(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp) override;
92     int32_t ResetDeviceSettings();
93     int32_t DispatchDefaultSettingToHdi();
94     void SetDeviceMuteMode(bool muteMode);
95     uint8_t GetUsedAsPosition();
96     bool GetDeviceMuteMode();
97 
SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback)98     inline void SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback)
99     {
100         std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_);
101         proxyStreamOperatorCallback_ = operatorCallback;
102     }
103 
GetStreamOperatorCallback()104     inline sptr<IStreamOperatorCallback> GetStreamOperatorCallback()
105     {
106         std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_);
107         return proxyStreamOperatorCallback_.promote();
108     }
109 
SetCameraPrivacy(sptr<CameraPrivacy> cameraPrivacy)110     inline void SetCameraPrivacy(sptr<CameraPrivacy> cameraPrivacy)
111     {
112         std::lock_guard<std::mutex> lock(cameraPrivacyMutex_);
113         cameraPrivacy_ = cameraPrivacy;
114     }
115 
GetCameraPrivacy()116     inline sptr<CameraPrivacy> GetCameraPrivacy()
117     {
118         std::lock_guard<std::mutex> lock(cameraPrivacyMutex_);
119         return cameraPrivacy_;
120     }
121 
GenerateHdiStreamId()122     inline int32_t GenerateHdiStreamId()
123     {
124         return hdiStreamIdGenerator_.fetch_add(1);
125     }
126 
ResetHdiStreamId()127     inline void ResetHdiStreamId()
128     {
129         hdiStreamIdGenerator_ = HDI_STREAM_ID_INIT;
130     }
131 
132     void NotifyCameraSessionStatus(bool running);
133 
134     void RemoveResourceWhenHostDied();
135 
136     int64_t GetSecureCameraSeq(uint64_t* secureSeqId);
137 
138     bool CheckMovingPhotoSupported(int32_t mode);
139 
140     void NotifyCameraStatus(int32_t type);
141 
142     bool GetCameraResourceCost(int32_t &cost, std::set<std::string> &conflicting);
143 
144     int32_t CloseDevice();
145 
146 private:
147     class FoldScreenListener;
148     static const std::vector<std::tuple<uint32_t, std::string, std::string>> reportTagInfos_;
149 
150     std::mutex opMutex_; // Lock the operations updateSettings_, streamOperator_, and hdiCameraDevice_.
151     std::shared_ptr<OHOS::Camera::CameraMetadata> updateSettings_;
152     sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator_;
153     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> hdiCameraDevice_;
154     std::shared_ptr<OHOS::Camera::CameraMetadata> cachedSettings_;
155 
156     sptr<HCameraHostManager> cameraHostManager_;
157     std::string cameraID_;
158     std::atomic<bool> isOpenedCameraDevice_;
159     std::mutex deviceSvcCbMutex_;
160     std::mutex cachedSettingsMutex_;
161     static std::mutex g_deviceOpenCloseMutex_;
162     sptr<ICameraDeviceServiceCallback> deviceSvcCallback_;
163     std::map<int32_t, wptr<ICameraServiceCallback>> statusSvcCallbacks_;
164 
165     uint32_t callerToken_;
166     std::mutex cameraPrivacyMutex_;
167     sptr<CameraPrivacy> cameraPrivacy_;
168     int32_t cameraPid_;
169 
170     std::mutex proxyStreamOperatorCallbackMutex_;
171     wptr<IStreamOperatorCallback> proxyStreamOperatorCallback_;
172 
173     std::mutex deviceAbilityMutex_;
174     std::shared_ptr<OHOS::Camera::CameraMetadata> deviceAbility_;
175 
176     std::mutex deviceOpenLifeCycleMutex_;
177     std::shared_ptr<OHOS::Camera::CameraMetadata> deviceOpenLifeCycleSettings_;
178 
179     std::string clientName_;
180     int clientUserId_;
181     uint8_t usedAsPosition_ = OHOS_CAMERA_POSITION_OTHER;
182     std::mutex unPrepareZoomMutex_;
183     uint32_t zoomTimerId_;
184     std::atomic<bool> inPrepareZoom_;
185     std::atomic<bool> deviceMuteMode_;
186     bool isHasOpenSecure = false;
187     uint64_t mSecureCameraSeqId = 0L;
188 
189     std::atomic<int32_t> hdiStreamIdGenerator_ = HDI_STREAM_ID_INIT;
190     void UpdateDeviceOpenLifeCycleSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> changedSettings);
191     void ResetDeviceOpenLifeCycleSettings();
192 
193     sptr<ICameraDeviceServiceCallback> GetDeviceServiceCallback();
194     void ResetCachedSettings();
195     int32_t InitStreamOperator();
196     void ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
197     void RegisterFoldStatusListener();
198     void UnRegisterFoldStatusListener();
199     void CheckOnResultData(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult);
200     int32_t CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos);
201     int32_t CommitStreams(std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode);
202     bool CanOpenCamera();
203     void ResetZoomTimer();
204     void CheckZoomChange(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
205     void UnPrepareZoom();
206     int32_t OpenDevice(bool isEnableSecCam = false);
207     void HandleFoldableDevice();
208     int32_t CheckPermissionBeforeOpenDevice();
209     bool HandlePrivacyBeforeOpenDevice();
210     void HandlePrivacyAfterCloseDevice();
211     void DebugLogForSmoothZoom(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag);
212     void DebugLogForAfRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag);
213     void DebugLogForAeRegions(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings, uint32_t tag);
214     void DebugLogTag(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings,
215                      uint32_t tag, std::string tagName, std::string dfxUbStr);
216     void CreateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
217     int32_t UpdateDeviceSetting();
218 };
219 } // namespace CameraStandard
220 } // namespace OHOS
221 #endif // OHOS_CAMERA_H_CAMERA_DEVICE_H
222