• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 CAMERA_MANAGER_NAPI_H_
17 #define CAMERA_MANAGER_NAPI_H_
18 
19 #include "camera_napi_utils.h"
20 #include "input/camera_device.h"
21 #include "input/camera_input_napi.h"
22 #include "input/camera_manager.h"
23 #include "listener_base.h"
24 #include "output/camera_output_capability.h"
25 #include "output/capture_output.h"
26 #include "output/photo_output_napi.h"
27 #include "output/preview_output_napi.h"
28 #include "output/video_output_napi.h"
29 #include "session/camera_session_napi.h"
30 
31 namespace OHOS {
32 namespace CameraStandard {
33 static const char CAMERA_MANAGER_NAPI_CLASS_NAME[] = "CameraManager";
34 
35 enum CameraManagerAsyncCallbackModes {
36     CREATE_DEFERRED_PREVIEW_OUTPUT_ASYNC_CALLBACK,
37 };
38 
39 class CameraManagerCallbackNapi : public CameraManagerCallback, public ListenerBase,
40     public std::enable_shared_from_this<CameraManagerCallbackNapi> {
41 public:
42     explicit CameraManagerCallbackNapi(napi_env env);
43     virtual ~CameraManagerCallbackNapi();
44     void OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const override;
45     void OnFlashlightStatusChanged(const std::string &cameraID, const FlashStatus flashStatus) const override;
46 
47 private:
48     void OnCameraStatusCallback(const CameraStatusInfo &cameraStatusInfo) const;
49     void OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const;
50 };
51 
52 struct CameraStatusCallbackInfo {
53     CameraStatusInfo info_;
54     weak_ptr<const CameraManagerCallbackNapi> listener_;
CameraStatusCallbackInfoCameraStatusCallbackInfo55     CameraStatusCallbackInfo(CameraStatusInfo info, shared_ptr<const CameraManagerCallbackNapi> listener)
56         : info_(info), listener_(listener) {}
~CameraStatusCallbackInfoCameraStatusCallbackInfo57     ~CameraStatusCallbackInfo()
58     {
59         listener_.reset();
60     }
61 };
62 
63 class CameraMuteListenerNapi : public CameraMuteListener, public ListenerBase,
64     public std::enable_shared_from_this<CameraMuteListenerNapi> {
65 public:
66     explicit CameraMuteListenerNapi(napi_env env);
67     virtual ~CameraMuteListenerNapi();
68     void OnCameraMute(bool muteMode) const override;
69 private:
70     void OnCameraMuteCallback(bool muteMode) const;
71     void OnCameraMuteCallbackAsync(bool muteMode) const;
72 };
73 
74 class ControlCenterStatusListenerNapi : public ControlCenterStatusListener, public ListenerBase,
75     public std::enable_shared_from_this<ControlCenterStatusListenerNapi> {
76 public:
77     explicit ControlCenterStatusListenerNapi(napi_env env);
78     virtual ~ControlCenterStatusListenerNapi();
79     void OnControlCenterStatusChanged(bool status) const override;
80 private:
81     void OnControlCenterStatusCallback(bool status) const;
82     void OnControlCenterStatusCallbackAsync(bool status) const;
83 };
84 
85 struct ControlCenterStatusCallbackInfo {
86     bool controlCenterStatus_;
87     weak_ptr<const ControlCenterStatusListenerNapi> listener_;
ControlCenterStatusCallbackInfoControlCenterStatusCallbackInfo88     ControlCenterStatusCallbackInfo(bool status, shared_ptr<const ControlCenterStatusListenerNapi> listener)
89         : controlCenterStatus_(status), listener_(listener) {}
~ControlCenterStatusCallbackInfoControlCenterStatusCallbackInfo90     ~ControlCenterStatusCallbackInfo()
91     {
92         listener_.reset();
93     }
94 };
95 
96 struct CameraMuteCallbackInfo {
97     bool muteMode_;
98     weak_ptr<const CameraMuteListenerNapi> listener_;
CameraMuteCallbackInfoCameraMuteCallbackInfo99     CameraMuteCallbackInfo(bool muteMode, shared_ptr<const CameraMuteListenerNapi> listener)
100         : muteMode_(muteMode), listener_(listener) {}
~CameraMuteCallbackInfoCameraMuteCallbackInfo101     ~CameraMuteCallbackInfo()
102     {
103         listener_.reset();
104     }
105 };
106 
107 class TorchListenerNapi : public TorchListener, public ListenerBase,
108     public std::enable_shared_from_this<TorchListenerNapi> {
109 public:
110     explicit TorchListenerNapi(napi_env env);
111     virtual ~TorchListenerNapi();
112     void OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const override;
113 private:
114     void OnTorchStatusChangeCallback(const TorchStatusInfo &torchStatusInfo) const;
115     void OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const;
116 };
117 
118 struct TorchStatusChangeCallbackInfo {
119     TorchStatusInfo info_;
120     weak_ptr<const TorchListenerNapi> listener_;
TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo121     TorchStatusChangeCallbackInfo(TorchStatusInfo info, shared_ptr<const TorchListenerNapi> listener)
122         : info_(info), listener_(listener) {}
~TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo123     ~TorchStatusChangeCallbackInfo()
124     {
125         listener_.reset();
126     }
127 };
128 
129 class FoldListenerNapi : public FoldListener, public ListenerBase,
130     public std::enable_shared_from_this<FoldListenerNapi> {
131 public:
132     explicit FoldListenerNapi(napi_env env);
133     virtual ~FoldListenerNapi();
134     void OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const override;
135 private:
136     void OnFoldStatusChangedCallback(const FoldStatusInfo &foldStatusInfo) const;
137     void OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const;
138 };
139 
140 struct FoldStatusChangeCallbackInfo {
141     FoldStatusInfo info_;
142     weak_ptr<const FoldListenerNapi> listener_;
FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo143     FoldStatusChangeCallbackInfo(FoldStatusInfo info, shared_ptr<const FoldListenerNapi> listener)
144         : info_(info), listener_(listener) {}
~FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo145     ~FoldStatusChangeCallbackInfo()
146     {
147         listener_.reset();
148     }
149 };
150 
151 class CameraManagerNapi : public CameraNapiEventEmitter<CameraManagerNapi>,
152                           public CameraNapiEventListener<TorchListenerNapi>,
153                           public CameraNapiEventListener<CameraManagerCallbackNapi>,
154                           public CameraNapiEventListener<CameraMuteListenerNapi>,
155                           public CameraNapiEventListener<ControlCenterStatusListenerNapi>,
156                           public CameraNapiEventListener<FoldListenerNapi> {
157 public:
158     static napi_value Init(napi_env env, napi_value exports);
159     static napi_value CreateCameraManager(napi_env env);
160     static napi_value GetSupportedCameras(napi_env env, napi_callback_info info);
161     static napi_value GetSupportedModes(napi_env env, napi_callback_info info);
162     static napi_value GetSupportedOutputCapability(napi_env env, napi_callback_info info);
163     static napi_value IsCameraMuted(napi_env env, napi_callback_info info);
164     static napi_value IsCameraMuteSupported(napi_env env, napi_callback_info info);
165     static napi_value MuteCamera(napi_env env, napi_callback_info info);
166     static napi_value MuteCameraPersist(napi_env env, napi_callback_info info);
167     static napi_value PrelaunchCamera(napi_env env, napi_callback_info info);
168     static napi_value ResetRssPriority(napi_env env, napi_callback_info info);
169     static napi_value PreSwitchCamera(napi_env env, napi_callback_info info);
170     static napi_value SetPrelaunchConfig(napi_env env, napi_callback_info info);
171     static napi_value IsPrelaunchSupported(napi_env env, napi_callback_info info);
172     static napi_value IsControlCenterActive(napi_env env, napi_callback_info info);
173     static napi_value CreateControlCenterSession(napi_env env, napi_callback_info info);
174     static napi_value CreateCameraInputInstance(napi_env env, napi_callback_info info);
175     static napi_value CreateCameraSessionInstance(napi_env env, napi_callback_info info);
176     static napi_value CreateSessionInstance(napi_env env, napi_callback_info info);
177     static napi_value CreatePreviewOutputInstance(napi_env env, napi_callback_info info);
178     static napi_value CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info);
179     static napi_value CreatePhotoOutputInstance(napi_env env, napi_callback_info info);
180     static napi_value CreateVideoOutputInstance(napi_env env, napi_callback_info info);
181     static napi_value CreateMetadataOutputInstance(napi_env env, napi_callback_info info);
182     static napi_value CreateDepthDataOutputInstance(napi_env env, napi_callback_info info);
183     static napi_value IsTorchSupported(napi_env env, napi_callback_info info);
184     static napi_value IsTorchModeSupported(napi_env env, napi_callback_info info);
185     static napi_value GetTorchMode(napi_env env, napi_callback_info info);
186     static napi_value SetTorchMode(napi_env env, napi_callback_info info);
187     static napi_value On(napi_env env, napi_callback_info info);
188     static napi_value Once(napi_env env, napi_callback_info info);
189     static napi_value Off(napi_env env, napi_callback_info info);
190     static napi_value GetCameraDevice(napi_env env, napi_callback_info info);
191     static napi_value GetCameraConcurrentInfos(napi_env env, napi_callback_info info);
192     static napi_value GetCameraStorageSize(napi_env env, napi_callback_info info);
193 
194     CameraManagerNapi();
195     ~CameraManagerNapi() override;
196 
197     virtual const EmitterFunctions& GetEmitterFunctions() override;
198 
199 private:
200     static void CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint);
201     static napi_value CameraManagerNapiConstructor(napi_env env, napi_callback_info info);
202     static void ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition,
203         const CameraType cameraType, sptr<CameraDevice>& cameraInfo);
204     static void GetSupportedOutputCapabilityAdaptNormalMode(
205         SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability);
206     static sptr<CameraDevice> GetSupportedOutputCapabilityGetCameraInfo(
207         napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode);
208 
209     static void RemoveDuplicatesProfile(sptr<CameraOutputCapability>& outputCapability);
210     template<typename T>
211     static void RemoveDuplicatesProfile(std::vector<T>& profiles);
212     static napi_value CreateCameraConcurrentResult(napi_env env, vector<sptr<CameraDevice>> &cameraDeviceArrray,
213         std::vector<bool> &cameraConcurrentType, std::vector<std::vector<SceneMode>> &modes,
214         std::vector<std::vector<sptr<CameraOutputCapability>>> &outputCapabilities);
215     void ParseGetCameraConcurrentInfos(napi_env env, napi_value arrayParam,
216         std::vector<string> &cameraIdv);
217 
218     void RegisterCameraStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
219         const std::vector<napi_value>& args, bool isOnce);
220     void UnregisterCameraStatusCallbackListener(
221         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
222     void RegisterCameraMuteCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
223         const std::vector<napi_value>& args, bool isOnce);
224     void UnregisterCameraMuteCallbackListener(
225         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
226     void RegisterTorchStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
227         const std::vector<napi_value>& args, bool isOnce);
228     void UnregisterTorchStatusCallbackListener(
229         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
230     void RegisterFoldStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
231         const std::vector<napi_value>& args, bool isOnce);
232     void UnregisterFoldStatusCallbackListener(
233         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
234     void RegisterControlCenterStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
235         const std::vector<napi_value>& args, bool isOnce);
236     void UnregisterControlCenterStatusCallbackListener(
237         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
238 
239     static thread_local napi_ref sConstructor_;
240 
241     napi_env env_;
242     sptr<CameraManager> cameraManager_;
243     static thread_local uint32_t cameraManagerTaskId;
244 };
245 
246 struct CameraManagerAsyncContext : public AsyncContext {
CameraManagerAsyncContextCameraManagerAsyncContext247     CameraManagerAsyncContext(std::string funcName, int32_t taskId) : AsyncContext(funcName, taskId) {};
248     CameraManagerNapi* objectInfo = nullptr;
249     int64_t storageSize = 0;
~CameraManagerAsyncContextCameraManagerAsyncContext250     ~CameraManagerAsyncContext()
251     {
252         objectInfo = nullptr;
253     }
254 };
255 } // namespace CameraStandard
256 } // namespace OHOS
257 #endif /* CAMERA_MANAGER_NAPI_H_ */
258