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 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/depth_data_output_napi.h"
27 #include "output/photo_output_napi.h"
28 #include "output/preview_output_napi.h"
29 #include "output/video_output_napi.h"
30 #include "session/camera_session_napi.h"
31 
32 namespace OHOS {
33 namespace CameraStandard {
34 static const char CAMERA_MANAGER_NAPI_CLASS_NAME[] = "CameraManager";
35 
36 enum CameraManagerAsyncCallbackModes {
37     CREATE_DEFERRED_PREVIEW_OUTPUT_ASYNC_CALLBACK,
38 };
39 
40 class CameraManagerCallbackNapi : public CameraManagerCallback, public ListenerBase,
41     public std::enable_shared_from_this<CameraManagerCallbackNapi> {
42 public:
43     explicit CameraManagerCallbackNapi(napi_env env);
44     virtual ~CameraManagerCallbackNapi();
45     void OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const override;
46     void OnFlashlightStatusChanged(const std::string &cameraID, const FlashStatus flashStatus) const override;
47 
48 private:
49     void OnCameraStatusCallback(const CameraStatusInfo &cameraStatusInfo) const;
50     void OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const;
51 };
52 
53 struct CameraStatusCallbackInfo {
54     CameraStatusInfo info_;
55     weak_ptr<const CameraManagerCallbackNapi> listener_;
CameraStatusCallbackInfoCameraStatusCallbackInfo56     CameraStatusCallbackInfo(CameraStatusInfo info, shared_ptr<const CameraManagerCallbackNapi> listener)
57         : info_(info), listener_(listener) {}
~CameraStatusCallbackInfoCameraStatusCallbackInfo58     ~CameraStatusCallbackInfo()
59     {
60         listener_.reset();
61     }
62 };
63 
64 class CameraMuteListenerNapi : public CameraMuteListener, public ListenerBase {
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 struct CameraMuteCallbackInfo {
75     bool muteMode_;
76     const CameraMuteListenerNapi* listener_;
CameraMuteCallbackInfoCameraMuteCallbackInfo77     CameraMuteCallbackInfo(bool muteMode, const CameraMuteListenerNapi* listener)
78         : muteMode_(muteMode), listener_(listener) {}
~CameraMuteCallbackInfoCameraMuteCallbackInfo79     ~CameraMuteCallbackInfo()
80     {
81         listener_ = nullptr;
82     }
83 };
84 
85 class TorchListenerNapi : public TorchListener, public ListenerBase {
86 public:
87     explicit TorchListenerNapi(napi_env env);
88     virtual ~TorchListenerNapi();
89     void OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const override;
90 private:
91     void OnTorchStatusChangeCallback(const TorchStatusInfo &torchStatusInfo) const;
92     void OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const;
93 };
94 
95 struct TorchStatusChangeCallbackInfo {
96     TorchStatusInfo info_;
97     const TorchListenerNapi* listener_;
TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo98     TorchStatusChangeCallbackInfo(TorchStatusInfo info, const TorchListenerNapi* listener)
99         : info_(info), listener_(listener) {}
~TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo100     ~TorchStatusChangeCallbackInfo()
101     {
102         listener_ = nullptr;
103     }
104 };
105 
106 class FoldListenerNapi : public FoldListener, public ListenerBase {
107 public:
108     explicit FoldListenerNapi(napi_env env);
109     virtual ~FoldListenerNapi();
110     void OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const override;
111 private:
112     void OnFoldStatusChangedCallback(const FoldStatusInfo &foldStatusInfo) const;
113     void OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const;
114 };
115 
116 struct FoldStatusChangeCallbackInfo {
117     FoldStatusInfo info_;
118     const FoldListenerNapi* listener_;
FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo119     FoldStatusChangeCallbackInfo(FoldStatusInfo info, const FoldListenerNapi* listener)
120         : info_(info), listener_(listener) {}
~FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo121     ~FoldStatusChangeCallbackInfo()
122     {
123         listener_ = nullptr;
124     }
125 };
126 
127 struct CameraNapiObject;
128 class CameraManagerNapi : public CameraNapiEventEmitter<CameraManagerNapi> {
129 public:
130     static napi_value Init(napi_env env, napi_value exports);
131     static napi_value CreateCameraManager(napi_env env);
132     static napi_value GetSupportedCameras(napi_env env, napi_callback_info info);
133     static napi_value GetSupportedModes(napi_env env, napi_callback_info info);
134     static napi_value GetSupportedOutputCapability(napi_env env, napi_callback_info info);
135     static napi_value IsCameraMuted(napi_env env, napi_callback_info info);
136     static napi_value IsCameraMuteSupported(napi_env env, napi_callback_info info);
137     static napi_value MuteCamera(napi_env env, napi_callback_info info);
138     static napi_value MuteCameraPersist(napi_env env, napi_callback_info info);
139     static napi_value PrelaunchCamera(napi_env env, napi_callback_info info);
140     static napi_value PreSwitchCamera(napi_env env, napi_callback_info info);
141     static napi_value SetPrelaunchConfig(napi_env env, napi_callback_info info);
142     static napi_value IsPrelaunchSupported(napi_env env, napi_callback_info info);
143     static napi_value CreateCameraInputInstance(napi_env env, napi_callback_info info);
144     static napi_value CreateCameraSessionInstance(napi_env env, napi_callback_info info);
145     static napi_value CreateSessionInstance(napi_env env, napi_callback_info info);
146     static napi_value CreatePreviewOutputInstance(napi_env env, napi_callback_info info);
147     static napi_value CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info);
148     static napi_value CreatePhotoOutputInstance(napi_env env, napi_callback_info info);
149     static napi_value CreateVideoOutputInstance(napi_env env, napi_callback_info info);
150     static napi_value CreateMetadataOutputInstance(napi_env env, napi_callback_info info);
151     static napi_value CreateDepthDataOutputInstance(napi_env env, napi_callback_info info);
152     static napi_value IsTorchSupported(napi_env env, napi_callback_info info);
153     static napi_value IsTorchModeSupported(napi_env env, napi_callback_info info);
154     static napi_value GetTorchMode(napi_env env, napi_callback_info info);
155     static napi_value SetTorchMode(napi_env env, napi_callback_info info);
156     static napi_value On(napi_env env, napi_callback_info info);
157     static napi_value Once(napi_env env, napi_callback_info info);
158     static napi_value Off(napi_env env, napi_callback_info info);
159 
160     CameraManagerNapi();
161     ~CameraManagerNapi() override;
162 
163     virtual const EmitterFunctions& GetEmitterFunctions() override;
164 
165 private:
166     static void CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint);
167     static napi_value CameraManagerNapiConstructor(napi_env env, napi_callback_info info);
168     static void ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition,
169         const CameraType cameraType, sptr<CameraDevice>& cameraInfo);
170     static void GetSupportedOutputCapabilityAdaptNormalMode(
171         SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability);
172     static sptr<CameraDevice> GetSupportedOutputCapabilityGetCameraInfo(
173         napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode);
174 
175     static void RemoveDuplicatesProfile(sptr<CameraOutputCapability>& outputCapability);
176     template <typename T>
177     static void RemoveDuplicatesProfile(std::vector<T>& profiles);
178 
179     void RegisterCameraStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
180         const std::vector<napi_value>& args, bool isOnce);
181     void UnregisterCameraStatusCallbackListener(
182         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
183     void RegisterCameraMuteCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
184         const std::vector<napi_value>& args, bool isOnce);
185     void UnregisterCameraMuteCallbackListener(
186         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
187     void RegisterTorchStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
188         const std::vector<napi_value>& args, bool isOnce);
189     void UnregisterTorchStatusCallbackListener(
190         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
191     void RegisterFoldStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
192         const std::vector<napi_value>& args, bool isOnce);
193     void UnregisterFoldStatusCallbackListener(
194         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args);
195 
196     std::shared_ptr<CameraManagerCallbackNapi> cameraManagerCallback_;
197     std::shared_ptr<CameraMuteListenerNapi> cameraMuteListener_;
198     std::shared_ptr<TorchListenerNapi> torchListener_;
199     std::shared_ptr<FoldListenerNapi> foldListener_;
200     static thread_local napi_ref sConstructor_;
201 
202     napi_env env_;
203     sptr<CameraManager> cameraManager_;
204     static thread_local uint32_t cameraManagerTaskId;
205 };
206 
207 struct CameraManagerContext : public AsyncContext {
208     std::string surfaceId;
209     CameraManagerNapi* managerInstance;
210     Profile profile;
211     VideoProfile videoProfile;
212     DepthProfile depthProfile;
213     CameraManagerAsyncCallbackModes modeForAsync;
214     std::string errString;
~CameraManagerContextCameraManagerContext215     ~CameraManagerContext()
216     {
217         managerInstance = nullptr;
218     }
219 };
220 } // namespace CameraStandard
221 } // namespace OHOS
222 #endif /* CAMERA_MANAGER_NAPI_H_ */
223