#ifndef _IPCMD_H_
#define _IPCMD_H_	

/************************************************
*	define
************************************************/
#ifdef __cplusplus
#define AVSAPI	  extern "C"	__declspec (dllexport)	/* a reference to a GLOBAL function */
#else
#define AVSAPI	  extern	/* a reference to a GLOBAL function */
#endif

#define MAKEFOURCC(ch0, ch1, ch2, ch3)                              \
		((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   \
		((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))

#define	FOURCC_YUY2             MAKEFOURCC( 'Y', 'U', 'Y', '2' )
#define	FOURCC_I420             MAKEFOURCC( 'I', '4', '2', '0' )
#define	FOURCC_BGR24            MAKEFOURCC( 'R', 'G', 'B', '3' )

#define	HCODEC	void*

/************************************************
*	Flags to ipcd_decode_info
************************************************/
#define FLAG_SUBNAIL			0x01
#define FLAG_SHIELD				0x02
#define FLAG_MULTISHIELD		0x04	// 2008.11.06 Ray
#define FLAG_FIELDMERGE			0x08	// 2009.04.07	Merge even odd field to one frame
#define FLAG_JPGINVERSE			0x10	// MJPG transform to IJPG
#define FLAG_SOLO_DECRYPTION	0x20	// For SOLO H264 Decryption

#ifndef AVSCODEC_H	//To avoid redefinition to avscodec.h
/************************************************
*	nMode to ipcd_downscale_info
************************************************/
#define FLAG_RES_FULL           0x00000000
#define FLAG_RES_HALF           0x00000001		// 1/2 * 1/2 original size
#define FLAG_RES_QUARTER        0x00000002		// 1/4 * 1/4 original size
#define FLAG_RES_AUTO           0x00000003		// Downscale resolution depend on input size

/************************************************
*	Error Code
************************************************/
typedef	enum	{
	AVSCODEC_OK = 0,
	AVSCODEC_FAILED,
	AVSCODEC_OUT_OF_MEMORY,
	AVSCODEC_NOT_SUPPORTED,
	AVSCODEC_HARDWARE_NOT_FOUND,
	AVSCODEC_HARDWARE_INITIAL_ERROR,
	AVSCODEC_INVALID_HANDLE,
	AVSCODEC_INVALID_PARAMETER,
	AVSCODEC_INVALID_SERIAL_NUMBER,
	AVSCODEC_INPUT_OUT_OF_RANGE,
	AVSCODEC_CANCELED_BY_USER,
	AVSCODEC_FRAME_NOT_READY,
	AVSCODEC_FRAME_EXHAUSTED,
	AVSCODEC_BUFFER_OVERRUN,
	AVSCODEC_NO_SIGNAL,
	AVSCODEC_STREAMSTILLRUNNING,
	// AVI Module
	AVSCODEC_CANTOPENAVIFILE,
	AVSCODEC_CANTCREATESTREAM,
	AVSCODEC_CANTMAKECOMPRESSION,
	AVSCODEC_CANTSETFORMAT,
	AVSCODEC_FAILEDTOWRITEFRAME,
	// CODEC Module
	AVSCODEC_NO_CODEC_FOUND,
	AVSCODEC_BAD_FORMAT,
	AVSCODEC_DECRYPTION_OK,
	AVSCODEC_NEED_CRYPTION_KEY,
	AVSCODEC_WRONG_CRYPTION_KEY,
	AVSCODEC_END_OF_STREAM,
	AVSCODEC_DECODE_VOLHEADER,
	AVSCODEC_SHIELD_OK,
	AVSCODEC_NEED_SHIELD_KEY,
	AVSCODEC_WRONG_SHIELD_KEY,
	AVSCODEC_DECODE_NOT_RETURN_NOPICTURE,	// got_picture = 0AB`decodeɡAjXG  Ray 2009.06.25
	AVSCODEC_TOTAL
} AVSCODEC;
#endif

/************************************************
*	ipcmd_init
************************************************/
typedef struct {
	DWORD		dwCryptionKeyPublic;	// Public key for crypt
	DWORD		dwCryptionKeyPrivate;	// Private key for crypt
	bool		bDoWatermark;			// Do watermark or not
	LPBYTE		pattern;				// Watermark pattern
	AVSCODEC	err_code;				// Init error message
	DWORD		Reserve1;
	DWORD		Reserve2;
	DWORD		Reserve3;
	DWORD		Reserve4;
} ipcd_init;

/************************************************
*	decode_info
************************************************/
typedef struct{
	/**
	 MultiShield:
		Element Numbers in a row and a column of MultiShield Array
	*/
	int					width;
	int					height;

	bool				bDoDeblock;				// Do deblock or not
	DWORD				dwColorSpace;			// Color Space
	int					wm_ratio;				// Watermark accurate ratio
	AVSCODEC			err_code;				// Decoder error message
	bool				bDecodeHeader;			// Only decode header
	bool				bDecodeHeaderOK;		// Decode I-frame header OK
	BYTE				flags;
	BYTE				Reserve1;

	/**
	 Shield: 
		Shield width and Shield height
	*/
	unsigned __int16	shield_width;
	unsigned __int16	shield_height;

	/**
	 Shield: 
		Shield start point x and y
	 MultiShield:
		shield_startpoint_x: First two bytes of multi-shield array address
		shield_startpoint_y: Last two bytes of multi-shield array address
	*/
	unsigned __int16	shield_startpoint_x;
	unsigned __int16	shield_startpoint_y;


	DWORD				Reserve2;
} ipcd_decode_info;

#ifndef AVSCODEC_H	//To avoid redefinition to avscodec.h
/************************************************
*	ipcd_downscale_info
************************************************/
typedef struct {
	int			nSize;				// Structure size
	BYTE		Version;
	int			nMode;				// DownScale Mode: 0->Full, 1->1/2, 2->1/4, 3->AUTO
	int			nPreviewWidth;		// Width of tha AP preview rect
	int			nPreviewHeight;		// Height of tha AP preview rect
	int			nFrameWidth;		// Width of the actual frame
	int			nFrameHeight;		// Height of the actual frame
	DWORD		Reserve1;
} ipcd_downscale_info;
#endif

/************************************************
*	extern functions
************************************************/
AVSAPI	void*	InitDecoder( ipcd_init *init);
AVSAPI	void*	DecodeFrame(void* handle, unsigned char *pInputBuffer, int *pnLen, ipcd_decode_info *pDecInfo);
AVSAPI	int		FreeDecoder(void* handle);
AVSAPI	int		SetDownscaleStatus(void* handle, void* pScaleInfo);

#endif