ss928_framework/ss928sdk/include/ot_common_3a.h

433 lines
12 KiB
C
Raw Normal View History

2024-12-16 13:31:45 +08:00
/*
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
*/
#ifndef OT_COMMON_3A_H
#define OT_COMMON_3A_H
#include "ot_common.h"
#include "ot_common_isp.h"
#include "ot_common_sns.h"
#include "ot_common_video.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#define is_linear_mode(mode) ((mode) == OT_WDR_MODE_NONE)
#define is_wdr_mode(mode) ((!is_linear_mode(mode)) && ((mode) < OT_WDR_MODE_BUTT))
#define is_hdr_mode(mode) (((mode) > OT_DYNAMIC_RANGE_SDR10) && ((mode) < OT_DYNAMIC_RANGE_BUTT))
#define is_built_in_wdr_mode(mode) ((mode) == OT_WDR_MODE_BUILT_IN)
#define is_fs_wdr_mode(mode) ((!is_linear_mode(mode))&& (!is_built_in_wdr_mode(mode)) && \
((mode) < OT_WDR_MODE_BUTT))
#define is_2to1_wdr_mode(mode) (((mode) == OT_WDR_MODE_2To1_FRAME) || \
((mode) == OT_WDR_MODE_2To1_LINE) || ((mode) == OT_WDR_MODE_QUDRA))
#define is_3to1_wdr_mode(mode) (((mode) == OT_WDR_MODE_3To1_FRAME) || ((mode) == OT_WDR_MODE_3To1_LINE))
#define is_4to1_wdr_mode(mode) (((mode) == OT_WDR_MODE_4To1_FRAME) || ((mode) == OT_WDR_MODE_4To1_LINE))
#define is_full_wdr_mode(mode) 0
#define is_half_wdr_mode(mode) (((mode) == OT_WDR_MODE_2To1_FRAME) || ((mode) == OT_WDR_MODE_3To1_FRAME) || \
((mode) == OT_WDR_MODE_4To1_FRAME))
#define is_line_wdr_mode(mode) (((mode) == OT_WDR_MODE_2To1_LINE) || ((mode) == OT_WDR_MODE_3To1_LINE) || \
((mode) == OT_WDR_MODE_4To1_LINE) || ((mode) == OT_WDR_MODE_QUDRA))
#define is_stitch_main_pipe(vi_pipe, main_pipe) ((vi_pipe) == (main_pipe))
#define is_offline_mode(mode) ((mode) == ISP_MODE_RUNNING_OFFLINE)
#define is_online_mode(mode) ((mode) == ISP_MODE_RUNNING_ONLINE)
#define is_sidebyside_mode(mode) ((mode) == ISP_MODE_RUNNING_SIDEBYSIDE)
#define is_striping_mode(mode) ((mode) == ISP_MODE_RUNNING_STRIPING)
#define is_pre_online_post_offline(mode) ((mode) == ISP_MODE_RUNNING_PRE_ONLINE_POST_OFFLINE)
#define is_virt_pipe(vi_pipe) (((vi_pipe) >= OT_ISP_MAX_PHY_PIPE_NUM) && ((vi_pipe) < OT_ISP_MAX_PIPE_NUM))
#define OT_ISP_MAX_REGISTER_ALG_LIB_NUM 2
typedef enum {
OT_ISP_ALG_AE = 0,
OT_ISP_ALG_AF,
OT_ISP_ALG_AWB,
OT_ISP_ALG_BLC,
OT_ISP_ALG_DP,
OT_ISP_ALG_PREGAMMA,
OT_ISP_ALG_AGAMMA,
OT_ISP_ALG_ADGAMMA,
OT_ISP_ALG_DRC,
OT_ISP_ALG_DEMOSAIC,
OT_ISP_ALG_ANTIFALSECOLOR,
OT_ISP_ALG_GAMMA,
OT_ISP_ALG_GE,
OT_ISP_ALG_SHARPEN,
OT_ISP_ALG_FRAMEWDR,
OT_ISP_ALG_FPN,
OT_ISP_ALG_DEHAZE,
OT_ISP_ALG_LCAC,
OT_ISP_ALG_ACAC,
OT_ISP_ALG_BSHP,
OT_ISP_ALG_CSC,
OT_ISP_ALG_EXPANDER,
OT_ISP_ALG_MCDS,
OT_ISP_ALG_ACS,
OT_ISP_ALG_LSC,
OT_ISP_ALG_RC,
OT_ISP_ALG_RGBIR,
OT_ISP_ALG_HRS,
OT_ISP_ALG_DG,
OT_ISP_ALG_BAYERNR,
OT_ISP_ALG_FLICKER,
OT_ISP_ALG_LDCI,
OT_ISP_ALG_CA,
OT_ISP_ALG_CLUT,
OT_ISP_ALG_CCM,
OT_ISP_ALG_AI,
OT_ISP_ALG_CRB,
OT_ISP_ALG_HNR,
OT_ISP_ALG_MOD_BUTT,
} ot_isp_alg_mod;
typedef enum {
OT_ISP_WDR_MODE_SET = 8000,
OT_ISP_PROC_WRITE,
OT_ISP_AE_FPS_BASE_SET,
OT_ISP_AE_BLC_SET,
OT_ISP_AE_RC_SET,
OT_ISP_AE_BAYER_FORMAT_SET,
OT_ISP_AE_INIT_INFO_GET,
OT_ISP_AWB_ISO_SET, /* set iso, change saturation when iso change */
OT_ISP_CHANGE_IMAGE_MODE_SET,
OT_ISP_UPDATE_INFO_GET,
OT_ISP_FRAMEINFO_GET,
OT_ISP_ATTACHINFO_GET,
OT_ISP_COLORGAMUTINFO_GET,
OT_ISP_AWB_INTTIME_SET,
OT_ISP_BAS_MODE_SET,
OT_ISP_PROTRIGGER_SET,
OT_ISP_AWB_PIRIS_SET,
OT_ISP_AWB_SNAP_MODE_SET,
OT_ISP_AWB_ZONE_ROW_SET,
OT_ISP_AWB_ZONE_COL_SET,
OT_ISP_AWB_ZONE_BIN_SET,
OT_ISP_AWB_ERR_GET,
OT_ISP_CTRL_CMD_BUTT,
} ot_isp_ctrl_cmd;
typedef struct {
td_char *proc_buff;
td_u32 buff_len;
td_u32 write_len; /* the len count should contain '\0'. */
} ot_isp_ctrl_proc_write;
typedef struct {
td_bool stitch_enable;
td_bool main_pipe;
td_u8 stitch_pipe_num;
td_s8 stitch_bind_id[OT_ISP_MAX_STITCH_NUM];
} ot_isp_stitch_attr;
/* AE */
/* the init param of ae alg */
typedef struct {
ot_sensor_id sensor_id;
td_u8 wdr_mode;
td_u8 hdr_mode;
td_u16 black_level;
td_float fps;
ot_isp_bayer_format bayer;
ot_isp_stitch_attr stitch_attr;
td_s32 reserved;
} ot_isp_ae_param;
/* the statistics of ae alg */
typedef struct {
td_u32 pixel_count[OT_ISP_WDR_MAX_FRAME_NUM];
td_u32 pixel_weight[OT_ISP_WDR_MAX_FRAME_NUM];
td_u32 histogram_mem_array[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_HIST_NUM];
td_u32 histogram_mem_array_ir[OT_ISP_HIST_NUM]; /* only support fe0 */
} ot_isp_fe_ae_stat_1;
typedef struct {
td_u16 global_avg_r[OT_ISP_WDR_MAX_FRAME_NUM];
td_u16 global_avg_gr[OT_ISP_WDR_MAX_FRAME_NUM];
td_u16 global_avg_gb[OT_ISP_WDR_MAX_FRAME_NUM];
td_u16 global_avg_b[OT_ISP_WDR_MAX_FRAME_NUM];
td_u16 global_avg_ir; /* only support fe0 */
} ot_isp_fe_ae_stat_2;
typedef struct {
td_u16 zone_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u16 zone_avg_ir[OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN]; /* only support fe0 */
} ot_isp_fe_ae_stat_3;
typedef struct {
td_u16 zone_avg[OT_VI_MAX_PIPE_NUM][OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN]\
[OT_ISP_BAYER_CHN_NUM];
} ot_isp_fe_ae_stitch_stat_3;
typedef struct {
td_u32 pixel_count;
td_u32 pixel_weight;
td_u32 histogram_mem_array[OT_ISP_HIST_NUM];
td_u32 estimate_histogram_mem_array[OT_ISP_HIST_NUM];
} ot_isp_be_ae_stat_1;
typedef struct {
td_u16 global_avg_r;
td_u16 global_avg_gr;
td_u16 global_avg_gb;
td_u16 global_avg_b;
} ot_isp_be_ae_stat_2;
typedef struct {
td_u16 zone_avg[OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
} ot_isp_be_ae_stat_3;
typedef struct {
td_u16 zone_avg[OT_VI_MAX_PIPE_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
} ot_isp_be_ae_stitch_stat_3;
typedef struct {
td_u32 frame_cnt; /* the counting of frame */
td_u64 frame_pts;
td_u16 frame_width;
td_u16 frame_height;
ot_isp_smart_info smart_info;
ot_isp_fe_ae_stat_1 *fe_ae_stat1;
ot_isp_fe_ae_stat_2 *fe_ae_stat2;
ot_isp_fe_ae_stat_3 *fe_ae_stat3;
ot_isp_fe_ae_stitch_stat_3 *fe_ae_sti_stat;
ot_isp_be_ae_stat_1 *be_ae_stat1;
ot_isp_be_ae_stat_2 *be_ae_stat2;
ot_isp_be_ae_stat_3 *be_ae_stat3;
ot_isp_be_ae_stitch_stat_3 *be_ae_sti_stat;
} ot_isp_ae_info;
typedef struct {
td_bool change;
td_bool hist_adjust;
td_u8 ae_be_sel;
td_u8 four_plane_mode;
td_u8 hist_offset_x;
td_u8 hist_offset_y;
td_u8 hist_skip_x;
td_u8 hist_skip_y;
td_bool mode_update;
td_u8 hist_mode;
td_u8 aver_mode;
td_u8 max_gain_mode;
td_bool wight_table_update;
td_u8 weight_table[OT_VI_MAX_PIPE_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN];
} ot_isp_ae_stat_attr;
/* the final calculate of ae alg */
#define AE_INT_TIME_NUM 4
typedef struct {
td_u32 int_time[AE_INT_TIME_NUM];
td_u32 isp_dgain;
td_u32 again;
td_u32 dgain;
td_u32 iso;
td_u32 isp_dgain_sf;
td_u32 again_sf;
td_u32 dgain_sf;
td_u32 iso_sf;
td_u8 ae_run_interval;
td_bool piris_valid;
td_s32 piris_pos;
td_u32 piris_gain;
td_u32 sns_lhcg_exp_ratio;
ot_isp_fswdr_mode fswdr_mode;
td_u32 wdr_gain[OT_ISP_WDR_MAX_FRAME_NUM];
td_u32 hmax_times; /* unit is ns */
td_u32 vmax; /* unit is line */
ot_isp_ae_stat_attr stat_attr;
ot_isp_dcf_update_info update_info;
} ot_isp_ae_result;
typedef struct {
td_u32 isp_dgain;
td_u32 iso;
} ot_isp_ae_init_info;
typedef struct {
td_s32 (*pfn_ae_init)(td_s32 handle, const ot_isp_ae_param *ae_param);
td_s32 (*pfn_ae_run)(td_s32 handle,
const ot_isp_ae_info *ae_info,
ot_isp_ae_result *ae_result,
td_s32 reserved);
td_s32 (*pfn_ae_ctrl)(td_s32 handle, td_u32 cmd, td_void *value);
td_s32 (*pfn_ae_exit)(td_s32 handle);
} ot_isp_ae_exp_func;
typedef struct {
ot_isp_ae_exp_func ae_exp_func;
} ot_isp_ae_register;
/* AWB */
typedef enum {
OT_ISP_AWB_CCM_CONFIG_SET,
OT_ISP_AWB_CCM_CONFIG_GET,
OT_ISP_AWB_DEBUG_ATTR_SET,
OT_ISP_AWB_DEBUG_ATTR_GET,
OT_ISP_AWB_CTRL_BUTT,
} ot_isp_awb_ctrl_cmd;
typedef struct {
td_bool awb_bypass_en;
td_bool manual_sat_en;
td_bool manual_temp_en;
td_u32 manual_sat_value;
td_u32 manual_temp_value;
td_u16 ccm_speed;
td_u16 high_ccm[OT_ISP_CCM_MATRIX_SIZE];
td_u16 low_ccm[OT_ISP_CCM_MATRIX_SIZE];
td_u16 high_color_temp;
td_u16 low_color_temp;
} awb_ccm_config;
/* the init param of awb alg */
typedef struct {
ot_sensor_id sensor_id;
td_u8 wdr_mode;
td_u8 awb_zone_row;
td_u8 awb_zone_col;
td_u8 awb_zone_bin;
ot_isp_stitch_attr stitch_attr;
td_u16 awb_width;
td_u16 awb_height;
td_u32 init_iso;
td_s8 reserved;
} ot_isp_awb_param;
/* the statistics of awb alg */
typedef struct {
td_u16 metering_awb_avg_r;
td_u16 metering_awb_avg_g;
td_u16 metering_awb_avg_b;
td_u16 metering_awb_count_all;
} ot_isp_awb_stat_1;
typedef struct {
td_u16 metering_mem_array_avg_r[OT_ISP_AWB_ZONE_NUM];
td_u16 metering_mem_array_avg_g[OT_ISP_AWB_ZONE_NUM];
td_u16 metering_mem_array_avg_b[OT_ISP_AWB_ZONE_NUM];
td_u16 metering_mem_array_count_all[OT_ISP_AWB_ZONE_NUM];
} ot_isp_awb_stat_2;
typedef struct {
td_u16 zone_col;
td_u16 zone_row;
td_u16 zone_bin;
td_u16 metering_mem_array_avg_r[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 metering_mem_array_avg_g[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 metering_mem_array_avg_b[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 metering_mem_array_count_all[OT_ISP_AWB_ZONE_STITCH_MAX];
} ot_isp_awb_stat_stitch;
typedef struct {
td_u16 *zone_avg_r;
td_u16 *zone_avg_g;
td_u16 *zone_avg_b;
td_u16 *zone_count;
} ot_isp_awb_stat_result;
typedef struct {
td_u32 frame_cnt;
ot_isp_awb_stat_1 *awb_stat1;
ot_isp_awb_stat_result awb_stat2;
td_u8 awb_gain_switch;
td_u8 awb_stat_switch;
td_bool wb_gain_in_sensor;
td_u32 wdr_wb_gain[OT_ISP_BAYER_CHN_NUM];
} ot_isp_awb_info;
/* the statistics's attr of awb alg */
typedef struct {
td_bool stat_cfg_update;
td_u16 metering_white_level_awb;
td_u16 metering_black_level_awb;
td_u16 metering_cr_ref_max_awb;
td_u16 metering_cb_ref_max_awb;
td_u16 metering_cr_ref_min_awb;
td_u16 metering_cb_ref_min_awb;
} ot_isp_awb_raw_stat_attr;
/* the final calculate of awb alg */
typedef struct {
td_u32 white_balance_gain[OT_ISP_BAYER_CHN_NUM];
td_u16 color_matrix[OT_ISP_CCM_MATRIX_SIZE];
td_u32 color_temp;
td_u8 saturation;
ot_isp_awb_raw_stat_attr raw_stat_attr;
} ot_isp_awb_result;
typedef struct {
td_s32 (*pfn_awb_init)(td_s32 handle, const ot_isp_awb_param *awb_param, ot_isp_awb_result *awb_result);
td_s32 (*pfn_awb_run)(td_s32 handle,
const ot_isp_awb_info *awb_info,
ot_isp_awb_result *awb_result,
td_s32 reserved);
td_s32 (*pfn_awb_ctrl)(td_s32 handle, td_u32 cmd, td_void *value);
td_s32 (*pfn_awb_exit)(td_s32 handle);
} ot_isp_awb_exp_func;
typedef struct {
ot_isp_awb_exp_func awb_exp_func;
} ot_isp_awb_register;
/* AF */
/* the statistics of af alg */
typedef struct {
td_u16 v1;
td_u16 h1;
td_u16 v2;
td_u16 h2;
td_u16 y;
td_u16 hl_cnt;
} ot_isp_af_zone;
typedef struct {
ot_isp_af_zone zone_metrics[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN]; /* R;
the zoned measure of contrast */
} ot_isp_fe_af_stat;
typedef struct {
ot_isp_af_zone zone_metrics[OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN]; /* R; the zoned measure of contrast */
} ot_isp_be_af_stat;
#define ALG_LIB_NAME_SIZE_MAX 20
typedef struct {
td_s32 id;
td_char lib_name[ALG_LIB_NAME_SIZE_MAX];
} ot_isp_3a_alg_lib;
typedef struct {
ot_sensor_id sensor_id;
ot_isp_3a_alg_lib ae_lib;
ot_isp_3a_alg_lib af_lib;
ot_isp_3a_alg_lib awb_lib;
} ot_isp_bind_attr;
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */
#endif /* OT_COMM_3A_H */