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 std::enable_shared_from_this<CameraMuteListenerNapi> { 66 public: 67 explicit CameraMuteListenerNapi(napi_env env); 68 virtual ~CameraMuteListenerNapi(); 69 void OnCameraMute(bool muteMode) const override; 70 private: 71 void OnCameraMuteCallback(bool muteMode) const; 72 void OnCameraMuteCallbackAsync(bool muteMode) const; 73 }; 74 75 struct CameraMuteCallbackInfo { 76 bool muteMode_; 77 weak_ptr<const CameraMuteListenerNapi> listener_; CameraMuteCallbackInfoCameraMuteCallbackInfo78 CameraMuteCallbackInfo(bool muteMode, shared_ptr<const CameraMuteListenerNapi> listener) 79 : muteMode_(muteMode), listener_(listener) {} ~CameraMuteCallbackInfoCameraMuteCallbackInfo80 ~CameraMuteCallbackInfo() 81 { 82 listener_.reset(); 83 } 84 }; 85 86 class TorchListenerNapi : public TorchListener, public ListenerBase, 87 public std::enable_shared_from_this<TorchListenerNapi> { 88 public: 89 explicit TorchListenerNapi(napi_env env); 90 virtual ~TorchListenerNapi(); 91 void OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const override; 92 private: 93 void OnTorchStatusChangeCallback(const TorchStatusInfo &torchStatusInfo) const; 94 void OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const; 95 }; 96 97 struct TorchStatusChangeCallbackInfo { 98 TorchStatusInfo info_; 99 weak_ptr<const TorchListenerNapi> listener_; TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo100 TorchStatusChangeCallbackInfo(TorchStatusInfo info, shared_ptr<const TorchListenerNapi> listener) 101 : info_(info), listener_(listener) {} ~TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo102 ~TorchStatusChangeCallbackInfo() 103 { 104 listener_.reset(); 105 } 106 }; 107 108 class FoldListenerNapi : public FoldListener, public ListenerBase, 109 public std::enable_shared_from_this<FoldListenerNapi> { 110 public: 111 explicit FoldListenerNapi(napi_env env); 112 virtual ~FoldListenerNapi(); 113 void OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const override; 114 private: 115 void OnFoldStatusChangedCallback(const FoldStatusInfo &foldStatusInfo) const; 116 void OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const; 117 }; 118 119 struct FoldStatusChangeCallbackInfo { 120 FoldStatusInfo info_; 121 weak_ptr<const FoldListenerNapi> listener_; FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo122 FoldStatusChangeCallbackInfo(FoldStatusInfo info, shared_ptr<const FoldListenerNapi> listener) 123 : info_(info), listener_(listener) {} ~FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo124 ~FoldStatusChangeCallbackInfo() 125 { 126 listener_.reset(); 127 } 128 }; 129 130 class CameraManagerNapi : public CameraNapiEventEmitter<CameraManagerNapi>, 131 public CameraNapiEventListener<TorchListenerNapi>, 132 public CameraNapiEventListener<CameraManagerCallbackNapi>, 133 public CameraNapiEventListener<CameraMuteListenerNapi>, 134 public CameraNapiEventListener<FoldListenerNapi> { 135 public: 136 static napi_value Init(napi_env env, napi_value exports); 137 static napi_value CreateCameraManager(napi_env env); 138 static napi_value GetSupportedCameras(napi_env env, napi_callback_info info); 139 static napi_value GetSupportedModes(napi_env env, napi_callback_info info); 140 static napi_value GetSupportedOutputCapability(napi_env env, napi_callback_info info); 141 static napi_value IsCameraMuted(napi_env env, napi_callback_info info); 142 static napi_value IsCameraMuteSupported(napi_env env, napi_callback_info info); 143 static napi_value MuteCamera(napi_env env, napi_callback_info info); 144 static napi_value MuteCameraPersist(napi_env env, napi_callback_info info); 145 static napi_value PrelaunchCamera(napi_env env, napi_callback_info info); 146 static napi_value PreSwitchCamera(napi_env env, napi_callback_info info); 147 static napi_value SetPrelaunchConfig(napi_env env, napi_callback_info info); 148 static napi_value IsPrelaunchSupported(napi_env env, napi_callback_info info); 149 static napi_value CreateCameraInputInstance(napi_env env, napi_callback_info info); 150 static napi_value CreateCameraSessionInstance(napi_env env, napi_callback_info info); 151 static napi_value CreateSessionInstance(napi_env env, napi_callback_info info); 152 static napi_value CreatePreviewOutputInstance(napi_env env, napi_callback_info info); 153 static napi_value CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info); 154 static napi_value CreatePhotoOutputInstance(napi_env env, napi_callback_info info); 155 static napi_value CreateVideoOutputInstance(napi_env env, napi_callback_info info); 156 static napi_value CreateMetadataOutputInstance(napi_env env, napi_callback_info info); 157 static napi_value CreateDepthDataOutputInstance(napi_env env, napi_callback_info info); 158 static napi_value IsTorchSupported(napi_env env, napi_callback_info info); 159 static napi_value IsTorchModeSupported(napi_env env, napi_callback_info info); 160 static napi_value GetTorchMode(napi_env env, napi_callback_info info); 161 static napi_value SetTorchMode(napi_env env, napi_callback_info info); 162 static napi_value On(napi_env env, napi_callback_info info); 163 static napi_value Once(napi_env env, napi_callback_info info); 164 static napi_value Off(napi_env env, napi_callback_info info); 165 static napi_value GetCameraDevice(napi_env env, napi_callback_info info); 166 static napi_value GetCameraConcurrentInfos(napi_env env, napi_callback_info info); 167 168 CameraManagerNapi(); 169 ~CameraManagerNapi() override; 170 171 virtual const EmitterFunctions& GetEmitterFunctions() override; 172 173 private: 174 static void CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint); 175 static napi_value CameraManagerNapiConstructor(napi_env env, napi_callback_info info); 176 static void ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition, 177 const CameraType cameraType, sptr<CameraDevice>& cameraInfo); 178 static void GetSupportedOutputCapabilityAdaptNormalMode( 179 SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability); 180 static sptr<CameraDevice> GetSupportedOutputCapabilityGetCameraInfo( 181 napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode); 182 183 static void RemoveDuplicatesProfile(sptr<CameraOutputCapability>& outputCapability); 184 template<typename T> 185 static void RemoveDuplicatesProfile(std::vector<T>& profiles); 186 static napi_value CreateCameraConcurrentResult(napi_env env, vector<sptr<CameraDevice>> &cameraDeviceArrray, 187 std::vector<bool> &cameraConcurrentType, std::vector<std::vector<SceneMode>> &modes, 188 std::vector<std::vector<sptr<CameraOutputCapability>>> &outputCapabilities); 189 void ParseGetCameraConcurrentInfos(napi_env env, napi_value arrayParam, 190 std::vector<string> &cameraIdv); 191 192 void RegisterCameraStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 193 const std::vector<napi_value>& args, bool isOnce); 194 void UnregisterCameraStatusCallbackListener( 195 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 196 void RegisterCameraMuteCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 197 const std::vector<napi_value>& args, bool isOnce); 198 void UnregisterCameraMuteCallbackListener( 199 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 200 void RegisterTorchStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 201 const std::vector<napi_value>& args, bool isOnce); 202 void UnregisterTorchStatusCallbackListener( 203 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 204 void RegisterFoldStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 205 const std::vector<napi_value>& args, bool isOnce); 206 void UnregisterFoldStatusCallbackListener( 207 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 208 209 static thread_local napi_ref sConstructor_; 210 211 napi_env env_; 212 sptr<CameraManager> cameraManager_; 213 static thread_local uint32_t cameraManagerTaskId; 214 }; 215 216 struct CameraManagerContext : public AsyncContext { 217 std::string surfaceId; 218 CameraManagerNapi* managerInstance; 219 Profile profile; 220 VideoProfile videoProfile; 221 DepthProfile depthProfile; 222 CameraManagerAsyncCallbackModes modeForAsync; 223 std::string errString; ~CameraManagerContextCameraManagerContext224 ~CameraManagerContext() 225 { 226 managerInstance = nullptr; 227 } 228 }; 229 } // namespace CameraStandard 230 } // namespace OHOS 231 #endif /* CAMERA_MANAGER_NAPI_H_ */ 232