/******************************************************************************
*
*  Copyright (C), 2001-2011, Huawei Tech. Co., Ltd.
*
*******************************************************************************
*  File Name     : hi_comm_vda.h
*  Version       : Initial Draft
*  Author        : j00169368,l64467
*  Created       : 2011/1/7
*  Last Modified :
*  Description   : include VDA struct , Marco and Error information
*  Function List :
*
*
*  History:
* 
*       1.  Date         : 2011/1/7
*           Author       : j00169368,l64467
*           Modification : Created file
*
******************************************************************************/

#ifndef __HI_COMM_VDA_H__
#define __HI_COMM_VDA_H__

#include "hi_type.h"
#include "hi_debug.h"
#include "hi_comm_video.h"
#include "hi_common.h"
#include "hi_errno.h"
#include "hi_defines.h"

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */


/*Motion Region Data*/
typedef struct hiVDA_OBJ_S
{
    HI_U16 u16Left;
	HI_U16 u16Top;
	HI_U16 u16Right;
	HI_U16 u16Bottom;
}VDA_OBJ_S;

/*reference pictrue mode*/
typedef enum hiVDA_REF_MODE_E
{
	VDA_REF_MODE_DYNAMIC = 0,   /*reference pictrue dynamic*/
	VDA_REF_MODE_STATIC,	    /*reference pictrue static*/
    VDA_REF_MODE_USER,          /*reference pictrue user*/
	VDA_REF_MODE_BUTT           /*reserve*/
}VDA_REF_MODE_E;

/*VDA algorithm*/
typedef enum hiVDA_ALG_E
{
	VDA_ALG_BG = 0,		/*base on background pictrue*/
	VDA_ALG_REF,	    /*base on reference pictrue*/
	VDA_ALG_BUTT
}VDA_ALG_E;

/*MB size*/
typedef enum hiVDA_MB_SIZE_E
{
	VDA_MB_8PIXEL,      /* 8*8 */          
	VDA_MB_16PIXEL,     /* 16*16 */
	VDA_MB_BUTT	
}VDA_MB_SIZE_E;

/*SAD bits*/
typedef enum hiVDA_MB_SADBITS_E
{
    VDA_MB_SAD_8BIT = 0,  /*SAD precision 8bits*/
    VDA_MB_SAD_16BIT,     /*SAD precision 16bits*/
    VDA_MB_SAD_BUTT       /*reserve*/
} VDA_MB_SADBITS_E;


/*OD region attribute*/
typedef struct hiVDA_OD_RGN_ATTR_S
{
    /*static attribute*/
    RECT_S stRect;            /*region rect
                               *X:[0,VDA_MAX_WIDTH),align:16
                               *Y:[0,VDA_MAX_HEIGHT)
                               *W:[16,VDA_MAX_WIDTH],align:16
                               *H:[16,VDA_MAX_HEIGHT],align:16
                               *X+W <= chunnel wight
                               *Y+H <= chunnel height
                               */

    /*dynamic attribute*/
    HI_U32 u32SadTh;          /*SAD threshold,range:[0,4080]*/
    HI_U32 u32AreaTh;         /*alarm area threshold,range:[0,100]*/
	HI_U32 u32OccCntTh;	      /*alarm frame count threshold,range:[1,256]*/
    HI_U32 u32UnOccCntTh;	  /*The max uncover count,range:[0,256]*/
}VDA_OD_RGN_ATTR_S;

/*MD attribute*/
typedef struct hiVDA_MD_ATTR_S
{
    /*static attribute*/
	VDA_ALG_E		 enVdaAlg;	    /*arithmetic*/
    VDA_MB_SIZE_E    enMbSize;      /*MB size*/
    VDA_MB_SADBITS_E enMbSadBits;   /*MB SAD size*/
    VDA_REF_MODE_E   enRefMode;     /*reference picture mode*/
    HI_U32           u32MdBufNum;   /*Result buffer number,range:[1,16]*/ 
    
    /*dynamic attribute*/
    HI_U32           u32VdaIntvl;   /*VDA interval,range:[0,256]*/
    
    HI_U32           u32BgUpSrcWgt;  /*the source picture weight,
                                      *back ground updata totle weight 256,
                                      *range:[1,255],recommendatory value:128
                                      */
                                      
    HI_U32			 u32SadTh;      /*SAD threshold,range:[0,4080],recommendatory value:100*/
    HI_U32           u32ObjNumMax;  /*max OBJ number,range:[1,128]*/
}VDA_MD_ATTR_S;


#define VDA_OD_RGN_NUM_MAX 4

/*OD attribute*/
typedef struct hiVDA_OD_ATTR_S
{
    HI_U32           u32RgnNum;     /*region number*/
    VDA_OD_RGN_ATTR_S astOdRgnAttr[VDA_OD_RGN_NUM_MAX]; /*region attribute*/
    
    /*static attribute*/
	VDA_ALG_E		 enVdaAlg;		/*arithmetic*/
    VDA_MB_SIZE_E    enMbSize;      /*MB size*/
    VDA_MB_SADBITS_E enMbSadBits;   /*MB SAD size*/
    VDA_REF_MODE_E   enRefMode;     /*reference picture mode*/
        
    /*dynamic attribute*/
    HI_U32           u32VdaIntvl;   /*VDA interval,[0,256]*/
    HI_U32           u32BgUpSrcWgt;  /*back ground updata totle weight 256,the source picture weight,[1,255]*/

    
}VDA_OD_ATTR_S;


/*work mode*/
typedef enum hiVDA_WORK_MODE_E
{
	VDA_WORK_MODE_MD = 0, /*motion detection*/
    VDA_WORK_MODE_OD,     /*Occlusion detection*/
    VDA_WORK_MODE_BUTT    
}VDA_WORK_MODE_E;


/*work mode attribute*/
typedef union hiVDA_WORK_MODE_ATTR_U
{
    VDA_MD_ATTR_S stMdAttr;  /*MD attribute*/
    VDA_OD_ATTR_S stOdAttr;  /*OD attribute*/
}VDA_WORK_MODE_ATTR_U;


/*VDA CHN attribute*/
typedef struct hiVDA_CHN_ATTR_S
{
    VDA_WORK_MODE_E enWorkMode;  /*work mode*/
    VDA_WORK_MODE_ATTR_U unAttr; /*work mode attribute*/
    HI_U32 u32Width;             /*the width of CHNL,[16,VDA_MAX_WIDTH]*/
    HI_U32 u32Height;            /*the height of CHNL,[16,VDA_MAX_HEIGHT]*/
}VDA_CHN_ATTR_S;


/*MB SAD data*/
typedef struct hiVDA_MB_SAD_DATA_S
{
    HI_VOID	   *pAddr;             /*address*/
    HI_U32		u32Stride;         /*stride*/
    VDA_MB_SADBITS_E enMbSadBits;  /*the MB SAD size*/
}VDA_MB_SAD_DATA_S;

/*OBJ data*/
typedef struct hiVDA_OBJ_DATA_S
{
    HI_U32 u32ObjNum;              /*OBJ number*/
    VDA_OBJ_S	*pstAddr;          /*OBJ data address*/
    
    HI_U32 u32IndexOfMaxObj;       /*index of max OBJ*/
    HI_U32 u32SizeOfMaxObj;        /*size of max OBJ*/
	HI_U32 u32SizeOfTotalObj;      /*total size of all OBJ*/
}VDA_OBJ_DATA_S;


/*MD data*/
typedef struct hiVDA_MD_DATA_S
{
    HI_BOOL           bMbSadValid;     /*SAD data is valid?*/
    VDA_MB_SAD_DATA_S stMbSadData;    /*MB SAD data*/
    
    HI_BOOL           bObjValid;       /*OBJ data is valid?*/
    VDA_OBJ_DATA_S    stObjData;      /*OBJ data*/

    HI_BOOL           bPelsNumValid;   /*alarm pixel number data is valid?*/
	HI_U32 			  u32AlarmPixCnt;/*motion pix of picture*/
}VDA_MD_DATA_S;


/*OD data*/
typedef struct hiVDA_OD_DATA_S
{
    HI_U32  u32RgnNum;                      /*region number*/
    HI_BOOL abRgnAlarm[VDA_OD_RGN_NUM_MAX]; /*HI_TRUE:alarm*/
}VDA_OD_DATA_S;



typedef union hiVDA_DATA_U
{
    VDA_MD_DATA_S stMdData; /*MD data*/
    VDA_OD_DATA_S stOdData; /*OD data*/
}VDA_DATA_U;


/*VDA data*/
typedef struct hiVDA_DATA_S
{
    VDA_WORK_MODE_E enWorkMode;  /*work mode*/
    VDA_DATA_U      unData;      /*VDA data*/
    VDA_MB_SIZE_E   enMbSize;    /*MB size*/
    HI_U32          u32MbWidth;  /*VDA channle width in MB*/
    HI_U32          u32MbHeight; /*VDA channle height in MB*/
    HI_U64          u64Pts;      /*time*/    
}VDA_DATA_S;


/*chnnel state*/
typedef struct hiVDA_CHN_STAT_S
{
    HI_BOOL bStartRecvPic; /*start receive picture*/
	HI_U32 u32LeftPic;     /*left picture*/
	HI_U32 u32LeftRst;     /*left data*/   
}VDA_CHN_STAT_S;

/* invlalid device ID */
#define HI_ERR_VDA_INVALID_DEVID     HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID)
/* invlalid channel ID */
#define HI_ERR_VDA_INVALID_CHNID     HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
/* at lease one parameter is illagal ,eg, an illegal enumeration value  */
#define HI_ERR_VDA_ILLEGAL_PARAM     HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
/* channel exists */
#define HI_ERR_VDA_EXIST             HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST)
/*UN exist*/
#define HI_ERR_VDA_UNEXIST           HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST)
/* using a NULL point */
#define HI_ERR_VDA_NULL_PTR          HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
/* try to enable or initialize system,device or channel, before configing attribute */
#define HI_ERR_VDA_NOT_CONFIG        HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG)
/* operation is not supported by NOW */
#define HI_ERR_VDA_NOT_SUPPORT      HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
/* operation is not permitted ,eg, try to change stati attribute */
#define HI_ERR_VDA_NOT_PERM          HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
/* failure caused by malloc memory */
#define HI_ERR_VDA_NOMEM             HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
/* failure caused by malloc buffer */
#define HI_ERR_VDA_NOBUF             HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF)
/* no data in buffer */
#define HI_ERR_VDA_BUF_EMPTY         HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY)
/* no buffer for new data */
#define HI_ERR_VDA_BUF_FULL          HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL)
/* bad address, eg. used for copy_from_user & copy_to_user */
#define HI_ERR_VDA_BADADDR           HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR)
/* resource is busy, eg. destroy a venc chn without unregistering it */
#define HI_ERR_VDA_BUSY              HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)

/* System is not ready,maybe not initialed or loaded.
 * Returning the error code when opening a device file failed.
 */
#define HI_ERR_VDA_NOTREADY          HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */


#endif /* End of #ifndef __HI_COMM_VDA_H__ */
