doubao_chat/include_lib/driver/cpu/wl82/asm/isp_alg.h

395 lines
6.9 KiB
C

#ifndef __ISP_ALG_H__
#define __ISP_ALG_H__
#include "typedef.h"
enum {
ISP_ISO_100 = 0,
ISP_ISO_200,
ISP_ISO_400,
ISP_ISO_800,
ISP_ISO_1600,
ISP_ISO_3200,
ISP_ISO_6400,
ISP_ISO_AUTO = 0xff,
};
#define ISP_ISO_MAX (ISP_ISO_6400+1)
//AE
#define AE_CURVE_END ((unsigned int)(-1))
#define AE_CURVE_INFO_MAX 4
enum {
AE_INTERP_EXP = 1,
AE_INTERP_GAIN = 2,
};
enum {
AE_CURVE_50HZ = 0,
AE_CURVE_60HZ,
};
typedef enum {
AE_WIN_WEIGHT_AVG = 0, // 平均测光
AE_WIN_WEIGHT_CENTRE, // 中央区域测光
AE_WIN_WEIGHT_SPOT, // 点测光
AE_WIN_WEIGHT_MULTI, // 多区域测光
AE_WIN_WEIGHT_CARDV, // 行车记录仪专用
AE_WIN_WEIGHT_CUST,
} isp_ae_ww_type_t;
#define AE_WIN_WEIGHT_MAX AE_WIN_WEIGHT_CUST
typedef struct {
u32 ae_exp_line;
u32 ae_exp_clk;
u32 ae_gain;
} isp_ae_shutter_t;
typedef struct {
u32(*calc_shutter)(isp_ae_shutter_t *shutter, u32 exp_time, u32 gain);
u32(*set_shutter)(isp_ae_shutter_t *shutter);
void *(*get_ae_curve)(u32 type, u32 fps, int *min_ev, int *max_ev);
} isp_ae_ops_t;
typedef struct ae_params {
u32 ae_max_ev;
u32 ae_min_ev;
u32 ae_init_ev;
u32 ae_curve_type;
u32 ae_target;
u32 ae_phase_comp;
u32 ae_luma_smooth_num;
u32 ae_conver_h;
u32 ae_conver_l;
u32 ae_diver_h;
u32 ae_diver_l;
u32 ae_ratio_max_h;
u32 ae_ratio_max_l;
u32 ae_ratio_max2_h;
u32 ae_ratio_max2_l;
u32 ae_ratio_slope;
u32 ae_expline_th;
u32 *ae_user_ev_value_table;
u32 ae_user_ev_value_table_size;
s32 ae_user_ev_value; // centered to zero
u8 ae_init_weight_type;
u8 *ae_win_cust_weights;
isp_ae_ops_t ae_ops;
u32 ae_step;
u32 ae_hl_comp_en;
u32 ae_hl_count_th0;
u32 ae_hl_count_th1;
u32 ae_hl_lv_th;
u32 ae_hl_comp_max;
u32 reserved[11];
} isp_ae_params_t;
//AWB
typedef enum {
AWB_DAYLIGHT, // 晴天5600K
AWB_CLOUNDY, // 多云/阴天 D65 6500K
AWB_TUNGSTEN, // 钨丝灯/白炽灯 TL83/U30 3000K
AWB_FLUORESCENT1, // 荧光灯1 D65 6500K
AWB_FLUORESCENT2, // 荧光灯2 TL84 4000K
AWB_AUTO,
} isp_wb_type_t;
#define AWB_SCENE_MAX AWB_AUTO
enum {
AWB_ALG_GW1 = 0,
AWB_ALG_GW2,
AWB_ALG_CT1,
AWB_ALG_CT2,
};
typedef enum {
AWB_WIN_WEIGHT_AVG = 0, // 平均测光
AWB_WIN_WEIGHT_CENTRE, // 中央区域测光
AWB_WIN_WEIGHT_SPOT, // 点测光
AWB_WIN_WEIGHT_MULTI, // 多区域测光
AWB_WIN_WEIGHT_CARDV, // 行车记录仪专用
AWB_WIN_WEIGHT_CUST,
} isp_awb_ww_type_t;
#define AWB_WIN_WEIGHT_MAX AWB_WIN_WEIGHT_CUST
#define ISP_AWB_ONE (1<<10)
typedef struct {
u16 r_gain;
u16 g_gain;
u16 b_gain;
} isp_wb_gain_t;
typedef struct {
s16 wp_th;
u8 r_th;
u8 g_th;
u8 b_th;
u16 wp_ratio_th_numerator;
u16 wp_ratio_th_denominator;
u16 rgain_min;
u16 rgain_max;
u16 bgain_min;
u16 bgain_max;
u32 ev_th;
u32 ultralow_th;
u16 ultralow_rgain;
u16 ultralow_bgain;
} isp_awb_gw1_params_t;
typedef struct {
u32 prev_w;
u32 new_w;
u16 rgain_min;
u16 rgain_max;
u16 bgain_min;
u16 bgain_max;
} isp_awb_gw2_params_t;
typedef enum {
ISP_AWB_ZONE_UNKNOWN = -1,
ISP_AWB_ZONE_UHCT,
ISP_AWB_ZONE_HCT,
ISP_AWB_ZONE_MCT,
ISP_AWB_ZONE_LCT,
ISP_AWB_ZONE_ULCT,
ISP_AWB_ZONE_GREEN,
ISP_AWB_ZONE_SKIN,
ISP_AWB_ZONE_MAX,
} isp_awb_zone_type_t;
typedef struct {
isp_awb_zone_type_t type;
u16 rg_min; //q8
u16 bg_min; //q8
u16 rg_max; //q8
u16 bg_max; //q8
u16 rg_center; //q8
u16 bg_center; //q8
//8x8 array
const u8 *desc;
} isp_awb_zone_t;
#define ISP_AWB_CT1_WP_WEIGHT_SIZE 16
typedef struct {
isp_awb_zone_t *zones[ISP_AWB_ZONE_MAX];
//16x1 array
u8 *wp_weights;
u8 y_min;
u8 y_max;
u32 hct_ev_th;
u32 lct_ev_th;
u32 prev_w;
u32 new_w;
u32 ev_th;
} isp_awb_ct1_params_t;
typedef struct {
void (*awb_post_process)(u32 prob, u32 ev, u32 zone_type, u16 *r_gain, u16 *b_gain, void *data);
isp_awb_zone_t *zones[ISP_AWB_ZONE_MAX];
u32 prev_w;
u32 new_w;
u8 y_min;
u8 y_max;
u32 refine_radius;
//base 1000
u32 subwin_weight_ratio_th;
u32 zone_weight_ratio_th;
u32 green_weight_ratio_th;
u32 gw_weight_ratio_th;
u32 daylight_ev_th;
u32 outdoor_ev_th;
u32 lowlight_ev_th;
u8 fallback_gw;
u8 inference;
u8 inference_g;
u8 inference_d;
u8 refine;
u32 skylight_high_ev_th;
u32 skylight_low_ev_th;
} isp_awb_ct2_params_t;
typedef struct {
u8 awb_alg_type;
u8 awb_scene_type;
u8 awb_win_type;
isp_wb_gain_t awb_init_gain;
isp_wb_gain_t awb_scene_gains[AWB_SCENE_MAX];
u8 *awb_win_cust_weights;
u8 *awb_ct_weights;
isp_awb_gw1_params_t *awb_gw1_params;
isp_awb_gw2_params_t *awb_gw2_params;
isp_awb_ct1_params_t *awb_ct1_params;
isp_awb_ct2_params_t *awb_ct2_params;
} isp_awb_params_t;
typedef struct {
s16 r;
s16 gr;
s16 gb;
s16 b;
} isp_blc_t;
typedef struct {
u16 dth;
u16 sth;
u16 vth;
} isp_dpc_t;
typedef struct {
u16 cx;
u16 cy;
u16 *lr;
u16 *lg;
u16 *lb;
u16 dp0;
u16 dp1;
u16 dth;
} isp_lsc_t;
typedef struct {
u8 en3d;
u8 str;
u16 mth;
u16 lth;
u16 hth;
u8 wm0;
u8 wm1;
u8 c;
u16 s[8];
} __attribute__((packed)) isp_tnr_t;
typedef s16(isp_ccm_t)[12];
typedef u8 *isp_gamma_t;
typedef struct {
u32 enable;
u8 *r_gamma;
u8 *g_gamma;
u8 *b_gamma;
} isp_three_gamma_t;
typedef struct {
u8 s0/*mul 10*/;
u8 s1;
u16 th;
} isp_nr_t;
typedef struct {
u8 lth0;
u8 lth1;
u8 o0;
u8 o1;
u16 a0;
u16 a1;
u8 g0;
u8 g1;
u16 th00;
u16 th01;
u16 th02;
u16 th10;
u16 th11;
} isp_shp_t;
typedef struct {
u8 men;
u8 th;
u8 s/*mul 10*/;
} isp_cnr_t;
typedef struct {
u16 *curve;
u32 g;
} isp_wdr_t;
typedef struct {
u16 gc0;
u16 gc1;
u16 gc2;
s16 oc0;
s16 oc1;
s16 oc2;
} isp_adj_t;
typedef struct {
isp_blc_t blc;
isp_lsc_t lsc;
isp_wdr_t wdr;
isp_adj_t adj;
isp_gamma_t gamma;
isp_ccm_t ccm;
isp_dpc_t dpc;
isp_tnr_t tnr;
isp_nr_t nr;
isp_shp_t shp;
isp_cnr_t cnr;
u32 md_wms[5];
u32 md_level;
isp_three_gamma_t three_gamma;
} isp_iq_params_t;
void isp_ae_curve_interp(u32(*ae_curve)[AE_CURVE_INFO_MAX], u32 ev, u32 *time, u32 *gain/*q10*/);
#endif