• 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 #ifndef OHOS_CAMERA_H_CAMERA_DEVICE_H
17 #define OHOS_CAMERA_H_CAMERA_DEVICE_H
18 
19 #include <cstdint>
20 #include <iostream>
21 #include <atomic>
22 #include <mutex>
23 
24 #include "accesstoken_kit.h"
25 #include "privacy_kit.h"
26 #include "v1_0/icamera_device_callback.h"
27 #include "camera_metadata_info.h"
28 #include "camera_util.h"
29 #include "hcamera_device_stub.h"
30 #include "hcamera_host_manager.h"
31 #include "v1_0/icamera_device.h"
32 #include "v1_1/icamera_device.h"
33 #include "v1_2/icamera_device.h"
34 #include "v1_0/icamera_host.h"
35 
36 namespace OHOS {
37 namespace CameraStandard {
38 using OHOS::HDI::Camera::V1_0::CaptureEndedInfo;
39 using OHOS::HDI::Camera::V1_0::CaptureErrorInfo;
40 using OHOS::HDI::Camera::V1_0::ICameraDeviceCallback;
41 using OHOS::HDI::Camera::V1_2::IStreamOperatorCallback;
42 class HCameraDevice : public HCameraDeviceStub, public ICameraDeviceCallback, public IStreamOperatorCallback {
43 public:
44     explicit HCameraDevice(
45         sptr<HCameraHostManager>& cameraHostManager, std::string cameraID, const uint32_t callingTokenId);
46     ~HCameraDevice();
47 
48     int32_t Open() override;
49     int32_t Close() override;
50     int32_t Release() override;
51     int32_t UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings) override;
52     int32_t UpdateSettingOnce(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
53     int32_t GetStatus(std::shared_ptr<OHOS::Camera::CameraMetadata> &metaIn,
54             std::shared_ptr<OHOS::Camera::CameraMetadata> &metaOut) override;
55     int32_t GetEnabledResults(std::vector<int32_t>& results) override;
56     int32_t EnableResult(std::vector<int32_t>& results) override;
57     int32_t DisableResult(std::vector<int32_t>& results) override;
58     int32_t ReleaseStreams(std::vector<int32_t>& releaseStreamIds);
59     sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> GetStreamOperator();
60     int32_t SetCallback(sptr<ICameraDeviceServiceCallback>& callback) override;
61     int32_t OnError(OHOS::HDI::Camera::V1_0::ErrorType type, int32_t errorCode) override;
62     int32_t OnResult(uint64_t timestamp, const std::vector<uint8_t>& result) override;
63     std::shared_ptr<OHOS::Camera::CameraMetadata> GetDeviceAbility();
64     std::shared_ptr<OHOS::Camera::CameraMetadata> CloneCachedSettings();
65     std::string GetCameraId();
66     bool IsOpenedCameraDevice();
67     int32_t GetCallerToken();
68     int32_t CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos,
69         std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode);
70     int32_t UpdateStreams(std::vector<StreamInfo_V1_1>& streamInfos);
71 
72     int32_t OperatePermissionCheck(uint32_t interfaceCode) override;
73 
74     int32_t OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds) override;
75     int32_t OnCaptureStarted_V1_2(
76         int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo>& infos) override;
77     int32_t OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos) override;
78     int32_t OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos) override;
79     int32_t OnFrameShutter(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp) override;
80 
81     int32_t ResetDeviceSettings();
82     int32_t DispatchDefaultSettingToHdi();
83 
SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback)84     inline void SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback)
85     {
86         std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_);
87         proxyStreamOperatorCallback_ = operatorCallback;
88     }
89 
GetStreamOperatorCallback()90     inline sptr<IStreamOperatorCallback> GetStreamOperatorCallback()
91     {
92         std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_);
93         return proxyStreamOperatorCallback_.promote();
94     }
95 
96     void NotifyCameraSessionStatus(bool running);
97 
98 private:
99     class FoldScreenListener;
100     std::mutex opMutex_; // Lock the operations updateSettings_, streamOperator_, and hdiCameraDevice_.
101     std::shared_ptr<OHOS::Camera::CameraMetadata> updateSettings_;
102     sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator_;
103     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> hdiCameraDevice_;
104     std::shared_ptr<OHOS::Camera::CameraMetadata> cachedSettings_;
105 
106     sptr<HCameraHostManager> cameraHostManager_;
107     std::string cameraID_;
108     std::atomic<bool> isOpenedCameraDevice_;
109     std::mutex deviceSvcCbMutex_;
110     std::mutex cachedSettingsMutex_;
111     static std::mutex g_deviceOpenCloseMutex_;
112     sptr<ICameraDeviceServiceCallback> deviceSvcCallback_;
113     std::map<int32_t, wptr<ICameraServiceCallback>> statusSvcCallbacks_;
114 
115     uint32_t callerToken_;
116 
117     std::mutex proxyStreamOperatorCallbackMutex_;
118     wptr<IStreamOperatorCallback> proxyStreamOperatorCallback_;
119 
120     std::mutex deviceAbilityMutex_;
121     std::shared_ptr<OHOS::Camera::CameraMetadata> deviceAbility_;
122 
123     std::mutex deviceOpenLifeCycleMutex_;
124     std::shared_ptr<OHOS::Camera::CameraMetadata> deviceOpenLifeCycleSettings_;
125 
126     std::string clientName_;
127     int clientUserId_;
128 
129     std::mutex unPrepareZoomMutex_;
130     uint32_t zoomTimerId_;
131     std::atomic<bool> inPrepareZoom_;
132 
133     void UpdateDeviceOpenLifeCycleSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> changedSettings);
134     void ResetDeviceOpenLifeCycleSettings();
135 
136     sptr<ICameraDeviceServiceCallback> GetDeviceServiceCallback();
137     void ResetCachedSettings();
138     int32_t InitStreamOperator();
139     void ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
140     void RegisterFoldStatusListener();
141     void UnRegisterFoldStatusListener();
142     void CheckOnResultData(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult);
143     int32_t CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos);
144     int32_t CommitStreams(std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode);
145     bool CanOpenCamera();
146     void ResetZoomTimer();
147     void CheckZoomChange(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings);
148     void UnPrepareZoom();
149     int32_t OpenDevice();
150     int32_t CloseDevice();
151 };
152 } // namespace CameraStandard
153 } // namespace OHOS
154 #endif // OHOS_CAMERA_H_CAMERA_DEVICE_H
155