• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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