
#ifndef __DECODE_PLAYSDK_H__
#define __DECODE_PLAYSDK_H__
#include <time.h>
#ifndef WIN32
#include "osindependent.h"
#define CALLMETHOD
#define CALLBACK
#define LPCSTR                      char*
#define PBYTE                       char*
#define PCSTR                       char*
#define PLAY_SDK_API extern "C"
#define FLOAT                       float
#define COLORREF                    DWORD
#else
#define PLAY_SDK_API extern "C" __declspec(dllexport)

#define CALLMETHOD						__stdcall
#define CALLBACK						__stdcall
#endif
#define PLAY_SDK_MAX_PORT				100				//< 最大播放通道数

//波形调整因子最大最小值宏定义
#define PLAY_SDK_MIN_WAVE_COEF			-100			//< 最小波形调整因子
#define PLAY_SDK_MAX_WAVE_COEF			100				//< 最大波形调整因子

//定时器类型宏定义
#define PLAY_SDK_TIMER_1				1				//< 默认定时器, 精确定时，但一个进程中只有16个
#define PLAY_SDK_TIMER_2				2				//< 不精确定时、个数不限制 

//缓冲类型宏定义
#define PLAY_SDK_BUF_VIDEO_SRC			1				//< 视频源缓冲        
#define PLAY_SDK_BUF_AUDIO_SRC			2				//< 音频源缓冲
#define PLAY_SDK_BUF_VIDEO_RENDER		3				//< 解码后视频数据缓冲
#define PLAY_SDK_BUF_AUDIO_RENDER		4				//< 解码后音频数据缓冲

//错误类型宏定义
#define	PLAY_SDK_NOERROR				0           	//< 没有错误;
#define PLAY_SDK_PARA_OVER				1           	//< 输入参数非法;
#define PLAY_SDK_ORDER_ERROR			2           	//< 调用顺序出错;
#define PLAY_SDK_TIMER_ERROR			3           	//< 多媒体时钟设置失败;
#define PLAY_SDK_DEC_VIDEO_ERROR		4	        	//< 视频解码失败;
#define PLAY_SDK_DEC_AUDIO_ERROR		5	        	//< 音频解码失败;
#define PLAY_SDK_ALLOC_MEMORY_ERROR		6		    	//< 分配内存失败;
#define PLAY_SDK_OPEN_FILE_ERROR		7				//< 文件操作失败;
#define PLAY_SDK_CREATE_OBJ_ERROR		8	        	//< 创建线程事件等失败;
#define PLAY_SDK_CREATE_DDRAW_ERROR		9		    	//< 创建directDraw失败;
#define PLAY_SDK_CREATE_OFFSCREEN_ERROR	10		    	//< 创建后端缓存失败;
#define PLAY_SDK_BUF_OVER				11	        	//< 缓冲区满, 输入流失败;
#define PLAY_SDK_CREATE_SOUND_ERROR		12		    	//< 创建音频设备失败;
#define PLAY_SDK_SET_VOLUME_ERROR		13	        	//< 设置音量失败;
#define PLAY_SDK_SUPPORT_FILE_ONLY		14		    	//< 只能在播放文件时才能使用此接口;
#define PLAY_SDK_SUPPORT_STREAM_ONLY	15		    	//< 只能在播放流时才能使用此接口;
#define PLAY_SDK_SYS_NOT_SUPPORT		16		    	//< 系统不支持, 解码器只能工作在Pentium 3以上;
#define PLAY_SDK_FILEHEADER_UNKNOWN		17		    	//< 没有文件头;
#define PLAY_SDK_VERSION_INCORRECT		18	        	//< 解码器和编码器版本不对应;
#define PLAY_SDK_INIT_DECODER_ERROR		19		    	//< 初始化解码器失败;
#define PLAY_SDK_CHECK_FILE_ERROR		20		    	//< 文件太短或码流无法识别;
#define PLAY_SDK_INIT_TIMER_ERROR		21				//< 初始化多媒体时钟失败;
#define PLAY_SDK_BLT_ERROR				22				//< 位拷贝失败;
#define PLAY_SDK_UPDATE_ERROR			23				//< 显示overlay失败;

#define PLAY_SDK_MAX_DISPLAY_WND		4				//< 同时最多打开4个区域显示窗口;

//显示类型宏定义
#define PLAY_SDK_DISPLAY_NORMAL			1				//< 以正常分辨率显示;
#define PLAY_SDK_DISPLAY_QUARTER		2				//< 以1/4分辨率显示;

//解码缓冲帧数最大最小值宏定义
#define PLAY_SDK_MAX_DIS_FRAMES			50				//< 最大解码缓冲帧数
#define PLAY_SDK_MIN_DIS_FRAMES			6				//< 最小解码缓冲帧数

//定位类型宏定义
#define PLAY_SDK_BY_FRAMENUM			1				//< 按帧号定位
#define PLAY_SDK_BY_FRAMETIME			2				//< 按时间定位

//数据流原始缓冲最大最小值宏定义
#define PLAY_SDK_SOURCE_BUF_MAX			(1024 * 100000) //< 最大原始缓冲
#define PLAY_SDK_SOURCE_BUF_MIN			(1024 * 50)		//< 最小原始缓冲

//数据流播放模式宏定义
#define PLAY_SDK_STREAME_REALTIME		0				//< 数据流模式 会尽量保正实时性, 防止数据阻塞; 而且数据检查严格;
#define PLAY_SDK_STREAME_FILE			1				//< 文件模式 则不然.(按帧率播放)

//解码音频回调帧类型宏定义
#define PLAY_SDK_AUDIO16				101				//< 采样率16khz单声道, 每个采样点16 位表示
#define PLAY_SDK_AUDIO8					100				//< 采样率8khz,单声道,每个采样点8位表示

#define PLAY_SDK_UYVY					1				//< uyvy 格式“U0-Y0-V0-Y1-U2-Y2-V2-Y3….”,第一个像素位于图像左上角;
#define PLAY_SDK_YV12					3				//< yv12 格式。排列顺序“Y0-Y1-……”,“V0-V1….”,“U0-U1-…..”;
#define PLAY_SDK_RGB32					7				//< 每个像素4 个字节,排列方式与位图相似,“B-G-R-0 …”,第一个像素位于图像左下角;

//系统支持的功能宏定义，用于按位表示系统功能
#define PLAY_SDK_SUPPORT_DDRAW			0x0001			//< 支持DIRECTDRAW；如果不支持，则播放器不能工作。
#define PLAY_SDK_SUPPORT_BLT			0x0002			//< 显卡支持BLT操作；如果不支持，则播放器不能工作
#define PLAY_SDK_SUPPORT_BLTFOURCC		0x0004			//< 显卡BLT支持颜色转换；
#define PLAY_SDK_SUPPORT_BLTSHRINKX		0x0008			//< 显卡BLT支持X轴缩小；
#define PLAY_SDK_SUPPORT_BLTSHRINKY		0x0010			//< 显卡BLT支持Y轴缩小；
#define PLAY_SDK_SUPPORT_BLTSTRETCHX	0x0020			//< 显卡BLT支持X轴放大；
#define PLAY_SDK_SUPPORT_BLTSTRETCHY	0x0040			//< 显卡BLT支持Y轴放大；
#define PLAY_SDK_SUPPORT_SSE			0x0080			//< CPU支持SSE指令,Intel Pentium3以上支持SSE指令；
#define PLAY_SDK_SUPPORT_MMX			0x0100			//< CPU支持MMX指令集。

//查询信息命令宏定义
#define PLAY_SDK_QUERYINFO_CMD_GETTIME		1
#define PLAY_SDK_QUERYINFO_CMD_GETFILERATE	2

//文件类型
typedef enum
{
	PLAY_SDK_MEDIA_FILE_NONE			= 0,			//< 无文件
	PLAY_SDK_MEDIA_FILE_H264			= 1,			//< H264文件
	PLAY_SDK_MEDIA_FILE_AVI				= 2,			//< AVI文件
	PLAY_SDK_MEDIA_FILE_RMVB			= 3,			//< RMVB文件
	PLAY_SDK_MEDIA_FILE_MPG4			= 4,			//< MP4文件
	PLAY_SDK_MEDIA_FILE_NUM
}PLAY_SDK_MEDIA_FILE_TYPE;
#ifndef SYSTEMTIME
#ifndef WIN32
typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;
#endif
#endif
//出差帧信息
typedef struct
{
	long			nFilePos;							//< 指定帧在文件中的偏移位置
	long			nFrameNum;							//< 帧序号
	long			nFrameTime;							//< 帧时间
	long			nErrorFrameNum;						//< 错误帧号
	SYSTEMTIME*		pErrorTime;							//< 错误帧时间
	long			nErrorLostFrameNum;					//< 错误帧帧号
	long			nErrorFrameSize;					//< 错误帧大小
}PLAY_SDK_FRAME_POS,*PPLAY_SDK_FRAME_POS;

//播放帧信息
typedef struct
{
	long			nWidth;								//< 画面宽，单位像素。如果是音频数据则为0；
	long			nHeight;							//< 画面高。如果是音频数据则为0；
	long			nStamp;								//< 时标信息，单位毫秒。
	long			nType;								//< 数据类型，PLAY_SDK_AUDIO16，PLAY_SDK_RGB32， PLAY_SDK_YV12，详见宏定义说明。
	long			nFrameRate;							//< 编码时产生的图像帧率。
}PLAY_SDK_FRAME_INFO;

//帧类型
typedef struct 
{
	char*			pDataBuf;							//< 帧数据
	long			nSize;								//< 帧大小
	long			nFrameNum;							//< 帧序号
	BOOL			bIsAudio;							//< 是否音频帧
	long			nReserved;							//< 保留字
}PLAY_SDK_FRAME_TYPE;

//码流类型
enum PLAY_SDK_ENCODE_TYPE
{
	StreamEmpty						= 0,			//< 空码流
	StreamH264						= 2,			//< H264码流
	StreamJpeg						= 3,			//< JPEG码流
	StreamGeneral					= 4,			//< 普通码流
	StreamPCM8						= 7,			//< PCM8码流
	StreamStd						= 8				//< 标准码流
};

//图像帧类型
enum PLAY_SDK_VIDEO_FRAME_TYPE
{
	FrameUnknown					= 0,			//< 位置类型
	FrameVideo						= 1,			//< 视频帧
	FrameAudio						= 2,			//< 音频帧
	FrameData						= 3				//< 
};

//图像帧子类型
enum PLAY_SDK_VIDEO_FRAME_SUB_TYPE
{
	FrameSubIFrame					= 0,			//< 
	FrameSubPFrame					= 1,			//<
	FrameSubBFrame					= 2,			//< 
	FrameSubSFrame					= 3,			//< 
	FrameSubDataText				= 5,			//< 
	FrameSubDataIntl				= 6				//< 
};

//视频帧信息
typedef struct 
{
	unsigned char*		pHeader;						//< 帧数据缓冲起始地址
	unsigned char*		pContent;						//< 
	unsigned long		nLength;						//< 
	unsigned long		nFrameLength;					//< 
	unsigned int		nType;							//< 见VIDEO_FRAME_TYPE
	unsigned int		nSubType;						//< 见VIDEO_FRAME_SUB_TYPE
	unsigned int		nEncodeType;					// 见ENCODE_TYPE
	unsigned long		nYear;							//< 帧时间戳 - 年
	unsigned long		nMonth;							//< 帧时间戳 - 月
	unsigned long		nDay;							//< 帧时间戳 - 日
	unsigned long		nHour;							//< 帧时间戳 - 时
	unsigned long		nMinute;						//< 帧时间戳 - 分
	unsigned long		nSecond;						//< 帧时间戳 - 秒
	unsigned long		nTimeStamp;						//< 帧时间戳, 格式:
	unsigned int		nFrameRate;						//< 视频图像帧率
	int					nWidth;							//< 视频图像宽度
	int					nHeight;						//< 视频图像高度
	unsigned long		nRequence;						//< 
	unsigned int		nChannels;						//< 
	unsigned int		nBitsPerSample;					//< 音频采样位深
	unsigned int		nSamplesPerSecond;				//< 音频采样率
	unsigned long		nParam1;						//< 预留字段1, 扩展用
	unsigned long		nParam2;						//< 预留字段2, 扩展用
} PLAY_SDK_VIDEO_FRAME_INFO;
#ifdef WIN32
//字体类型，目前只支持这些
typedef enum 
{
	PLAY_SDK_OSD_TXT_FONT_ARIAL					= 1,			//< Arial字体
	PLAY_SDK_OSD_TXT_FONT_SERIF,									//< Serif字体
	PLAY_SDK_OSD_TXT_FONT_SANS,									//< Sans字体
	PLAY_SDK_OSD_TXT_FONT_SIMSUN					= 101,			//< 中文字体, 宋体
	PLAY_SDK_OSD_TXT_FONT_SIMHEI									//< 黑体
} PLAY_SDK_DEFAULT_OSD_TXT_FONT;

//文本信息
typedef struct
{
	int						pos_x;						//< x轴相对位置(百分比)
	int						pos_y;						//< y轴相对位置(百分比)
	COLORREF				color;						//< 字体颜色
	char					text[256];					//< 文本内容
	PLAY_SDK_DEFAULT_OSD_TXT_FONT	font_type;					//< 字体类型
	int						font_size;					//< 字体大小, 以窗口的百分比来表示
	HFONT					out_ft;						//< 创建的字体对象
	int						isBold;						//< 是否粗体
	int						isTransparent;				//< 是否透明底色
	COLORREF				bkColor;					//< 背景色
} PLAY_SDK_OSD_INFO_TXT;
#endif

/*----------------------以下是回调函数类型-------------------------------*/

//音频采集回调函数类型
typedef void (CALLBACK *fAudioCaptureCallBack)(LPBYTE pDataBuffer,		//音频数据
											   DWORD DataLength,		//数据长度
											   long nUser);				//用户数据

//画图回调函数类型
typedef void (CALLBACK *fDrawCallBack)(LONG nPort,						//播放通道号
									   HDC hDc,							//设备句柄
									   LONG nUser);						//用户数据

//解码回调函数类型
typedef void (CALLBACK *fDecodeCallBack)(LONG nPort,					//播放通道号
										 LPCSTR pBuf,					//码流缓冲区
										 LONG nSize,					//缓冲区大小
										 PLAY_SDK_FRAME_INFO* pFrameInfo,		//帧信息
										 LONG nPlayedFrames);			//已解码的帧数

//播放回调函数类型
typedef void (CALLBACK *fDisplayCallBack)(LONG nPort,					//播放通道号
										  LPCSTR pBuf,					//数据缓冲区
										  LONG nSize,					//缓冲区大小
										  LONG nWidth,					//图像宽度
										  LONG nHeight,					//图像高度
										  LONG nStamp,					//时间戳
										  LONG nType,					//类型, 按帧还是按时间
										  LONG nUser);					//用户数据

//文件播放结束回调函数类型
typedef void (CALLBACK *fFileCallBack)(LONG nPort,						//播放通道号
									   LONG nUser);						//用户数据

//发现数据被修改时的回调函数类型
typedef void (CALLBACK *fVerifyCallBack)(LONG nPort,					//播放通道号
										 PLAY_SDK_FRAME_POS * pFilePos,			//出错信息
										 DWORD bIsVideo,				//是否视频数据，1 视频，0 音频
										 LONG nUser);					//用户数据 

//音频解码回调函数类型
typedef void (CALLBACK *fAudioCallBack)(LONG nPort,						//播放通道号
										PBYTE pAudioBuf,				//wave 格式音频数据指针
										LONG nSize,						//音频数据长度
										LONG nStamp,					//时标(ms)
										LONG nType,						//音频类型
										LONG nUser);					//用户数据

//源数据分析完的回调函数类型
typedef void (CALLBACK *fDemuxCallBack)(LONG nPort,						//播放通道号
										PLAY_SDK_VIDEO_FRAME_INFO* pFrameInfo,	//视频帧信息地址
										LONG nUser);					//用户数据

//剩余数据小于等于阀值时的回调函数类型
typedef void (CALLBACK *fSourceBufCallBack)(LONG nPort,					//播放通道号
											DWORD nBufSize,				//剩余数据大小
											LONG nUser);				//用户数据

//分辨率改变通知回调函数类型
typedef void (CALLBACK *fImageSizeChangeCallBack)(LONG nPort,			//播放通道号
												  LONG nUser);			//用户数据

//文件转换回调类型
typedef void (CALLBACK *fCoverFileCallBack) (DWORD CurrentPos,			//当前的帧序, 或者说进度
											 DWORD TotoalPos,			//总的帧数
											 long dwUser);				//用户自定义数据

struct 	VIDEDATETIME							
{

	unsigned int second		:6;				//	秒	0-59		
	unsigned int minute		:6;				//	分	0-59		
	unsigned int hour		:5;				//	时	0-23		
	unsigned int day		:5;				//	日	1-31		
	unsigned int month		:4;				//	月	1-12		
	unsigned int year		:6;				//	年	2000-2063	
};

typedef struct Videofilehdr 
{
	unsigned char	mark[5];	/// 标示
	unsigned char   alarm;		/// 报警类型
	unsigned short   resv; 
	VIDEDATETIME	DirStartTime;	/// 文件开始时间
	VIDEDATETIME	DirEndTime;		/// 文件结束时间
	unsigned int		dwChanMask;		/// 支持的通道掩码

	char		startTitle[64];
	unsigned int		startSec;
	unsigned int		startColor;
	char		endTitle[64];
	unsigned int		endSec;
	unsigned int		endColor;
	unsigned char		Reserved[1024-164]; 
}PLAY_VIDEOFILE_HDR;


/*----------------------以下为SDK的API, 供用作二次开发调用--------------------------*/

/*
 * @func:   PLAY_SDK_OpenFile
 * @brief:  打开播放文件
 * @parm:   LONG nPort 播放通道号
 * @parm:   LPCSTR sFileName 播放文件名
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   文件不能大于4G Byte或者小于4K Byte
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_OpenFile(LONG nPort, LPCSTR sFileName);

/*
 * @func:   PLAY_SDK_CloseFile
 * @brief:  关闭播放文件
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_CloseFile(LONG nPort);

/*
 * @func:   PlAY_SDK_WatermarkInfo
 * @brief:  得到水印信息
 * @parm:   LONG nPort 播放通道号
 * @parm:   unsigned char* Watermark  水印信息
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL CALLMETHOD PlAY_SDK_SetWaterInfoCallBack(LONG nPort,void *pvFunc,long useData);

/*
 * @func:   PLAY_SDK_Play
 * @brief:  开始播放
 * @parm:   LONG nPort 播放通道号
 * @parm:   HWND hWnd  播放的窗口句柄
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Play(LONG nPort, HWND hWnd);

/*
 * @func:   PLAY_SDK_Stop
 * @brief:  停止播放
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note: PLAY_SDK_Stop与PLAY_SDK_CloseStream的顺序一定要是先Stop再Close
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Stop(LONG nPort);

/*
 * @func:   PLAY_SDK_Pause
 * @brief:  暂停/恢复播放
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nPause 1 -- 暂停播放 0 -- 恢复播放,输入这2者之外的任何值, 返回失败
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Pause(LONG nPort,DWORD nPause);

/*
 * @func:   PLAY_SDK_Fast
 * @brief:  快进 播放速度分为九级, 播放速度分别为每秒播放1,3,6,12,25,50,75,100,125帧图像。
 *		    每次调用播放速度提升一级最多调 用4次,
 *		    要恢复正常播放调用PLAY_SDK_Play,从当前位置开始正常播放
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Fast(LONG nPort);

/*
 * @func:   PLAY_SDK_Slow
 * @brief:  慢放 播放速度分为九级, 播放速度分别为每秒播放1,3,6,12,25,50,75,100,125帧图像。
		    每次调用播放速度降低一级最多调 用4次,
		    要恢复正常播放调用PLAY_SDK_Play,从当前位置开始正常播放。
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Slow(LONG nPort);

/*
 * @func:   PLAY_SDK_NextFrame
 * @brief:  单帧往后播放, 要恢复正常播放调用PLAY_SDK_Play,从当前位置开始正常播放
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_NextFrame(LONG nPort);

/*
 * @func:   PLAY_SDK_PrevFrame
 * @brief:  单帧往前播放, 要恢复正常播放调用PLAY_SDK_Play,从当前位置开始正常播放。
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_PrevFrame(LONG nPort);

/*
 * @func:   PLAY_SDK_SetPlayPos
 * @brief:  设置文件播放指针的相对位置
 * @parm:   LONG nPort 播放通道号
 * @parm:   FLOAT fRelativePos 播放位置百分比,取值范围 [0.00, 100.00]
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetPlayPos(LONG nPort, FLOAT fRelativePos);

/*
 * @func:   PLAY_SDK_GetPlayPos
 * @brief:  获取文件播放指针的相对位置
 * @parm:   LONG nPort
 * @return: FLOAT 文件播放指针的相对百分比位置, 范围[0.00, 100.00]
 */
PLAY_SDK_API FLOAT CALLMETHOD 	PLAY_SDK_GetPlayPos(LONG nPort);

/*
 * @func:   PLAY_SDK_SetFileEndMsg
 * @brief:  设置文件播放结束时要发送的消息
 * @parm:   LONG nPort 播放通道号
 * @parm:   HWND hWnd  消息发往东窗口
 * @parm:   UINT nMsg  用户输入的消息, 当播放到文件结束时用户在hWnd窗口过程中收到这个消息
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetFileEndMsg(LONG nPort,HWND hWnd,UINT nMsg);

/*
 * @func:   PLAY_SDK_SetFileEndCallBack
 * @brief:  设置文件播放结束回调
 * @parm:   LONG nPort 播放通道号
 * @parm:   fFileCallBack pProc 回调函数
 * @parm:   LONG nUser 用户自定义数据
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetFileEndCallBack(LONG nPort, fFileCallBack pProc,LONG nUser);

/*
 * @func:   PLAY_SDK_SetVolume
 * @brief:  设置播放时声音
 * @parm:   LONG nPort 播放通道号
 * @parm:   WORD nVolume 音量, 取值范围[0, 0xFFFF]
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetVolume(LONG nPort,WORD nVolume);

/*
 * @func:   PLAY_SDK_StopSound
 * @brief:  关闭以独占方式打开播放的声音
 * @parm:   无
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StopSound();

/*
 * @func:   PLAY_SDK_PlaySound
 * @brief:  以独占方式打开播放声音
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   同一时刻只能有一路声音。如果现在已经有声音打开，则自动关闭原来已经打开的声音
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_PlaySound(LONG nPort);

/*
 * @func:   PLAY_SDK_OpenStream
 * @brief:  打开媒体流
 * @parm:   LONG nPort 播放通道号
 * @parm:   PBYTE pFileHeadBuf 目前不使用, 设置为NULL
 * @parm:   DWORD nSize		   目前不使用, 设置为0
 * @parm:   DWORD nBufPoolSize 设置播放器中存放数据流的缓冲区大小, 一般设为900K ,如果数据送过来相对均匀,
 *							   可调小该值, 如果数据传输不均匀, 可增大该值
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_OpenStream(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize);

/*
 * @func:   PLAY_SDK_InputData
 * @brief:  输入待解码数据
 * @parm:   LONG nPort 播放通道号
 * @parm:   PBYTE pBuf 存放数据缓冲区地址
 * @parm:   DWORD nSize 缓冲区长度
 * @return: BOOL TRUE -- 输入数据成功  FALSE -- 输入数据失败
 * @note:   打开流并调用PLAY_SDK_Play之后才能输入数据, 如果失败, 通常原因是缓冲区已满
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_InputData(LONG nPort,PBYTE pBuf,DWORD nSize);

/*
 * @func:   PLAY_SDK_CloseStream
 * @brief:  关闭数据流
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   PLAY_SDK_Stop与PLAY_SDK_CloseStream的顺序一定要是先Stop再Close
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_CloseStream(LONG nPort);

/*
 * @func:   PLAY_SDK_GetCaps
 * @brief:  获取当前系统信息, 通常用于测试播放器需要的一些系统功能
 * @parm:   无
 * @return: LONG 系统功能位
 */
PLAY_SDK_API LONG  CALLMETHOD 	PLAY_SDK_GetCaps();

/*
 * @func:   PLAY_SDK_GetFileTime
 * @brief:  获得文件总的时间长度, 单位: 秒
 * @parm:   LONG nPort 播放通道号
 * @return: DWORD 文件总的时间长度
 */
PLAY_SDK_API DWORD CALLMETHOD 	PLAY_SDK_GetFileTime(LONG nPort);

/*
 * @func:   PLAY_SDK_GetPlayedTime
 * @brief:  获取文件当前播放的时间, 单位: 秒
 * @parm:   LONG nPort 播放通道号
 * @return: DWORD 文件当前播放的时间
 */
PLAY_SDK_API DWORD CALLMETHOD 	PLAY_SDK_GetPlayedTime(LONG nPort);

/*
 * @func:   PLAY_SDK_GetPlayedTimeEx
 * @brief:  获取文件当前播放的时间, 单位: 毫秒
 * @parm:   LONG nPort 播放通道号
 * @return: DWORD 文件当前播放的时间
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetPlayedTimeEx(LONG nPort);

/*
 * @func:   PLAY_SDK_GetPlayedFrames
 * @brief:  获取已播放的帧数
 * @parm:   LONG nPort 播放通道号
 * @return: DWORD 已播放的帧数
 */
PLAY_SDK_API DWORD CALLMETHOD 	PLAY_SDK_GetPlayedFrames(LONG nPort);

/*
 * @func:   PLAY_SDK_Back
 * @brief:  反向回放
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_Back(LONG nPort);

/*
 * @func:   PLAY_SDK_SetDecCallBack
 * @brief:  设置解码回调
 * @parm:   LONG nPort 播放通道号
 * @parm:   fDecodeCallBack pProc 解码回调函数
 * @return: BOOL TRUE -- 设置成功  FALSE -- 设置失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDecCallBack(LONG nPort, fDecodeCallBack pProc);

/*
 * @func:   PLAY_SDK_SetDisplayCallBack
 * @brief:  设置图像显示回调函数
 * @parm:   LONG nPort 播放通道号
 * @parm:   fDisplayCallBack pProc 显示回调函数
 * @parm:   LONG nUser用户自定义数据
 * @return: BOOL TRUE -- 设置成功  FALSE -- 设置失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDisplayCallBack(LONG nPort, fDisplayCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_ConvertToBmpFile
 * @brief:  图像数据转为BMP 格式
 * @parm:   PBYTE pBuf   抓图回调函数中图像缓冲区
 * @parm:   LONG nSize   抓图回调函数中图像缓冲区大小
 * @parm:   LONG nWidth  抓图回调函数中图像宽度
 * @parm:   LONG nHeight 抓图回调函数中图像高度
 * @parm:   LPCSTR sFileName 要保存的文件名。最好以BMP 作为文件扩展名
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   图像数据可从解码回调或者显示回调中获取,可在播放库回调函数中使用.
 *			转换函数占用的cpu资源, 如果不需要保存图片, 则不要调用
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_ConvertToBmpFile(PBYTE pBuf,LONG nSize,LONG nWidth,LONG nHeight, LPCSTR sFileName);

/*
 * @func:   PLAY_SDK_ConvertToJpgFile
 * @brief:  图像数据转为JPG 格式
 * @parm:   PBYTE pBuf   抓图回调函数中图像缓冲区
 * @parm:   LONG nSize   抓图回调函数中图像缓冲区大小
 * @parm:   LONG nWidth  抓图回调函数中图像宽度
 * @parm:   LONG nHeight 抓图回调函数中图像高度
 * @parm:   LPCSTR sFileName 要保存的文件名。最好以JPG 作为文件扩展名
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   图像数据可从解码回调或者显示回调中获取,可在播放库回调函数中使用.
 *			转换函数占用的cpu资源, 如果不需要保存图片, 则不要调用
 */
PLAY_SDK_API BOOL CALLMETHOD PLAY_SDK_ConvertToJpgFile(PBYTE pBuf, LONG nSize,LONG nWidth,LONG nHeight,PCSTR sFileName);
/*
 * @func:   PLAY_SDK_GetFileTotalFrames
 * @brief:  获取文件总帧数
 * @parm:   LONG nPort 播放通道号
 * @return: DWORD 文件总帧数
 * @note:   不支持对正在写入的文件进行帧数的读取
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetFileTotalFrames(LONG nPort);

/*
 * @func:   PLAY_SDK_SetPlayedTimeEx
 * @brief:  根据时间设置文件播放位置,此接口比PLAY_SDK_SetPlayedPos费时
 *			但如果用时间来控制进度条(与PLAY_SDK_GetPlayedTimeEx配合使用),那么可以使进度条平滑滚动
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nTime 要设置的播放时间
 * @return: BOOL TRUE -- 设置成功  FALSE -- 设置失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetPlayedTimeEx(LONG nPort,DWORD nTime);

/*
 * @func:   PLAY_SDK_GetCurrentFrameNum
 * @brief:  得到当前播放的帧序号。
 * @parm:   LONG nPort 播放通道号
 * @return: 当前播放的帧序号
 * @note:   如果文件播放位置不被改变，那么这两个函数的返回值应该非常接近,除非码流丢失数据
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetCurrentFrameNum(LONG nPort);

/*
 * @func:   PLAY_SDK_SetStreamOpenMode
 * @brief:  设置流播放的模式, 必须在播放之前设置
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nMode 数据流播放模式, 取值为PLAY_SDK_STREAME_REALTIME或者PLAY_SDK_STREAME_FILE
 * @return: PBOOL TRUE -- 设置成功  FALSE -- 设置失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetStreamOpenMode(LONG nPort,DWORD nMode);

/*
 * @func:   PLAY_SDK_GetSdkVersion
 * @brief:  获取播放库的版本号
 * @parm:   无
 * @return: 版本号, 高16位表示当前的主版本号。9~16位表示次版本号，1~8位表示次补丁号。
 *			如：返回值0x00010101表示：主版本号是1，次版本号是1，补丁号是1
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetSdkVersion();

/*
 * @func:   PLAY_SDK_GetLastError
 * @brief:  获得最后一次出错的错误码
 * @parm:   LONG nPort 播放通道号
 * @return: 错误码 
 * @note:   应该在调用某个函数失败时，调用此函数以获得错误的详细信息
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetLastError(LONG nPort);

/*
 * @func:   PLAY_SDK_RefreshPlay
 * @brief:  刷新显示的图像
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   当用户暂停时如果刷新了窗口,则窗口中的图像因为刷新而消失，
 *			此时调用这个接口可以重新把图像显示出来。只有在暂停和单帧播放时才会执行,
 *			其它情况会直接返回
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_RefreshPlay(LONG nPort);

/*
 * @func:   PLAY_SDK_SetOverlayMode
 * @brief:  设置Overlay模式
 * @parm:   LONG nPort 播放通道号
 * @parm:   BOOL bOverlay 
 *			TRUE	表示将首先尝试使用OVERLAY模式，如果不行再使用其他模式
 *			FALSE	不进行OVERLAY模式的尝试
 * @parm:   COLORREF colorKey 用户设置的透明色，透明色相当于一层透视膜，显示画面只
 *			能穿过这种颜色，其他颜色将挡住显示的画面。用户应该在
 *			显示窗口中涂上这种颜色，才能看到显示画面。一般应该使
 *			用一种不常用的颜色作为透明色。这是一个双字节值
 *			0x00bbggrr,最高字节为0，后三个字节分别表示r,g,b 的值
 * @return: BOOL TRUE -- 设置成功  FALSE -- 设置失败
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_SetOverlayMode(LONG nPort, BOOL bOverlay, COLORREF colorKey);

/*
 * @func:   PLAY_SDK_GetPictureSize
 * @brief:  获得码流中原始图像的大小
 * @parm:   LONG nPort 播放通道号
 * @parm:   LONG* pWidth  获取到的图像宽度
 * @parm:   LONG* pHeight 获取到的图像高度
 * @return: BOOL TRUE -- 获取成功  FALSE -- 获取失败
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_GetPictureSize(LONG nPort, LONG* pWidth,LONG* pHeight);

/*
 * @func:   PLAY_SDK_SetPicQuality
 * @brief:  设置图像质量
 * @parm:   LONG nPort 播放通道号
 * @parm:   BOOL bHighQuality 等于1 时图像高质量,等于0 时低质量, 默认为1。
 * @return: BOOL TRUE -- 设置成功  FALSE -- 设置失败
 * @note:   当设置成高质量时画面效果好,但CPU 利用率高。
 *			在支持多路播放时,可以设为低质量,以降低CPU 利用率
 *			当某路放大播放时将该路设置成高质量,以达到好的画面效果。
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_SetPicQuality(LONG nPort,BOOL bHighQuality);

/*
 * @func:   PLAY_SDK_PlaySoundShare
 * @brief:  以共享方式打开播放声音，播放本路声音而不去关闭其它路声音
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_PlaySoundShare(LONG nPort);

/*
 * @func:   PLAY_SDK_StopSoundShare
 * @brief:  关闭以以共享方式打开的声音
 * @parm:   LONG nPort 播放通道号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   PLAY_SDK_PlaySound和PLAY_SDK_StopSound是以独占方式播放声音的，
 *          在同一个进程中，所有通道必须使用相同的方式播放或关闭声音
 */
PLAY_SDK_API BOOL	CALLMETHOD 	PLAY_SDK_StopSoundShare(LONG nPort);

/*
 * @func:   PLAY_SDK_GetStreamOpenMode
 * @brief:  获得流模式类型
 * @parm:   LONG nPort 播放通道号
 * @return: LONG 流播放模式: PLAY_SDK_STREAME_REALTIME、PLAY_SDK_STREAME_FILE
 */
PLAY_SDK_API LONG 	CALLMETHOD 	PLAY_SDK_GetStreamOpenMode(LONG nPort);

/*
 * @func:   PLAY_SDK_GetOverlayMode
 * @brief:  获得当前使用的overlay模式
 * @parm:   LONG nPort 播放通道号
 * @return: 0 -- 没有使用Overlay模式 1 -- 使用了Overlay模式
 */
PLAY_SDK_API LONG 	CALLMETHOD 	PLAY_SDK_GetOverlayMode(LONG nPort);

/*
 * @func:   PLAY_SDK_GetVolume
 * @brief:  获取音量大小
 * @parm:   LONG nPort 播放通道号
 * @return: 音量大小
 */
PLAY_SDK_API WORD 	CALLMETHOD 	PLAY_SDK_GetVolume(LONG nPort);

/*
 * @func:   PLAY_SDK_GetPictureQuality
 * @brief:  获取图像质量参数
 * @parm:   LONG nPort 播放通道号
 * @parm:   BOOL* bHighQuality 获取到的质量 1 -- 表示高质量, 0 -- 表示低质量
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetPictureQuality(LONG nPort,BOOL* bHighQuality);

/*
 * @func:   PLAY_SDK_GetSourceBufferRemain
 * @brief:  获得流播放模式下源缓冲剩余数据大小
 * @parm:   LONG nPort 播放通道号
 * @return: 源缓冲剩余数据大小
 */
PLAY_SDK_API DWORD	CALLMETHOD	PLAY_SDK_GetSourceBufferRemain(LONG nPort);

/*
 * @func:   PLAY_SDK_ResetSourceBuffer
 * @brief:  重置回调标志为有效状态
 * @parm:   LONG nPort
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_ResetSourceBuffer(LONG nPort);

/*
 * @func:   PLAY_SDK_SetSourceBufCallBack
 * @brief:  设置源缓冲区阀值和剩余数据小于等于阀值时的回调函数指针。
 *			只有在数据量从大到小"越过"指定阈值的时候, 才会触发回调;
 * @parm:   LONG nPort					播放通道号
 * @parm:   DWORD nThreShold			阈值
 * @parm:   fSourceBufCallBack pProc	回调函数
 * @parm:   LONG nUser					用户自定义数据
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   一次触发后需要调用PlayM4_ResetSourceBufFlag 接口重置参数, 使得再次有效
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetSourceBufCallBack(LONG nPort,DWORD nThreShold, fSourceBufCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_ResetSourceBufFlag
 * @brief:  重置回调标志位为有效状态
 * @parm:   LONG nPort
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_ResetSourceBufFlag(LONG nPort);

/*
 * @func:   PLAY_SDK_SetDisplayBuf
 * @brief:  播放缓冲区最大缓冲帧数
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nNum 播放缓冲区最大缓冲帧数。范围：PLAY_SDK_MIN_DIS_FRAMES ~PLAY_SDK_MAX_DIS_FRAMES。
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDisplayBuf(LONG nPort,DWORD nNum);

/*
 * @func:   PLAY_SDK_GetDisplayBuf
 * @brief:  获取播放缓冲区最大缓冲帧数
 * @parm:   LONG nPort 播放通道号
 * @return: 播放缓冲区最大缓冲帧数
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetDisplayBuf(LONG nPort);

/*
 * @func:   PLAY_SDK_SetFileRefCallBack
 * @brief:  建立文件索引回调。
 * @parm:   LONG nPort 播放通道号
 * @parm:   fFileCallBack pProc 回调函数
 * @parm:   LONG nUser 用户自定义数据
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   为了能在文件中准确快速的定位，在文件打开的时候生成文件索引。这个过程耗
 *			时比较长，大约每秒处理40M 左右的数据，主要是因为从硬盘读数据比较慢。建
 *			立索引的过程是在后台完成，需要使用索引的函数要等待这个过程结束，而其他
 *			接口不会受到影响。打开文件时是否建立文件的关键帧索引, 如果索引回调未触
 *			发, 表明录像文件异常。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetFileRefCallBack(LONG nPort, fFileCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_SetCurrentFrameNum
 * @brief:  设置当前播放播放位置到指定帧号；根据帧号来定位播放位置
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nFrameNum 帧号
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   如果在建立文件索引的前提下使用, 为精确定位, 否则即为粗略定位,在PlayM4_Play 之后调用才有效。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetCurrentFrameNum(LONG nPort,DWORD nFrameNum);

/*
 * @func:   PLAY_SDK_GetKeyFramePos
 * @brief:  查找指定位置前的关键帧
 * @parm:   LONG nPort   播放通道号
 * @parm:   DWORD nValue 当前位置,可以是时间或帧号,类型由nType 指定
 * @parm:   DWORD nType  见【定位类型宏定义】
 * @parm:   PFRAME_POS pFramePos 查找到的关键帧的文件位置、帧序号、时标信息
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 * @note:   图像解码必须从关键帧开始，如果用户保存的文件不是从关键帧开始的,那么到下
			一个关键帧之前的数据会被忽略。如果用户要截取文件中的一段数据，则应该考虑
			从关键帧开始截取。结束位置则关系不大,最多丢失3 帧数据。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PPLAY_SDK_FRAME_POS pFramePos);

/*
 * @func:   PLAY_SDK_GetNextKeyFramePos
 * @brief:  查找指定位置之后的关键帧位置
 * @parm:   LONG nPort    播放通道号
 * @parm:   DWORD nValue  当前位置，可以是时间或帧号，类型由nType 指定
 * @parm:   DWORD nType   见【定位类型宏定义】
 * @parm:   PFRAME_POS pFramePos  查找到的关键帧的文件位置、帧序号、时标信息
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetNextKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PPLAY_SDK_FRAME_POS pFramePos);

/*
 * @func:   PLAY_SDK_InitDDrawDevice
 * @brief:  初始化多显卡显示设备
 * @param:  无
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_InitDDrawDevice();

/*
 * @func:   PLAY_SDK_ReleaseDDrawDevice
 * @brief:  释放枚举显示设备的过程中分配的资源
 * @param:  无
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_ReleaseDDrawDevice();

/*
 * @func:   PLAY_SDK_GetDDrawDeviceTotalNums
 * @brief:  获得系统中与windows 桌面绑定的总的显示设备数目(这里主要是指显卡)
 * @param:  无
 * @return: 如果返回0，则表示系统中只有主显示设备。如果返回1，则表示系统中安装了多
 *			块显卡，但只有一块显卡与Windows 桌面绑定。返回其他值，则表示系统中与桌
 *			面绑定的显卡数目。在多显卡的系统中可以通过设置显示属性，而指定任意一块
 *			显卡作为主显示设备
 */
PLAY_SDK_API DWORD	CALLMETHOD 	PLAY_SDK_GetDDrawDeviceTotalNums();

/*
 * @func:   PLAY_SDK_SetDisplayType
 * @brief:  设置显示的模式，在小画面显示时，采用DISPLAY_QUARTER 可以减小显卡工作量,
 *			从而支持更多路显示，但画面显示质量有下降。在正常和大画面显示时应该使用
 *			PLAY_SDK_DISPLAY_NORMAL
 * @parm:   LONG nPort 播放通道号
 * @parm:   LONG nType 取值PLAY_SDK_DISPLAY_NORMAL 或者 PLAY_SDK_DISPLAY_QUARTER
 * @return: BOOL TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDisplayType(LONG nPort,LONG nType);

/*
 * @func:   PLAY_SDK_GetDisplayType
 * @brief:  获取显示模式
 * @parm:   LONG nPort 播放通道号
 * @return: PLAY_SDK_DISPLAY_NORMAL 或者 PLAY_SDK_DISPLAY_QUARTER
 */
PLAY_SDK_API LONG 	CALLMETHOD 	PLAY_SDK_GetDisplayType(LONG nPort);

/*
 * @func:   PLAY_SDK_SetDecCBStream
 * @brief:  设置解码回调的码流类型
 * @parm:   LONG nPort   播放通道号
 * @parm:   DWORD nStream 1 -- 视频流, 2 -- 音频流, 3 -- 复合流
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDecCBStream(LONG nPort,DWORD nStream);

/*
 * @func:   PLAY_SDK_SetDisplayRegion
 * @brief:  设置或增加显示区域, 可以做局部放大显示
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nRegionNum 显示区域序号，0~(PLAY_SDK_MAX_DISPLAY_WND-1)。如果nRegionNum 为0, 表示对主要显示窗口
 *			(PlayM4_Play 中设置的窗口) 进行设置, 将忽略hDestWnd 和bEnable 的设置
 * @parm[in]:   RECT* pSrcRect 设置在要显示的原始图像上的区域，如：如果原始图像是352*288,那么pSrcRect 
 *			可设置的范围只能在（0, 0, 352, 288）之中。如果pSrcRect=NULL,将显示整个图像。
 * @parm:   HWND hDestWnd  设置显示窗口。如果该区域的窗口已经设置过(打开过), 那么该参数被忽略。
 * @parm:   BOOL bEnable   打开(设置)或关闭显示区域
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDisplayRegion(LONG nPort,DWORD nRegionNum, RECT* pSrcRect, HWND hDestWnd, BOOL bEnable);

/*
 * @func:   PLAY_SDK_RefreshPlayEx
 * @brief:  刷新显示, 同PLAY_SDK_RefreshPlay。为支持PLAY_SDK_SetDisplayRegion 而增加一个参数
 * @parm:   LONG nPort			播放通道号
 * @parm:   DWORD nRegionNum	[0, PLAY_SDK_MAX_DISPLAY_WND-1]
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_RefreshPlayEx(LONG nPort,DWORD nRegionNum);

/*
 * @func:   PLAY_SDK_GetRefValue
 * @brief:  获取文件索引信息，以便下次打开同一个文件时直接使用这个信息。必须在索引建成后才能获得信息。
 * @parm:   LONG   nPort     播放通道号
 * @parm:   BYTE*  pBuffer   索引信息
 * @parm[out]:   DWORD* pSize     输入pBuffer 的大小，输出索引信息大小
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   可以在第一次指定pSize=0,pBuffer=NULL,从pSize的返回值获得需要的缓冲区大小。然后分配足够的缓冲,再调用一次。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetRefValue(LONG nPort,BYTE* pBuffer, DWORD* pSize);

/*
 * @func:   PLAY_SDK_SetRefValue
 * @brief:  设置文件索引。如果已经有了文件索引信息，可以不再调用生成索引的回调函数
 *			PLAY_SDK_SetFileRefCallBack, 直接输入索引信息。
 * @parm[in]:   LONG nPort     播放通道号
 * @parm[in]:   BYTE* pBuffer  索引信息
 * @parm[in]:   DWORD nSize    索引信息的长度
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   索引信息及其长度必须准确，在PLAY_SDK_OpenFile 之后调用
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetRefValue(LONG nPort,BYTE* pBuffer, DWORD nSize);

/*
 * @func:   PLAY_SDK_InputVideoData
 * @brief:  输入视频流(可以是复合流，但音频数据会被忽略), 打开流之后才能输入数据
 * @parm:   LONG nPort  播放通道号
 * @parm:   PBYTE pBuf  缓冲区地址
 * @parm:   DWORD nSize 缓冲区大小
 * @return: TRUE -- 输入数据成功  FALSE -- 失败, 数据没有输入
 * @note1:  失败一般是由于内部缓冲区满,建议暂停输入数据线程,再次输入数据,确保播放库不丢失数据。
 * @note2:  在实时流情况下, 因数据满而无法送入播放库, 可以选择丢弃, 后果是画面可能跳帧或者花屏,
 *			若无法接受,则sleep 几毫秒后,再尝试多送几次.
 * @note3:	文件流回放模式下，数据满而导致无法送入播放库，需要不断尝试，直到送成功为止。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_InputVideoData(LONG nPort, PBYTE pBuf, DWORD nSize);

/*
 * @func:   PLAY_SDK_InputAudioData
 * @brief:  输入音频流, 打开声音之后才能输入数据
 * @parm:   LONG nPort 播放通道号
 * @parm:   PBYTE pBuf 缓冲区地址
 * @parm:   DWORD nSize 缓冲区大小
 * @return: TRUE -- 输入数据成功  FALSE -- 失败, 数据没有输入
 * @note:   见PLAY_SDK_InputVideoData的note事项
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_InputAudioData(LONG nPort, PBYTE pBuf, DWORD nSize);

/*
 * @func:   PLAY_SDK_RigisterDrawFun
 * @brief:  注册画图回调函数
 * @parm:   LONG nPort			播放通道号
 * @parm:   fDrawCallBack pProc 画图回调函数
 * @parm:   LONG nUser			用户自定义数据
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_RigisterDrawFun(LONG nPort, fDrawCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_SetTimerType
 * @brief:  设置播放使用的定时器类型
 * @parm:   LONG nPort  播放通道号
 * @parm:   DWORD nTimerType PLAY_SDK_TIMER_1 或者 PLAY_SDK_TIMER_2
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetTimerType(LONG nPort,DWORD nTimerType);

/*
 * @func:   PLAY_SDK_GetTimerType
 * @brief:  获取播放使用的定时器类型
 * @parm[in]:   LONG nPort 播放通道号
 * @parm[out]:   DWORD * pTimerType  PLAY_SDK_TIMER_1 或者 PLAY_SDK_TIMER_2
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetTimerType(LONG nPort,DWORD* pTimerType);

/*
 * @func:   PLAY_SDK_ResetBuffer
 * @brief:  清空指定缓冲区的剩余数据
 * @parm:   LONG nPort      播放通道号
 * @parm:   DWORD nBufType  缓冲区类型, 见 【缓冲类型宏定义】
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_ResetBuffer(LONG nPort,DWORD nBufType);

/*
 * @func:   PLAY_SDK_GetBufferValue
 * @brief:  根据参数不同, 返回缓冲区值, 源缓冲区返回byte,解码后缓冲区返回帧数。
 * @parm:   LONG nPort       播放通道号
 * @parm:   DWORD nBufType   缓冲区类型, 见 【缓冲类型宏定义】
 * @return: 源缓冲区返回byte,解码后缓冲区返回帧数
 * @note:   这个接口可以帮助用户了解缓冲区中的数据,从而在网络延时方面有所估计
 */
PLAY_SDK_API DWORD CALLMETHOD 	PLAY_SDK_GetBufferValue(LONG nPort,DWORD nBufType);

/*
 * @func:   PLAY_SDK_AdjustWaveAudio
 * @brief:  调整WAVE 波形, 可以改变声音的大小。和PLAY_SDK_SetVolume 的不同在于, 它是调整声音数据, 只对该路其作用， 而
 *			PLAY_SDK_SetVolume 是调整声卡音量，对整个系统起作用。
 * @parm:   LONG nPort         播放通道号
 * @parm:   LONG nCoefficient  调整参数，0 是不调整，范围见【波形调整因子最大最小值宏定义】
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   用这个函数会破坏音质, 除非想每路单独调整音量,否则请谨慎使用。
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_AdjustWaveAudio(LONG nPort,LONG nCoefficient);

/*
 * @func:   PLAY_SDK_SetVerifyCallBack
 * @brief:  设置数据校验
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nBeginTime		校验开始时间，单位ms
 * @parm:   DWORD nEndTime			校验结束时间，单位ms
 * @parm:   fVerifyCallBack pProc	当发现数据被修改时回调的函数, 详细参数信息见回调函数类型定义
 * @parm:   LONG nUser				用户自定义数据
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetVerifyCallBack(LONG nPort, DWORD nBeginTime, DWORD nEndTime, fVerifyCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_SetAudioCallBack
 * @brief:  设置音频解码回调
 * @parm:   LONG nPort 播放通道号
 * @parm:   fAudioCallBack pProc 音频解码回调函数，若不需要回调函数则置为NULL,否则不能为NULL
 * @parm:   LONG nUser  用户数据
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetAudioCallBack(LONG nPort, fAudioCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_SetImageSizeChangeCallBack
 * @brief:  设置分辨率改变通知回调
 * @parm:   LONG nPort 播放通道号
 * @parm:   fImageSizeChangeCallBack pProc 分辨率发生改变时通知用户的回调函数
 * @parm:   LONG nUser 用户数据
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   不推荐与PLAY_SDK_SetImageSizeChangeMsg同时使用
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetImageSizeChangeCallBack(LONG nPort,fImageSizeChangeCallBack pProc,LONG nUser);

/*
 * @func:   PLAY_SDK_SetImageSizeChangeMsg
 * @brief:  设置分辨改变通知消息
 * @parm:   LONG nPort 播放通道号
 * @parm:   HWND hWnd 消息发送的窗口
 * @parm:   UINT nMsg 用户输入的消息；当设置解码时编码格式发生改变时要发送
			此定义的消息。消息函数中的wParam 参数值是返回nPort的值
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   回调与消息不能同时使用
 */
PLAY_SDK_API BOOL 	CALLMETHOD	PLAY_SDK_SetImageSizeChangeMsg(LONG nPort,HWND hWnd,UINT nMsg);

/*
 * @func:   PLAY_SDK_SetColor
 * @brief:  设置视频的图像参数, 即刻起作用
 * @parm:   LONG nPort 播放通道号
 * @parm:   DWORD nRegionNum   显示区域，参考PlayM4_SetDisplayRegion；如果只有一个显示区域(通常情况)设为0
 * @parm:   LONG nBrightness   亮度,默认64, 范围0-128
 * @parm:   LONG nContrast     对比度,默认64, 范围0-128
 * @parm:   LONG nSaturation   饱和度,默认64,范围0-128
 * @parm:   LONG nHue          色调,默认64, 范围0-128
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetColor(LONG nPort, DWORD nRegionNum, LONG nBrightness, LONG nContrast, LONG nSaturation, LONG nHue);

/*
 * @func:   PLAY_SDK_GetColor
 * @brief:  获取当前视频图像的参数信息
 * @parm[in] :   LONG nPort			播放通道号
 * @parm[in] :   DWORD nRegionNum	显示区域
 * @parm[out]:   LONG* pBrightness  亮度
 * @parm[out]:   LONG* pContrast    对比度
 * @parm[out]:   LONG* pSaturation  饱和度
 * @parm[out]:   LONG* pHue         色调
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetColor(LONG nPort, DWORD nRegionNum, LONG* pBrightness, LONG* pContrast, LONG* pSaturation, LONG* pHue);

/*
 * @func:   PLAY_SDK_SetMDRange
 * @brief:  设置动检区域及范围
 * @parm:   LONG nPort 播放通道号
 * @parm[in]:   RECT* rc 动态检测的区域
 * @parm:   DWORD nVauleBegin  搜索范围上限，可以是时间或帧号，具体取决于nType
 * @parm:   DWORD nValueEnd    搜索范围下限，可以是时间或帧号，具体取决于nType
 * @parm:   DWORD nType        见【定位类型宏定义】
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetMDRange(LONG nPort,RECT* rc,DWORD nVauleBegin,DWORD nValueEnd,DWORD nType);

/*
 * @func:   PLAY_SDK_SetMDThreShold
 * @brief:  设置动态检测搜索的阀值
 * @parm:   LONG nPort      播放通道号
 * @parm:   DWORD ThreShold 阈值 取值范围[0, 255]
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetMDThreShold(LONG nPort, DWORD ThreShold);

/*
 * @func:   PLAY_SDK_GetMDPosition
 * @brief:  获得搜索到的动检帧的帧序号
 * @parm:   LONG nPort      播放通道号
 * @parm:   DWORD Direction 搜索方向, 0 -- 向前搜索, 1 -- 向后搜索
 * @parm:   DWORD nFrame    参考帧
 * @parm:   DWORD* MDValue  搜索到的动检帧的阀值
 * @return: 搜索到的动检帧的帧序号
 */
PLAY_SDK_API DWORD CALLMETHOD 	PLAY_SDK_GetMDPosition(LONG nPort, DWORD Direction, DWORD nFrame, DWORD* MDValue) ;

/*
 * @func:   PLAY_SDK_CatchPic
 * @brief:  抓图
 * @parm:   LONG nPort		  播放通道号
 * @parm:   LPCSTR sFileName  图片保存的名字
 * @parm:   int    Pictype    图片保存的类型 0:jpeg 1:bmp
 * @return: TRUE -- 成功  FALSE -- 失败
 * @note:   PLAY_SDK_SetDisplayCallBack设置的视频数据回调函数,只有在有视频数据解码出来时才调用,
 *			并由用户处理视频数据(如抓图)，如果不断有解码的数据,就不断调用这个回调函数,当然也就耗资源。
 *			而PLAY_SDK_CatchPic一次只抓一幅图，并能在暂停和单帧播放时实现抓图。
 *			建议:如果用户想实现抓图(一次抓一幅图),调用PLAY_SDK_CatchPic,
 *			而如果想得到一段时间内的视频数据，调用PLAY_SDK_SetDisplayCallBack
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_CatchPic(LONG nPort, LPCSTR sFileName, int Pictype = 1) ;
/*
* @func:   PLAY_SDK_GetH265
* @brief:  获取端口
* @parm:   LONG nPort			播放通道号		
* @return: 4 ---h265
*/
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_GetH265(LONG nPort);
/*
 * @func:   PLAY_SDK_StartDataRecord
 * @brief:  开始流数据录像, 只对流模式有用, 在调用PLAY_SDK_Play之后才能调用
 * @parm:   LONG nPort			播放通道号
 * @parm:   LPCSTR sFileName	录像文件保存名称
 * @parm:   LONG nType			保存的文件类型, 见文件类型枚举定义		
 * @return: TRUE -- 成功  FALSE -- 失败
 */

PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StartDataRecord(LONG nPort,  PCSTR sFileName, LONG nType);

PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StartDataRecord_V2(LONG nPort,  LPCSTR sFileName, PLAY_VIDEOFILE_HDR* pHeader);

/*
 * @func:   PLAY_SDK_StopDataRecord
 * @brief:  停止录像
 * @parm:   LONG nPort  播放通道号
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StopDataRecord(LONG nPort);

/*
 * @func:   PLAY_SDK_AdjustFluency
 * @brief:  调整视频播放的流畅性, 即刻起作用
 * @parm:   LONG nPort 播放通道号
 * @parm:   int level 调整图象播放的流畅性。流畅性和实时性是一对平衡体。当level为0时,
 *			图象最流畅; 当level为6时,图象实时性最好。Level的默认值为3。
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_AdjustFluency(LONG nPort, int level);

/*
 * @func:   PLAY_SDK_SetPlayFPS
 * @brief:  改变视频播放的帧率 
 * @parm:   LONG nPort 播放通道号
 * @parm:   LONG nFPS  取值[0, 250]
 * @return: PLAY_SDK_API BOOL 	CALLMETHOD
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetPlayFPS(LONG nPort, LONG nFPS);

/*
 * @func:   PLAY_SDK_GetPlayFPS
 * @brief:  得到当前码流中编码时的帧率
 * @parm:   LONG nPort  播放通道号
 * @return: 当前码流中当前编码帧率 注意： 如果码流中的帧率小于1，则返回0
 */
PLAY_SDK_API LONG 	CALLMETHOD 	PLAY_SDK_GetPlayFPS(LONG nPort);

/*
 * @func:   PLAY_SDK_SetDemuxCallBack
 * @brief:  设置源数据分析完的数据回调
 * @parm:   LONG nPort   播放通道号
 * @parm:   fDemuxCallBack pProc  分析数据回调函数指针
 * @parm:   LONG nUser   用户自定义参数
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_SetDemuxCallBack(LONG nPort, fDemuxCallBack pProc, LONG nUser);

/*
 * @func:   PLAY_SDK_StartAudioCapture
 * @brief:  打开音频采集功能
 * @parm:   fAudioCaptureCallBack pProc  音频采集回调函数，当采集到音频数据时该函数将被调用
 * @parm:   LONG nBitsPerSample  采样位深度
 * @parm:   LONG nSamplesPerSec  采样率
 * @parm:   LONG nLength         音频数据包长度
 * @parm:   LONG nUser			 自定义参数
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StartAudioCapture(fAudioCaptureCallBack pProc, LONG nBitsPerSample, LONG nSamplesPerSec, LONG nLength, LONG nUser);

/*
 * @func:   PLAY_SDK_StopAudioCapture
 * @brief:  关闭音频采集功能
 * @parm:   无
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL 	CALLMETHOD 	PLAY_SDK_StopAudioCapture();

/*
 * @func:   PLAY_SDK_GetPort
 * @brief:  获取未使用的通道号
 * @parm[out]:   LONG * nPort, 未使用的通道号, 上限为FUNC_MAX_PORT
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL   CALLMETHOD	PLAY_SDK_GetPort(LONG* nPort);

/*
 * @func:   PLAY_SDK_FreePort
 * @brief:  释放已使用的通道号, 释放成功后，最好将nPort 置为-1
 * @parm:   LONG nPort 要释放的通道号
 * @return: TRUE -- 成功  FALSE -- 失败
 */
PLAY_SDK_API BOOL	CALLMETHOD	PLAY_SDK_FreePort(LONG nPort);

/*
 * @func:   PLAY_SDK_GetColorKey
 * @brief:  获取OVERLAY 关键色
 * @parm:   LONG nPort 播放通道号
 * @return: OVERLAY 关键色
 */
PLAY_SDK_API COLORREF 	CALLMETHOD	PLAY_SDK_GetColorKey(LONG nPort);

/*
 * @func:   PLAY_SDK_GetFileHeadLength
 * @brief:  得到当前版本播放库能播放的文件的文件头长度, 主要应用在流播放器的
			PLAY_SDK_STREAME_FILE 模式下。以便读出文件头作为Play_SDK_OpenStream()的输入参数
 * @parm:   无
 * @return: PLAY_SDK_API LONG	CALLMETHOD
 */
PLAY_SDK_API LONG	CALLMETHOD	PLAY_SDK_GetFileHeadLength();

/*
 * @func:   PLAY_SDK_GetCurTimeStamp
 * @brief:  获取当前播放帧的时间戳 单位: 秒(s)
 * @parm:   LONG nPort  播放通道号
 * @return: 当前播放帧的时间戳
 */
PLAY_SDK_API time_t CALLMETHOD PLAY_SDK_GetCurTimeStamp(LONG nPort);

/*
 * @func:   PLAY_SDK_SetOsdTex
 * @brief:  设置osd叠加信息,必须在openstream后，play之前设置，否则无效
 * @parm:   LONG nPort  播放通道号
 * @parm:   OSD_INFO_TXT* txt 叠加的文本信息
 * @return: 返回osd叠加索引
 */
#ifdef WIN32
PLAY_SDK_API int	CALLMETHOD PLAY_SDK_SetOsdTex(LONG nPort, PLAY_SDK_OSD_INFO_TXT* txt);
#endif
/*
 * @func:   PLAY_SDK_DeleteOsdTex
 * @brief:  删除osd叠加信息,nIndex是PLAY_SDK_SetOsdTex的返回值
 * @parm:   LONG nPort 播放通道号
 * @parm:   int nIndex osd叠加索引
 * @return: PLAY_SDK_API int	CALLMETHOD
 */
PLAY_SDK_API int	CALLMETHOD PLAY_SDK_DeleteOsdTex(LONG nPort, int nIndex);
/*
*/
PLAY_SDK_API void	CALLMETHOD PLAY_SDK_SetAdaptation(LONG nPort,bool Enable);

PLAY_SDK_API int	CALLMETHOD PLAY_SDK_SetMontion(LONG nPort,bool Enable,int row,int col,char* InpBuffer,unsigned int InpBufferSize);

PLAY_SDK_API void   CALLMETHOD PLAY_SDK_GetMontion(LONG nPort,char * lpOutBuffer, unsigned long dwOutBufferSize);
/*
 * @func:   PLAY_SDK_GetVideoParameter
 * @brief:  获得视频的长宽
 * @parm:   LONG nPort 播放通道号
 * @parm:   int* nWidth 宽
 * @parm：	int* nheight 长

 */
PLAY_SDK_API void   CALLMETHOD PLAY_SDK_GetVideoParameter(LONG nPort,int *nWidth,int *nheight);

/*
 * @func:   PLAY_SDK_ConvertFile
 * @brief:  H264录像文件转Avi录像文件
 * @parm:   const char* pSourceFile 源文件
 * @parm:   const char* pDestFile	目标文件
 * @parm:   LONG nType              
 * @parm:   fCoverFileCallBack coverPosCallback 转码回调函数
 * @parm:   DWORD dwUser			用户自定义参数
 * @return: PLAY_SDK_API int	CALLMETHOD
 */
PLAY_SDK_API int	CALLMETHOD PLAY_SDK_ConvertFile(const char* pSourceFile,const char* pDestFile,  LONG nType, fCoverFileCallBack coverPosCallback, DWORD dwUser);

/*
 * @func:   PLAY_SDK_QueryInfo
 * @brief:  查询信息
 * @parm:   LONG nPort		播放通道号
 * @parm:   int cmdType		查询命令类型
 * @parm:   char * buf		结果存放缓冲区
 * @parm:   int buflen		缓冲区长度
 * @parm:   int * returnlen 返回的结果长度
 * @return: PLAY_SDK_API BOOL CALLMETHOD
 */
PLAY_SDK_API BOOL CALLMETHOD PLAY_SDK_QueryInfo(LONG nPort, int cmdType, char* buf, int buflen, int* returnlen);

/*
 *  @func:    	 PLAY_SDK_ChangeWnd
 *  @brief:   	 切换播放通道的播放窗口
 *  @param[in]:  LONG nPort  播放通道号
 *  @param[in]:  HWND hWnd   窗口句柄
 *  @return:  	 BOOL TRUE -- 切换成功 -- FALSE -- 切换失败
 *  @note:    	 none   
 */
PLAY_SDK_API BOOL CALLMETHOD PLAY_SDK_ChangeWnd(LONG nPort, HWND hWnd);



#endif

