/* ****************************************************************************** * * common_eis.h * * common_eis.h * * Copyright (c) 2018 by Allwinnertech Co., Ltd. http://www.allwinnertech.com * * Version Author Date Description * * 1.0 huangbohan 2018/05/08 VIDEO STABLIZATION * ***************************************************************************** */ #ifndef _AW_COMMON_EIS_H_ #define _AW_COMMON_EIS_H_ #include /* platform types */ #include "mm_common.h" #include #include "plat_errno.h" #include #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ #define MAX_EIS_CHN_NUM 2 #define EIS_ERR_PRIV_TIMEOUT (EN_ERR_BUTT + 1) #define EIS_ERR_PRIV_NOTENABLE (EN_ERR_BUTT + 2) #define EIS_ERR_PRIV_NOTDISABLE (EN_ERR_BUTT + 3) #define EIS_ERR_PRIV_NORM_UNMATCH (EN_ERR_BUTT + 4) #define EIS_ERR_PRIV_INVALID_PHYCHNID (EN_ERR_BUTT + 5) #define EIS_ERR_PRIV_FAILED_NOTBIND (EN_ERR_BUTT + 6) #define EIS_ERR_PRIV_FAILED_BINDED (EN_ERR_BUTT + 7) #define EIS_ERR_PRIV_UNEXIST (EN_ERR_BUTT + 8) #define EIS_ERR_PRIV_EXIST (EN_ERR_BUTT + 9) #define ERR_EIS_INVALID_CHNID DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) #define ERR_EIS_INVALID_PARA DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) #define ERR_EIS_INVALID_NULL_PTR DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) #define ERR_EIS_FAILED_NOTCONFIG DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) #define ERR_EIS_NOT_SUPPORT DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) #define ERR_EIS_NOT_PERM DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) #define ERR_EIS_INVALID_DEVID DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) #define ERR_EIS_NOMEM DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) #define ERR_EIS_BUF_EMPTY DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) #define ERR_EIS_BUF_FULL DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) #define ERR_EIS_SYS_NOTREADY DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) #define ERR_EIS_BUSY DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) #define ERR_EIS_FAILED_NOTENABLE DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_NOTENABLE) #define ERR_EIS_FAILED_NOTDISABLE DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_NOTDISABLE) #define ERR_EIS_CFG_TIMEOUT DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_TIMEOUT) #define ERR_EIS_NORM_UNMATCH DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_NORM_UNMATCH) #define ERR_EIS_INVALID_PHYCHNID DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_INVALID_PHYCHNID) #define ERR_EIS_FAILED_NOTBIND DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_FAILED_NOTBIND) #define ERR_EIS_FAILED_BINDED DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_FAILED_BINDED) #define ERR_EIS_UNEXIST DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_UNEXIST) #define ERR_EIS_EXIST DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EIS_ERR_PRIV_EXIST) #define ERR_EIS_SAMESTATE DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_SAMESTATE) #define ERR_EIS_INVALIDSTATE DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALIDSTATE) #define ERR_EIS_INCORRECT_STATE_TRANSITION DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_TRANSITION) #define ERR_EIS_INCORRECT_STATE_OPERATION DEF_ERR(MOD_ID_EIS, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_OPERATION) typedef enum awEIS_CHANNEL_PORT_DEFINE_E { /* No matter bind or unbind mode, we use this port to * accept video frames. */ EIS_CHN_PORT_INDEX_VIDEO_IN = 0, /* Just in offline mode, we use this port to receive * gyro datas. data structure: x, y, z, timestamp */ EIS_CHN_PORT_INDEX_GYRO_IN, EIS_CHN_PORT_INDEX_OUT, EIS_CHN_PORT_INDEX_OUT_M, EIS_CHN_PORT_INDEX_OUT_S, EIS_CHN_MAX_PORTS, } EIS_CHANNEL_PORT_DEFINE_E; typedef enum awEIS_CONF_OPR_E { EIS_CHN_CONF_SET = 0, EIS_CHN_CONF_GET, } EIS_CONF_OPR_E; typedef enum awEIS_ALGO_MODE { EIS_ALGO_MODE_HW, /* Use hardware device to process EIS. */ EIS_ALGO_MODE_SW, /* Specific for IRIDALibs' cpu EIS. */ EIS_ALGO_MODE_BP, /* By pass mode, no EIS process, just ouput the origin videos and gyro datas. */ } EIS_ALGO_MODE; typedef enum awEIS_OPR_MODE_E { EIS_OPR_1080P30, EIS_OPR_1080P60, EIS_OPR_VGA30, EIS_OPR_VGA60, EIS_OPR_4K30, EIS_OPR_2P7K30, EIS_OPR_DEBUG_RES, } EIS_OPR_MODE_E; typedef struct awEIS_KMAT_S { float KmatK1; float KmatK2; float KmatKx; float KmatKy; } EIS_KMAT_S; /* For video format attribution segment */ typedef struct awEIS_VIDEO_FMT_ATTR_S { /* video input and output resolutions */ int iVideoInWidth; int iVideoInHeight; int iVideoInWidthStride; int iVideoInHeightStride; int iVideoOutWidth; int iVideoOutHeight; int iVideoFps; PIXEL_FORMAT_E eVideoFmt; } EIS_VIDEO_FMT_ATTR_S; /* For data process attribution segment */ typedef struct awEIS_DATA_PROC_ATTR_S { /* In low memory device, we may want to reduce memory size, * then set this value, then EIS component will return input * video frame immediately. BBBBBBBBBBBBBBBBBBBBBBut, it is dangerious, * if your input buffer pool is too small and the EIS process speed * is too slowly, then the video maybe overlaped. */ bool bRetInFrmFast; /* This is the number of filter width, unit:frame number */ bool bVerticalFlip; /* If the pic's Y axi(horizion) be fliped */ bool bHorizFlip; /* If the pic's X axi(vertical) be fliped. */ int iEisFilterWidth; int iInputBufNum; int iOutputBufBum; /* We use timestamp to sync gyro and video frames, * this value indicates that we will sync with: (gyro timestamp + iDelayTimeMs) = video timestamp * * |------iDelayTimeMs-----| * Timeline---------------------------------------------------------> * gyro id0 video id0 */ int iDelayTimeMs; /* default: 0 */ unsigned int iSyncErrTolerance; /* Unit: ms */ } EIS_DATA_PROC_ATTR_S; typedef struct awEIS_GYRO_DATA_ATTR_S { /*gyro sample frequency, default 1000, unit:HZ*/ int iGyroFreq; /*how many gyro elems can be cached in gyro buffer pool, * 3axi: 1 elem = 16 Bytes; 6axi: 1 elem = 20 Bytes; * default to [200elems], it means we cache 200ms datas. * 1000 / iGyroFreq * iGyroPoolSize = Cache time length(ms) */ int iGyroPoolSize; /* Gyro axis count, by default: 3(Angle x,y,z) * if set to 6, the Accel x,y,z will be included, too. */ int iGyroAxiNum; } EIS_GYRO_DATA_ATTR_S; /* The whole attributions specfic for EIS channel. * If you think it is too large, then use the samll subdivision attributions like above. */ typedef struct awEIS_ATTR_S { /************************** * gyro property settings ***************************/ /*gyro sample frequency, default 1000, unit:HZ*/ int iGyroFreq; /*how many gyro elems can be cached in gyro buffer pool, * 3axi: 1 elem = 16 Bytes; 6axi: 1 elem = 20 Bytes; * default to [200elems], it means we cache 200ms datas. * 1000 / iGyroFreq * iGyroPoolSize = Cache time length(ms) */ int iGyroPoolSize; /* Gyro axis count, by default: 3(Angle x,y,z) * if set to 6, the Accel x,y,z will be included, too. */ int iGyroAxiNum; /************************** * video property settings ***************************/ /* video input and output resolutions */ int iVideoInWidth; int iVideoInHeight; int iVideoInWidthStride; int iVideoInHeightStride; int iVideoOutWidth; int iVideoOutHeight; int iVideoFps; PIXEL_FORMAT_E eVideoFmt; /************************** * EIS property settings ***************************/ /* In low memory device, we may want to reduce memory size, * then set this value, then EIS component will return input * video frame immediately. BBBBBBBBBBBBBBBBBBBBBBut, it is dangerious, * if your input buffer pool is too small and the EIS process speed * is too slowly, then the video maybe overlaped. */ bool bRetInFrmFast; /* This is the number of filter width, unit:frame number */ bool bVerticalFlip; /* If the pic's Y axi(horizion) be fliped */ bool bHorizFlip; /* If the pic's X axi(vertical) be fliped. */ int iEisFilterWidth; int iInputBufNum; int iOutputBufBum; /* We use timestamp to sync gyro and video frames, * this value indicates that we will sync with: (gyro timestamp + iDelayTimeMs) = video timestamp * * |------iDelayTimeMs-----| * Timeline---------------------------------------------------------> * gyro id0 video id0 */ int iDelayTimeMs; /* default: 0 */ unsigned int iSyncErrTolerance; /* Unit: ms */ /* * we got default k-mat values for imx317 in SDK. * but if you have other sensors, you should set * ,and fill . * the important thing is: you must be responsible for your own values. */ bool bUseKmat; EIS_KMAT_S stEisKmat; EIS_OPR_MODE_E eOperationMode; /* * We may need simulation offline use offline datas. * if you need it, set this flag. */ bool bSimuOffline; /* Use hardware EIS: then use * use software EIS: then use * use debug EIS: then use */ EIS_ALGO_MODE eEisAlgoMode; bool bSaveYUV; //If you want save the YUV file directly, then set it to 1. char *pBPDataSavePath; //The path you want to store your datas. } EIS_ATTR_S; typedef struct awEIS_GYRO_PACKET_S { uint64_t dTimeStamp; /* Unit: us */ float fAccelVX; float fAccelVY; float fAccelVZ; float fAnglrVX; float fAnglrVY; float fAnglrVZ; } EIS_GYRO_PACKET_S; typedef struct awEIS_GYRO_PACKET_3AXI_S { uint64_t dTimeStamp; float fAnglrVX; float fAnglrVY; float fAnglrVZ; } EIS_GYRO_PACKET_3AXI_S; typedef struct awEIS_PARAMS_S { EIS_CHN mChn; EIS_ATTR_S *pstAttr; VIDEO_FRAME_INFO_S *pstFrameInfo; AW_S32 s32MilliSec; } EIS_PARAMS_S; #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /*_AW_COMMON_EIS_H_*/