///////////////////////////////////////////////////////////////////////////
// HIKVISION DS-4xxx/iDS-4xxx/DS-5xxx series SYSTEM SDK					 //	
// Copyright (c) 2004-2010 Hangzhou Hikvision digtial technology co,. ltd//
/////////////////////////////////////////////////////////////////////////// 

#ifndef DATA_TYPE_H
#define DATA_TYPE_H
#define FRAME_HEAD_MAGIC 0x03211546 
#define SYSTEM_SYNC_ID	2

#ifdef __LINUX__
typedef unsigned char			UCHAR;
typedef unsigned char*          PBYTE;
typedef char*					LPTSTR;
typedef	unsigned short		 	USHORT;
typedef int                     HANDLE;
typedef unsigned long           ULONG;
typedef unsigned long           DWORD;
#endif //#ifdef __LINUX__

typedef struct tagFrameInfo{
	ULONG	SyncId; /* 00000000000000000000000000010b */
	ULONG	Magic;
	USHORT	FrameType; /* I frames , P frames or BBP frames Audio frames or dsp status etc */
	ULONG	Length; /*lenth include this header */
	ULONG	FrameNumber; /* serial number of this frame */
	UCHAR	Breakable; /* indicate if stream breakable, you could restart new file(with PktSysHeader) if true */
	/*ULONG   Ack;*/
	ULONG	PTS; /* system clock when this frames is processed */
}TMFRAME_HEADER, *PTMFRAME_HEADER;

typedef enum {
   StandardNone                   = 0x80000000,
   StandardNTSC                   = 0x00000001,
   StandardPAL                    = 0x00000002,
   Standard720P_24HZ              = 0x00000003,
   Standard720P_25HZ              = 0x00000004,
   Standard720P_30HZ              = 0x00000005,
   Standard720P_50HZ              = 0x00000006,
   Standard720P_60HZ              = 0x00000007,
   Standard1080I_50HZ             = 0x00000008,
   Standard1080I_60HZ             = 0x00000009,
   Standard1080P_24HZ             = 0x0000000a,
   Standard1080P_25HZ             = 0x0000000b,
   Standard1080P_30HZ             = 0x0000000c,
   Standard1080P_50HZ             = 0x0000000d,
   Standard1080P_60HZ             = 0x0000000e
} VideoStandard_t;               


typedef enum {
	PktError = 0,
	PktIFrames = 0x0001,
	PktPFrames = 0x0002,
	PktBBPFrames = 0x0004,
	PktAudioFrames = 0x0008,
	PktMotionDetection = 0x00010,
	PktDspStatus = 0x00020,
	PktOrigImage = 0x00040,
	PktSysHeader = 0x00080,
	PktBPFrames = 0x00100,
	PktSFrames = 0x00200,
	PktSubIFrames = 0x00400,
	PktSubPFrames = 0x00800,
	PktSubBBPFrames = 0x01000,
	PktSubSysHeader = 0x02000,
	PktVQDScore = 0x04000,
	PktSMDFrames = 0x08000
}FrameType_t;

typedef struct tagVersion{
	ULONG DspVersion, DspBuildNum;
	ULONG DriverVersion, DriverBuildNum;
	ULONG SDKVersion, SDKBuildNum;
}VERSION_INFO, *PVERSION_INFO;

typedef enum {
	ENC_CIF_FORMAT = 0,
	ENC_QCIF_FORMAT = 1,
	ENC_2CIF_FORMAT = 2,
	ENC_4CIF_FORMAT = 3,
	ENC_QQCIF_FORMAT = 4,
	ENC_CIFQCIF_FORMAT =5,
	ENC_CIFQQCIF_FORMAT =6,
	ENC_DCIF_FORMAT =7,
	ENC_VGA_FORMAT=8,
	ENC_HD_Q_FORMAT=9,
	ENC_HD_H_FORMAT=10,
	ENC_HD_F_FORMAT=11,
	ENC_WD1_FORMAT=12
}PictureFormat_t;
	
typedef struct tagMotionData{
	PictureFormat_t PicFormat;
	ULONG HorizeBlocks;
	ULONG VerticalBlocks;
	ULONG BlockSize;
}MOTION_DATA_HEADER, *PMOTION_DATA_HEADER;


#define _OSD_BASE			0x9000				/*base address of special character*/
#define	_OSD_YEAR4			(_OSD_BASE+0)		/*show year time by length of 4 , for example: 2005*/
#define _OSD_YEAR2			(_OSD_BASE+1)		/*show year time by length of 2, for example: 05	*/
#define _OSD_MONTH3			(_OSD_BASE+2)		/*show month time in English, for example: Jan*/
#define _OSD_MONTH2			(_OSD_BASE+3)		/*show month time by two Arabic numerals, for example: 07*/
#define _OSD_DAY			(_OSD_BASE+4)		/*show day time by two Arabic numerals, for example: 31*/
#define _OSD_WEEK3			(_OSD_BASE+5)		/*show week time in English: MON¡«SUN*/
#define	_OSD_CWEEK1			(_OSD_BASE+6)		/*show week time in Chinese GB code*/
#define	_OSD_HOUR24			(_OSD_BASE+7)		/*show 24 hours clock: 00¡«23	*/
#define	_OSD_HOUR12			(_OSD_BASE+8)		/*show 12 hours clock: 00¡«12*/
#define	_OSD_MINUTE			(_OSD_BASE+9)		/*show minute time by length of 2: 00¡«59*/
#define _OSD_SECOND			(_OSD_BASE+10)		/*show second time by length of 2: 00¡«59*/
#define _OSD_MILISECOND		(_OSD_BASE+11)		/*show millisecond time by length of 3: 000~999*/
#define _OSD_APM			(_OSD_BASE+14)		/*show a.m. or p.m. by length of 2 bit, AM or PM*/

//For new added APIs to set OSD: SetEncoderOsdDisplayMode, SetDecoderOsdDisplayMode and SetDisplayOsdDisplayMode in v6.0 SDK, we use new basic address of special character.
#define _OSD_BASE_EX		0x90000				/*base address of special character*/
#define	_OSD_YEAR4_EX		(_OSD_BASE_EX+0)	/*the same as _OSD_YEAR4*/
#define _OSD_YEAR2_EX		(_OSD_BASE_EX+1)	/*the same as _OSD_YEAR2*/
#define _OSD_MONTH3_EX		(_OSD_BASE_EX+2)	/*the same as _OSD_MONTH3*/
#define _OSD_MONTH2_EX		(_OSD_BASE_EX+3)	/*the same as _OSD_MONTH2*/
#define _OSD_DAY_EX			(_OSD_BASE_EX+4)	/*the same as _OSD_DAY*/
#define _OSD_WEEK3_EX		(_OSD_BASE_EX+5)	/*the same as _OSD_WEEK3*/
#define	_OSD_CWEEK1_EX		(_OSD_BASE_EX+6)	/*the same as _OSD_CWEEK1*/
#define	_OSD_HOUR24_EX		(_OSD_BASE_EX+7)	/*the same as _OSD_HOUR24*/
#define	_OSD_HOUR12_EX		(_OSD_BASE_EX+8)	/*the same as _OSD_HOUR12*/
#define	_OSD_MINUTE_EX		(_OSD_BASE_EX+9)	/*the same as _OSD_MINUTE*/
#define _OSD_SECOND_EX		(_OSD_BASE_EX+10)	/*the same as _OSD_SECOND*/
#define _OSD_MILISECOND_EX	(_OSD_BASE_EX+11)	/*the same as _OSD_MILISECOND*/
#define _OSD_APM_EX			(_OSD_BASE_EX+14)	/*the same as _OSD_APM*/

/* SMD */
typedef struct
{
	float x;            //x coordinate:[0,1]
	float y;            //y coordinate:[0,1]
}POINT_F;

typedef struct
{
	unsigned int vertexNum;					  //vertex num
	POINT_F point[10];						  //coordinate 
}POLYGON_F;


#endif
