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