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
|
|
|