mirror of https://github.com/OpenIPC/firmware.git
431 lines
13 KiB
C
431 lines
13 KiB
C
/******************************************************************************
|
|
|
|
Copyright (C), 2016, Hisilicon Tech. Co., Ltd.
|
|
|
|
******************************************************************************
|
|
File Name : hi_comm_3a.h
|
|
Version : Initial Draft
|
|
Author : Hisilicon multimedia software group
|
|
Created : 2012/12/18
|
|
Description :
|
|
History :
|
|
1.Date : 2012/12/18
|
|
Author :
|
|
Modification: Created file
|
|
|
|
******************************************************************************/
|
|
|
|
#ifndef __HI_COMM_3A_H__
|
|
#define __HI_COMM_3A_H__
|
|
|
|
#include "hi_common.h"
|
|
#include "hi_comm_isp.h"
|
|
#include "hi_comm_sns.h"
|
|
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|
|
|
|
#define IS_LINEAR_MODE(mode) ((mode) == WDR_MODE_NONE)
|
|
#define IS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode)) && ((mode) < WDR_MODE_BUTT))
|
|
#define IS_HDR_MODE(mode) (((mode) > DYNAMIC_RANGE_SDR10) && ((mode) < DYNAMIC_RANGE_BUTT))
|
|
#define IS_BUILT_IN_WDR_MODE(mode) ((mode) == WDR_MODE_BUILT_IN)
|
|
#define IS_FS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode))&& (!IS_BUILT_IN_WDR_MODE(mode)) && ((mode) < WDR_MODE_BUTT))
|
|
#define IS_2to1_WDR_MODE(mode) (((mode) == WDR_MODE_2To1_FRAME) || ((mode) == WDR_MODE_2To1_FRAME_FULL_RATE) || ((mode) == WDR_MODE_2To1_LINE) || ((mode) == WDR_MODE_QUDRA))
|
|
#define IS_3to1_WDR_MODE(mode) (((mode) == WDR_MODE_3To1_FRAME) || ((mode) == WDR_MODE_3To1_FRAME_FULL_RATE) || ((mode) == WDR_MODE_3To1_LINE))
|
|
#define IS_4to1_WDR_MODE(mode) (((mode) == WDR_MODE_4To1_FRAME) || ((mode) == WDR_MODE_4To1_FRAME_FULL_RATE) || ((mode) == WDR_MODE_4To1_LINE))
|
|
#define IS_FULL_WDR_MODE(mode) (((mode) == WDR_MODE_2To1_FRAME_FULL_RATE) || ((mode) == WDR_MODE_3To1_FRAME_FULL_RATE) || ((mode) == WDR_MODE_4To1_FRAME_FULL_RATE))
|
|
#define IS_HALF_WDR_MODE(mode) (((mode) == WDR_MODE_2To1_FRAME) || ((mode) == WDR_MODE_3To1_FRAME) || ((mode) == WDR_MODE_4To1_FRAME))
|
|
#define IS_LINE_WDR_MODE(mode) (((mode) == WDR_MODE_2To1_LINE) || ((mode) == WDR_MODE_3To1_LINE) || ((mode) == WDR_MODE_4To1_LINE) || ((mode) == WDR_MODE_QUDRA))
|
|
|
|
#define IS_STITCH_MAIN_PIPE(ViPipe,MainPipe) ((ViPipe) == (MainPipe))
|
|
#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 MAX_REGISTER_ALG_LIB_NUM 2
|
|
|
|
typedef enum hiISP_ALG_MOD_E {
|
|
ISP_ALG_AE = 0,
|
|
ISP_ALG_AF,
|
|
ISP_ALG_AWB,
|
|
ISP_ALG_BLC,
|
|
ISP_ALG_FELOGLUT,
|
|
ISP_ALG_LOGLUT,
|
|
ISP_ALG_DP,
|
|
ISP_ALG_PREGAMMA,
|
|
ISP_ALG_DRC,
|
|
ISP_ALG_DEMOSAIC,
|
|
ISP_ALG_ANTIFALSECOLOR,
|
|
ISP_ALG_GAMMA,
|
|
ISP_ALG_GE,
|
|
ISP_ALG_SHARPEN,
|
|
ISP_ALG_EDGEAMRK,
|
|
ISP_ALG_FrameWDR,
|
|
ISP_ALG_FPN,
|
|
ISP_ALG_DEHAZE,
|
|
ISP_ALG_ACM,
|
|
ISP_ALG_LCAC,
|
|
ISP_ALG_GCAC,
|
|
ISP_ALG_CSC,
|
|
ISP_ALG_EXPANDER,
|
|
ISP_ALG_MCDS,
|
|
ISP_ALG_LSC,
|
|
ISP_ALG_RLSC,
|
|
ISP_ALG_FeLSC,
|
|
ISP_ALG_RC,
|
|
ISP_ALG_RGBIR,
|
|
ISP_ALG_HRS,
|
|
ISP_ALG_DG,
|
|
ISP_ALG_BAYERNR,
|
|
ISP_ALG_FLICKER,
|
|
ISP_ALG_SPLIT,
|
|
ISP_ALG_LDCI,
|
|
ISP_ALG_CA,
|
|
ISP_ALG_CLUT,
|
|
ISP_ALG_DETAIL,
|
|
ISP_ALG_BUTT,
|
|
} ISP_ALG_MOD_E;
|
|
|
|
typedef enum hiISP_CTRL_CMD_E {
|
|
ISP_WDR_MODE_SET = 8000,
|
|
ISP_PROC_WRITE,
|
|
|
|
ISP_AE_FPS_BASE_SET,
|
|
ISP_AE_BLC_SET,
|
|
ISP_AE_RC_SET,
|
|
ISP_AE_BAYER_FORMAT_SET,
|
|
ISP_AE_INIT_INFO_GET,
|
|
|
|
ISP_AWB_ISO_SET, /* set iso, change saturation when iso change */
|
|
ISP_CHANGE_IMAGE_MODE_SET,
|
|
ISP_UPDATE_INFO_GET,
|
|
ISP_FRAMEINFO_GET,
|
|
ISP_ATTACHINFO_GET,
|
|
ISP_COLORGAMUTINFO_GET,
|
|
ISP_AWB_INTTIME_SET,
|
|
ISP_BAS_MODE_SET,
|
|
ISP_PROTRIGGER_SET,
|
|
ISP_AWB_PIRIS_SET,
|
|
ISP_AWB_SNAP_MODE_SET,
|
|
ISP_AWB_ZONE_ROW_SET,
|
|
ISP_AWB_ZONE_COL_SET,
|
|
ISP_AWB_ZONE_BIN_SET,
|
|
ISP_CTRL_CMD_BUTT,
|
|
} ISP_CTRL_CMD_E;
|
|
|
|
typedef struct hiISP_CTRL_PROC_WRITE_S {
|
|
HI_CHAR *pcProcBuff;
|
|
HI_U32 u32BuffLen;
|
|
HI_U32 u32WriteLen; /* The len count should contain '\0'. */
|
|
} ISP_CTRL_PROC_WRITE_S;
|
|
|
|
|
|
typedef struct hiISP_STITCH_ATTR_S {
|
|
HI_BOOL bStitchEnable;
|
|
HI_BOOL bMainPipe;
|
|
HI_U8 u8StitchPipeNum;
|
|
HI_S8 as8StitchBindId[VI_MAX_PIPE_NUM];
|
|
} ISP_STITCH_ATTR_S;
|
|
/******************************** AE *************************************/
|
|
/* the init param of ae alg */
|
|
typedef struct hiISP_AE_PARAM_S {
|
|
SENSOR_ID SensorId;
|
|
HI_U8 u8WDRMode;
|
|
HI_U8 u8HDRMode;
|
|
HI_U16 u16BlackLevel;
|
|
HI_FLOAT f32Fps;
|
|
ISP_BAYER_FORMAT_E enBayer;
|
|
ISP_STITCH_ATTR_S stStitchAttr;
|
|
|
|
HI_S32 s32Rsv;
|
|
} ISP_AE_PARAM_S;
|
|
|
|
/* the statistics of ae alg */
|
|
typedef struct hiISP_FE_AE_STAT_1_S {
|
|
HI_U32 u32PixelCount[ISP_CHN_MAX_NUM];
|
|
HI_U32 u32PixelWeight[ISP_CHN_MAX_NUM];
|
|
HI_U32 au32HistogramMemArray[ISP_CHN_MAX_NUM][1024];
|
|
} ISP_FE_AE_STAT_1_S;
|
|
|
|
typedef struct hiISP_FE_AE_STAT_2_S {
|
|
HI_U16 u16GlobalAvgR[ISP_CHN_MAX_NUM];
|
|
HI_U16 u16GlobalAvgGr[ISP_CHN_MAX_NUM];
|
|
HI_U16 u16GlobalAvgGb[ISP_CHN_MAX_NUM];
|
|
HI_U16 u16GlobalAvgB[ISP_CHN_MAX_NUM];
|
|
} ISP_FE_AE_STAT_2_S;
|
|
|
|
typedef struct hiISP_FE_AE_STAT_3_S {
|
|
HI_U16 au16ZoneAvg[ISP_CHN_MAX_NUM][AE_ZONE_ROW][AE_ZONE_COLUMN][4];
|
|
} ISP_FE_AE_STAT_3_S;
|
|
|
|
typedef struct hiISP_FE_AE_STITCH_STAT_3_S {
|
|
HI_U16 au16ZoneAvg[VI_MAX_PIPE_NUM][ISP_CHN_MAX_NUM][AE_ZONE_ROW][AE_ZONE_COLUMN][4];
|
|
} ISP_FE_AE_STITCH_STAT_3_S;
|
|
|
|
typedef struct hiISP_BE_AE_STAT_1_S {
|
|
HI_U32 u32PixelCount;
|
|
HI_U32 u32PixelWeight;
|
|
HI_U32 au32HistogramMemArray[1024];
|
|
} ISP_BE_AE_STAT_1_S;
|
|
|
|
typedef struct hiISP_BE_AE_STAT_2_S {
|
|
HI_U16 u16GlobalAvgR;
|
|
HI_U16 u16GlobalAvgGr;
|
|
HI_U16 u16GlobalAvgGb;
|
|
HI_U16 u16GlobalAvgB;
|
|
} ISP_BE_AE_STAT_2_S;
|
|
|
|
typedef struct hiISP_BE_AE_STAT_3_S {
|
|
HI_U16 au16ZoneAvg[AE_ZONE_ROW][AE_ZONE_COLUMN][4];
|
|
} ISP_BE_AE_STAT_3_S;
|
|
|
|
typedef struct hiISP_BE_AE_STITCH_STAT_3_S {
|
|
HI_U16 au16ZoneAvg[VI_MAX_PIPE_NUM][AE_ZONE_ROW][AE_ZONE_COLUMN][4];
|
|
} ISP_BE_AE_STITCH_STAT_3_S;
|
|
|
|
typedef struct hiISP_AE_INFO_S {
|
|
HI_U32 u32FrameCnt; /* the counting of frame */
|
|
ISP_SMART_INFO_S stSmartInfo; /* Only used for Hi3516EV200/Hi3516EV300/Hi3518EV300 */
|
|
|
|
ISP_FE_AE_STAT_1_S *pstFEAeStat1;
|
|
ISP_FE_AE_STAT_2_S *pstFEAeStat2;
|
|
ISP_FE_AE_STAT_3_S *pstFEAeStat3;
|
|
ISP_FE_AE_STITCH_STAT_3_S *pstFEAeStiStat;
|
|
ISP_BE_AE_STAT_1_S *pstBEAeStat1;
|
|
ISP_BE_AE_STAT_2_S *pstBEAeStat2;
|
|
ISP_BE_AE_STAT_3_S *pstBEAeStat3;
|
|
ISP_BE_AE_STITCH_STAT_3_S *pstBEAeStiStat;
|
|
} ISP_AE_INFO_S;
|
|
|
|
|
|
typedef struct hiISP_AE_STAT_ATTR_S {
|
|
HI_BOOL bChange;
|
|
|
|
HI_BOOL bHistAdjust;
|
|
HI_U8 u8AEBESel;
|
|
HI_U8 u8FourPlaneMode;
|
|
HI_U8 u8HistOffsetX;
|
|
HI_U8 u8HistOffsetY;
|
|
HI_U8 u8HistSkipX;
|
|
HI_U8 u8HistSkipY;
|
|
|
|
HI_BOOL bModeUpdate;
|
|
HI_U8 u8HistMode;
|
|
HI_U8 u8AverMode;
|
|
HI_U8 u8MaxGainMode;
|
|
|
|
HI_BOOL bWightTableUpdate;
|
|
HI_U8 au8WeightTable[VI_MAX_PIPE_NUM][AE_ZONE_ROW][AE_ZONE_COLUMN];
|
|
} ISP_AE_STAT_ATTR_S;
|
|
|
|
/* the final calculate of ae alg */
|
|
#define AE_INT_TIME_NUM (4)
|
|
typedef struct hiISP_AE_RESULT_S {
|
|
HI_U32 u32IntTime[AE_INT_TIME_NUM];
|
|
HI_U32 u32IspDgain;
|
|
HI_U32 u32Again;
|
|
HI_U32 u32Dgain;
|
|
HI_U32 u32Iso;
|
|
HI_U32 u32IspDgainSF;
|
|
HI_U32 u32AgainSF;
|
|
HI_U32 u32DgainSF;
|
|
HI_U32 u32IsoSF;
|
|
HI_U8 u8AERunInterval;
|
|
|
|
HI_BOOL bPirisValid;
|
|
HI_S32 s32PirisPos;
|
|
HI_U32 u32PirisGain;
|
|
|
|
ISP_FSWDR_MODE_E enFSWDRMode;
|
|
HI_U32 au32WDRGain[4];
|
|
HI_U32 u32HmaxTimes; /* unit is ns */
|
|
HI_U32 u32Vmax; /* unit is line */
|
|
|
|
ISP_AE_STAT_ATTR_S stStatAttr;
|
|
ISP_DCF_UPDATE_INFO_S stUpdateInfo;
|
|
} ISP_AE_RESULT_S;
|
|
|
|
typedef struct hiISP_AE_INIT_INFO_S {
|
|
HI_U32 u32IspDgain;
|
|
HI_U32 u32Iso;
|
|
} ISP_AE_INIT_INFO_S;
|
|
|
|
typedef struct hiISP_AE_EXP_FUNC_S {
|
|
HI_S32 (*pfn_ae_init)(HI_S32 s32Handle, const ISP_AE_PARAM_S *pstAeParam);
|
|
HI_S32 (*pfn_ae_run)(HI_S32 s32Handle,
|
|
const ISP_AE_INFO_S *pstAeInfo,
|
|
ISP_AE_RESULT_S *pstAeResult,
|
|
HI_S32 s32Rsv
|
|
);
|
|
HI_S32 (*pfn_ae_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue);
|
|
HI_S32 (*pfn_ae_exit)(HI_S32 s32Handle);
|
|
} ISP_AE_EXP_FUNC_S;
|
|
|
|
typedef struct hiISP_AE_REGISTER_S {
|
|
ISP_AE_EXP_FUNC_S stAeExpFunc;
|
|
} ISP_AE_REGISTER_S;
|
|
|
|
/******************************** AWB *************************************/
|
|
typedef enum hiAWB_CTRL_CMD_E {
|
|
AWB_CCM_CONFIG_SET,
|
|
AWB_CCM_CONFIG_GET,
|
|
|
|
AWB_DEBUG_ATTR_SET,
|
|
AWB_DEBUG_ATTR_GET,
|
|
|
|
AWB_CTRL_BUTT,
|
|
} AWB_CTRL_CMD_E;
|
|
|
|
typedef struct hiAWB_CCM_CONFIG_S {
|
|
HI_BOOL bAWBBypassEn;
|
|
HI_BOOL bManualSatEn;
|
|
HI_BOOL bManualTempEn;
|
|
|
|
HI_U32 u32ManualSatValue;
|
|
HI_U32 u32ManualTempValue;
|
|
HI_U16 u16CCMSpeed;
|
|
|
|
HI_U16 au16HighCCM[9];
|
|
HI_U16 au16LowCCM[9];
|
|
HI_U16 u16HighColorTemp;
|
|
HI_U16 u16LowColorTemp;
|
|
} AWB_CCM_CONFIG_S;
|
|
|
|
/* the init param of awb alg */
|
|
typedef struct hiISP_AWB_PARAM_S {
|
|
SENSOR_ID SensorId;
|
|
HI_U8 u8WDRMode;
|
|
HI_U8 u8AWBZoneRow;
|
|
HI_U8 u8AWBZoneCol;
|
|
HI_U8 u8AWBZoneBin;
|
|
ISP_STITCH_ATTR_S stStitchAttr;
|
|
HI_U16 u16AWBWidth;
|
|
HI_U16 u16AWBHeight;
|
|
HI_U32 u32InitIso;
|
|
HI_S8 s8Rsv;
|
|
} ISP_AWB_PARAM_S;
|
|
|
|
/* the statistics of awb alg */
|
|
typedef struct hiISP_AWB_STAT_1_S {
|
|
HI_U16 u16MeteringAwbAvgR;
|
|
HI_U16 u16MeteringAwbAvgG;
|
|
HI_U16 u16MeteringAwbAvgB;
|
|
HI_U16 u16MeteringAwbCountAll;
|
|
} ISP_AWB_STAT_1_S;
|
|
|
|
typedef struct hiISP_AWB_STAT_2_S {
|
|
HI_U16 au16MeteringMemArrayAvgR[AWB_ZONE_NUM];
|
|
HI_U16 au16MeteringMemArrayAvgG[AWB_ZONE_NUM];
|
|
HI_U16 au16MeteringMemArrayAvgB[AWB_ZONE_NUM];
|
|
HI_U16 au16MeteringMemArrayCountAll[AWB_ZONE_NUM];
|
|
|
|
} ISP_AWB_STAT_2_S;
|
|
|
|
typedef struct hiISP_AWB_STAT_STITCH_S {
|
|
HI_U16 u16ZoneCol;
|
|
HI_U16 u16ZoneRow;
|
|
HI_U16 u16ZoneBin;
|
|
HI_U16 au16MeteringMemArrayAvgR[AWB_ZONE_STITCH_MAX];
|
|
HI_U16 au16MeteringMemArrayAvgG[AWB_ZONE_STITCH_MAX];
|
|
HI_U16 au16MeteringMemArrayAvgB[AWB_ZONE_STITCH_MAX];
|
|
HI_U16 au16MeteringMemArrayCountAll[AWB_ZONE_STITCH_MAX];
|
|
|
|
} ISP_AWB_STAT_STITCH_S;
|
|
|
|
typedef struct hiISP_AWB_STAT_RESULT_S {
|
|
HI_U16 *pau16ZoneAvgR;
|
|
HI_U16 *pau16ZoneAvgG;
|
|
HI_U16 *pau16ZoneAvgB;
|
|
HI_U16 *pau16ZoneCount;
|
|
} ISP_AWB_STAT_RESULT_S;
|
|
|
|
typedef struct hiISP_AWB_INFO_S {
|
|
HI_U32 u32FrameCnt;
|
|
|
|
ISP_AWB_STAT_1_S *pstAwbStat1;
|
|
ISP_AWB_STAT_RESULT_S stAwbStat2;
|
|
HI_U8 u8AwbGainSwitch;
|
|
HI_U8 u8AwbStatSwitch;
|
|
HI_U32 au32WDRWBGain[ISP_BAYER_CHN_NUM];
|
|
} ISP_AWB_INFO_S;
|
|
|
|
/* the statistics's attr of awb alg */
|
|
typedef struct hiISP_AWB_RAW_STAT_ATTR_S {
|
|
HI_BOOL bStatCfgUpdate;
|
|
|
|
HI_U16 u16MeteringWhiteLevelAwb;
|
|
HI_U16 u16MeteringBlackLevelAwb;
|
|
HI_U16 u16MeteringCrRefMaxAwb;
|
|
HI_U16 u16MeteringCbRefMaxAwb;
|
|
HI_U16 u16MeteringCrRefMinAwb;
|
|
HI_U16 u16MeteringCbRefMinAwb;
|
|
} ISP_AWB_RAW_STAT_ATTR_S;
|
|
|
|
/* the final calculate of awb alg */
|
|
typedef struct hiISP_AWB_RESULT_S {
|
|
HI_U32 au32WhiteBalanceGain[ISP_BAYER_CHN_NUM];
|
|
HI_U16 au16ColorMatrix[CCM_MATRIX_SIZE];
|
|
HI_U32 u32ColorTemp;
|
|
HI_U8 u8Saturation;
|
|
ISP_AWB_RAW_STAT_ATTR_S stRawStatAttr;
|
|
} ISP_AWB_RESULT_S;
|
|
|
|
typedef struct hiISP_AWB_EXP_FUNC_S {
|
|
HI_S32 (*pfn_awb_init)(HI_S32 s32Handle, const ISP_AWB_PARAM_S *pstAwbParam, ISP_AWB_RESULT_S *pstAwbResult);
|
|
HI_S32 (*pfn_awb_run)(HI_S32 s32Handle,
|
|
const ISP_AWB_INFO_S *pstAwbInfo,
|
|
ISP_AWB_RESULT_S *pstAwbResult,
|
|
HI_S32 s32Rsv);
|
|
HI_S32 (*pfn_awb_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue);
|
|
HI_S32 (*pfn_awb_exit)(HI_S32 s32Handle);
|
|
} ISP_AWB_EXP_FUNC_S;
|
|
|
|
typedef struct hiISP_AWB_REGISTER_S {
|
|
ISP_AWB_EXP_FUNC_S stAwbExpFunc;
|
|
} ISP_AWB_REGISTER_S;
|
|
|
|
/******************************** AF *************************************/
|
|
/* the statistics of af alg */
|
|
typedef struct hiISP_AF_ZONE_S {
|
|
HI_U16 u16v1;
|
|
HI_U16 u16h1;
|
|
HI_U16 u16v2;
|
|
HI_U16 u16h2;
|
|
HI_U16 u16y;
|
|
HI_U16 u16HlCnt;
|
|
} ISP_AF_ZONE_S;
|
|
|
|
typedef struct hiISP_FE_AF_STAT_S {
|
|
ISP_AF_ZONE_S stZoneMetrics[WDR_CHN_MAX][AF_ZONE_ROW][AF_ZONE_COLUMN]; /* R; The zoned measure of contrast */
|
|
} ISP_FE_AF_STAT_S;
|
|
|
|
typedef struct hiISP_BE_AF_STAT_S {
|
|
ISP_AF_ZONE_S stZoneMetrics[AF_ZONE_ROW][AF_ZONE_COLUMN]; /* R; The zoned measure of contrast */
|
|
} ISP_BE_AF_STAT_S;
|
|
|
|
#define ALG_LIB_NAME_SIZE_MAX (20)
|
|
typedef struct hiALG_LIB_S {
|
|
HI_S32 s32Id;
|
|
HI_CHAR acLibName[ALG_LIB_NAME_SIZE_MAX];
|
|
} ALG_LIB_S;
|
|
|
|
typedef struct hiISP_BIND_ATTR_S {
|
|
SENSOR_ID SensorId;
|
|
ALG_LIB_S stAeLib;
|
|
ALG_LIB_S stAfLib;
|
|
ALG_LIB_S stAwbLib;
|
|
} ISP_BIND_ATTR_S;
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|
|
|
|
#endif /* __HI_COMM_SNS_H__ */
|