#ifndef __XM_COMM_VO_H__
#define __XM_COMM_VO_H__

#include "xm_type.h"
#include "xm_common.h"
#include "xm_comm_video.h"
#include "xm_errno.h"

#define VO_DEF_CHN_BUF_LEN      8
#define VO_DEF_DISP_BUF_LEN		5
#define VO_DEF_VIRT_BUF_LEN		3
#define VO_DEF_WBC_DEPTH_LEN    8

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

typedef enum xmEN_VOU_ERR_CODE_E
{
    EN_ERR_VO_DEV_NOT_CONFIG	  = 0x40,
    EN_ERR_VO_DEV_NOT_ENABLE      = 0x41,
    EN_ERR_VO_DEV_HAS_ENABLED     = 0x42,
    EN_ERR_VO_DEV_HAS_BINDED      = 0x43,
    EN_ERR_VO_DEV_NOT_BINDED      = 0x44,

    ERR_VO_NOT_ENABLE             = 0x45,
    ERR_VO_NOT_DISABLE            = 0x46,
    ERR_VO_NOT_CONFIG             = 0x47,

    ERR_VO_CHN_NOT_DISABLE        = 0x48,
    ERR_VO_CHN_NOT_ENABLE         = 0x49,
    ERR_VO_CHN_NOT_CONFIG         = 0x4a,
    ERR_VO_CHN_NOT_ALLOC          = 0x4b,

    ERR_VO_CCD_INVALID_PAT        = 0x4c,
    ERR_VO_CCD_INVALID_POS        = 0x4d,

    ERR_VO_WAIT_TIMEOUT           = 0x4e,
    ERR_VO_INVALID_VFRAME         = 0x4f,
    ERR_VO_INVALID_RECT_PARA      = 0x50,
    ERR_VO_SETBEGIN_ALREADY       = 0x51,
    ERR_VO_SETBEGIN_NOTYET        = 0x52,
    ERR_VO_SETEND_ALREADY         = 0x53,
    ERR_VO_SETEND_NOTYET          = 0x54,

    ERR_VO_GRP_INVALID_ID         = 0x55,
    ERR_VO_GRP_NOT_CREATE         = 0x56,
    ERR_VO_GRP_HAS_CREATED        = 0x57,
    ERR_VO_GRP_NOT_DESTROY        = 0x58,
    ERR_VO_GRP_CHN_FULL           = 0x59,
    ERR_VO_GRP_CHN_EMPTY          = 0x5a,
    ERR_VO_GRP_CHN_NOT_EMPTY      = 0x5b,
    ERR_VO_GRP_INVALID_SYN_MODE   = 0x5c,
    ERR_VO_GRP_INVALID_BASE_PTS   = 0x5d,
    ERR_VO_GRP_NOT_START          = 0x5e,
    ERR_VO_GRP_NOT_STOP           = 0x5f,
    ERR_VO_GRP_INVALID_FRMRATE    = 0x60,
    ERR_VO_GRP_CHN_HAS_REG        = 0x61,
    ERR_VO_GRP_CHN_NOT_REG        = 0x62,
    ERR_VO_GRP_CHN_NOT_UNREG      = 0x63,
    ERR_VO_GRP_BASE_NOT_CFG       = 0x64,

    ERR_GFX_NOT_DISABLE           = 0x65,
    ERR_GFX_NOT_BIND              = 0x66,
    ERR_GFX_NOT_UNBIND            = 0x67,
    ERR_GFX_INVALID_ID            = 0x68,

    ERR_VO_WBC_NOT_DISABLE        = 0x69,
    ERR_VO_WBC_NOT_CONFIG         = 0x6a,

    ERR_VO_CHN_AREA_OVERLAP       = 0x6b,

    EN_ERR_INVALID_WBCID          = 0x6c,
    EN_ERR_INVALID_LAYERID        = 0x6d,
    EN_ERR_VO_VIDEO_HAS_BINDED    = 0x6e,
    EN_ERR_VO_VIDEO_NOT_BINDED    = 0x6f,
    ERR_VO_WBC_HAS_BIND           = 0x70,
    ERR_VO_WBC_HAS_CONFIG         = 0x71, 
    ERR_VO_WBC_NOT_BIND           = 0x72,

    /* new added */
    ERR_VO_BUTT

}EN_VOU_ERR_CODE_E;

#define XM_TRACE_VO(level, fmt...) XM_TRACE(level, XM_ID_VOU,##fmt)

/* System define error code */
#define XM_ERR_VO_BUSY                  XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)
#define XM_ERR_VO_NO_MEM                XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
#define XM_ERR_VO_NULL_PTR              XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
#define XM_ERR_VO_SYS_NOTREADY          XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)
#define XM_ERR_VO_INVALID_DEVID         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID)
#define XM_ERR_VO_INVALID_CHNID         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
#define XM_ERR_VO_ILLEGAL_PARAM         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
#define XM_ERR_VO_NOT_SUPPORT          XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
#define XM_ERR_VO_NOT_PERMIT            XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
#define XM_ERR_VO_INVALID_WBCID         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_WBCID)
#define XM_ERR_VO_INVALID_LAYERID        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_LAYERID)


/* device relative error code */
#define XM_ERR_VO_DEV_NOT_CONFIG        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_CONFIG)
#define XM_ERR_VO_DEV_NOT_ENABLE        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_ENABLE)
#define XM_ERR_VO_DEV_HAS_ENABLED       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_ENABLED)
#define XM_ERR_VO_DEV_HAS_BINDED        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_BINDED)
#define XM_ERR_VO_DEV_NOT_BINDED        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_BINDED)

/* video relative error code */
#define XM_ERR_VO_VIDEO_NOT_ENABLE      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_ENABLE)
#define XM_ERR_VO_VIDEO_NOT_DISABLE     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_DISABLE)
#define XM_ERR_VO_VIDEO_NOT_CONFIG      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_CONFIG)
#define XM_ERR_VO_VIDEO_HAS_BINDED      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_HAS_BINDED)
#define XM_ERR_VO_VIDEO_NOT_BINDED      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_NOT_BINDED)

/*wbc error code*/
#define XM_ERR_VO_WBC_NOT_DISABLE     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_DISABLE)
#define XM_ERR_VO_WBC_NOT_CONFIG      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_CONFIG)
#define XM_ERR_VO_WBC_HAS_CONFIG      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_CONFIG)
#define XM_ERR_VO_WBC_NOT_BIND        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_BIND)
#define XM_ERR_VO_WBC_HAS_BIND        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_BIND)

/* channel relative error code */
#define XM_ERR_VO_CHN_NOT_DISABLE       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_DISABLE)
#define XM_ERR_VO_CHN_NOT_ENABLE        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ENABLE)
#define XM_ERR_VO_CHN_NOT_CONFIG        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_CONFIG)
#define XM_ERR_VO_CHN_NOT_ALLOC         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ALLOC)
#define XM_ERR_VO_CHN_AREA_OVERLAP      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_AREA_OVERLAP)


/* cascade relatvie error code */
#define XM_ERR_VO_INVALID_PATTERN       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_PAT)
#define XM_ERR_VO_INVALID_POSITION      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_POS)

/* misc */
#define XM_ERR_VO_WAIT_TIMEOUT          XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WAIT_TIMEOUT)
#define XM_ERR_VO_INVALID_VFRAME        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_VFRAME)
#define XM_ERR_VO_INVALID_RECT_PARA     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_RECT_PARA)
#define XM_ERR_VO_SETBEGIN_ALREADY      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_ALREADY)
#define XM_ERR_VO_SETBEGIN_NOTYET       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_NOTYET)
#define XM_ERR_VO_SETEND_ALREADY        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_ALREADY)
#define XM_ERR_VO_SETEND_NOTYET         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_NOTYET)

/* sync group relative error code */
#define XM_ERR_VO_GRP_INVALID_ID        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_ID)
#define XM_ERR_VO_GRP_NOT_CREATE        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_CREATE)
#define XM_ERR_VO_GRP_HAS_CREATED       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_HAS_CREATED)
#define XM_ERR_VO_GRP_NOT_DESTROY       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_DESTROY)
#define XM_ERR_VO_GRP_CHN_FULL          XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_FULL)
#define XM_ERR_VO_GRP_CHN_EMPTY         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_EMPTY)
#define XM_ERR_VO_GRP_CHN_NOT_EMPTY     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_EMPTY)
#define XM_ERR_VO_GRP_INVALID_SYN_MODE  XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_SYN_MODE)
#define XM_ERR_VO_GRP_INVALID_BASE_PTS  XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_BASE_PTS)
#define XM_ERR_VO_GRP_NOT_START         XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_START)
#define XM_ERR_VO_GRP_NOT_STOP          XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_STOP)
#define XM_ERR_VO_GRP_INVALID_FRMRATE   XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_FRMRATE)
#define XM_ERR_VO_GRP_CHN_HAS_REG       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_HAS_REG)
#define XM_ERR_VO_GRP_CHN_NOT_REG       XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_REG)
#define XM_ERR_VO_GRP_CHN_NOT_UNREG     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_UNREG)
#define XM_ERR_VO_GRP_BASE_NOT_CFG      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_BASE_NOT_CFG)


/* graphics relative error code */
#define XM_ERR_VO_GFX_NOT_DISABLE     XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_DISABLE)
#define XM_ERR_VO_GFX_NOT_BIND        XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_BIND)
#define XM_ERR_VO_GFX_NOT_UNBIND      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_UNBIND)
#define XM_ERR_VO_GFX_INVALID_ID      XM_DEF_ERR(XM_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_INVALID_ID)

/* vo inteface type */
#define VO_INTF_CVBS     (0x01L<<0)
#define VO_INTF_YPBPR    (0x01L<<1)
#define VO_INTF_VGA      (0x01L<<2)
#define VO_INTF_BT656    (0x01L<<3)
#define VO_INTF_BT1120   (0x01L<<4)
#define VO_INTF_HDMI     (0x01L<<5)
#define VO_INTF_LCD      (0x01L<<6)
#define VO_INTF_BT656_H  (0x01L<<7)
#define VO_INTF_BT656_L  (0x01L<<8)


/* WBC channel id*/
#define VO_WBC_CHN_ID    (VO_MAX_CHN_NUM + 1)

#define VO_DEFAULT_CHN      -1          /* use vo buffer as pip buffer */

/*****************************************************************************
 * 3520 ADDed
 *****************************************************************************/
typedef XM_S32 VO_INTF_TYPE_E;

//typedef XM_S32 VO_WBC_CHN;

typedef enum xmVO_INTF_SYNC_E
{
    VO_OUTPUT_PAL = 0,
    VO_OUTPUT_NTSC,
    VO_OUTPUT_960H_PAL,              /* ITU-R BT.1302 960 x 576 at 50 Hz (interlaced)*/
    VO_OUTPUT_960H_NTSC,             /* ITU-R BT.1302 960 x 480 at 60 Hz (interlaced)*/
    
    VO_OUTPUT_1080P24,
    VO_OUTPUT_1080P25,
    VO_OUTPUT_1080P30,
    
    VO_OUTPUT_720P50, 
    VO_OUTPUT_720P60,   
    VO_OUTPUT_1080I50,
    VO_OUTPUT_1080I60,    
    VO_OUTPUT_1080P50,
    VO_OUTPUT_1080P60,            

    VO_OUTPUT_576P50,
    VO_OUTPUT_480P60,

    VO_OUTPUT_640x480_60,            /* VESA 640 x 480 at 60 Hz (non-interlaced) CVT */
    VO_OUTPUT_800x600_60,            /* VESA 800 x 600 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1024x768_60,           /* VESA 1024 x 768 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1280x1024_60,          /* VESA 1280 x 1024 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1366x768_60,           /* VESA 1366 x 768 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1440x900_60,           /* VESA 1440 x 900 at 60 Hz (non-interlaced) CVT Compliant */
    VO_OUTPUT_1280x800_60,           /* 1280*800@60Hz VGA@60Hz*/    
    VO_OUTPUT_1680x1050_60,          /* VESA 1680 x 1050 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1920x2160_30,          /* 1920x2160_30 */
    VO_OUTPUT_1600x1200_60,          /* VESA 1600 x 1200 at 60 Hz (non-interlaced) */
    VO_OUTPUT_1920x1200_60,          /* VESA 1920 x 1600 at 60 Hz (non-interlaced) CVT (Reduced Blanking)*/ 
    VO_OUTPUT_2560x1440_30,          /* 2560x1440_30 */
    VO_OUTPUT_2560x1600_60,          /* 2560x1600_60 */
    VO_OUTPUT_3840x2160_30,          /* 3840x2160_30 */
    VO_OUTPUT_3840x2160_60,          /* 3840x2160_60 */
	VO_OUTPUT_480x272_60,			 /* 480x272_60*/
    VO_OUTPUT_USER,
    VO_OUTPUT_BUTT

} VO_INTF_SYNC_E;

typedef enum xmVO_DISPLAY_FIELD_E
{
  VO_FIELD_TOP,                 /* top field*/
  VO_FIELD_BOTTOM,              /* bottom field*/
  VO_FIELD_BOTH,                /* top and bottom field*/
  VO_FIELD_BUTT
} VO_DISPLAY_FIELD_E;

typedef enum xmVOU_ZOOM_IN_E
{
    VOU_ZOOM_IN_RECT = 0,       /* zoom in by rect */
    VOU_ZOOM_IN_RATIO,          /* zoom in by ratio */
    VOU_ZOOM_IN_BUTT
} VOU_ZOOM_IN_E;

typedef enum xmVO_CSC_MATRIX_E
{
    VO_CSC_MATRIX_IDENTITY = 0,         /* do not change color space */
    
    VO_CSC_MATRIX_BT601_TO_BT709,       /* change color space from BT.601 to BT.709 */
    VO_CSC_MATRIX_BT709_TO_BT601,       /* change color space from BT.709 to BT.601 */

    VO_CSC_MATRIX_BT601_TO_RGB_PC,      /* change color space from BT.601 to RGB */
    VO_CSC_MATRIX_BT709_TO_RGB_PC,      /* change color space from BT.709 to RGB */

    VO_CSC_MATRIX_RGB_TO_BT601_PC,      /* change color space from RGB to BT.601 */
    VO_CSC_MATRIX_RGB_TO_BT709_PC,      /* change color space from RGB to BT.709 */

    VO_CSC_MATRIX_BUTT
} VO_CSC_MATRIX_E;

typedef struct xmVO_CHN_ATTR_S
{
    XM_U32  u32Priority;                /* video out overlay pri sd */
    RECT_S  stRect;                     /* rect of video out chn */
    XM_BOOL bDeflicker;                 /* deflicker or not sd */
}VO_CHN_ATTR_S;

typedef struct tagVO_SYNC_INFO_S
{
    XM_BOOL  bSynm;     /* sync mode(0:timing,as BT.656; 1:signal,as LCD) */
    XM_BOOL  bIop;      /* interlaced or progressive display(0:i; 1:p) */
    XM_U8    u8Intfb;   /* interlace bit width while output */

    XM_U16   u16Vact ;  /* vertical active area */
    XM_U16   u16Vbb;    /* vertical back blank porch */
    XM_U16   u16Vfb;    /* vertical front blank porch */

    XM_U16   u16Hact;   /* herizontal active area */
    XM_U16   u16Hbb;    /* herizontal back blank porch */
    XM_U16   u16Hfb;    /* herizontal front blank porch */
    XM_U16   u16Hmid;   /* bottom herizontal active area */

    XM_U16   u16Bvact;  /* bottom vertical active area */
    XM_U16   u16Bvbb;   /* bottom vertical back blank porch */
    XM_U16   u16Bvfb;   /* bottom vertical front blank porch */

    XM_U16   u16Hpw;    /* horizontal pulse width */
    XM_U16   u16Vpw;    /* vertical pulse width */

    XM_BOOL  bIdv;      /* inverse data valid of output */
    XM_BOOL  bIhs;      /* inverse horizontal synch signal */
    XM_BOOL  bIvs;      /* inverse vertical synch signal */

} VO_SYNC_INFO_S;

typedef struct xmVO_PUB_ATTR_S
{
    XM_U32                   u32BgColor;          /* Background color of a device, in RGB format. */
    VO_INTF_TYPE_E           enIntfType;          /* Type of a VO interface */
    VO_INTF_SYNC_E           enIntfSync;          /* Type of a VO interface timing */
    VO_SYNC_INFO_S           stSyncInfo;          /* Information about VO interface timings */
} VO_PUB_ATTR_S;

typedef struct xmVO_WBC_ATTR_S
{
    SIZE_S              stTargetSize;        /* WBC Zoom target size */ 
    PIXEL_FORMAT_E      enPixelFormat;       /* the pixel format of WBC output */
    XM_U32              u32FrameRate;        /* frame rate control */    
} VO_WBC_ATTR_S;

typedef enum xmVO_WBC_MODE_E
{
    VO_WBC_MODE_NOMAL = 0,                  /* In this mode, wbc will capture frames according to dev frame rate
                                                    and wbc frame rate */
    VO_WBC_MODE_DROP_REPEAT,                /* In this mode, wbc will drop dev repeat frame, and capture the real frame
                                                    according to video layer's display rate and wbc frame rate */
    VO_WBC_MODE_PROG_TO_INTL,               /* In this mode, wbc will drop dev repeat frame which repeats more than 3 times,
                                                     and change two progressive frames to one interlace frame */
    
    VO_WBC_MODE_BUTT,
} VO_WBC_MODE_E;


typedef enum xmVO_WBC_SOURCE_TYPE_E
{
    VO_WBC_SOURCE_DEV      = 0x0,          /* WBC source is device */
    VO_WBC_SOURCE_VIDEO    = 0x1,          /* WBC source is video layer */
    VO_WBC_SOURCE_GRAPHIC  = 0x2,          /* WBC source is graphic layer, not support */
    
    VO_WBC_SOURCE_BUTT
} VO_WBC_SOURCE_TYPE_E;

typedef struct xmVO_WBC_SOURCE_S
{
    VO_WBC_SOURCE_TYPE_E enSourceType;    /* the type of WBC source */
    XM_U32 u32SourceId;                   /* the device, video layer or graphic layer */
} VO_WBC_SOURCE_S;

typedef enum xmVO_CAS_MODE_E
{
    VO_CAS_MODE_SINGLE = 0,        /* cascade mode is single */
    VO_CAS_MODE_DUAL,              /* cascade mode is dual */
    VO_CAS_MODE_BUTT,
} VO_CAS_MODE_E;

typedef enum xmVO_CAS_DATA_TRAN_MODE_E
{
    VO_CAS_DATA_SINGLE_TRAN_MODE = 0, /* single transition,clock rising edge or clock falling edge tigger transition */
    VO_CAS_DATA_DOUBLE_TRAN_MODE,     /* double transition,clock rising edge and clock falling edge tigger transition */
    VO_CAS_DATA_MODE_BUTT,
} VO_CAS_DATA_TRAN_MODE_E;

typedef enum xmVO_CAS_RGN_E
{
    VO_CAS_64_RGN = 0,        
    VO_CAS_32_RGN,            
    VO_CAS_RGN_BUTT,
} VO_CAS_RGN_E;            /* cascade region number */

typedef struct xmVO_CAS_ATTR_S
{
    XM_BOOL         bSlave;                         /* XM_TRUE: slave mode, XM_FALSE: master mode */
    VO_CAS_RGN_E    enCasRgn;                       /* cascade region number */
    VO_CAS_MODE_E   enCasMode;                      /* cascade mode */
    VO_CAS_DATA_TRAN_MODE_E enCasDataTranMode;      /* cascade data transition mode  */
} VO_CAS_ATTR_S;

typedef enum xmVO_PART_MODE_E
{
    VO_PART_MODE_SINGLE	= 0,		/* single partition, which use software to make multi-picture in one hardware cell */
	VO_PART_MODE_MULTI	= 1,		/* muliti partition, each partition is a hardware cell */
	VO_PART_MODE_BUTT
	
} VO_PART_MODE_E;

typedef struct xmVO_COMPRESS_ATTR_S
{
    XM_BOOL bSupportCompress;          /* Whether to support compress */
}VO_COMPRESS_ATTR_S;

typedef struct xmVO_VIDEO_LAYER_ATTR_S
{
    RECT_S stDispRect;                  /* Display resolution */
    SIZE_S stImageSize;                 /* Canvas size of the video layer */
    XM_U32 u32DispFrmRt;                /* Display frame rate */
    PIXEL_FORMAT_E enPixFormat;         /* Pixel format of the video layer */
    XM_BOOL bDoubleFrame;               /* Whether to double frames */  
    XM_BOOL bClusterMode;               /* Whether to take Cluster way to use memory*/
} VO_VIDEO_LAYER_ATTR_S;

typedef enum xmVOU_LAYER_DDR_E
{
    VOU_LAYER_DDR0 = 0,
    VOU_LAYER_DDR1 = 1,
    VOU_LAYER_DDR_BUTT
}VOU_LAYER_DDR_E;

typedef struct xmVO_ZOOM_RATIO_S
{
    XM_U32 u32XRatio;
    XM_U32 u32YRatio;
    XM_U32 u32WRatio;
    XM_U32 u32HRatio;    
} VO_ZOOM_RATIO_S;

typedef struct xmVO_ZOOM_ATTR_S
{
    VOU_ZOOM_IN_E   enZoomType;         /* choose the type of zoom in */
    union
    {
        RECT_S          stZoomRect;     /* zoom in by rect */
        VO_ZOOM_RATIO_S stZoomRatio;    /* zoom in by ratio */
    };
} VO_ZOOM_ATTR_S;

typedef struct xmVO_CSC_S
{
    VO_CSC_MATRIX_E enCscMatrix;
    XM_U32 u32Luma;                     /* luminance:   0 ~ 100 default: 50 */
    XM_U32 u32Contrast;                 /* contrast :   0 ~ 100 default: 50 */
    XM_U32 u32Hue;                      /* hue      :   0 ~ 100 default: 50 */
    XM_U32 u32Saturation;               /* saturation:  0 ~ 100 default: 50 */
} VO_CSC_S;

typedef struct xmVO_VGA_PARAM_S
{
    VO_CSC_S stCSC;                     /* color space */
    XM_U32 u32Gain;                     /* current gain of VGA signals. [0, 64). default:0x30 */
    XM_S32 s32SharpenStrength;          /* current sharpen strength of VGA signals. [0, 255]. default:0x80 */
} VO_VGA_PARAM_S;

typedef struct xmVO_HDMI_PARAM_S
{
    VO_CSC_S stCSC;                    /* color space */
} VO_HDMI_PARAM_S;

typedef struct xmVO_REGION_INFO_S
{
    RECT_S *pstRegion;         /*region attribute*/
    XM_U32 u32RegionNum;       /*count of the region*/
}VO_REGION_INFO_S;

typedef struct xmVO_IMAGE_LAYER_ATTR_S
{
    RECT_S stDispRect;                  /* Display resolution */
    PIXEL_FORMAT_E enPixFormat;         /* Pixel format of the video layer */
	XM_U32  u32PhyAddr;
	XM_U32  u32Effect;                  /*0-7 tran;8-15 tran0;16-23 tran1; 24-27 HUP;28-31VUP */
} VO_IMAGE_LAYER_ATTR_S;

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

#endif /* End of #ifndef __XM_COMM_VO_H__ */