1 /* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef __QCAMERAFOVCONTROL_H__
31 #define __QCAMERAFOVCONTROL_H__
32 
33 #include <utils/Mutex.h>
34 #include "cam_intf.h"
35 #include "QCameraExtZoomTranslator.h"
36 
37 using namespace android;
38 
39 namespace qcamera {
40 
41 typedef enum {
42     AE_SETTLED,
43     AE_CONVERGING
44 } ae_status;
45 
46 typedef enum {
47     AF_VALID,
48     AF_INVALID
49 } af_status;
50 
51 typedef enum {
52     CAM_POSITION_LEFT,
53     CAM_POSITION_RIGHT
54 } cam_relative_position;
55 
56 typedef enum {
57     STATE_WIDE,
58     STATE_TRANSITION,
59     STATE_TELE
60 } dual_cam_state;
61 
62 typedef enum {
63     ZOOM_STABLE,
64     ZOOM_IN,
65     ZOOM_OUT
66 } dual_cam_zoom_dir;
67 
68 typedef enum {
69     CAM_TYPE_WIDE,
70     CAM_TYPE_TELE
71 } cam_type;
72 
73 
74 
75 typedef struct {
76     ae_status status;
77     float     luxIndex;
78 } ae_info;
79 
80 typedef struct {
81     af_status status;
82     uint32_t  focusDistCm;
83 } af_info;
84 
85 typedef struct {
86     ae_info ae;
87     af_info af;
88 } status_3A_t;
89 
90 typedef struct {
91     status_3A_t main;
92     status_3A_t aux;
93 } dual_cam_3A_status_t;
94 
95 typedef struct {
96     int32_t shiftHorz;
97     int32_t shiftVert;
98 } spatial_align_shift_t;
99 
100 typedef struct {
101     uint8_t               readyStatus;
102     uint8_t               camMasterHint;
103     uint8_t               camMasterPreview;
104     uint8_t               camMaster3A;
105     uint32_t              activeCameras;
106     spatial_align_shift_t shiftWide;
107     spatial_align_shift_t shiftTele;
108     spatial_align_shift_t shiftAfRoiWide;
109     spatial_align_shift_t shiftAfRoiTele;
110 } spatial_align_result_t;
111 
112 typedef struct {
113     float    cropRatio;
114     float    cutOverFactor;
115     float    cutOverWideToTele;
116     float    cutOverTeleToWide;
117     float    transitionHigh;
118     float    transitionLow;
119     uint32_t waitTimeForHandoffMs;
120 } dual_cam_transition_params_t;
121 
122 typedef struct {
123     bool                         configCompleted;
124     uint32_t                     zoomMain;
125     uint32_t                     zoomAux;
126     uint32_t                     zoomWide;
127     uint32_t                     zoomTele;
128     uint32_t                     zoomWidePrev;
129     uint32_t                     zoomMainPrev;
130     uint32_t                    *zoomRatioTable;
131     uint32_t                     zoomRatioTableCount;
132     uint32_t                     zoomStableCount;
133     dual_cam_zoom_dir            zoomDirection;
134     zoom_trans_init_data         zoomTransInitData;
135     cam_sync_type_t              camWide;
136     cam_sync_type_t              camTele;
137     dual_cam_state               camState;
138     dual_cam_3A_status_t         status3A;
139     cam_dimension_t              previewSize;
140     cam_dimension_t              ispOutSize;
141     spatial_align_result_t       spatialAlignResult;
142     uint32_t                     availableSpatialAlignSolns;
143     float                        camMainWidthMargin;
144     float                        camMainHeightMargin;
145     float                        camAuxWidthMargin;
146     float                        camAuxHeightMargin;
147     bool                         camcorderMode;
148     bool                         wideCamStreaming;
149     bool                         teleCamStreaming;
150     bool                         fallbackEnabled;
151     bool                         fallbackToWide;
152     float                        basicFovRatio;
153     uint32_t                     brightnessStableCount;
154     uint32_t                     focusDistStableCount;
155     dual_cam_transition_params_t transitionParams;
156     uint32_t                     afStatusMain;
157     uint32_t                     afStatusAux;
158     bool                         lpmEnabled;
159 } fov_control_data_t;
160 
161 typedef struct {
162     bool     enablePostProcess;
163     float    zoomMin;
164     float    zoomMax;
165     uint16_t luxMin;
166     uint16_t focusDistanceMin;
167 } snapshot_pp_config_t;
168 
169 typedef struct {
170     float    percentMarginHysterisis;
171     float    percentMarginAux;
172     float    percentMarginMain;
173     uint32_t waitTimeForHandoffMs;
174     uint16_t auxSwitchBrightnessMin;
175     uint16_t auxSwitchFocusDistCmMin;
176     uint16_t zoomStableCountThreshold;
177     uint16_t focusDistStableCountThreshold;
178     uint16_t brightnessStableCountThreshold;
179     snapshot_pp_config_t snapshotPPConfig;
180 } fov_control_config_t;
181 
182 typedef struct{
183     uint32_t sensorStreamWidth;
184     uint32_t sensorStreamHeight;
185     float    focalLengthMm;
186     float    pixelPitchUm;
187 } intrinsic_cam_params_t;
188 
189 typedef struct {
190     uint32_t               minFocusDistanceCm;
191     cam_relative_position  positionAux;
192     intrinsic_cam_params_t paramsMain;
193     intrinsic_cam_params_t paramsAux;
194 } dual_cam_params_t;
195 
196 typedef struct {
197     bool            isValid;
198     cam_sync_type_t camMasterPreview;
199     cam_sync_type_t camMaster3A;
200     uint32_t        activeCameras;
201     bool            snapshotPostProcess;
202     bool            snapshotPostProcessZoomRange;
203 } fov_control_result_t;
204 
205 
206 class QCameraFOVControl {
207 public:
208     ~QCameraFOVControl();
209     static QCameraFOVControl* create(cam_capability_t *capsMainCam, cam_capability_t* capsAuxCam);
210     int32_t updateConfigSettings(parm_buffer_t* paramsMainCam, parm_buffer_t* paramsAuxCam);
211     cam_capability_t consolidateCapabilities(cam_capability_t* capsMainCam,
212             cam_capability_t* capsAuxCam);
213     int32_t translateInputParams(parm_buffer_t* paramsMainCam, parm_buffer_t *paramsAuxCam);
214     metadata_buffer_t* processResultMetadata(metadata_buffer_t* metaMainCam,
215             metadata_buffer_t* metaAuxCam);
216     fov_control_result_t getFovControlResult();
217     cam_frame_margins_t getFrameMargins(int8_t masterCamera);
218 
219 private:
220     QCameraFOVControl();
221     bool validateAndExtractParameters(cam_capability_t  *capsMainCam,
222             cam_capability_t  *capsAuxCam);
223     bool calculateBasicFovRatio();
224     bool combineFovAdjustment();
225     void  calculateDualCamTransitionParams();
226     void convertUserZoomToWideAndTele(uint32_t zoom);
227     uint32_t readjustZoomForTele(uint32_t zoomWide);
228     uint32_t readjustZoomForWide(uint32_t zoomTele);
229     uint32_t findZoomRatio(uint32_t zoom);
230     inline uint32_t findZoomValue(uint32_t zoomRatio);
231     cam_face_detection_data_t translateRoiFD(cam_face_detection_data_t faceDetectionInfo,
232             cam_sync_type_t cam);
233     cam_roi_info_t translateFocusAreas(cam_roi_info_t roiAfMain, cam_sync_type_t cam);
234     cam_set_aec_roi_t translateMeteringAreas(cam_set_aec_roi_t roiAecMain, cam_sync_type_t cam);
235     void generateFovControlResult();
236     bool isMainCamFovWider();
237     bool isSpatialAlignmentReady();
238     void resetVars();
239     bool canSwitchMasterTo(cam_type cam);
240     bool sacRequestedDualZone();
241 
242     Mutex                           mMutex;
243     fov_control_config_t            mFovControlConfig;
244     fov_control_data_t              mFovControlData;
245     fov_control_result_t            mFovControlResult;
246     dual_cam_params_t               mDualCamParams;
247     QCameraExtZoomTranslator       *mZoomTranslator;
248 };
249 
250 }; // namespace qcamera
251 
252 #endif /* __QCAMERAFOVCONTROL_H__ */
253