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