322 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #ifndef _AWB_ALG_H_
 | |
| #define _AWB_ALG_H_
 | |
| 
 | |
| #if defined(__KERNEL__) || defined(__FREERTOS)
 | |
| #include "kwrap/type.h"
 | |
| #endif
 | |
| 
 | |
| #define AWB_MIN(a, b)       ((a) <= (b) ? (a) : (b))
 | |
| #define AWB_MAX(a, b)       ((a) >= (b) ? (a) : (b))
 | |
| #define AWB_CLAMP(x, a, b)  AWB_MAX(AWB_MIN(x, b), a)
 | |
| #define AWBALG_ABS(A)       (((A) > 0) ? (A) : (-A))
 | |
| 
 | |
| //=============================================================================
 | |
| // struct & definition
 | |
| //=============================================================================
 | |
| #define AWB_TUNING_CT_WEIGHT_MAX 6
 | |
| #define AWB_TUNING_TARGET_MAX 3
 | |
| #define AWB_TUNING_CT_MAX 6
 | |
| #define AWB_TUNING_MWB_MAX 12
 | |
| #define AWB_TUNING_BLOCK_MAX 4
 | |
| #define AWB_TUNING_LUMA_WEIGHT_MAX 8
 | |
| // AWB alg CA definition
 | |
| #define AWB_WIN 32
 | |
| #define AWB_CABUFFER_SIZE   AWB_WIN * AWB_WIN
 | |
| 
 | |
| /**
 | |
| 	AWB id
 | |
| */
 | |
| typedef enum _AWB_ID {
 | |
| 	AWB_ID_1 = 0,       ///< awb id 1
 | |
| 	AWB_ID_2,           ///< awb id 2
 | |
| 	AWB_ID_3,           ///< awb id 3
 | |
| 	AWB_ID_4,           ///< awb id 4
 | |
| 	AWB_ID_5,           ///< awb id 5
 | |
| 	AWB_ID_MAX_NUM,
 | |
| 	ENUM_DUMMY4WORD(AWB_ID)
 | |
| } AWB_ID;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg Expand TH Mode
 | |
| */
 | |
| typedef enum _AWBALG_EXPAND_TH_MODE {
 | |
| 	AWBALG_EXPAND_TH_OFF    = 0,
 | |
| 	AWBALG_EXPAND_TH_ADD    = 1,
 | |
| 	AWBALG_EXPAND_TH_REMOVE = 2,
 | |
| 	ENUM_DUMMY4WORD(AWBALG_EXPAND_TH_MODE)
 | |
| } AWBALG_EXPAND_TH_MODE;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg Status
 | |
| */
 | |
| typedef enum _AWB_STS {
 | |
| 	AWBALG_STATUS_INIT          = 0,
 | |
| 	AWBALG_STATUS_ADJUST,
 | |
| 	AWBALG_STATUS_FREEZE,
 | |
| 	AWBALG_STATUS_CONVERGE,
 | |
| 	AWBALG_STATUS_MANUAL,
 | |
| 	AWBALG_STATUS_EXPAND_CT,
 | |
| 	AWBALG_STATUS_DAYLIGHT      = 11,
 | |
| 	AWBALG_STATUS_CLOUDY        = 12,
 | |
| 	AWBALG_STATUS_TUNGSTEN      = 13,
 | |
| 	AWBALG_STATUS_SUNSET        = 14,
 | |
| 	AWBALG_STATUS_CUSTOMER1     = 15,
 | |
| 	AWBALG_STATUS_CUSTOMER2     = 16,
 | |
| 	AWBALG_STATUS_CUSTOMER3     = 17,
 | |
| 	AWBALG_STATUS_CUSTOMER4     = 18,
 | |
| 	AWBALG_STATUS_CUSTOMER5     = 19,
 | |
| 	AWBALG_STATUS_NIGHTMODE     = 20,
 | |
| 	AWBALG_STATUS_MGAIN         = 21,
 | |
| 	AWBALG_STATUS_END           = 0xffffffff,
 | |
| 	ENUM_DUMMY4WORD(AWB_STS)
 | |
| } AWB_STS;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg channel type
 | |
| */
 | |
| typedef enum _AWBALG_CH {
 | |
| 	AWBALG_CH_R = 0,
 | |
| 	AWBALG_CH_G,
 | |
| 	AWBALG_CH_B,
 | |
| 	AWBALG_CH_IR,
 | |
| 	AWBALG_ACC_CNT,
 | |
| 	AWBALG_CH_MAX,
 | |
| 	ENUM_DUMMY4WORD(AWBALG_CH)
 | |
| } AWBALG_CH;
 | |
| 
 | |
| /**
 | |
| 	 AWB CA th.
 | |
| 	 @note
 | |
| */
 | |
| typedef struct _AWBALG_CA_THRESHOLD {
 | |
| 	BOOL  enable;
 | |
| 	UINT32 mode;
 | |
| 	UINT16 g_l;			///< G threshold lower bound
 | |
| 	UINT16 g_u;			///< G threshold upper bound
 | |
| 	UINT16 r_l;			///< R threshold lower bound
 | |
| 	UINT16 r_u;			///< R threshold upper bound
 | |
| 	UINT16 b_l;			///< B threshold lower bound
 | |
| 	UINT16 b_u;			///< B threshold upper bound
 | |
| 	UINT16 p_l;			///< P threshold lower bound
 | |
| 	UINT16 p_u;			///< P threshold upper bound
 | |
| } AWBALG_CA_THRESHOLD;
 | |
| 
 | |
| /**
 | |
| 	 AWB th_m1.
 | |
| 
 | |
| 	 @note
 | |
| */
 | |
| typedef struct _AWB_TH {
 | |
| 	INT32 y_l;
 | |
| 	INT32 y_u;
 | |
| 	INT32 rpb_l;
 | |
| 	INT32 rpb_u;
 | |
| 	INT32 rsb_l;
 | |
| 	INT32 rsb_u;
 | |
| 	INT32 r2g_l;
 | |
| 	INT32 r2g_u;
 | |
| 	INT32 b2g_l;
 | |
| 	INT32 b2g_u;
 | |
| 	INT32 rmb_l;
 | |
| 	INT32 rmb_u;
 | |
| } AWB_TH;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg LV check
 | |
| */
 | |
| typedef struct _AWB_LV {
 | |
| 	UINT32 night_l;
 | |
| 	UINT32 night_h;
 | |
| 	UINT32 in_l;
 | |
| 	UINT32 in_h;
 | |
| 	UINT32 out_l;
 | |
| 	UINT32 out_h;
 | |
| } AWB_LV;
 | |
| 
 | |
| typedef struct _AWB_CT_WEIGHT {
 | |
| 	UINT32 ctmp[AWB_TUNING_CT_WEIGHT_MAX];
 | |
| 	INT32 cx[AWB_TUNING_CT_WEIGHT_MAX];
 | |
| 	INT32 out_weight[AWB_TUNING_CT_WEIGHT_MAX];
 | |
| 	INT32 in_weight[AWB_TUNING_CT_WEIGHT_MAX];
 | |
| 	INT32 night_weight[AWB_TUNING_CT_WEIGHT_MAX];
 | |
| } AWB_CT_WEIGHT;
 | |
| /**
 | |
| 	 AWB target.
 | |
| */
 | |
| typedef struct _AWB_TARGET {
 | |
| 	INT32 cx[AWB_TUNING_TARGET_MAX];
 | |
| 	INT32 rg_ratio[AWB_TUNING_TARGET_MAX];
 | |
| 	INT32 bg_ratio[AWB_TUNING_TARGET_MAX];
 | |
| } AWB_TARGET;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg CT table
 | |
| */
 | |
| typedef struct _AWB_CT_INFO {
 | |
| 	UINT32 temperature[AWB_TUNING_CT_MAX];
 | |
| 	UINT32 r_gain[AWB_TUNING_CT_MAX];
 | |
| 	UINT32 g_gain[AWB_TUNING_CT_MAX];
 | |
| 	UINT32 b_gain[AWB_TUNING_CT_MAX];
 | |
| } AWB_CT_INFO;
 | |
| 
 | |
| /**
 | |
| 	AWB Manual WB Gain
 | |
| */
 | |
| typedef struct _AWB_MWB_GAIN {
 | |
| 	UINT32 r_gain[AWB_TUNING_MWB_MAX];
 | |
| 	UINT32 g_gain[AWB_TUNING_MWB_MAX];
 | |
| 	UINT32 b_gain[AWB_TUNING_MWB_MAX];
 | |
| } AWB_MWB_GAIN;
 | |
| 
 | |
| /**
 | |
| 	AWB Converge
 | |
| */
 | |
| typedef struct _AWB_CONVERGE {
 | |
| 	UINT32 skip_frame;
 | |
| 	UINT32 speed;
 | |
| 	UINT32 tolerance;
 | |
| } AWB_CONVERGE;
 | |
| 
 | |
| /**
 | |
| 	AWB Expand Block
 | |
| */
 | |
| typedef struct _AWB_EXPAND_BLOCK {
 | |
| 	AWBALG_EXPAND_TH_MODE mode[AWB_TUNING_BLOCK_MAX];
 | |
| 	UINT32 lv_l[AWB_TUNING_BLOCK_MAX];
 | |
| 	UINT32 lv_h[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 y_l[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 y_u[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 rpb_l[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 rpb_u[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 rsb_l[AWB_TUNING_BLOCK_MAX];
 | |
| 	INT32 rsb_u[AWB_TUNING_BLOCK_MAX];
 | |
| } AWB_EXPAND_BLOCK;
 | |
| 
 | |
| /**
 | |
| 	AWB Luma Weight
 | |
| */
 | |
| typedef struct _AWB_LUMA_WEIGHT {
 | |
| 	BOOL en;
 | |
| 	INT32 y[AWB_TUNING_LUMA_WEIGHT_MAX];
 | |
| 	INT32 w[AWB_TUNING_LUMA_WEIGHT_MAX];
 | |
| } AWB_LUMA_WEIGHT;
 | |
| 
 | |
| /**
 | |
| 	AWB Alg stable table
 | |
| */
 | |
| typedef struct _AWBALG_STABLE_GAIN {
 | |
| 	UINT32 r_gain;
 | |
| 	UINT32 g_gain;
 | |
| 	UINT32 b_gain;
 | |
| 	UINT32 score;
 | |
| 	UINT32 tolerance; ///< 256 is 100%
 | |
| } AWBALG_STABLE_GAIN;
 | |
| 
 | |
| /**
 | |
| 	AWB Parameter
 | |
| */
 | |
| typedef struct _AWB_PARAM {
 | |
| 	AWB_TH           *th;
 | |
| 	AWB_LV           *lv;
 | |
| 	AWB_CT_WEIGHT    *ct_weight;
 | |
| 	AWB_TARGET       *target;
 | |
| 	AWB_CT_INFO      *ct_info;
 | |
| 	AWB_MWB_GAIN     *mwb_gain;
 | |
| 	AWB_CONVERGE     *converge;
 | |
| 	AWB_EXPAND_BLOCK *expand_block;
 | |
| 	AWB_LUMA_WEIGHT  *luma_weight;
 | |
| } AWB_PARAM;
 | |
| 
 | |
| /**
 | |
|     AWB Manual Gain
 | |
| */
 | |
| typedef struct _AWB_MANUAL {
 | |
| 	BOOL en;
 | |
| 	UINT32 r_gain;
 | |
| 	UINT32 g_gain;
 | |
| 	UINT32 b_gain;
 | |
| } AWB_MANUAL;
 | |
| 
 | |
| /**
 | |
|     AWB KGain Ratio
 | |
| */
 | |
| typedef struct _AWB_KGAIN_RATIO {
 | |
| 	UINT32 r_ratio;
 | |
| 	UINT32 b_ratio;
 | |
| } AWB_KGAIN_RATIO;
 | |
| 
 | |
| /**
 | |
|     AWB Current Status
 | |
| */
 | |
| typedef struct _AWB_STATUS {
 | |
| 	UINT32 cur_r_gain;
 | |
| 	UINT32 cur_g_gain;
 | |
| 	UINT32 cur_b_gain;
 | |
| 	UINT32 cur_ct;
 | |
| 	UINT32 cur_cx;
 | |
| 	AWB_STS mode;
 | |
| 	UINT32 reserved[4];
 | |
| } AWB_STATUS;
 | |
| 
 | |
| /**
 | |
|     AWB Tuning CA Info
 | |
| */
 | |
| typedef struct _AWB_CA {
 | |
| 	UINT32 win_num_x;
 | |
| 	UINT32 win_num_y;
 | |
| 	UINT16 tab[AWBALG_CH_MAX][AWB_WIN][AWB_WIN];
 | |
| } AWB_CA;
 | |
| 
 | |
| /**
 | |
|     AWB Tuning Flag Info
 | |
| */
 | |
| typedef struct _AWB_FLAG {
 | |
| 	UINT32 win_num_x;
 | |
| 	UINT32 win_num_y;
 | |
| 	UINT16 tab[AWB_WIN][AWB_WIN];
 | |
| } AWB_FLAG;
 | |
| 
 | |
| /**
 | |
| 	 AWB ca type
 | |
| */
 | |
| typedef enum _AWB_CA_TYPE {
 | |
| 	AWB_CA_TYPE_NORMAL = 0,
 | |
| 	AWB_CA_TYPE_THRESHOLD,
 | |
| 	AWB_CA_TYPE_MAX,
 | |
| 	ENUM_DUMMY4WORD(AWB_CA_TYPE)
 | |
| } AWB_CA_TYPE;
 | |
| 
 | |
| /**
 | |
| 	Color temperature range
 | |
| */
 | |
| typedef enum _AWB_CT_RANGE {
 | |
| 	AWB_CT_RANGE_NONE   = 0x00000000,     ///< not in range
 | |
| 	AWB_CT_RANGE_1      = 0x00000001,     ///< awb ct range 1
 | |
| 	AWB_CT_RANGE_2      = 0x00000002,     ///< awb ct range 2
 | |
| 	AWB_CT_RANGE_3      = 0x00000004,     ///< awb ct range 3
 | |
| 	AWB_CT_RANGE_4      = 0x00000008,     ///< awb ct range 4
 | |
| 	AWB_CT_RANGE_5      = 0x00000010,     ///< awb ct range 5
 | |
| 	AWB_CT_RANGE_MAX    = 0x0000001F,
 | |
| 	ENUM_DUMMY4WORD(AWB_CT_RANGE)
 | |
| } AWB_CT_RANGE;
 | |
| 
 | |
| /**
 | |
| 	Color temperature to color gain
 | |
| */
 | |
| typedef struct _AWBALG_CT_TO_CGAIN {
 | |
| 	UINT32 ct;
 | |
| 	UINT32 r_gain;
 | |
| 	UINT32 g_gain;
 | |
| 	UINT32 b_gain;
 | |
| } AWBALG_CT_TO_CGAIN;
 | |
| 
 | |
| /**
 | |
|     AWB window
 | |
| */
 | |
| typedef struct _AWB_WINDOW {
 | |
| 	UINT8 tab[AWB_WIN][AWB_WIN];
 | |
| } AWB_WINDOW;
 | |
| 
 | |
| #endif
 | |
| 
 | 
