1 /*
2  * Copyright (c) 2022-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_NDK_CAMERA_H
17 #define CAMERA_NDK_CAMERA_H
18 
19 #include <unistd.h>
20 #include <string>
21 #include <thread>
22 #include <cstdio>
23 #include <fcntl.h>
24 #include <map>
25 #include <string>
26 #include <vector>
27 #include "surface_buffer.h"
28 #include <native_buffer/native_buffer.h>
29 #include "iostream"
30 #include "mutex"
31 
32 #include "multimedia/camera_framework/camera.h"
33 #include "multimedia/camera_framework/camera_input.h"
34 #include "multimedia/camera_framework/capture_session.h"
35 #include "multimedia/camera_framework/photo_output.h"
36 #include "multimedia/camera_framework/preview_output.h"
37 #include "multimedia/camera_framework/video_output.h"
38 #include "napi/native_api.h"
39 #include "multimedia/camera_framework/camera_manager.h"
40 
41 namespace OHOS_NDK_CAMERA {
42 class NDKCamera {
43 public:
44     ~NDKCamera();
45     NDKCamera(char *str, uint32_t focusMode, uint32_t cameraDeviceIndex);
46 
Destroy()47     static void Destroy()
48     {
49         if (ndkCamera_ != nullptr) {
50             delete ndkCamera_;
51             ndkCamera_ = nullptr;
52         }
53     }
54 
55     void EnumerateCamera(void);
56     Camera_ErrorCode CreateCameraInput(void);
57     Camera_ErrorCode CameraInputOpen(void);
58     Camera_ErrorCode CameraInputClose(void);
59     Camera_ErrorCode CameraInputRelease(void);
60     Camera_ErrorCode GetSupportedCameras(void);
61     Camera_ErrorCode GetSupportedOutputCapability(void);
62     Camera_ErrorCode CreatePreviewOutput(void);
63     Camera_ErrorCode CreatePhotoOutput(char* photoId);
64     Camera_ErrorCode CreateVideoOutput(char* videoId);
65     Camera_ErrorCode CreateMetadataOutput(void);
66     Camera_ErrorCode IsCameraMuted(void);
67     Camera_ErrorCode PreviewOutputStop(void);
68     Camera_ErrorCode PreviewOutputRelease(void);
69     Camera_ErrorCode PhotoOutputRelease(void);
70     Camera_ErrorCode HasFlashFn(uint32_t mode);
71     Camera_ErrorCode IsVideoStabilizationModeSupportedFn(uint32_t mode);
72     Camera_ErrorCode setZoomRatioFn(uint32_t zoomRatio);
73     Camera_ErrorCode SessionFlowFn(void);
74     Camera_ErrorCode SessionBegin(void);
75     Camera_ErrorCode SessionCommitConfig(void);
76     Camera_ErrorCode SessionStart(void);
77     Camera_ErrorCode SessionStop(void);
78     Camera_ErrorCode StartVideo(char* videoId, char* photoId);
79     Camera_ErrorCode AddVideoOutput(void);
80     Camera_ErrorCode AddPhotoOutput();
81     Camera_ErrorCode VideoOutputStart(void);
82     Camera_ErrorCode StartPhoto(char* mSurfaceId);
83     Camera_ErrorCode IsExposureModeSupportedFn(uint32_t mode);
84     Camera_ErrorCode IsMeteringPoint(int x, int y);
85     Camera_ErrorCode IsExposureBiasRange(int exposureBias);
86     Camera_ErrorCode IsFocusMode(uint32_t mode);
87     Camera_ErrorCode IsFocusPoint(float x, float y);
88     Camera_ErrorCode IsFocusModeSupported(uint32_t mode);
89     Camera_ErrorCode ReleaseCamera(void);
90     Camera_ErrorCode SessionRealese(void);
91     Camera_ErrorCode ReleaseSession(void);
92     int32_t GetVideoFrameWidth(void);
93     int32_t GetVideoFrameHeight(void);
94     int32_t GetVideoFrameRate(void);
95     Camera_ErrorCode VideoOutputStop(void);
96     Camera_ErrorCode VideoOutputRelease(void);
97     Camera_ErrorCode TakePicture(void);
98     Camera_ErrorCode TakePictureWithPhotoSettings(Camera_PhotoCaptureSetting photoSetting);
99     // callback
100     Camera_ErrorCode CameraManagerRegisterCallback(void);
101     Camera_ErrorCode CameraInputRegisterCallback(void);
102     Camera_ErrorCode PreviewOutputRegisterCallback(void);
103     Camera_ErrorCode PhotoOutputRegisterCallback(void);
104     Camera_ErrorCode VideoOutputRegisterCallback(void);
105     Camera_ErrorCode MetadataOutputRegisterCallback(void);
106     Camera_ErrorCode CaptureSessionRegisterCallback(void);
107 
108     // Get callback
109     CameraManager_Callbacks* GetCameraManagerListener(void);
110     CameraInput_Callbacks* GetCameraInputListener(void);
111     PreviewOutput_Callbacks* GetPreviewOutputListener(void);
112     PhotoOutput_Callbacks* GetPhotoOutputListener(void);
113     VideoOutput_Callbacks* GetVideoOutputListener(void);
114     MetadataOutput_Callbacks* GetMetadataOutputListener(void);
115     CaptureSession_Callbacks* GetCaptureSessionRegister(void);
116 
117 private:
118     NDKCamera(const NDKCamera&) = delete;
119     NDKCamera& operator = (const NDKCamera&) = delete;
120     uint32_t cameraDeviceIndex_;
121     Camera_Manager* cameraManager_;
122     Camera_CaptureSession* captureSession_;
123     Camera_Device* cameras_;
124     uint32_t size_;
125     Camera_OutputCapability* cameraOutputCapability_;
126     const Camera_Profile* profile_;
127     const Camera_VideoProfile* videoProfile_;
128     Camera_PreviewOutput* previewOutput_;
129     Camera_PhotoOutput* photoOutput_;
130     Camera_VideoOutput* videoOutput_;
131     const Camera_MetadataObjectType* metaDataObjectType_;
132     Camera_MetadataOutput* metadataOutput_;
133     Camera_Input* cameraInput_;
134     bool* isCameraMuted_;
135     Camera_Position position_;
136     Camera_Type type_;
137     char* previewSurfaceId_;
138     char* photoSurfaceId_;
139     uint32_t takePictureTimes = 0;
140     Camera_ExposureMode exposureMode_;
141     bool isExposureModeSupported_;
142     bool isFocusModeSupported_;
143     float minExposureBias_;
144     float maxExposureBias_;
145     float step_;
146     uint32_t focusMode_;
147 
148     static NDKCamera* ndkCamera_;
149     static std::mutex mtx_;
150     volatile bool valid_;
151     static const uint32_t width_;
152     static const uint32_t height_;
153 };
154 } // OHOS_NDK_CAMERA
155 #endif  // CAMERA_NDK_CAMERA_H