1 /* 2 * Copyright (c) 2023-2023 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_NATIVE_CAMERA_H 17 #define CAMERA_NATIVE_CAMERA_H 18 19 #include <native_buffer/native_buffer.h> 20 #include <unistd.h> 21 #include <string> 22 #include <thread> 23 #include <cstdio> 24 #include <fcntl.h> 25 #include "napi/native_api.h" 26 #include "iostream" 27 #include "mutex" 28 #include "hilog/log.h" 29 #include "ohcamera/camera.h" 30 #include "ohcamera/camera_manager.h" 31 #include "ohcamera/camera_input.h" 32 #include "ohcamera/capture_session.h" 33 #include "ohcamera/preview_output.h" 34 #include "ohcamera/photo_output.h" 35 #include "ohcamera/video_output.h" 36 #include <map> 37 #include <string> 38 #include <vector> 39 #include <ohcamera/camera_device.h> 40 #define COLOR_SPACE_NOT_SUPPORTED_MODE 3 41 #define TARGET_ZOOM 1.5 42 #define ALL_CALLBACK_IS_NULL 1 43 #define ONLY_ON_ERROR 2 44 #define ONLY_ON_FOCUS_STATE_CHANGE 3 45 #define INVALID_SURFACE_ID 4 46 #define SET_OH_COLORSPACE_SRGB_FULL 2 47 #define INVALID_MIN_FPS (-1) 48 #define INVALID_MAX_FPS 5 49 #define COLOR_SPACE_NOT_SUPPORTED 0 50 #define SET_CAMERA_FRONT_FOR_SECURE_PHOTO 5 51 #define BACK_CAMERA 0 52 #define FRONT_CAMERA 1 53 54 typedef enum CameraCallbackCode { 55 CameraInput_Status = 1, 56 Preview_OnFrameStart = 2, 57 Preview_OnFrameEnd = 3, 58 Preview_OnError = 4, 59 Photo_OnFrameStart = 5, 60 Photo_OnFrameShutter = 6, 61 Photo_OnFrameEnd = 7, 62 Photo_OnError = 8, 63 Video_OnFrameStart = 9, 64 Video_OnFrameEnd = 10, 65 Video_OnError = 11, 66 Metadata_Object_Available = 12, 67 Metadata_Output_Error = 13, 68 Session_OnFocusState_Change = 14, 69 Session_OnError = 15, 70 CameraManager_Status = 16, 71 NoReceived = 10086, 72 PHOTO_ON_PHOTO_AVAILABLE = 17, 73 PHOTO_ON_PHOTO_ASSET_AVAILABLE = 18, 74 } CameraCallbackCode; 75 76 typedef enum UseCaseCode { 77 PARAMETER_OK = 0, 78 PARAMETER1_ERROR = 1, 79 PARAMETER2_ERROR = 2, 80 PARAMETER3_ERROR = 3, 81 PARAMETER4_ERROR = 4, 82 } UseCaseCode; 83 84 class NDKCamera { 85 public: 86 ~NDKCamera(void); 87 NDKCamera(char *str); 88 89 bool IsMirror_; 90 bool IsVideoMirror_; 91 bool HasFlash_; 92 bool IsFlashMode_; 93 bool IsExposureMode_; 94 float minExposureBias_; 95 float maxExposureBias_; 96 float exposureBias_; 97 bool isFocusSupported_; 98 float minZoom_; 99 float maxZoom_; 100 float zoom_; 101 bool isVideoSupported_; 102 Camera_FlashMode flashMode_; 103 Camera_ExposureMode exposureMode_; 104 Camera_Point point_; 105 Camera_FocusMode focusMode_; 106 Camera_Point focusPoint_; 107 Camera_VideoStabilizationMode videoMode_; 108 Camera_Device* cameras_; 109 Camera_OutputCapability* cameraOutputCapability_; 110 bool isAddInput_; 111 Camera_Device *camera_; 112 Camera_SceneMode *sceneModes_; 113 Camera_SceneMode sceneMode_; 114 uint64_t secureSeqId_; 115 bool canPreconfig_; 116 uint32_t sceneModesSize_; 117 bool isNormalPhoto_; 118 bool isNormalVideo_; 119 bool isSecurePhoto_; 120 bool isMovingPhotoSupported_; 121 OH_PhotoNative *photoNative_; 122 OH_ImageNative *mainImage_; 123 bool isTorchSupported_; 124 bool isTorchSupportedByTorchMode_; 125 Camera_TorchMode torchMode_; 126 uint32_t frameRatesSize_; 127 uint32_t videoFrameRatesSize_; 128 uint32_t colorSpacesSize_; 129 OH_NativeBuffer_ColorSpace* colorSpace_; 130 OH_NativeBuffer_ColorSpace activeColorSpace_; 131 OH_NativeBuffer_ColorSpace setcolorSpace_; 132 Camera_FrameRateRange* frameRateRange_; 133 Camera_FrameRateRange activeFrameRateRange_; 134 Camera_FrameRateRange* videoFrameRateRange_; 135 Camera_FrameRateRange videoActiveFrameRateRange_; 136 Camera_ImageRotation imageRotation_; 137 Camera_ImageRotation previewRotation_; 138 bool isCreatePhotoOutputWithoutSurface_; 139 140 //callback 141 static CameraCallbackCode cameraCallbackCode_; 142 143 Camera_ErrorCode CreateCameraInput(void); 144 Camera_ErrorCode CreateCameraInputWithPositionAndType(Camera_Position position, Camera_Type type); 145 Camera_ErrorCode CreateSession(void); 146 Camera_ErrorCode CameraInputOpen(void); 147 Camera_ErrorCode CameraInputClose(void); 148 Camera_ErrorCode CameraInputRelease(void); 149 Camera_ErrorCode GetSupportedCameras(void); 150 Camera_ErrorCode GetCameraOrientation(void); 151 Camera_ErrorCode GetCameraHostName(void); 152 Camera_ErrorCode GetCameraHostNameErrorParameter(void); 153 Camera_ErrorCode GetCameraHostTypeErrorParameter(void); 154 Camera_ErrorCode GetCameraHostNameInspection(void); 155 Camera_ErrorCode GetCameraHostTypeInspection(void); 156 Camera_ErrorCode GetCameraHostType(void); 157 Camera_ErrorCode GetSupportedOutputCapability(void); 158 Camera_ErrorCode CreatePreviewOutput(void); 159 Camera_ErrorCode CreatePhotoOutput(char* photoSurfaceId); 160 Camera_ErrorCode CreateVideoOutput(char* videoId); 161 Camera_ErrorCode CreateMetadataOutput(void); 162 Camera_ErrorCode IsCameraMuted(void); 163 Camera_ErrorCode PreviewOutputStop(void); 164 Camera_ErrorCode PreviewOutputRelease(void); 165 Camera_ErrorCode PhotoOutputRelease(void); 166 Camera_ErrorCode HasFlashFn(uint32_t mode); 167 Camera_ErrorCode setZoomRatioFn(uint32_t zoomRatio); 168 169 Camera_ErrorCode SessionBegin(void); 170 Camera_ErrorCode SessionCommitConfig(void); 171 Camera_ErrorCode SessionStart(void); 172 Camera_ErrorCode SessionStop(void); 173 Camera_ErrorCode StartVideo(char* videoId); 174 Camera_ErrorCode AddVideoOutput(void); 175 Camera_ErrorCode VideoOutputStart(void); 176 177 Camera_ErrorCode PreviewOutputStart(void); 178 Camera_ErrorCode PhotoOutputCapture(void); 179 Camera_ErrorCode TakePictureWithPhotoSettings(Camera_PhotoCaptureSetting photoSetting); 180 Camera_ErrorCode IsMirrorSupported(void); 181 Camera_ErrorCode VideoOutputStop(void); 182 Camera_ErrorCode VideoOutputRelease(void); 183 Camera_ErrorCode IsVideoMirrorSupported(void); 184 Camera_ErrorCode EnableVideoMirror(bool isEnable); 185 186 Camera_ErrorCode MetadataOutputStart(void); 187 Camera_ErrorCode MetadataOutputStop(void); 188 Camera_ErrorCode MetadataOutputRelease(void); 189 190 Camera_ErrorCode SessionAddInput(void); 191 Camera_ErrorCode SessionRemoveInput(void); 192 Camera_ErrorCode SessionAddPreviewOutput(void); 193 Camera_ErrorCode SessionAddPhotoOutput(void); 194 Camera_ErrorCode SessionAddVideoOutput(void); 195 Camera_ErrorCode SessionAddMetadataOutput(void); 196 Camera_ErrorCode SessionRemovePreviewOutput(void); 197 Camera_ErrorCode SessionRemovePhotoOutput(void); 198 Camera_ErrorCode SessionRemoveVideoOutput(void); 199 Camera_ErrorCode SessionRemoveMetadataOutput(void); 200 Camera_ErrorCode SessionRelease(void); 201 202 Camera_ErrorCode SessionHasFlash(void); 203 Camera_ErrorCode SessionIsFlashModeSupported(uint32_t mode); 204 Camera_ErrorCode SessionGetFlashMode(void); 205 Camera_ErrorCode SessionSetFlashMode(uint32_t mode); 206 207 Camera_ErrorCode SessionIsExposureModeSupported(uint32_t mode); 208 Camera_ErrorCode SessionGetExposureMode(void); 209 Camera_ErrorCode SessionSetExposureMode(uint32_t mode); 210 Camera_ErrorCode SessionGetMeteringPoint(void); 211 Camera_ErrorCode SessionSetMeteringPoint(double point_x, double point_y); 212 Camera_ErrorCode SessionGetExposureBiasRange(void); 213 Camera_ErrorCode SessionSetExposureBias(float exposureBias); 214 Camera_ErrorCode SessionGetExposureBias(void); 215 Camera_ErrorCode SessionGetPhotoRotation(int rotation); 216 Camera_ErrorCode SessionGetVideoRotation(int rotation); 217 Camera_ErrorCode SessionGetPreviewRotation(int rotation); 218 Camera_ErrorCode SessionSetPreviewRotation(int rotation, bool isDisplayLocked); 219 220 Camera_ErrorCode SessionIsFocusModeSupported(uint32_t mode); 221 Camera_ErrorCode SessionGetFocusMode(void); 222 Camera_ErrorCode SessionSetFocusMode(uint32_t mode); 223 Camera_ErrorCode SessionSetFocusPoint(double point_x, double point_y); 224 Camera_ErrorCode SessionGetFocusPoint(void); 225 226 Camera_ErrorCode SessionGetZoomRatioRange(void); 227 Camera_ErrorCode SessionGetZoomRatio(void); 228 Camera_ErrorCode SessionSetZoomRatio(float zoom); 229 230 Camera_ErrorCode SessionIsVideoStabilizationModeSupported(uint32_t mode); 231 Camera_ErrorCode SessionGetVideoStabilizationMode(void); 232 Camera_ErrorCode SessionSetVideoStabilizationMode(uint32_t mode); 233 Camera_ErrorCode SessionSetQualityPrioritization(uint32_t quality); 234 235 // RegisterCallback 236 Camera_ErrorCode CameraManagerRegisterCallback(void); 237 Camera_ErrorCode CameraInputRegisterCallback(void); 238 Camera_ErrorCode PreviewOutputRegisterCallback(void); 239 Camera_ErrorCode PhotoOutputRegisterCallback(void); 240 Camera_ErrorCode VideoOutputRegisterCallback(void); 241 Camera_ErrorCode MetadataOutputRegisterCallback(void); 242 Camera_ErrorCode CaptureSessionRegisterCallback(void); 243 Camera_ErrorCode CaptureSessionRegisterCallback(int useCaseCode); 244 245 // UnRegisterCallback 246 Camera_ErrorCode CameraManagerUnRegisterCallback(void); 247 Camera_ErrorCode CameraInputUnRegisterCallback(void); 248 Camera_ErrorCode PreviewOutputUnRegisterCallback(void); 249 Camera_ErrorCode PhotoOutputUnRegisterCallback(void); 250 Camera_ErrorCode VideoOutputUnRegisterCallback(void); 251 Camera_ErrorCode MetadataOutputUnRegisterCallback(void); 252 Camera_ErrorCode CaptureSessionUnRegisterCallback(void); 253 Camera_ErrorCode CaptureSessionUnRegisterCallback(int useCaseCode); 254 255 // Get callback 256 CameraManager_Callbacks* GetCameraManagerListener(void); 257 CameraInput_Callbacks* GetCameraInputListener(void); 258 PreviewOutput_Callbacks* GetPreviewOutputListener(void); 259 PhotoOutput_Callbacks* GetPhotoOutputListener(void); 260 VideoOutput_Callbacks* GetVideoOutputListener(void); 261 MetadataOutput_Callbacks* GetMetadataOutputListener(void); 262 CaptureSession_Callbacks* GetCaptureSessionRegister(void); 263 264 // RegisterCallback_On 265 Camera_ErrorCode CaptureSessionRegisterCallbackOn(int useCaseCode); 266 267 // UnregisterCallback_Off 268 Camera_ErrorCode CaptureSessionUnregisterCallbackOff(int useCaseCode); 269 270 // Get callback 271 CaptureSession_Callbacks* GetCaptureSessionRegister(int useCaseCode); 272 273 Camera_ErrorCode GetSupportedSceneModes(int useCaseCode); 274 Camera_ErrorCode DeleteSceneModes(int useCaseCode); 275 Camera_ErrorCode GetSupportedCameraOutputCapabilityWithSceneMode(int useCaseCode); 276 Camera_ErrorCode SetSessionMode(int useCaseCode); 277 Camera_ErrorCode CanAddInput(int useCaseCode); 278 Camera_ErrorCode CanAddPreviewOutput(int useCaseCode); 279 Camera_ErrorCode CanAddPhotoOutput(int useCaseCode); 280 Camera_ErrorCode CanAddVideoOutput(int useCaseCode); 281 Camera_ErrorCode AddSecureOutput(int useCaseCode); 282 Camera_ErrorCode OpenSecureCamera(int useCaseCode); 283 284 Camera_ErrorCode CreatePreviewOutputUsedInPreconfig(int useCaseCode); 285 Camera_ErrorCode CreatePhotoOutputUsedInPreconfig(char *photoSurfaceId, int useCaseCode); 286 Camera_ErrorCode CreateVideoOutputUsedInPreconfig(char *videoId, int useCaseCode); 287 Camera_ErrorCode VideoOutputGetActiveProfile(int useCaseCode); 288 Camera_ErrorCode VideoOutputDeleteProfile(int useCaseCode); 289 Camera_ErrorCode SessionCanPreconfig(uint32_t mode, int useCaseCode); 290 Camera_ErrorCode SessionCanPreconfigWithRatio(uint32_t mode, uint32_t mode2, int useCaseCode); 291 Camera_ErrorCode SessionPreconfig(uint32_t mode, int useCaseCode); 292 Camera_ErrorCode SessionPreconfigWithRatio(uint32_t mode, uint32_t mode2, int useCaseCode); 293 Camera_ErrorCode PreviewOutputGetActiveProfile(int useCaseCode); 294 Camera_ErrorCode PreviewOutputDeleteProfile(int useCaseCode); 295 Camera_ErrorCode PhotoOutputGetActiveProfile(int useCaseCode); 296 Camera_ErrorCode PhotoOutputDeleteProfile(int useCaseCode); 297 298 Camera_ErrorCode RegisterPhotoAvailableCallback(int useCaseCode); 299 Camera_ErrorCode UnregisterPhotoAvailableCallback(int useCaseCode); 300 Camera_ErrorCode RegisterPhotoAssetAvailableCallback(int useCaseCode); 301 Camera_ErrorCode UnregisterPhotoAssetAvailableCallback(int useCaseCode); 302 Camera_ErrorCode IsMovingPhotoSupported(int useCaseCode); 303 Camera_ErrorCode EnableMovingPhoto(int useCaseCode, bool enable); 304 Camera_ErrorCode GetMainImage(int useCaseCode); 305 Camera_ErrorCode PhotoNativeRelease(int useCaseCode); 306 Camera_ErrorCode CreatePhotoOutputWithoutSurface(int useCaseCode); 307 308 Camera_ErrorCode TorchMode(int useCaseCode); 309 Camera_ErrorCode IsTorchSupported(int useCaseCode); 310 Camera_ErrorCode IsTorchSupportedByTorchMode(int useCaseCode); 311 Camera_ErrorCode SetTorchMode(int useCaseCode); 312 Camera_ErrorCode GetExposureValue(int useCaseCode); 313 Camera_ErrorCode GetFocalLength(int useCaseCode); 314 Camera_ErrorCode SetSmoothZoom(int useCaseCode); 315 Camera_ErrorCode GetSupportedColorSpaces(int useCaseCode); 316 Camera_ErrorCode DeleteColorSpaces(int useCaseCode); 317 Camera_ErrorCode GetActiveColorSpace(int useCaseCode); 318 Camera_ErrorCode SetColorSpace(int useCaseCode); 319 Camera_ErrorCode GetSupportedFrameRates(int useCaseCode); 320 Camera_ErrorCode DeleteFrameRates(int useCaseCode); 321 Camera_ErrorCode SetFrameRate(int useCaseCode); 322 Camera_ErrorCode GetActiveFrameRate(int useCaseCode); 323 Camera_ErrorCode VideoOutputGetSupportedFrameRates(int useCaseCode); 324 Camera_ErrorCode VideoOutputSetFrameRate(int useCaseCode); 325 Camera_ErrorCode VideoOutputGetActiveFrameRate(int useCaseCode); 326 Camera_ErrorCode VideoOutputDeleteFrameRates(int useCaseCode); 327 Camera_ErrorCode CameraManagerRegisterTorchStatusCallback(int useCaseCode); 328 Camera_ErrorCode CameraManagerUnregisterTorchStatusCallback(int useCaseCode); 329 Camera_ErrorCode CaptureSessionRegisterSmoothZoomInfoCallback(int useCaseCode); 330 Camera_ErrorCode CaptureSessionUnregisterSmoothZoomInfoCallback(int useCaseCode); 331 Camera_ErrorCode PhotoOutputRegisterCaptureStartWithInfoCallback(int useCaseCode); 332 Camera_ErrorCode PhotoOutputUnregisterCaptureStartWithInfoCallback(int useCaseCode); 333 Camera_ErrorCode PhotoOutputRegisterCaptureEndCallback(int useCaseCode); 334 Camera_ErrorCode PhotoOutputUnregisterCaptureEndCallback(int useCaseCode); 335 Camera_ErrorCode PhotoOutputRegisterFrameShutterEndCallback(int useCaseCode); 336 Camera_ErrorCode PhotoOutputUnregisterFrameShutterEndCallback(int useCaseCode); 337 Camera_ErrorCode PhotoOutputRegisterCaptureReadyCallback(int useCaseCode); 338 Camera_ErrorCode PhotoOutputUnregisterCaptureReadyCallback(int useCaseCode); 339 Camera_ErrorCode PhotoOutputRegisterEstimatedCaptureDurationCallback(int useCaseCode); 340 Camera_ErrorCode PhotoOutputUnregisterEstimatedCaptureDurationCallback(int useCaseCode); 341 342 Camera_ErrorCode IsAutoDeviceSwitchSupported(bool* isSupported); 343 Camera_ErrorCode EnableAutoDeviceSwitch(bool isEnable); 344 Camera_ErrorCode RegisterAutoDeviceSwitchStatusCallback(int useCaseCode); 345 Camera_ErrorCode UnegisterAutoDeviceSwitchStatusCallback(int useCaseCode); 346 Camera_ErrorCode CameraManagerRegisterFoldStatusCallback(int useCaseCode); 347 Camera_ErrorCode CameraManagerUnregisterFoldStatusCallback(int useCaseCode); 348 int32_t ColorSpace(void); 349 350 // test aid 351 Camera_ErrorCode SetSceneMode(int useCaseCode); 352 Camera_ErrorCode GetCameraFromCameras(Camera_Device* cameras, Camera_Device** camera, 353 size_t cameraIndex = BACK_CAMERA); 354 Camera_ErrorCode ReleaseCamera(void); 355 Camera_ErrorCode ReadyCreatePhotoOutputWithoutSurface(); GetCameraDeviceSize()356 inline uint32_t GetCameraDeviceSize() 357 { 358 return size_; 359 } 360 361 private: 362 NDKCamera(const NDKCamera&) = delete; 363 NDKCamera& operator = (const NDKCamera&) = delete; 364 365 Camera_Manager* cameraManager_; 366 Camera_CaptureSession* captureSession_; 367 uint32_t size_; // 记录支持的Camera_Device列表的大小。 368 const Camera_Profile* profile_; 369 const Camera_Profile* photoProfile_; 370 const Camera_VideoProfile* videoProfile_; 371 Camera_PreviewOutput* previewOutput_; 372 Camera_PhotoOutput* photoOutput_; 373 Camera_VideoOutput* videoOutput_; 374 const Camera_MetadataObjectType* metaDataObjectType_; 375 Camera_MetadataOutput* metadataOutput_; 376 Camera_Input* cameraInput_; 377 bool* isCameraMuted_; 378 char* previewSurfaceId_; 379 Camera_Profile *cameraProfile_; 380 Camera_VideoProfile *videoActiveProfile_; 381 Camera_ErrorCode ret_; 382 float step_; 383 384 static NDKCamera* ndkCamera_; 385 static std::mutex mtx_; 386 volatile bool valid_; 387 uint32_t orientation_; 388 char* hostName_; 389 Camera_HostDeviceType hostType_; 390 uint32_t cameraDeviceIndex_; 391 }; 392 #endif // CAMERA_NATIVE_CAMERA_H