ss928_framework/ss928sdk/include/ot_common_vi.h

513 lines
21 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_VI_H
#define OT_COMMON_VI_H
#include "ot_common.h"
#include "ot_errno.h"
#include "ot_common_video.h"
#include "ot_common_sys.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define OT_ERR_VI_INVALID_DEV_ID OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_DEV_ID)
#define OT_ERR_VI_INVALID_PIPE_ID OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_PIPE_ID)
#define OT_ERR_VI_INVALID_CHN_ID OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_CHN_ID)
#define OT_ERR_VI_INVALID_GRP_ID OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_GRP_ID)
#define OT_ERR_VI_ILLEGAL_PARAM OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_ILLEGAL_PARAM)
#define OT_ERR_VI_NULL_PTR OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NULL_PTR)
#define OT_ERR_VI_NOT_CFG OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_CFG)
#define OT_ERR_VI_NOT_SUPPORT OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_SUPPORT)
#define OT_ERR_VI_NOT_PERM OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_PERM)
#define OT_ERR_VI_NOT_ENABLE OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_ENABLE)
#define OT_ERR_VI_NOT_DISABLE OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_DISABLE)
#define OT_ERR_VI_NO_MEM OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NO_MEM)
#define OT_ERR_VI_BUF_EMPTY OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_EMPTY)
#define OT_ERR_VI_BUF_FULL OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_FULL)
#define OT_ERR_VI_NOT_READY OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_READY)
#define OT_ERR_VI_TIMEOUT OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_TIMEOUT)
#define OT_ERR_VI_BUSY OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_BUSY)
#define OT_ERR_VI_NOT_BINDED OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_BINDED)
#define OT_ERR_VI_BINDED OT_DEFINE_ERR(OT_ID_VI, OT_ERR_LEVEL_ERROR, OT_ERR_BINDED)
#define OT_VI_MAX_AD_CHN_NUM 4UL
#define OT_VI_COMPONENT_MASK_NUM 2UL
#define OT_VI_MAX_SNS_CFG_NUM 64U
#define OT_VI_MAX_SD_MUX_NUM 4U
#define VI_INVALID_FRAME_RATE (-1)
#define OT_VI_CORRECTION_COEF_NUM 9
/* Interface mode of video input */
typedef enum {
OT_VI_INTF_MODE_BT656 = 0, /* BT.656 mode */
OT_VI_INTF_MODE_BT601, /* BT.601 mode */
OT_VI_INTF_MODE_DC, /* Digital Camera mode */
OT_VI_INTF_MODE_BT1120, /* BT.1120 mode */
OT_VI_INTF_MODE_MIPI, /* MIPI RAW mode */
OT_VI_INTF_MODE_MIPI_YUV420_NORM, /* MIPI YUV420 mode */
OT_VI_INTF_MODE_MIPI_YUV420_LEGACY, /* MIPI YUV420 legacy mode */
OT_VI_INTF_MODE_MIPI_YUV422, /* MIPI YUV422 mode */
OT_VI_INTF_MODE_THERMO, /* Thermo mode */
OT_VI_INTF_MODE_BUTT
} ot_vi_intf_mode;
/* Work mode */
typedef enum {
OT_VI_WORK_MODE_MULTIPLEX_1 = 0, /* 1 Multiplex mode */
OT_VI_WORK_MODE_MULTIPLEX_2, /* 2 Multiplex mode */
OT_VI_WORK_MODE_MULTIPLEX_4, /* 4 Multiplex mode */
OT_VI_WORK_MODE_BUTT
} ot_vi_work_mode;
/* Whether an input picture is interlaced or progressive */
typedef enum {
OT_VI_SCAN_PROGRESSIVE = 0, /* progressive mode */
OT_VI_SCAN_INTERLACED, /* interlaced mode */
OT_VI_SCAN_BUTT
} ot_vi_scan_mode;
/* Sequence of YUV data */
typedef enum {
OT_VI_DATA_SEQ_VUVU = 0, /*
* The input sequence of the second component(only contains u and v)
* in BT.1120 mode is VUVU
*/
OT_VI_DATA_SEQ_UVUV, /*
* The input sequence of the second component(only contains u and v)
* in BT.1120 mode is UVUV
*/
OT_VI_DATA_SEQ_UYVY, /* The input sequence of YUV is UYVY */
OT_VI_DATA_SEQ_VYUY, /* The input sequence of YUV is VYUY */
OT_VI_DATA_SEQ_YUYV, /* The input sequence of YUV is YUYV */
OT_VI_DATA_SEQ_YVYU, /* The input sequence of YUV is YVYU */
OT_VI_DATA_SEQ_BUTT
} ot_vi_data_seq;
/* Attribute of the vertical synchronization signal */
typedef enum {
OT_VI_VSYNC_FIELD = 0, /* Field/toggle mode: a signal reversal means a new frame or a field */
OT_VI_VSYNC_PULSE, /* Pulse/effective mode: a pulse or an effective signal means a new frame or a field */
OT_VI_VSYNC_BUTT
} ot_vi_vsync;
/* Polarity of the vertical synchronization signal */
typedef enum {
OT_VI_VSYNC_NEG_HIGH = 0, /*
* if VIU_VSYNC_E = VIU_VSYNC_FIELD,
* then the vertical synchronization signal of even field is high-level,
* if VIU_VSYNC_E = VIU_VSYNC_PULSE,
* then the vertical synchronization pulse is positive pulse.
*/
OT_VI_VSYNC_NEG_LOW, /*
* if VIU_VSYNC_E = VIU_VSYNC_FIELD,
* then the vertical synchronization signal of even field is low-level,
* if VIU_VSYNC_E = VIU_VSYNC_PULSE,
* then the vertical synchronization pulse is negative pulse.
*/
OT_VI_VSYNC_NEG_BUTT
} ot_vi_vsync_neg;
/* Attribute of the horizontal synchronization signal */
typedef enum {
OT_VI_HSYNC_VALID_SIG = 0, /* the horizontal synchronization is valid signal mode */
OT_VI_HSYNC_PULSE, /*
* the horizontal synchronization is pulse mode,
* a new pulse means the beginning of a new line.
*/
OT_VI_HSYNC_BUTT
} ot_vi_hsync;
/* Polarity of the horizontal synchronization signal */
typedef enum {
OT_VI_HSYNC_NEG_HIGH = 0, /*
* if VI_HSYNC_E = VI_HSYNC_VALID_SIG,
* then the valid horizontal synchronization signal is high-level;
* if VI_HSYNC_E = VI_HSYNC_PULSE,
* then the horizontal synchronization pulse is positive pulse.
*/
OT_VI_HSYNC_NEG_LOW, /*
* if VI_HSYNC_E = VI_HSYNC_VALID_SIG,
* then the valid horizontal synchronization signal is low-level;
* if VI_HSYNC_E = VI_HSYNC_PULSE,
* then the horizontal synchronization pulse is negative pulse.
*/
OT_VI_HSYNC_NEG_BUTT
} ot_vi_hsync_neg;
/* Attribute of the valid vertical synchronization signal */
typedef enum {
OT_VI_VSYNC_NORM_PULSE = 0, /* the vertical synchronization is pulse mode, a pulse means a new frame or field */
OT_VI_VSYNC_VALID_SIG, /*
* the vertical synchronization is effective mode,
* a effective signal means a new frame or field.
*/
OT_VI_VSYNC_VALID_BUTT
} ot_vi_vsync_valid;
/* Polarity of the valid vertical synchronization signal */
typedef enum {
OT_VI_VSYNC_VALID_NEG_HIGH = 0, /*
* if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,
* a positive pulse means vertical synchronization pulse;
* if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,
* the valid vertical synchronization signal is high-level.
*/
OT_VI_VSYNC_VALID_NEG_LOW, /*
* if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,
* a negative pulse means vertical synchronization pulse;
* if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,
* the valid vertical synchronization signal is low-level.
*/
OT_VI_VSYNC_VALID_NEG_BUTT
} ot_vi_vsync_valid_neg;
/* Blank information of the input timing */
typedef struct {
td_u32 hsync_hfb; /* RW; Horizontal front blanking width */
td_u32 hsync_act; /* RW; Horizontal effective width */
td_u32 hsync_hbb; /* RW; Horizontal back blanking width */
td_u32 vsync_vfb; /* RW; Vertical front blanking height of one frame or odd-field frame picture */
td_u32 vsync_vact; /* RW; Vertical effective width of one frame or odd-field frame picture */
td_u32 vsync_vbb; /* RW; Vertical back blanking height of one frame or odd-field frame picture */
td_u32 vsync_vbfb; /*
* RW; Even-field vertical front blanking height
* when input mode is interlace(invalid when progressive input mode).
*/
td_u32 vsync_vbact; /*
* RW; Even-field vertical effective width
* when input mode is interlace(invalid when progressive input mode).
*/
td_u32 vsync_vbbb; /*
* RW; Even-field vertical back blanking height
* when input mode is interlace(invalid when progressive input mode).
*/
} ot_vi_timing_blank;
/* synchronization information about the BT.601 or DC timing */
typedef struct {
ot_vi_vsync vsync;
ot_vi_vsync_neg vsync_neg;
ot_vi_hsync hsync;
ot_vi_hsync_neg hsync_neg;
ot_vi_vsync_valid vsync_valid;
ot_vi_vsync_valid_neg vsync_valid_neg;
ot_vi_timing_blank timing_blank;
} ot_vi_sync_cfg;
/* Input data type */
typedef enum {
OT_VI_DATA_TYPE_RAW = 0, /* input format is raw */
OT_VI_DATA_TYPE_YUV, /* input format is yuv */
OT_VI_DATA_TYPE_BUTT
} ot_vi_data_type;
/* The attributes of a VI device */
typedef struct {
ot_vi_intf_mode intf_mode; /* RW; Interface mode */
ot_vi_work_mode work_mode; /* RW; Work mode */
td_u32 component_mask[OT_VI_COMPONENT_MASK_NUM]; /* RW; Component mask */
ot_vi_scan_mode scan_mode; /* RW; Input scanning mode */
td_s32 ad_chn_id[OT_VI_MAX_AD_CHN_NUM]; /*
* RW; AD channel ID. Typically,
* the default value -1 is recommended
*/
ot_vi_data_seq data_seq; /* RW; Input data sequence(only YUV supported) */
ot_vi_sync_cfg sync_cfg; /*
* RW; Sync timing,
* it must be configured in BT.601 mode or DC mode.
*/
ot_vi_data_type data_type; /* RW; Raw or YUV input format */
td_bool data_reverse; /* RW; Data reverse */
ot_size in_size; /* RW; Input size */
ot_data_rate data_rate; /* RW; Data rate of device */
} ot_vi_dev_attr;
typedef enum {
OT_VI_REPHASE_MODE_NONE = 0,
OT_VI_REPHASE_MODE_SKIP_1_2, /* skip 1/2 */
OT_VI_REPHASE_MODE_SKIP_1_3, /* skip 1/3 */
OT_VI_REPHASE_MODE_BINNING_1_2, /* binning 1/2 */
OT_VI_REPHASE_MODE_BINNING_1_3, /* binning 1/3 */
OT_VI_REPHASE_MODE_BUTT
} ot_vi_rephase_mode;
typedef struct {
ot_vi_rephase_mode hor_rephase_mode;
ot_vi_rephase_mode ver_rephase_mode;
} ot_vi_rephase_attr;
/* Attribute of bas scale */
typedef struct {
ot_size out_size; /* RW; bayer scale size. */
} ot_vi_scale_attr;
/* Attribute of bayer scale */
typedef struct {
td_bool enable;
ot_vi_scale_attr scale_attr;
ot_vi_rephase_attr rephase_attr;
} ot_vi_bas_attr;
typedef enum {
OT_VI_THERMO_WORK_MODE_T0 = 0,
OT_VI_THERMO_WORK_MODE_T1,
OT_VI_THERMO_WORK_MODE_T2,
OT_VI_THERMO_WORK_MODE_T3,
OT_VI_THERMO_WORK_MODE_BUTT,
} ot_vi_thermo_work_mode;
typedef enum {
OT_VI_SD_MUX_T0_SD0 = 0,
OT_VI_SD_MUX_T0_SD1,
OT_VI_SD_MUX_T1_SDA,
OT_VI_SD_MUX_T1_FS,
OT_VI_SD_MUX_T2_SDA0,
OT_VI_SD_MUX_T2_SDA1,
OT_VI_SD_MUX_T2_SDA2,
OT_VI_SD_MUX_T2_FS,
OT_VI_SD_MUX_BUTT
} ot_vi_sd_mux;
typedef struct {
ot_vi_thermo_work_mode work_mode; /* RW; work mode. */
ot_video_frame_info ooc_frame_info; /* RW; ooc data. */
td_u32 cfg_num; /* RW; sns cfg num. */
td_u8 sns_cfg[OT_VI_MAX_SNS_CFG_NUM]; /* RW; sns cfg data. */
td_u32 frame_rate; /* RW; output frame rate. */
ot_vi_sd_mux sd_mux[OT_VI_MAX_SD_MUX_NUM]; /* RW; sd0~sd3 mux. */
} ot_vi_thermo_sns_attr;
/* Attribute of vi generate timing */
typedef struct {
td_bool enable; /* RW; range:[0,1];whether vi enable generate timing */
td_u32 frame_rate; /* RW; range:(0, 240]; generate timing frame rate */
} ot_vi_dev_timing_attr;
/* Attribute of vi generate data */
typedef struct {
td_bool enable; /* RW; range:[0,1];whether vi enable generate data */
} ot_vi_dev_data_attr;
/* Information of pipe binded to device */
typedef struct {
td_u32 pipe_num; /* RW; Range [1,OT_VI_MAX_PHYS_PIPE_NUM] */
ot_vi_pipe pipe_id[OT_VI_MAX_PHYS_PIPE_NUM]; /* RW; Array of pipe ID */
} ot_vi_bind_pipe;
/* Attribute of WDR fusion group */
typedef struct {
ot_wdr_mode wdr_mode; /* RW; WDR mode. */
td_u32 cache_line; /* RW; WDR cache line. */
ot_vi_pipe pipe_id[OT_VI_MAX_WDR_FRAME_NUM]; /* RW; WDR fusion pipe */
td_bool pipe_reverse; /* RW; WDR pipe reverse */
} ot_vi_wdr_fusion_grp_attr;
typedef enum {
OT_VI_PIPE_BYPASS_NONE = 0,
OT_VI_PIPE_BYPASS_FE,
OT_VI_PIPE_BYPASS_BE,
OT_VI_PIPE_BYPASS_BUTT
} ot_vi_pipe_bypass_mode;
typedef enum {
OT_VI_BIT_ALIGN_MODE_HIGH = 0,
OT_VI_BIT_ALIGN_MODE_LOW,
OT_VI_BIT_ALIGN_MODE_BUTT
} ot_vi_bit_align_mode;
/* The attributes of pipe */
typedef struct {
ot_vi_pipe_bypass_mode pipe_bypass_mode; /* RW; pipe bypass mode */
td_bool isp_bypass; /* RW;Range:[0, 1];ISP bypass enable */
ot_size size; /* RW; pipe BE input size */
ot_pixel_format pixel_format; /* RW; Pixel format */
ot_compress_mode compress_mode; /* RW; Range:[0, 4];Compress mode. */
ot_data_bit_width bit_width; /* RW; Range:[0, 4];Bit width */
ot_vi_bit_align_mode bit_align_mode; /*
* RW; pipe FE output bit align.
* eg. 14bit high bit align: 0xfffc, low bit align: 0x3fff.
*/
ot_frame_rate_ctrl frame_rate_ctrl; /* RW; Frame rate ctrl */
} ot_vi_pipe_attr;
typedef struct {
td_bool enable; /* RW; whether dump is enable */
td_u32 depth; /* RW; range [0,8]; user frame queue depth */
} ot_vi_frame_dump_attr;
typedef enum {
OT_VI_PRIVATE_DATA_MODE_BACK = 0,
OT_VI_PRIVATE_DATA_MODE_FRONT,
OT_VI_PRIVATE_DATA_MODE_BUTT
} ot_vi_private_data_mode;
typedef struct {
td_bool enable; /* RW; whether dump is enable */
ot_vi_private_data_mode data_mode; /* RW; private data mode */
td_u32 depth; /* RW; range [0,8]; depth */
td_u32 data_size; /* RW; data size, 2byte align, unit: bytes */
} ot_vi_private_data_dump_attr;
typedef struct {
td_u32 pool_id;
td_phys_addr_t phys_addr;
td_u32 data_size;
td_u64 pts;
} ot_vi_private_data_info;
typedef enum {
OT_VI_OUT_MODE_NORM = 0,
OT_VI_OUT_MODE_2F1_STAGGER,
OT_VI_OUT_MODE_3F1_STAGGER,
OT_VI_OUT_MODE_4F1_STAGGER,
OT_VI_OUT_MODE_BUTT
} ot_vi_out_mode;
typedef struct {
td_bool discard_pro_pic_en; /*
* RW; Range:[0, 1]; When pro mode snap, whether to discard
* long exposure picture in the video pipe.
*/
ot_vi_out_mode out_mode; /* RW; Support Stagger Auto mode output timing */
ot_data_rate data_rate; /* RW; Support pipe fe output data rate */
} ot_vi_pipe_param;
typedef enum {
OT_VI_PIPE_FRAME_SOURCE_FE = 0, /* RW; Frame source from pipe FE */
OT_VI_PIPE_FRAME_SOURCE_USER, /* RW; User send frame to pipe BE */
OT_VI_PIPE_FRAME_SOURCE_BUTT
} ot_vi_pipe_frame_source;
/* the status of pipe */
typedef struct {
td_bool enable; /* RO; Whether this pipe is enabled */
td_u32 frame_rate; /* RO; Current frame rate */
td_u32 interrupt_cnt; /* RO; The video frame interrupt count */
td_u32 lost_frame_cnt; /* RO; lost frame count */
td_u32 vb_fail_cnt; /* RO; Video buffer malloc failure */
ot_size size; /* RO; Current pipe FE output size */
} ot_vi_pipe_status;
/* Information of raw data compresss param */
typedef struct {
td_u8 compress_param[OT_VI_COMPRESS_PARAM_SIZE];
} ot_vi_compress_param;
/* the attributes of channel */
typedef struct {
ot_size size; /* RW; channel out put size */
ot_pixel_format pixel_format; /* RW; pixel format */
ot_dynamic_range dynamic_range; /* RW; dynamic range */
ot_video_format video_format; /* RW; video format */
ot_compress_mode compress_mode; /* RW; 256B segment compress or no compress. */
td_bool mirror_en; /* RW; mirror enable */
td_bool flip_en; /* RW; flip enable */
td_u32 depth; /* RW; range [0,8];depth */
ot_frame_rate_ctrl frame_rate_ctrl; /* RW; frame rate ctrl */
} ot_vi_chn_attr;
typedef struct {
ot_vi_chn bind_chn; /*
* RW; range [VI_CHN0, VI_MAX_PHY_CHN_NUM);
* the channel num which extend channel will bind to.
*/
ot_ext_chn_src_type src_type; /* RW; channel input source */
ot_size size; /* RW; channel out put size */
ot_pixel_format pixel_format; /* RW; pixel format */
ot_video_format video_format; /* RW; video format */
ot_dynamic_range dynamic_range; /* RW; dynamic range */
ot_compress_mode compress_mode; /* RW; 256B segment compress or no compress. */
td_u32 depth; /* RW; range [0,8];depth */
ot_frame_rate_ctrl frame_rate_ctrl; /* RW; frame rate ctrl */
} ot_vi_ext_chn_attr;
/* information of chn crop */
typedef struct {
td_bool enable; /* RW; Crop enable */
ot_coord crop_mode; /* RW; Coordinate mode of the crop start point */
ot_rect rect; /* RW; Crop rectangular */
} ot_vi_crop_info;
/* the status of chn */
typedef struct {
td_bool enable; /* RO; whether this channel is enabled */
td_u32 frame_rate; /* RO; current frame rate */
td_u32 lost_frame_cnt; /* RO; lost frame count */
td_u32 vb_fail_cnt; /* RO; video buffer malloc failure */
ot_size size; /* RO; chn output size */
} ot_vi_chn_status;
typedef enum {
OT_VI_STITCH_CFG_MODE_NORM = 0,
OT_VI_STITCH_CFG_MODE_SYNC,
OT_VI_STITCH_CFG_MODE_BUTT
} ot_vi_stitch_cfg_mode;
/* The attributes of stitch group */
typedef struct {
td_bool stitch_en; /* RW; Stitch enable */
ot_vi_stitch_cfg_mode cfg_mode; /* RW; Stitch cfg mode */
td_u32 max_pts_gap; /* RW; MAX PTS gap between frame of pipe, unit:us */
td_u32 pipe_num; /* RW; Range [2, OT_VI_MAX_PHYS_PIPE_NUM] */
ot_vi_pipe pipe_id[OT_VI_MAX_PHYS_PIPE_NUM]; /* RW; Array of pipe ID */
} ot_vi_stitch_grp_attr;
/* module params */
typedef struct {
td_s32 detect_err_frame;
td_u32 drop_err_frame;
} ot_vi_mod_param;
/* gdc correction attr */
typedef struct {
td_bool enable;
td_s64 correction_coef[OT_VI_CORRECTION_COEF_NUM]; /* matrix for match the two */
} ot_vi_fov_correction_attr;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* OT_COMMON_VI_H */