xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/include/algos/ae/rk_aiq_types_ae_algo_int.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2 * rk_aiq_types_ae_algo_int.h
3 
4 * for rockchip v2.0.0
5 *
6 *  Copyright (c) 2019 Rockchip Corporation
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 */
21 /* for rockchip v2.0.0*/
22 
23 #ifndef __RK_AIQ_TYPES_AE_ALGO_INT_H__
24 #define __RK_AIQ_TYPES_AE_ALGO_INT_H__
25 
26 /**
27  * @file rk_aiq_types_ae_algo_int.h
28  *
29  * @brief
30  *
31  *****************************************************************************/
32 /**
33  * @page module_name_page Module Name
34  * Describe here what this module does.
35  *
36  * For a detailed list of functions and implementation detail refer to:
37  * - @ref module_name
38  *
39  * @defgroup AEC Auto exposure control Module
40  * @{
41  *
42  */
43 #include "moduleinfo_head.h"
44 #include "aec_head.h"
45 #include "sensorinfo_head.h"
46 #include "rk_aiq_types_ae_algo.h"
47 
48 
49 #define MAX_HDR_FRAMENUM  (3)
50 /*****************************************************************************/
51 /**
52  * @brief   The number of mean and hist.
53  */
54 /*****************************************************************************/
55 #define ISP2_RAWAE_WINNUM_MAX  ((RAWAELITE_WIN_NUM > RAWAEBIG_WIN_NUM) ? RAWAELITE_WIN_NUM : RAWAEBIG_WIN_NUM)
56 #define ISP2_HIST_BINNUM_MAX  ((RAWHIST_BIN_N_MAX > SIHIST_BIN_N_MAX) ? RAWHIST_BIN_N_MAX : SIHIST_BIN_N_MAX)
57 
58 /*****************************************************************************/
59 /**
60  * predefined flicker period values for ECM module
61  */
62 /*****************************************************************************/
63 #define ECM_TFLICKER_50HZ (1.0/100.0)                                  //!< predefined flicker period value for ECM module
64 #define ECM_TFLICKER_60HZ (1.0/120.0)                                  //!< predefined flicker period value for ECM module
65 #define ECM_DOT_NO         (6)
66 
67 /*****************************************************************************/
68 /**
69  * @brief   This typedef represents the histogram which is measured by the
70  *          CamerIC ISP histogram module.
71  *
72  *****************************************************************************/
73 typedef uint32_t CamerIcHistBins_t[ISP2_HIST_BINNUM_MAX];
74 
75 /*****************************************************************************/
76 /**
77  * @brief   Array type for ISP EXP measurment values.
78  *          CamerIC ISP RawAe grid-luma module.
79  *
80  *****************************************************************************/
81 typedef uint8_t CamerIcLiteMeanLuma_t[RAWAELITE_WIN_NUM];
82 typedef uint8_t CamerIcBigMeanLuma_t[RAWAEBIG_WIN_NUM];
83 
84 /*****************************************************************************/
85 /**
86  * @brief   log level of ae
87  */
88 /*****************************************************************************/
89 typedef enum {
90     PREPARE = 0x01,
91     PREPROC = 0x02,
92     PROC = 0x04,
93     POST = 0x08,
94     LDM = 0x10,
95     CLM = 0x20,
96     ECM = 0x40,
97     HDRECM = 0x80,
98 } AecLogLevel_t;
99 /*****************************************************************************/
100 /**
101  * @brief   update config of ae
102  */
103 /*****************************************************************************/
104 typedef enum {
105     UPDATE_PREPARE   = 0x00, //including configtype=init/changeworingmode/reset
106     UPDATE_EXPSWATTR = 0x01,
107     UPDATE_LINEXPATTR = 0x02,
108     UPDATE_HDREXPATTR = 0x04,
109     UPDATE_LINAEROUTEATTR = 0x08,
110     UPDATE_HDRAEROUTEATTR = 0x10,
111     UPDATE_IRISATTR = 0x20,
112     UPDATE_SYNCTESTATTR = 0x40,
113     UPDATE_EXPWINATTR = 0x80,
114     UPDATE_EXPINFO = 0x100, //including vts/dcg
115     UPDATE_EXPHWATTR = 0x200, //including aec_meas/hist_meass
116     UPDATE_RESOLUTION = 0x400,
117     UPDATE_CALIB = 0xffff,//update iq file
118 } AecUpdateAttrMode_t;
119 
120 /*****************************************************************************/
121 /**
122  * @brief   CamerIcIspStats related params
123  */
124 /*****************************************************************************/
125 typedef enum CamIcYRangeMode_e {
126     CAMIC_YRANGE_MODE_INVALID    = 0,    /**< invalid y range mode   */
127     CAMIC_YRANGE_MODE_FULL       = 1,    /**< Y = 0.299 * R + 0.587 * G + 0.114 * B,full range BT601*/
128     CAMIC_YRANGE_MODE_LIMITED    = 2,    /**< Y = 16 + 0.25R + 0.5G + 0.1094B,limited range*/
129     CAMIC_YRANGE_MODE_MAX,
130 } CamIcYRangeMode_t;
131 
132 typedef enum CamIcRawStatsMode_e {
133     CAMIC_RAWSTATS_MODE_INVALID       = 0,    /**< lower border (only for an internal evaluation) */
134     CAMIC_RAWSTATS_MODE_R             = 1,    /**< R channel */
135     CAMIC_RAWSTATS_MODE_G             = 2,    /**< G channel */
136     CAMIC_RAWSTATS_MODE_B             = 3,    /**< B channel */
137     CAMIC_RAWSTATS_MODE_Y             = 4,    /**< luminance channel */
138     CAMIC_RAWSTATS_MODE_MAX,                                  /**< upper border (only for an internal evaluation) */
139 } CamIcRawStatsMode_t;
140 
141 typedef enum CamIcHistStatsMode_e {
142     CAMIC_HIST_MODE_INVALID       = 0,    /**< lower border (only for an internal evaluation) */
143     CAMIC_HIST_MODE_RGB_COMBINED  = 1,    /**< RGB combined histogram */
144     CAMIC_HIST_MODE_R             = 2,    /**< R histogram */
145     CAMIC_HIST_MODE_G             = 3,    /**< G histogram */
146     CAMIC_HIST_MODE_B             = 4,    /**< B histogram */
147     CAMIC_HIST_MODE_Y             = 5,    /**< luminance histogram */
148     CAMIC_HIST_MODE_MAX,                                  /**< upper border (only for an internal evaluation) */
149 } CamIcHistStatsMode_t;
150 
151 /*****************************************************************************/
152 /**
153  *          CamerIcRawSwapMode_t
154  *
155  * @brief   mode type of RawSwap
156  * 3frame:
157  *             L-BIG   M-BIG     S-LITE
158  *             L-BIG   M-LITE   S-BIG
159  *             L-LITE  M-BIG    S-BIG
160  * for Hdr 3frame all 3 modes is effective
161  * for Hdr 2frame all 3 modes is effective
162  * for Linear mode2 is the same as mode3, mode 1=LITE & mode 2/3=BIG
163  */
164 /*****************************************************************************/
165 typedef enum CamerIcRawSwapMode_e {
166     AEC_RAWSWAP_MODE_S_LITE    = 0,
167     AEC_RAWSWAP_MODE_M_LITE    = 1,
168     AEC_RAWSWAP_MODE_L_LITE    = 2,
169     AEC_RAWSWAP_MODE_MAX,
170 } CamerIcRawSwapMode_t;
171 
172 /*****************************************************************************/
173 /**
174  *          CamerIcRawAe3SelMode_t
175  *
176  * @brief   data sel type of RAWAE3
177  *
178  *   bit: 0x00   chn[0]
179  *         0x01   chn[1]
180  *         0x02   chn[2]
181  *         0x03   tmo
182  *
183  */
184 /*****************************************************************************/
185 typedef enum CamerIcRawAe3SelMode_e {
186     AEC_RAWSEL_MODE_CHN_0    = 0,
187     AEC_RAWSEL_MODE_CHN_1    = 1,
188     AEC_RAWSEL_MODE_CHN_2    = 2,
189     AEC_RAWSEL_MODE_TMO      = 3,
190 } CamerIcRawAe3SelMode_t;
191 
192 /*****************************************************************************/
193 /**
194  *          AIrisFNO_e
195  *
196  * @brief   enum Auto Iris FNO
197  *          real Equivalent Iris Gain = 1 << AIRIS_F_NO_XX_X
198  */
199 /*****************************************************************************/
200 typedef enum {
201     AIRIS_F_NO_32_0 = 0,
202     AIRIS_F_NO_22_0,
203     AIRIS_F_NO_16_0,
204     AIRIS_F_NO_11_0,
205     AIRIS_F_NO_8_0,
206     AIRIS_F_NO_5_6,
207     AIRIS_F_NO_4_0,
208     AIRIS_F_NO_2_8,
209     AIRIS_F_NO_2_0,
210     AIRIS_F_NO_1_4,
211     AIRIS_F_NO_1_0
212 } AIrisFNO_t;
213 /*****************************************************************************/
214 /**
215  *          AecDampingMode_t
216  *
217  * @brief   mode type of AEC Damping
218  *
219  */
220 /*****************************************************************************/
221 typedef enum {
222     AEC_DAMPING_MODE_INVALID        = 0,        /* invalid (only used for initialization) */
223     AEC_DAMPING_MODE_STILL_IMAGE    = 1,        /* damping mode still image */
224     AEC_DAMPING_MODE_VIDEO          = 2,        /* damping mode video */
225     AEC_DAMPING_MODE_MAX
226 } AecDampingMode_t;
227 /*****************************************************************************/
228 /**
229  * @brief   mode type of Hdr-AEC
230  *
231  ****************************************************************************/
232 typedef enum {
233     AEC_WORKING_MODE_NORMAL,
234     AEC_WORKING_MODE_ISP_HDR2    = 0x10,
235     AEC_WORKING_MODE_ISP_HDR3    = 0x20,
236 } AecWorkingMode_t;
237 
238 typedef enum {
239     ISP_HDR_MODE_2_FRAME_HDR = AEC_WORKING_MODE_ISP_HDR2 + 1,
240     ISP_HDR_MODE_2_LINE_HDR = AEC_WORKING_MODE_ISP_HDR2 + 2,
241     ISP_HDR_MODE_3_FRAME_HDR = AEC_WORKING_MODE_ISP_HDR3 + 1,
242     ISP_HDR_MODE_3_LINE_HDR = AEC_WORKING_MODE_ISP_HDR3 + 2,
243 } IspHdrMode_t;
244 
245 typedef enum {
246     AEC_LINEHDR_MODE_DCG     = 0,       /* HDR DCG MODE,2frame (only one integration time value),3frame=DCG+VS */
247     AEC_LINEHDR_MODE_STAGGER = 1,       /* HDR STAGGER MODE,2/3frame (independent integration time value) */
248 } AecLineHdrMode_t;
249 
250 typedef enum {
251     AEC_DCG_MODE_INVALID     = -1,       /*invalid, not support dcg configuration*/
252     AEC_DCG_MODE_LCG         = 0,       /* LCG, use lower conversion gain*/
253     AEC_DCG_MODE_HCG         = 1,       /* HCG, use higher conversion gain*/
254 } AecDcgMode_t;
255 
256 typedef enum {
257     LOW_TO_HIGH   = 0,        /* gain > up_thres: LSNR to HSNR*/
258     HIGH_TO_LOW   = 1,       /* gain > up_thres: HSNR to LSNR*/
259 } NrSwitchMode_t;
260 
261 typedef enum {
262     NR_FEATURE_LEVEL_LOW    = 0,        /* Low level, LSNR*/
263     NR_FEATURE_LEVEL_HIGH   = 1,       /* High level, HSNR*/
264 } AecNRFeatureLevel_t;
265 
266 /*****************************************************************************/
267 /**
268  *          AecFrameMode_t
269  * @brief   Frame Mode for RawAe
270  *
271  * For LinearAe CH0=Normal Frame, CH1/2 not used
272  * For HdrAe 2frame CH0=S Frame, CH1=L Frame, CH2 not used
273  * For HdrAe 3frame CH0=S Frame, CH1=M Frame, CH2=L Frame
274  */
275 /*****************************************************************************/
276 typedef enum {
277     AEC_HDR_3FRAME_S = 0,
278     AEC_HDR_3FRAME_M = 1,
279     AEC_HDR_3FRAME_L = 2,
280 
281     AEC_HDR_2FRAME_S = 0,
282     AEC_HDR_2FRAME_L = 1,
283 
284     AEC_EXTRA_FRAME = 3,
285     AEC_NORMAL_FRAME = 0
286 } AecFrameMode_t;
287 
288 /*****************************************************************************/
289 /**
290  *          AecProcStrategyMode_t
291  *
292  * @brief   flicker period types for the AEC algorithm
293  *
294  */
295 /*****************************************************************************/
296 typedef enum {
297     LOWLIGHT_DETECT = 0,
298     HIGHLIGHT_DETECT = 1
299 } AecProcStrategyMode_t;
300 
301 /*****************************************************************************/
302 /**
303  *          AecEcmFlickerPeriod_t
304  *
305  * @brief   flicker period types for the AEC algorithm
306  *
307  */
308 /*****************************************************************************/
309 typedef enum {
310     AEC_EXPOSURE_CONVERSION_FLICKER_OFF   = 0x00,
311     AEC_EXPOSURE_CONVERSION_FLICKER_100HZ = 0x01,
312     AEC_EXPOSURE_CONVERSION_FLICKER_120HZ = 0x02
313 } AecEcmFlickerPeriod_t;
314 /*****************************************************************************/
315 /**
316  * @brief   mode type of Day or Night Switch
317  *
318  ****************************************************************************/
319 typedef enum
320 {
321     TRIGGER_OFF = 0, //no trigger DayNight Switch, use fixed DNMode!
322     HARDWARE_TRIGGER = 1, //have photosensitive element to trigger night mode  (hardware Trigger)
323     SOFTWARE_TRIGGER = 2, //use software params to trigger night mode  (software Trigger)
324 } AecNightTriggerMode_t;
325 
326 typedef enum
327 {
328     IR_BW = 0, //use IR LED as supplement light, black&white night-vision mode (software)
329     VB_RGB = 1, //use (visible light/no light) as supplement light, rgb night mode (software)
330 } AecNightMode_t;
331 
332 typedef struct Aec_daynight_th_s {
333     float         fac_th;
334     uint8_t       holdon_times_th;
335 } Aec_daynight_th_t;
336 
337 /*****************************************************************************/
338 /**
339  *          Aec_stat_t
340  *
341  * @brief   AEC Module Hardware statistics structure
342  *
343  *****************************************************************************/
344 
345 typedef RkAiqAecHwStatsRes_t AecStat_t;
346 typedef RKAiqAecExpInfo_t ExpInfo_t;
347 
348 /*****************************************************************************/
349 /**
350  *          AecConfig_t
351  *
352  * @brief   AEC Module configuration structure isp2; used for re-configuration as well
353  *
354  *****************************************************************************/
355 typedef struct Aec_Sensor_nr_switch_s {
356     bool valid;
357     uint32_t direct;
358     uint32_t up_thres;
359     uint32_t down_thres;
360     uint32_t div_coeff;
361 } Aec_Sensor_nr_switch_t;
362 
363 typedef struct Aec_AeRange_s {
364     float                   Min;
365     float                   Max;
366 } Aec_AeRange_t;
367 
368 typedef struct Aec_LinAeRange_s {
369     Aec_AeRange_t      stExpTimeRange;
370     Aec_AeRange_t      stGainRange;
371     Aec_AeRange_t      stIspDGainRange;
372     Aec_AeRange_t      stPIrisRange;
373 } Aec_LinAeRange_t;
374 
375 typedef struct Aec_HdrAeRange_s {
376     Aec_AeRange_t      stExpTimeRange[3];
377     Aec_AeRange_t      stGainRange[3];
378     Aec_AeRange_t      stIspDGainRange[3];
379     Aec_AeRange_t      stPIrisRange;
380 } Aec_HdrAeRange_t;
381 
382 typedef struct Aec_uapi_advanced_attr_s {
383     bool                          enable;
384     uint8_t                       GridWeights[15 * 15];
385     uint8_t                       DayGridWeights[RAWAEBIG_WIN_NUM];
386     uint8_t                       NightGridWeights[RAWAEBIG_WIN_NUM];
387     bool                          SetAeRangeEn;
388     Aec_LinAeRange_t              SetLinAeRange;
389     Aec_HdrAeRange_t              SetHdrAeRange;
390 } Aec_uapi_advanced_attr_t;
391 
392 typedef enum AecHwVersion_e
393 {
394     AEC_HARDWARE_V0 = 0,  /*at most support Hdr 3_frame, 2 AEBIG & 1 AELITE for input raw, support yuv luma e.g. rv1126/1109*/
395     AEC_HARDWARE_V1 = 1,  /*at most support Hdr 2_frame, 1 AEBIG & 1 AELITE for input raw, not support yuv luma  e.g. rk356X*/
396     AEC_HARDWARE_V2 = 2,  /*at most support Hdr 3_frame, 2 AEBIG & 1 AELITE for input raw, not support yuv luma, share AEBIG3 with AF e.g. rk3588*/
397     AEC_HARDWARE_V3 = 3,  /*at most support Hdr 2_frame, 1 AEBIG & 1 AELITE for input raw, not support yuv luma, share AEBIG3 with AF e.g. rv1106*/
398     AEC_HARDWARE_V4 = 4,  /*at most support Hdr 2_frame, only exist AELITE AEBIG3, not support yuv luma, share AELITE AEBIG3 with AF e.g. rk3562*/
399     AEC_HARDWARE_MAX,
400 } AecHwVersion_t;
401 
402 typedef struct AfdPeakRes_s {
403     bool                    IsFlickExist;
404     int                     spatPeakNum;
405     float                   spatPeakIntv;
406     int                     spatValleyNum;
407     float                   spatValleyIntv;
408     int                     specPeakNum;
409     int                     specMaxPeakIdx;
410     float                   specMainFreq;
411     RKAiqAecExpInfo_t       expinfo[2];
412 } AfdPeakRes_t;
413 
414 typedef struct AecConfig_s {
415 
416     /*Aec Ctrl Configuration from calibdb, support User Api input Ctrl configuration*/
417 
418     //V2: json params
419     CalibDb_AecCommon_AttrV2_t    CommCtrlV2;
420     CalibDb_LinearAE_AttrV2_t     LinearAeCtrlV2;
421     CalibDb_HdrAE_AttrV2_t        HdrAeCtrlV2;
422     CalibDb_AecIrisCtrlV2_t       IrisCtrl;
423     CalibDb_AeSyncTestV2_t        SyncTest; //special module for debug
424     CalibDb_Sensor_ParaV2_t       SensorInfoV2;
425     CalibDb_Module_ParaV2_t       ModuleInfoV2;
426 
427 
428     RkAiqAecHwConfig_t            HwCtrl;
429     AecHwVersion_t                AecHwVers;
430 
431     int                           Workingmode;
432     int                           LineHdrMode;
433 
434     bool                          AfStatsPrior;
435 
436     /*params related to driver setting*/
437     float                         LinePeriodsPerField;
438     float                         PixelClockFreqMHZ;
439     float                         PixelPeriodsPerLine;
440     Aec_Sensor_nr_switch_t        nr_switch;
441 
442     /*continue to use some old params to keep the same with AecConfig_t*/
443     AecDampingMode_t              DampingMode;              /**< damping mode */
444     float                         SetEcmTflicker;
445 
446     int                           RawWidth;
447     int                           RawHeight;
448 
449     /*add for api using advanced params*/
450     Aec_uapi_advanced_attr_t      ApiAdvanced;
451     Aec_LinAeRange_t              LinAeRange;
452     Aec_HdrAeRange_t              HdrAeRange;
453 
454     /*add for auto flicker detection*/
455     AfdPeakRes_t                  AfdRes;
456 
457     /*update attr flag*/
458     uint16_t                      IsReconfig;
459 } AecConfig_t;
460 /*****************************************************************************/
461 /**
462  *          AeInstanceConfig_t
463  *
464  * @brief   AF Module instance configuration structure
465  *
466  *****************************************************************************/
467 typedef struct AecContext_s* AeHandle_t;     /**< handle to AEC context */
468 typedef struct AecConfig_s* AeConfig_t;     /**< handle to AEC config */
469 
470 typedef struct AeInstanceConfig_s {
471     AeHandle_t              hAe;            /**< handle returned by AeInit() */
472     AeConfig_t              aecCfg;
473     bool                    lockaebyaf;
474 } AeInstanceConfig_t;
475 
476 /*****************************************************************************/
477 /**
478  * @brief   ISP2.0 AEC Algo Result Params
479  */
480 /*****************************************************************************/
481 typedef struct AecPreResult_s {
482     float LowLightROIPdf[MAX_HDR_FRAMENUM];
483     float HighLightROIPdf[MAX_HDR_FRAMENUM];
484     float HighLightLuma[MAX_HDR_FRAMENUM];
485     float OverExpROIPdf[MAX_HDR_FRAMENUM];
486     float GlobalEnvLv[MAX_HDR_FRAMENUM];
487     float MeanLuma[MAX_HDR_FRAMENUM];
488     float DynamicRange;
489     RkAiqExpParamComb_t LinearExp;
490     RkAiqExpParamComb_t HdrExp[MAX_HDR_FRAMENUM];
491     CamerIcHistBins_t AeRawHistBin[3];
492 } AecPreResult_t;
493 
494 /*****************************************************************************/
495 /**
496 *     AecProcResult_t
497 * @brief   Aec_Result.
498 *
499 */
500 /*****************************************************************************/
501 typedef struct AecProcResult_s {
502     bool                          IsConverged;
503     bool                          IsEnvChanged;
504     bool                          IsAutoAfd;
505     bool                          LongFrmMode;
506     float                         LumaDeviation;
507     float                         HdrLumaDeviation[MAX_HDR_FRAMENUM];
508     int                           exp_set_cnt;
509     RKAiqAecExpInfo_t             exp_set_tbl[MAX_AEC_EFFECT_FNUM + 1];
510     float                         SetEcmTflicker;
511 } AecProcResult_t;
512 
513 typedef struct AecPostResult_s {
514     RkAiqDCIrisParam_t      DCIris;
515     RkAiqHDCIrisParam_t     HDCIris;
516 
517 } AecPostResult_t;
518 
519 /* @} AEC */
520 
521 #endif /* __RK_AIQ_TYPES_AE_ALGO_INT_H__*/
522