You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

460 lines
20 KiB

/******************************************************************************
Copyright (C), 2004-2020, Hisilicon Tech. Co., Ltd.
******************************************************************************
File Name : hi_comm_vi.h
Version : Initial Draft
Author : Hisilicon multimedia software group
Created : 2009/3/9
Last Modified :
Description :
Function List :
History :
1.Date : 2010/11/16
Author : p00123320/w54723/n168968
Modification: Created file
2.Date : 2011/06/16
Author : w54723/l00181524/c00186004
Modification: Created file
******************************************************************************/
#ifndef __HI_COMM_VI_H__
#define __HI_COMM_VI_H__
#include "hi_common.h"
#include "hi_errno.h"
#include "hi_comm_video.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"
{
#endif
#endif /* __cplusplus */
#define VI_INVALID_FRMRATE (-1UL)
#define VIU_MAX_USER_FRAME_DEPTH 8
typedef enum hiEN_VIU_ERR_CODE_E
{
ERR_VI_FAILED_NOTENABLE = 64, /* device or channel not enable*/
ERR_VI_FAILED_NOTDISABLE, /* device not disable*/
ERR_VI_FAILED_CHNOTDISABLE, /* channel not disable*/
ERR_VI_CFG_TIMEOUT, /* config timeout*/
ERR_VI_NORM_UNMATCH, /* video norm of ADC and VIU is unmatch*/
ERR_VI_INVALID_WAYID, /* invlalid way ID */
ERR_VI_INVALID_PHYCHNID, /* invalid phychn id*/
ERR_VI_FAILED_NOTBIND, /* device or channel not bind */
ERR_VI_FAILED_BINDED, /* device or channel not unbind */
} EN_VIU_ERR_CODE_E;
#define HI_ERR_VI_INVALID_PARA HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
#define HI_ERR_VI_INVALID_DEVID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID)
#define HI_ERR_VI_INVALID_CHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
#define HI_ERR_VI_INVALID_NULL_PTR HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
#define HI_ERR_VI_FAILED_NOTCONFIG HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG)
#define HI_ERR_VI_SYS_NOTREADY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)
#define HI_ERR_VI_BUF_EMPTY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY)
#define HI_ERR_VI_BUF_FULL HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL)
#define HI_ERR_VI_NOMEM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
#define HI_ERR_VI_NOT_SUPPORT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
#define HI_ERR_VI_BUSY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)
#define HI_ERR_VI_NOT_PERM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
#define HI_ERR_VI_FAILED_NOTENABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTENABLE)/* 0xA0108040*/
#define HI_ERR_VI_FAILED_NOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTDISABLE)/* 0xA0108041*/
#define HI_ERR_VI_FAILED_CHNOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_CHNOTDISABLE)/* 0xA0108042*/
#define HI_ERR_VI_CFG_TIMEOUT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_CFG_TIMEOUT)/* 0xA0108043*/
#define HI_ERR_VI_NORM_UNMATCH HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_NORM_UNMATCH)/* 0xA0108044*/
#define HI_ERR_VI_INVALID_WAYID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_WAYID)/* 0xA0108045*/
#define HI_ERR_VI_INVALID_PHYCHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_PHYCHNID)/* 0xA0108046*/
#define HI_ERR_VI_FAILED_NOTBIND HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTBIND)/* 0xA0108047*/
#define HI_ERR_VI_FAILED_BINDED HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_BINDED)/* 0xA0108048*/
/* interface mode of video input */
typedef enum hiVI_INTF_MODE_E
{
VI_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */
VI_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */
VI_MODE_DIGITAL_CAMERA, /* digatal camera mode */
VI_MODE_BT1120_STANDARD, /* BT.1120 progressive mode */
VI_MODE_BT1120_INTERLEAVED, /* BT.1120 interstage mode */
VI_MODE_BUTT
} VI_INTF_MODE_E;
/* Input mode */
typedef enum hiVI_INPUT_MODE_E
{
VI_INPUT_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */
VI_INPUT_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */
VI_INPUT_MODE_DIGITAL_CAMERA, /* digatal camera mode */
VI_INPUT_MODE_INTERLEAVED,
VI_INPUT_MODE_BUTT
} VI_INPUT_MODE_E;
typedef enum hiVI_WORK_MODE_E
{
VI_WORK_MODE_1Multiplex = 0, /* 1 Multiplex mode */
VI_WORK_MODE_2Multiplex, /* 2 Multiplex mode */
VI_WORK_MODE_4Multiplex, /* 4 Multiplex mode */
VI_WORK_MODE_BUTT
} VI_WORK_MODE_E;
/* whether an input picture is interlaced or progressive */
typedef enum hiVI_SCAN_MODE_E
{
VI_SCAN_INTERLACED = 0,
VI_SCAN_PROGRESSIVE,
VI_SCAN_BUTT,
} VI_SCAN_MODE_E;
typedef enum hiVI_DATA_YUV_SEQ_E
{
/*The input sequence of the second component(only contains u and v) in BT.1120 mode */
VI_INPUT_DATA_VUVU = 0,
VI_INPUT_DATA_UVUV,
/* The input sequence for yuv */
VI_INPUT_DATA_UYVY = 0,
VI_INPUT_DATA_VYUY,
VI_INPUT_DATA_YUYV,
VI_INPUT_DATA_YVYU,
VI_DATA_YUV_BUTT
} VI_DATA_YUV_SEQ_E;
typedef enum hiVI_CLK_EDGE_E
{
VI_CLK_EDGE_SINGLE_UP = 0, /* single-edge mode and in rising edge */
VI_CLK_EDGE_SINGLE_DOWN, /* single-edge mode and in falling edge */
VI_CLK_EDGE_DOUBLE , /* Double edge mode */
VI_CLK_EDGE_BUTT
} VI_CLK_EDGE_E;
typedef enum hiVI_COMP_MODE_E
{
VI_COMP_MODE_SINGLE = 0, /* in single component mode */
VI_COMP_MODE_DOUBLE = 1, /* in double component mode */
VI_COMP_MODE_BUTT,
}VI_COMP_MODE_E;
/* Y/C composite or separation mode */
typedef enum hiVI_COMBINE_MODE_E
{
VI_COMBINE_COMPOSITE = 0, /* Composite mode */
VI_COMBINE_SEPARATE, /* Separate mode */
VI_COMBINE_BUTT,
} VI_COMBINE_MODE_E;
/* Attribute of the vertical synchronization signal */
typedef enum hiVI_VSYNC_E
{
VI_VSYNC_FIELD = 0, /* Field/toggle mode:a signal reversal means a new frame or a field */
VI_VSYNC_PULSE, /* Pusle/effective mode:a pusle or an effective signal means a new frame or a field */
} VI_VSYNC_E;
/* Polarity of the vertical synchronization signal */
typedef enum hiVI_VSYNC_NEG_E
{
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.*/
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.*/
} VI_VSYNC_NEG_E;
/* Attribute of the horizontal synchronization signal */
typedef enum hiVI_HSYNC_E
{
VI_HSYNC_VALID_SINGNAL = 0, /* the horizontal synchronization is valid signal mode */
VI_HSYNC_PULSE, /* the horizontal synchronization is pulse mode, a new pulse means the beginning of a new line */
} VI_HSYNC_E;
/* Polarity of the horizontal synchronization signal */
typedef enum hiVI_HSYNC_NEG_E
{
VI_HSYNC_NEG_HIGH = 0, /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is high-level;
if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is positive pulse */
VI_HSYNC_NEG_LOW /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is low-level;
if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is negative pulse */
} VI_HSYNC_NEG_E;
/* Attribute of the valid vertical synchronization signal */
typedef enum hiVI_VSYNC_VALID_E
{
VI_VSYNC_NORM_PULSE = 0, /* the vertical synchronization is pusle mode, a pusle means a new frame or field */
VI_VSYNC_VALID_SINGAL, /* the vertical synchronization is effective mode, a effective signal means a new frame or field */
} VI_VSYNC_VALID_E;
/* Polarity of the valid vertical synchronization signal */
typedef enum hiVI_VSYNC_VALID_NEG_E
{
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 */
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 */
} VI_VSYNC_VALID_NEG_E;
/* Blank information of the input timing */
typedef struct hiVI_TIMING_BLANK_S
{
HI_U32 u32HsyncHfb ; /* Horizontal front blanking width */
HI_U32 u32HsyncAct ; /* Horizontal effetive width */
HI_U32 u32HsyncHbb ; /* Horizontal back blanking width */
HI_U32 u32VsyncVfb ; /* Vertical front blanking height of one frame or odd-field frame picture */
HI_U32 u32VsyncVact ; /* Vertical effetive width of one frame or odd-field frame picture */
HI_U32 u32VsyncVbb ; /* Vertical back blanking height of one frame or odd-field frame picture */
HI_U32 u32VsyncVbfb ; /* Even-field vertical front blanking height when input mode is interlace (invalid when progressive input mode) */
HI_U32 u32VsyncVbact ; /* Even-field vertical effetive width when input mode is interlace (invalid when progressive input mode) */
HI_U32 u32VsyncVbbb ; /* Even-field vertical back blanking height when input mode is interlace (invalid when progressive input mode) */
}VI_TIMING_BLANK_S;
/* synchronization information about the BT.601 or DC timing */
typedef struct hiVI_SYNC_CFG_S
{
VI_VSYNC_E enVsync;
VI_VSYNC_NEG_E enVsyncNeg;
VI_HSYNC_E enHsync;
VI_HSYNC_NEG_E enHsyncNeg;
VI_VSYNC_VALID_E enVsyncValid;
VI_VSYNC_VALID_NEG_E enVsyncValidNeg;
VI_TIMING_BLANK_S stTimingBlank;
} VI_SYNC_CFG_S;
/* the highest bit of the BT.656 timing reference code*/
typedef enum hiBT656_FIXCODE_E
{
BT656_FIXCODE_1 = 0, /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 1.*/
BT656_FIXCODE_0 /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 0.*/
}BT656_FIXCODE_E;
/* Polarity of the field indicator bit (F) of the BT.656 timing reference code */
typedef enum hiBT656_FIELD_POLAR_E
{
BT656_FIELD_POLAR_STD = 0, /* the standard BT.656 mode,the first filed F=0,the second filed F=1*/
BT656_FIELD_POLAR_NSTD /* the non-standard BT.656 mode,the first filed F=1,the second filed F=0*/
}BT656_FIELD_POLAR_E;
typedef struct hiVI_BT656_SYNC_CFG_S
{
BT656_FIXCODE_E enFixCode;
BT656_FIELD_POLAR_E enFieldPolar;
}VI_BT656_SYNC_CFG_S;
typedef enum hiVI_VBI_LOCAL_E
{
VI_VBI_LOCAL_ODD_FRONT = 0,
VI_VBI_LOCAL_ODD_END,
VI_VBI_LOCAL_EVEN_FRONT,
VI_VBI_LOCAL_EVEN_END,
VI_VBI_LOCAL_BUTT
} VI_VBI_LOCAL_E;
typedef struct hiVI_VBI_ATTR_S
{
VI_VBI_LOCAL_E enLocal; /* location of VBI */
HI_S32 s32X; /* horizontal original position of the VBI data */
HI_S32 s32Y; /* vertical original position of the VBI data */
HI_U32 u32Len; /* length of VBI data, by word(4 Bytes) */
} VI_VBI_ATTR_S;
typedef struct hiVI_VBI_ARG_S
{
VI_VBI_ATTR_S stVbiAttr[2];
}VI_VBI_ARG_S;
typedef enum hiVI_DATA_TYPE_E
{
VI_DATA_TYPE_YUV = 0,
VI_DATA_TYPE_RGB = 1,
VI_DATA_TYPE_BUTT
} VI_DATA_TYPE_E;
typedef enum hiVI_DATA_PATH_E
{
VI_PATH_BYPASS = 0, /* ISP bypass */
VI_PATH_ISP = 1, /* ISP enable */
VI_PATH_RAW = 2, /* Capture raw data, for debug */
VI_PATH_BUTT
}VI_DATA_PATH_E;
/* the extended attributes of VI device */
typedef struct hiVI_DEV_ATTR_EX_S
{
VI_INPUT_MODE_E enInputMode; /* Input mode */
VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */
VI_COMBINE_MODE_E enCombineMode; /* Y/C composite or separation mode */
VI_COMP_MODE_E enCompMode; /* Component mode (single-component or dual-component) */
VI_CLK_EDGE_E enClkEdge; /* Clock edge mode (sampling on the rising or falling edge) */
HI_U32 au32CompMask[2]; /* Component mask */
HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */
VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */
VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */
VI_BT656_SYNC_CFG_S stBT656SynCfg; /* Sync timing. This member must be configured in BT.656 mode */
VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */
VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */
HI_BOOL bDataRev; /* Data reverse */
} VI_DEV_ATTR_EX_S;
/* the attributes of a VI device */
typedef struct hiVI_DEV_ATTR_S
{
VI_INTF_MODE_E enIntfMode; /* Interface mode */
VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */
HI_U32 au32CompMask[2]; /* Component mask */
VI_CLK_EDGE_E enClkEdge; /* Clock edge mode (sampling on the rising or falling,double edge) */
HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */
/* The below members must be configured in BT.601 mode or DC mode and are invalid in other modes */
VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */
VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */
VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */
VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */
HI_BOOL bDataRev; /* Data reverse */
} VI_DEV_ATTR_S;
typedef struct hiVI_CHN_BIND_ATTR_S
{
VI_DEV ViDev;
VI_WAY ViWay;
} VI_CHN_BIND_ATTR_S;
/* the attributes of a VI way */
typedef struct hiVI_WAY_ATTR_S
{
HI_S32 s32AdChnId;
} VI_WAY_ATTR_S;
/* captrue selection of video input */
typedef enum hiVI_CAPSEL_E
{
VI_CAPSEL_TOP = 0, /* top field */
VI_CAPSEL_BOTTOM, /* bottom field */
VI_CAPSEL_BOTH, /* top and bottom field */
VI_CAPSEL_BUTT
} VI_CAPSEL_E;
/* the attributes of a VI channel */
typedef struct hiVI_CHN_ATTR_S
{
RECT_S stCapRect; /* the capture rect (corresponding to the size of the picture captured by a VI device).
For primary channels, the stCapRect's u32Width and u32Height are static attributes. That is,
the value of them can be changed only after primary and secondary channels are disabled.
For secondary channels, stCapRect is an invalid attribute */
SIZE_S stDestSize; /* Target picture size.
For primary channels, stDestSize must be equal to stCapRect's u32Width and u32Height,
because primary channel doesn't have scale capability. Additionally, it is a static
attribute, That is, the value of stDestSize can be changed only after primary and
secondary channels are disabled.
For secondary channels, stDestSize is a dynamic attribute */
VI_CAPSEL_E enCapSel; /* Frame/field select. It is used only in interlaced mode.
For primary channels, enCapSel is a static attribute */
VI_SCAN_MODE_E enScanMode; /* Input scanning mode (progressive or interlaced) */
PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */
HI_BOOL bMirror; /* Whether to mirror */
HI_BOOL bFlip; /* Whether to flip */
HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */
HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */
} VI_CHN_ATTR_S;
typedef struct hiVI_CHN_STAT_S
{
HI_BOOL bEnable; /* Whether this channel is enabled */
HI_U32 u32IntCnt; /* The video frame interrupt count */
HI_U32 u32FrmRate; /* current frame rate */
HI_U32 u32LostInt; /* The interrupt is received but nobody care */
HI_U32 u32VbFail; /* Video buffer malloc failure */
HI_U32 u32PicWidth; /* curren pic width */
HI_U32 u32PicHeight; /* current pic height */
HI_U32 u32AutoDisInt; /* auto disable interrupt count, when VIU detected too many interrupts */
} VI_CHN_STAT_S;
typedef enum hi_VI_USERPIC_MODE_E
{
VI_USERPIC_MODE_PIC = 0, /* YUV picture */
VI_USERPIC_MODE_BGC, /* Background picture only with a color */
VI_USERPIC_MODE_BUTT,
} VI_USERPIC_MODE_E;
typedef struct hiVI_USERPIC_BGC_S
{
HI_U32 u32BgColor;
} VI_USERPIC_BGC_S;
typedef struct hiVI_USERPIC_ATTR_S
{
HI_BOOL bPub; /* Whether the user picture information is shared by all VI devices and channels*/
VI_USERPIC_MODE_E enUsrPicMode; /* User picture mode */
union
{
VIDEO_FRAME_INFO_S stUsrPicFrm; /* Information about a YUV picture */
VI_USERPIC_BGC_S stUsrPicBg; /* Information about a background picture only with a color */
}unUsrPic;
} VI_USERPIC_ATTR_S;
typedef struct hiVI_USR_GET_FRM_TIMEOUT_S
{
VIDEO_FRAME_INFO_S stVFrame;
HI_S32 s32MilliSec;
} VI_USR_GET_FRM_TIMEOUT_S;
typedef struct hiVI_EXT_CHN_ATTR_S
{
VI_CHN s32BindChn; /* The channel num which extend channel will bind to*/
SIZE_S stDestSize; /* Target size*/
HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */
HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */
PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */
}VI_EXT_CHN_ATTR_S;
typedef struct hiVI_CHN_LUM_S
{
HI_U32 u32Lum; /* Luma sum of current frame */
HI_U64 u64Pts; /* PTS of current frame */
} VI_CHN_LUM_S;
typedef enum hiVI_SKIP_MODE_E
{
VI_SKIP_NONE = 0, /*default mode, no skip*/
VI_SKIP_YES,
VI_SKIP_BUTT,
}VI_SKIP_MODE_E;
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* End of #ifndef__HI_COMM_VIDEO_IN_H__ */