#ifndef _DHPLAY_H
#define _DHPLAY_H

#if (defined(WIN32) || defined(WIN64))
	#ifdef dhplay_EXPORTS
		#define PLAYSDK_API __declspec(dllexport)
	#else
		#define PLAYSDK_API __declspec(dllimport)
	#endif
	#define CALLMETHOD __stdcall
	#define CALLBACK   __stdcall
#else
	#define CALLMETHOD
	#define CALLBACK
	#define PLAYSDK_API //extern "C"
#endif

#if defined(WIN32) || defined(WIN64)
#include <windows.h>
#else
#ifdef __OBJC__
#include "objc/objc.h"
#else
#define BOOL        int
#endif
#define BYTE		unsigned char
#define PBYTE		BYTE*
#define LPBYTE		BYTE*
#ifndef LONG
#define LONG		int
#endif
#ifndef DWORD
#define DWORD		unsigned int
#endif
#define WORD		unsigned short
#define COLORREF	DWORD
#define HDC			void*
#define HWND		void*
#define LPSTR		char*
#define UINT		unsigned int
#define TRUE		1
#define FALSE		0
#define ULONGLONG	unsigned long long
#define LONGLONG	long long

typedef struct _SYSTEMTIME
{
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
#endif

#ifdef	__cplusplus
extern "C" {
#endif

/***********************************************************************************************/
/* 常量定义																					   */
/***********************************************************************************************/

/* 通道号 */
#define  FUNC_MAX_PORT					511		// 最大通道号，通道号范围[0,512)

/* 音频幅值 */
#define MIN_WAVE_COEF					-100	// PLAY_AdjustWaveAudio使用
#define MAX_WAVE_COEF					100		// PLAY_AdjustWaveAudio使用

/* 音频采集长度 */
#define MIN_AUDIO_RECORD_LEN			320		// 最小音频采集长度
#define MAX_AUDIO_RECORD_LEN			4096	// 最大音频采集长度

/* 显示相关 */
#define MAX_DISPLAY_WND					64      // 设置的区域序号的最大值

/* 播放缓存相关 */
#define BUF_VIDEO_SRC					1		// 视频源缓冲
#define BUF_AUDIO_SRC					2		// 音频源缓冲
#define BUF_VIDEO_RENDER				3		// 解码后视频数据缓冲
#define BUF_AUDIO_RENDER				4		// 解码后音频数据缓冲

/* 文件跳转方式 */
#define BY_FRAMENUM						1		// 按帧号方式(PLAY_GetKeyFramePos使用)
#define BY_FRAMETIME					2		// 按时间方式(PLAY_GetKeyFramePos使用)

/* 数据流相关 */
#define SOURCE_BUF_MAX					1024*100000	// 数据流缓冲区最大长度
#define SOURCE_BUF_MIN					1024*1024	// 数据流缓冲区最小长度

#define STREAME_REALTIME				0		// 实时流模式
#define STREAME_FILE					1		// 文件流模式

/* 音频位宽 */
#define T_AUDIO16						101		// 16位音频数据类型
#define T_AUDIO8						100		// 8位音频数据类型

/* 解码后的视频格式 */
#define T_UYVY							1		// UYVY类型的YUV数据，现在不支持
#define T_IYUV							3		// IYUV(I420)类型YUV数据
#define T_RGB32							7		// RGB32类型，现在不支持

/* avi转码 */
#define AVI_MEDIACHANGE_FRAMERATE		1		// 帧率改变
#define AVI_MEDIACHANGE_RESOLUTION		2		// 分辨率改变

/* 水印相关 */
#define WATERMARK_DATA_TEXT				0		// 文字
#define WATERMARK_DATA_JPEG_BMP			1		// JPEG或者BMP图片
#define WATERMARK_DATA_FRAMEDATA		3		// 帧数据

/* 错误码 */
#define  DH_PLAY_NOERROR							0	//无错误
#define  DH_PLAY_COMMON_ERROR						1	//普通错误
#define	 DH_PLAY_PARA_INVALID						2	//参数无效
#define  DH_PLAY_ORDER_ERROR						3	//调用顺序不对
#define	 DH_PLAY_PORT_OPEN							4	//通道已经被打开
#define	 DH_PLAY_PORT_CLOSE							5	//通道已经被关闭
#define	 DH_PLAY_PORT_INVALID						6	//通道号无效
#define	 DH_PLAY_PORT_EXIST							7	//通道已经存在
#define  DH_PLAY_OPEN_FILE_ERROR					8	//打开文件失败
#define  DH_PLAY_INTERFACE_NOT_SUPPORT				9	//接口不支持
#define  DH_PLAY_HWND_INVALID						10	//窗口句柄无效
#define  DH_PLAY_PLAY_ERROR							11	//播放失败
#define  DH_PLAY_SPEED_INVALID						12	//速度无效
#define  DH_PLAY_NOT_FILE							13	//非文件模式
#define  DH_PLAY_NOT_STREAM							14	//非流模式
#define  DH_PLAY_NO_FRAME							15	//当前没有帧可用
#define  DH_PLAY_INDEX_NOT_COMPLETE					16	//索引没有建立完成
#define  DH_PLAY_INDEX_COMPLETE						17	//已建立文件索引
#define  DH_PLAY_GET_FILE_SIZE_ERROR				18	//获取文件大小失败
#define  DH_PLAY_CREATE_THREAD_FAIL					19	//创建线程失败
#define  DH_PLAY_CREATE_EVENT_FAIL					20	//创建句柄失败
#define  DH_PLAY_SOUND_SHARE_MODE					21	//处于共享声音模式
#define  DH_PLAY_INCLUDE_SOUND_SHARE_PORT			22	//该端口已包含
#define  DH_PLAY_NOT_INCLUDE_SOUND_SHARE_PORT		23	//该端口未包含
#define  DH_PLAY_CREATE_DIR_ERROR					24	//创建路径失败
#define  DH_PLAY_CREATE_FILE_ERROR					25	//创建文件失败

#define  DH_PLAY_CONVERT_YUV_ERROR					26	//转到yuv失败
#define  DH_PLAY_CONVERT_JPG_ERROR					27	//转到jpg失败
#define  DH_PLAY_CONVERT_BMP_ERROR					28	//转到bmp失败
#define  DH_PLAY_CONVERT_TIFF_ERROR					29	//转到tiff失败
#define  DH_PLAY_HW_CATCH_ERROR					    30	//硬解码抓拍失败
#define  DH_PLAY_CREATE_VIDEO_RENDER_ERROR			31	//创建视频渲染失败
#define  DH_PLAY_NOT_SUPPORT_REF_VALUE				32	//不支持外部索引设置
#define  DH_PLAY_FORMAT_NOT_SUPPORT					33	//格式不支持
#define  DH_PLAY_CREATE_RECORD_ERROR				34	//创建录像失败
#define  DH_PLAY_OPEN_RECORD_ERROR					35	//打开录像失败
#define  DH_PLAY_FRAMERATE_ERROR					36	//帧率错误
#define  DH_PLAY_CREATE_AUDIO_RECORD_ERROR			37	//创建音频录像失败
#define  DH_PLAY_OPEN_AUDIO_RECORD_ERROR			38	//打开音频录像失败
#define	 DH_PLAY_AES_ALLOC_ERROR					39	//调用aes_alloc失败

#define  DH_PLAY_BUF_OVER				            40  //缓冲区已满
#define  DH_PLAY_ALLOC_MEMORY_ERROR		            41  //分配内存失败


/***********************************************************************************************/
/* 枚举定义																					   */
/***********************************************************************************************/
																								
/* 渲染模式 */
typedef enum
{
	RENDER_NOTSET = 0,				// 未设置
	RENDER_GDI,						// GDI渲染
	RENDER_X11 = RENDER_GDI,		// 非windows平台X11渲染
	RENDER_DDRAW,					// ddraw渲染	
	RENDER_OPENGL = RENDER_DDRAW,	// 非windows平台opengl渲染
    RENDER_D3D,						// d3d渲染
	RENDER_WGL						// windows平台opengl渲染
}RenderType;

/* 解码模式 */
typedef enum
{
	DECODE_NOTSET = 0,		// 未设置
	DECODE_SW,				// 软解
	DECODE_HW,				// 硬解码拷贝模式
	DECODE_HW_FAST,			// 硬解码直接显示模式
	DECODE_MSDK				// 硬解码，调用intel media sdk，已废弃
}DecodeType;

/* 图片格式 */
typedef enum __tPicFormats
{
	PicFormat_BMP = 0,				        // BMP32类型
	PicFormat_JPEG,							// JPEG类型
	PicFormat_JPEG_70,						// 70%质量的JPEG类型
	PicFormat_JPEG_50,						// 50%质量的JPEG类型
	PicFormat_JPEG_30,						// 30%质量的JPEG类型
	PicFormat_JPEG_10,						// 10%质量的JPEG类型
	PicFormat_BMP24,                        // BMP24类型
	PicFormat_TIFF							// TIFF类型
} tPicFormats;

/* 获取媒体信息格式 */
typedef enum _CMD_TYPE
{
	PLAY_CMD_GetTime = 1,			// 编码中时间信息，为公历年月日
	PLAY_CMD_GetFileRate = 2,		// 帧率信息
	PLAY_CMD_GetMediaInfo = 3,		// 媒体信息
	PLAY_CMD_GetRenderNum = 4,		// 当前要渲染的帧号
	PLAY_CMD_GetRenderTime = 5,		// 当前要渲染的时间
	PLAY_CMD_GetSrcTime	= 6,		// 编码中时间信息，为1970年7月1日后后持续的秒数
	PLAY_CMD_GetCurRenderNum = 7    // 当前帧号，PLAY_CMD_GetRenderNum是上一帧的帧号
} CMD_TYPE_E;

/* 音视频同步策略 */
typedef enum
{
	AV_SYNC_VIDEO_MASTER,		  // 以视频为基准（非音视频同步方式）
	AV_SYNC_AUDIO_TIME_STAMP      // 以音频时间戳为基准
}AV_SYNC_TYPE;

/***********************************************************************************************/
/* 结构体定义																				   */
/***********************************************************************************************/

/* 局部显示区域 */
typedef struct _tagRECT
{
	LONG left;								
	LONG top;								
	LONG right;								
	LONG bottom;							
}DISPLAYRECT;

/* 时间结构 */
#ifndef _DHTIME_
#define _DHTIME_
typedef struct _DHTIME								
{
	DWORD second	:6;						//	秒	0-59		
	DWORD minute	:6;						//	分	0-59		
	DWORD hour		:5;						//	时	0-23		
	DWORD day		:5;						//	日	1-31		
	DWORD month		:4;						//	月	1-12		
	DWORD year		:6;						//	年	2000-2063	
} DHTIME,*pDHTIME;
#endif

/* 文件信息结构，本地使用 */
typedef struct _FILE_INFO
{
	UINT		channel;				// 通道号
	BYTE		alarm;					// 报警类型
	BYTE		lock_flag;				// 锁定类型(0未锁定 1手动 2自动)
	BYTE		video_audio;			// 视频或音频
	BYTE		image;					// 图像质量(bit4~6保留， bit7 表示夏令时)
	BYTE		hint;					// 查找文件时使用的暗示参数
	DHTIME		start_time;				// 开始时间
	DHTIME		end_time;				// 结束时间
	UINT		file_length;			// 文件长度，单位为KB
	UINT		disk_no;				// 所在的硬盘号
	UINT		disk_part;				// 所在的分区
	UINT		first_clus_no;			// 文件首簇号
	UINT		ud_no;					// 用户数据号
	BYTE		base_name[24];			// 文件名
	BYTE		ext_name[4];			// 扩展名
	UINT		checked;				// 是否选中，用于文件备份
}FILE_INFO,*pFILE_INFO;

/* 帧位置信息 */
typedef struct
{
	LONGLONG		nFilePos;				// 指定帧在文件中的偏移位置
	LONG			nFrameLen;				// 帧长度
	LONG			nFrameNum;				// 帧序号
	LONG			nFrameTime;				// 帧时间
	LONG			nErrorFrameNum;			// 保留，暂无使用
	SYSTEMTIME*		pErrorTime;				// 保留，暂无使用
	LONG			nErrorLostFrameNum;		// 保留，暂无使用
	LONG			nErrorFrameSize;		// 保留，暂无使用
}FRAME_POS,*PFRAME_POS;

/* 帧信息 */
typedef struct
{
	LONG			nWidth;					// 画面宽，单位像素。如果是音频数据则为0
	LONG			nHeight;				// 画面高，如果是音频数据则为0
	LONG			nStamp;					// 时标信息，单位毫秒
	LONG			nType;					// 视频帧类型，T_AUDIO16，T_RGB32，T_IYUV
	LONG			nFrameRate;				// 视频表示帧率，音频表示采样率
}FRAME_INFO;

/* 帧信息扩展字段 */
typedef struct
{
	#define FRAME_TYPE_VIDEO 0				// 视频帧
	#define FRAME_TYPE_AUDIO 1				// 音频帧
	int				nFrameType;				// 视频帧类型，见上面定义
	int				nFrameSeq;				// 帧序号
	int				nStamp;					// 时标信息，单位毫秒
	int				nWidth;					// 画面宽，单位像素。如果是音频数据则为0
	int 			nHeight;				// 画面高，如果是音频数据则为0
	int				nFrameRate;				// 编码时产生的图像帧率
	int				nChannels;				// 音频通道数
	int				nBitPerSample;			// 音频采样位数
	int				nSamplesPerSec;			// 音频采样频率
	int				nRemainData;			// 缓冲剩余数据量
	SYSTEMTIME		nDataTime;				// 时间
	int				nFrameSubType;			// 视频帧子类型
	int				nReserved[58];			// 保留字段
}FRAME_INFO_EX;

/* 解码后的帧信息 */
typedef struct 
{
	int				nFrameType;					// 帧类型，定义见FRAME_INFO_EX里nFrameType字段
	void*			pAudioData;				    // 音频数据，如果是音频帧
	int				nAudioDataLen;			    // 音频数据长度
	void*			pVideoData[3];			    // 分别表示视频的YUV三个分量
	int				nStride[3];				    // 分别表示YUV三个分量的跨距
	int				nWidth[3];				    // 分别表示YUV三个分量的宽度
	int				nHeight[3];					// 分别表示YUV三个分量的高度
	int				nReserved[64];				// 保留字段
}FRAME_DECODE_INFO;

/* 媒体信息 */
typedef struct 
{
	int			lWidth;					//	画面宽，单位像素
	int			lHeight;				//	画面高
	int			lFrameRate;				//	帧率
	int			lChannel;				//	音频通道数
	int			lBitPerSample;			//	音频采样位数
	int			lSamplesPerSec;			//	音频采样频率
}MEDIA_INFO;

/***********************************************************************************************/
/* 接口																						   */
/***********************************************************************************************/

/************************************************************************/
//> 获取版本号
/************************************************************************/

/**
 * 获取播放库SDK主版本号，次版本号和SVN版本号。
 *
 * @return 最高1位表示当前的主版本号；第2~3位表示次版本号；其余的表示SVN版本号。
 *         如：返回值34033722表示：主版本号是3，次版本号是40，SVN版本号是33722。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetSdkVersion();

/************************************************************************/
//> 错误码
/************************************************************************/

/**
 * 获取错误码。
 *
 * @return 错误码
 */
PLAYSDK_API DWORD  CALLMETHOD PLAY_GetLastErrorEx();

/************************************************************************/
//> 日志开关
/************************************************************************/

/**
 * 日志调试开关，默认为Warn等级，打印较少。如果需要开启详细日志打印，建议为Debug等级。
 * Windows平台生成为当前库目录下的playsdk.log文件，其他非windows为控制台打印。
 *
 */
typedef enum
{
    LOG_LevelUnknown= 0, // 未知等级
    LOG_LevelFatal,	     // fatal等级，当设置为此等级时，有一种打印输出（fatal）都有输出
    LOG_LevelError,	     // error等级，当设置为此等级时，有两种打印输出（fatal，error）都有输出
    LOG_LevelWarn,	     // warn等级，当设置为此等级时，有三种打印输出（fatal，error，warn）都有输出
    LOG_LevelInfo,	     // info等级，当设置为此等级时，有四种打印输出（fatal，error，warn，info）都有输出
    LOG_LevelTrace,	     // Trace等级，当设置为此等级时，有五种打印输出（fatal，error，warn，info，trace）都有输出
    LOG_LevelDebug	     // Debug等级，当设置为此等级时，以上六种打印（fatal，error，warn，info，trace，debug）都有输出
}LOG_LEVEL;
PLAYSDK_API void CALLMETHOD PLAY_SetPrintLogLevel(LOG_LEVEL logLevel);

/************************************************************************/
//> 播放端口号
/************************************************************************/

/**
 * 获取空闲通道号，范围在101~511。
 *
 * @param[out] plPort 获取到的空闲通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetFreePort(LONG *plPort);

/**
 * 释放通道号。
 *
 * @param[in] lPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_ReleasePort(LONG lPort);

/************************************************************************/
//> 文件操作
/************************************************************************/

/**
 * 打开播放文件。
 *
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OpenFile(LONG nPort,LPSTR sFileName);

/**
 * 关闭文件。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CloseFile(LONG nPort);

/**
 * 文件结束回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pUserData 用户数据
 */
typedef void (CALLBACK *fFileEndCBFun)(DWORD nPort, void* pUserData);

/**
 * 文件结束回调。
 *
 * @param[in] nPort 通道号
 * @param[out] pFileEndCBFun 文件结束函数回调指针
 * @param[in] pUserData 用户数据
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetFileEndCallBack(LONG nPort, fFileEndCBFun pFileEndCBFun, void* pUserData);

/************************************************************************/
//> 流操作
/************************************************************************/

/**
 * 设置流播放模式。
 *
 * @param[in] nPort 通道号
 * @param[in] nMode 播放模式，0实时流，1文件流
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetStreamOpenMode(LONG nPort,DWORD nMode);

/**
 * 获取播放模式。
 *
 * @param[in] nPort 通道号
 * @return LONG，STREAM_MODE_REALSTREAM或STREAM_MODE_FILESTREAM
 */
PLAYSDK_API LONG CALLMETHOD PLAY_GetStreamOpenMode(LONG nPort);

/**
 * 打开流。
 *
 * @param[in] nPort 通道号
 * @param[in] pFileHeadBuf 文件头数据
 * @param[in] nSize 文件头长度
 * @param[in] nBufPoolSize 设置播放器中存放数据流的缓冲区大小。范围是SOURCE_BUF_MIN~SOURCE_BUF_MAX
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OpenStream(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize);

/**
 * 关闭流。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CloseStream(LONG nPort);

/**
 * 输入数据流，PLAY_Play之后使用。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 流数据缓冲区地址
 * @param[in] nSize 流数据长度
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_InputData(LONG nPort,PBYTE pBuf,DWORD nSize);


/************************************************************************/
//> 声音相关
/************************************************************************/

/**
 * 以独占方式打开声音。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_PlaySound(LONG nPort);

/**
 * 关闭声音（独占方式）。
 *
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopSound();

/**
 * 以共享方式打开声音。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_PlaySoundShare(LONG nPort);

/**
 * 关闭声音（共享方式）。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopSoundShare(LONG nPort);

/**
 * 设置音量。
 *
 * @param[in] nPort 通道号
 * @param[in] nVolume 音量值，范围0-0xFFFF
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetVolume(LONG nPort,WORD nVolume);

/**
 * 获取音量。
 *
 * @param[in] nPort 通道号
 * @return WORD，音量值
 * @note 这里的音量是指声卡输出的主音量，会影响到其他的声音应用。
 */
PLAYSDK_API WORD CALLMETHOD PLAY_GetVolume(LONG nPort);

/**
 * 音频采集数据回调函数。
 *
 * @param[in] pDataBuffer 数据地址
 * @param[in] DataLength 数据长度
 * @param[in] pUserData 用户数据
 */
typedef void (CALLBACK *pCallFunction)(LPBYTE pDataBuffer, DWORD DataLength, void* pUserData);

/**
 * 打开音频采集功能。
 *
 * @param[in] pProc音频采集数据回调指针
 * @param[in] nBitsPerSample 音频采样位数
 * @param[in] nSamplesPerSec 音频采样率
 * @param[in] nLength 数据缓冲的长度，范围320-4096
 * @param[in] encodetype 对采集数据进行编码设置，0：pcm，1：g711a，2：g711u。pcm回调裸数据，g711a和g711u回调带老大华头的数据
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OpenAudioRecord(pCallFunction pProc, LONG nBitsPerSample, LONG nSamplesPerSec, LONG nLength, LONG encodetype, void* pUserData);

/**
 * 关闭音频采集功能。
 *
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CloseAudioRecord();

/**
 * 设置音频采集缩放比例。
 *
 * @param[in] fRatio 缩放比例。大于0小于1为音频缩小；1为原始音频；大于1为音频放大
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetAudioRecScaling(float fRatio);

/**
 * 获取音频采集缩放比例。
 *
 * @param[out] pfRatio 缩放比例。大于0小于1为音频缩小；1为原始音频；大于1为音频放大
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetAudioRecScaling(float* pfRatio);

/**
 * 设置音频播放缩放比例。
 *
 * @param[in] nPort 通道号
 * @param[in] fRatio 缩放比例。大于0小于1为音频缩小；1为原始音频；大于1为音频放大。
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetAudioRenderScaling(LONG nPort, float fRatio);

/**
 * 获取音频播放缩放比例。
 *
 * @param[in] nPort 通道号
 * @param[out] pfRatio 缩放比例。大于0小于1为音频缩小；1为原始音频；大于1为音频放大
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetAudioRenderScaling(LONG nPort, float* pfRatio);

/**
 * 调整WAVE波形，可以改变声音的大小。它和PLAY_SetVolume的不同在于，它是调整声音数据，只对该路其作用，而PLAY_SetVolume是
 * 调整声卡音量， 对整个系统起作用。
 *
 * @param[in] nPort 通道号
 * @param[in] nCoefficient 调整参数，0是不调整，其他取值范围从MIN_WAVE_COEF到MAX_WAVE_COEF。若设定为MIN_WAVE_COEF表
 *                         示音量最低，若设定为MAX_WAVE_COEF表示音量最大
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_AdjustWaveAudio(LONG nPort,LONG nCoefficient);

/************************************************************************/
//> 播放控制
/************************************************************************/

/**
 * 开启播放。播放开始，播放视频画面大小将根据hWnd窗口调整，要全屏显示，只要把hWnd窗口放大到全屏。开始解码线程，若送入的显示窗   
 * 口句柄为NULL，则不显示，但是不影响解码。
*
* @param[in] nPort 通道号
* @param[in] hWnd 播放视频的窗口句柄
* @return BOOL，成功返回TURE，失败返回FALSE
* @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Play(LONG nPort, HWND hWnd);

/**
 * 关闭播放。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Stop(LONG nPort);

/**
 * 暂停/恢复播放。
 *
 * @param[in] nPort 通道号
 * @param[in] nPause 1：暂停；0：恢复
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Pause(LONG nPort,DWORD nPause);

/**
 * 慢速播放。每次调用将使当前播放速度慢一倍；要恢复正常播放调用PLAY_Play()，从当前位置开始正常播放。
 * 播放速度范围为[1/64,64]。
 *
 * @param[in] nPort 通道号
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Slow(LONG nPort);

/**
 * 快速播放。每次调用将使当前播放速度加快一倍，要恢复正常播放调用PLAY_Play()，从当前位置开始正常播 
   放；高清码流在高倍速播放时，由于受到解码和显示的限制，可能达不到所设置的速度。
 * 播放速度范围为[1/64, 64]。
 *
 * @param[in] nPort 通道号
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Fast(LONG nPort);

/**
 * 单帧播放。要恢复正常播放调用PLAY_ Play。
 *
 * @param[in] nPort 通道号
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OneByOne(LONG nPort);

/**
 * 单帧倒放。要恢复正常播放调用PLAY_ Play。只支持文件播放，且必须在文件索引生成之后才能调用。
 *
 * @param[in] nPort 通道号
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OneByOneBack(LONG nPort);

/**
 * 设置视频参数。
 *
 * @param[in] nPort 通道号
 * @param[in] nRegionNum 显示区域。如果只有一个显示区域(通常情况)设为0
 * @param[in] nBrightness 亮度。默认64；范围0-128
 * @param[in] nContrast 对比度。默认64；范围0-128
 * @param[in] nSaturation 饱和度。默认64；范围0-128
 * @param[in] nHue 色调。默认64；范围0-128
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetColor(LONG nPort, DWORD nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue);

/**
 * 获取视频参数。
 *
 * @param[in] nPort 通道号
 * @param[in] nRegionNum 显示区域
 * @param[out] pBrightness 亮度
 * @param[out] pContrast 对比度
 * @param[out] pSaturation 饱和度
 * @param[out] pHue 色调
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetColor(LONG nPort, DWORD nRegionNum, int *pBrightness, int *pContrast, int *pSaturation, int *pHue);

/**
 * 设置音视频播放策略。
 *
 * @param[in] nPort 通道号
 * @param[in] nAVSyncType 码流播放基准，见AV_SYNC_TYPE
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetAVSyncType(LONG nPort,AV_SYNC_TYPE nAVSyncType);

/**
 * 改变视频播放速度。在非1倍速下音频会被丢弃。
 *
 * @param[in] nPort 通道号
 * @param[in] fCoff 播放速度，范围是1/64-64。当播放速度较快时可能需要抽帧播放
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPlaySpeed(LONG nPort, float fCoff);

/**
 * 设置播放方向。
 *
 * @param[in] nPort 通道号
 * @param[in] emDirection 播放方向。0：正放；1：倒放
 * @return 成功返回TURE；失败返回FALSE。
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPlayDirection(LONG nPort, DWORD emDirection);

/**
 * 设置延迟播放时间。[nDelay,nThreshold]，小于nDelay稍微慢放，大于nThreshold稍微快放，两者之间正常播放。
 *
 * @param[in] nPort 通道号
 * @param[in] nDelay(ms) 延迟时间。缓冲达到该时间正常播放，小于该时间稍微慢放
 * @param[in] nThreshold(ms) 阈值时间。缓冲小于该时间正常播放，大于该时间稍微快放
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDelayTime(LONG nPort, int nDelay, int nThreshold);

/**
 * 设置播放策略，只对实时流有效。
 *
 * @param[in] nPort 通道号
 * @param[in] nStartTime(ms) 开始播放时间
 * @param[in] nSlowTime(ms) 阈值时间。缓冲小于该时间正常播放，大于该时间稍微快放
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPlayMethod(LONG nPort, int nStartTime, int nSlowTime, int nFastTime, int nFailedTime);

/**
 * 设置图像翻转。范围0-3。
 *
 * @param[in] nPort 通道号
 * @param[in] nrotateType 翻转类型。0：不旋转；1：旋转90度；2：旋转180度；3：旋转270度
 * @return 成功返回TURE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetRotateAngle(LONG nPort , int nrotateType);

/************************************************************************/
//> 文件定位
/************************************************************************/

/**
 * 设置文件播放指针的相对位置(百分比)。
 *
 * @param[in] nPort 通道号
 * @param[in] fRelativePos 文件长度的百分比
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPlayPos(LONG nPort,float fRelativePos);

/**
 * 获取文件播放指针的相对位置(百分比)。
 *
 * @param[in] nPort 通道号
 * @return float，返回文件长度的相对位置，范围0-100%
 */
PLAYSDK_API float CALLMETHOD PLAY_GetPlayPos(LONG nPort);

/**
 * 设置文件当前播放时间。
 *
 * @param[in] nPort 通道号
 * @param[in] nTime 设置文件播放位置到指定时间，单位毫秒
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPlayedTimeEx(LONG nPort,DWORD nTime);

/**
 * 获取文件当前播放时间。
 *
 * @param[in] nPort 通道号
 * @return DWORD，文件当前播放的时间，单位毫秒
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetPlayedTimeEx(LONG nPort);

/**
 * 获取当前播放的帧序号，PLAY_GetPlayedFrames是总共解码的帧数。如果文件
 * 播放位置不被改变，那么这两个函数的返回值应该非常接近，除非码流丢失
 * 数据。
 *
 * @param[in] nPort 通道号
 * @return DWORD，当前播放的帧序号
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetCurrentFrameNum(LONG nPort);

/**
 * 设置文件当前帧播放帧号，此函数必须在文件索引生成之后才能调用。
 *
 * @param[in] nPort 通道号
 * @param[in] nFrameNum 帧序号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetCurrentFrameNum(LONG nPort,DWORD nFrameNum);

/**
 * 获取已播放的帧数。
 *
 * @param[in] nPort 通道号
 * @return DWORD，已经播放的视频帧数
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetPlayedFrames(LONG nPort);

/**
 * 获取当前文件播放时间。
 *
 * @param[in] nPort 通道号
 * @return DWORD，文件当前播放的时间，单位秒
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetPlayedTime(LONG nPort);

/**
 * 获取文件总时间。
 *
 * @param[in] nPort 通道号
 * @return DWORD，文件总的时间长度值，单位秒
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetFileTime(LONG nPort);

/**
 * 获取文件总帧数。
 *
 * @param[in] nPort 通道号
 * @return DWORD，文件中的总帧数
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetFileTotalFrames(LONG nPort);

/************************************************************************/
//> 文件索引
/************************************************************************/

/**
 * 建立索引回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pUserData 用户自定义参数
 */
typedef void(CALLBACK *fFileRefDoneCBFun)(DWORD nPort, void* pUserData);	

/**
 * 设置建立索引回调，在文件打开时生成文件索引。这个过程耗时比较长，大约
 * 每秒处理40M左右的数据，因为从硬盘读数据比较慢，建立索引的过程是在
 * 后台完成，需要使用索引的函数要等待这个过程结束，其他接口不受影响。
 *
 * @param[in] nPort 通道号
 * @param[out] pFileRefDoneCBFun 建立索引回调函数指针
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetFileRefCallBack(LONG nPort,
													fFileRefDoneCBFun pFileRefDoneCBFunc,
													void* pUserData);
/**
 * 建立索引回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] bIndexCreated 索引创建标志，TRUE索引创建成功；FALSE失败
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK *fFileRefDoneCBFunEx)(DWORD nPort, BOOL bIndexCreated, void* pUserData);

/**
 * 设置建立索引回调，在文件打开时生成文件索引。这个过程耗时比较长，大约
 * 每秒处理40M左右的数据，因为从硬盘读数据比较慢，建立索引的过程是在
 * 后台完成，需要使用索引的函数要等待这个过程结束，其他接口不受影响。
 *
 * @param[in] nPort 通道号
 * @param[out] pFileRefDoneCBFunEx 建立索引回调函数指针
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetFileRefCallBackEx(LONG nPort, fFileRefDoneCBFunEx pFileRefDoneCBFunEx, void* pUserData);

/**
 * 查找指定位置之前的关键帧位置，图像解码必须从关键帧开始，如果用户保存
 * 的文件不是从关键帧开始的，那么倒下一个关键帧之前的数据会被忽略。如
 * 果用户要截取文件中的一段数据，则应该考虑从关键帧开始截取。结束位置
 * 则关系不大，最多丢失3帧数据。在文件索引建立完全的前提下，与
 * PLAY_GetNextKeyFramePos联合使用，可以用来实现剪辑录像文件，剪辑精度
 * 与关键帧间隔有关。
 *
 * @param[in] nPort 通道号
 * @param[in] nValue 当前位置，可以是时间或帧号，类型由nType指定
 * @param[in] nType 指定nValue的类型。如果nType是BY_FRAMENUM，则nValue表示帧号；nType是BY_FRAMTIME，则nValue表示时间，单位ms。
 * @param[in] pFramePos 查找到的关键帧的文件位置信息结构指针，详见PFRAME_POS。
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PFRAME_POS pFramePos);

/**
 * 查找指定位置之后的关键帧位置。
 *
 * @param[in] nPort 通道号
 * @param[in] nValue 当前位置，可以是时间或帧号，类型由nType指定
 * @param[in] nType 指定nValue的类型。如果nType是BY_FRAMENUM,则nValue表示帧号；nType是BY_FRAMTIME,则nValue表示时间,单位ms。
 * @param[in] pFramePos 查找到的关键帧的文件位置信息结构指针，详见PFRAME_POS。
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetNextKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PFRAME_POS pFramePos);

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

/**
 * 设置文件索引，索引信息及其长度必须准确。如果已经有了文件索引信息，可以
 * 不再调用生成索引的回调函数PLAY_SetFileRefCallBackEx，直接输入索引信息。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuffer 索引信息
 * @param[in] pSize 索引信息的长度
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetRefValue(LONG nPort,BYTE *pBuffer, DWORD nSize);

/************************************************************************/
//> 获取播放或解码信息
/************************************************************************/

/**
 * 设置解码回调流类型，在PLAY_Play之前调用。
 *
 * @param[in] nPort 通道号
 * @param[in] nStream 1 视频流；2 音频流；3 复合流
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecCBStream(LONG nPort,DWORD nStream);

/**
 * 解码回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pFrameDecodeInfo 解码后的音视频数据
 * @param[in] pFrameInfo 图像和声音信息，请参见FRAME_INFO结构体
 * @param[in] pUser 用户自定义参数
 */
typedef void (CALLBACK* fCBDecode)(LONG nPort, FRAME_DECODE_INFO* pFrameDecodeInfo, FRAME_INFO_EX* pFrameInfo, void* pUser);

/**
 * 设置解码回调，替换播放器中的显示部分，由用户自己控制显示，该函数在
 * PLAY_Play之前调用，在PLAY_Stop时自动失效，下次调用PLAY_Play之前
 * 需要重新设置。解码部分不控制速度，只要用户从回调函数中返回，解码器
 * 就会解码下一部分数据。适用于只解码不显示的情形。
 *
 * @param[in] nPort 通道号
 * @param[out] cbDec 解码回调函数指针，不能为NULL
 * @param[in] pUser 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecodeCallBack(LONG nPort, fCBDecode cbDec, void* pUser);

/**
 * 视频抓图回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 返回图像数据
 * @param[in] nSize 返回图像数据大小
 * @param[in] nWidth 画面宽，单位像素
 * @param[in] nHeight 画面高，单位像素
 * @param[in] nStamp 时标信息，单位毫秒
 * @param[in] nType 数据类型，T_RGB32，T_UYVY，详见宏定义说明
 * @param[in] nReceaved 对应用户自定义参数
 */
typedef void (CALLBACK* fDisplayCBFun)(LONG nPort,char * pBuf,LONG nSize,LONG nWidth,LONG nHeight,LONG nStamp,LONG nType, void* pReserved);

/**
 * 设置视频抓图回调函数，如果要停止回调，可以把回调函数指针设为NULL，该函数可以在任何时候调用。
 *
 * @param[in] nPort 通道号
 * @param[out] DisplayCBFun 抓图回调函数，可以为NULL
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDisplayCallBack(LONG nPort, fDisplayCBFun DisplayCBFun, void* pUserData);

/**
 * 音频解码后的WAVE数据回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pAudioBuf wave格式音频数据
 * @param[in] nSize 音频数据长度
 * @param[in] nStamp 时标(ms)
 * @param[in] nType 音频类型T_AUDIO16， 采样率8000，单声道，每个采样点16位表示
 * @param[in] pUserData 用户自定义数据
 */
typedef void (CALLBACK * fAudioCBFun)(LONG nPort, char * pAudioBuf, LONG nSize, LONG nStamp, LONG nType, void* pUserData);

/**
 * 音频解码后的WAVE数据回调。
 *
 * @param[in] nPort 通道号
 * @param[out] AudioCBFun 音频解码回调函数
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetAudioCallBack(LONG nPort, fAudioCBFun AudioCBFun, void* pUserData);

/**
 * 解码回调。与PLAY_SetDecodeCallBack基本相同，不同的是解码回调的同时可以显示视频，建议不要在回调函数里面做长时间的逻辑处理，以免增加显示的延时。
 *
 * @param[in] nPort 通道号
 * @param[out] cbDec 解码回调函数指针，不能为NULL
 * @param[in] pUser 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
typedef fCBDecode fVisibleDecodeCallBackFunc;
PLAYSDK_API BOOL CALLMETHOD PLAY_SetVisibleDecodeCallBack(LONG nPort, fVisibleDecodeCallBackFunc cbDec, void* pUser);

/**
 * 解码回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 解码后的音视频数据
 * @param[in] nSize 解码后的音视频数据pBuf的长度
 * @param[in] pFrameInfo 图像和声音信息，请参见FRAME_INFO结构体
 * @param[in] pUserData 用户自定义参数
 * @param[in] nReserved2 保留参数
 */
typedef void (CALLBACK* fDecCBFun)(LONG nPort,char * pBuf,LONG nSize,FRAME_INFO * pFrameInfo, void* pUserData, LONG nReserved2);

/**
 * 设置解码回调，替换播放器中的显示部分，由用户自己控制显示，该函数在
 * PLAY_Play之前调用，在PLAY_Stop时自动失效，下次调用PLAY_Play之前
 * 需要重新设置。解码部分不控制速度，只要用户从回调函数中返回，解码器
 * 就会解码下一部分数据。适用于只解码不显示的情形。
 *
 * @param[in] nPort 通道号
 * @param[out] DecCBFun 解码回调函数指针，不能为NULL
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecCallBack(LONG nPort, fDecCBFun DecCBFun);

/**
 * 设置解码回调，替换播放器中的显示部分，由用户自己控制显示，该函数在
 * PLAY_Play之前调用，在PLAY_Stop时自动失效，下次调用PLAY_Play之前
 * 需要重新设置。解码部分不控制速度，只要用户从回调函数中返回，解码器
 * 就会解码下一部分数据。适用于只解码不显示的情形。
 *
 * @param[in] nPort 通道号
 * @param[out] DecCBFun 解码回调函数指针,不能为NULL
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecCallBackEx(LONG nPort, fDecCBFun DecCBFun, void* pUserData);

/**
 * 解码回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 解码后的音视频数据
 * @param[in] nSize 解码后的音视频数据pBuf的长度
 * @param[in] pFrameInfo 图像和声音信息,请参见FRAME_INFO结构体
 * @param[in] pUserData 用户自定义参数
 * @param[in] nReserved1 保留参数
 */
typedef void (CALLBACK* fVisibleDecCBFun)(LONG nPort,char * pBuf,LONG nSize,FRAME_INFO * pFrameInfo, void* pUserData, LONG nReserved1);

/**
 * 解码回调。与PLAY_SetDecCallBackEx基本相同，不同的是解码回调的同时可以
 * 显示视频，建议不要在回调函数里面做长时间的逻辑处理，以免增加显示的延时。
 *
 * @param[in] nPort 通道号
 * @param[out] DecCBFun 解码回调函数指针,不能为NULL
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetVisibleDecCallBack(LONG nPort, fVisibleDecCBFun DecCBFun, void* pUserData);

/**
 * 水印数据回调函数。
 *
 * @param[in] buf 水印数据buffer指针
 * @param[in] key 区分不同水印信息
 * @param[in] len 缓冲的最大长度
 * @param[in] reallen 缓冲的实际长度
 * @param[in] len 缓冲的最大长度
 * @param[in] reallen 缓冲的实际长度
 * @param[in] type 1没有错误；2水印错误；3帧数据错误；4帧号错误；5帧头错误；6没有帧头
 * @param[in] pUserData 用户自定义参数
 * @return int 无意义
 */
typedef int (CALLBACK* fGetWaterMarkInfoCallbackFunc)(char* buf, LONG key, LONG len, LONG reallen, LONG type, void* pUserData);	

/**
 * 设置水印数据回调。注意：水印校验回调设置后将不会进行解码显示。
 *
 * @param[in] nPort 通道号
 * @param[out] pFunc 水印回调函数指针
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetWaterMarkCallBack(LONG nPort, fGetWaterMarkInfoCallbackFunc pFunc, void* pUserData);

/**
 * 水印数据回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] buf 水印数据缓冲
 * @param[in] lTimeStamp 水印的时间戳
 * @param[in] lInfoType 水印信息类型,有三种类型,WATERMARK_DATA_TEXT,WATERMARK_DATA_JPEG_BMP,WATERMARK_DATA_FRAMEDATA
 * @param[in] len 缓冲的最大长度
 * @param[in] reallen 缓冲的实际长度
 * @param[in] lCheckResult 1没有错误；2水印错误；3帧数据错误；4帧号错误；5帧头错误；6没有帧头
 * @param[in] pUserData 用户自定义参数
 * @return int 无意义
 */
typedef int (CALLBACK* fGetWaterMarkInfoCallbackFuncEx)(LONG nPort, char* buf, LONG lTimeStamp, LONG lInfoType, LONG len, LONG reallen, LONG lCheckResult, void* pUserData);

/**
 * 设置水印数据回调。注意：水印校验回调设置后将不会进行解码显示。
 *
 * @param[in] nPort 通道号
 * @param[out] pFunc 水印回调函数指针
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetWaterMarkCallBackEx(LONG nPort, fGetWaterMarkInfoCallbackFuncEx pFunc, void* pUserData);

/**
 * 图像分辨率改变通知回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK *fEncChangeCBFun)(LONG nPort, void* pUserData);

/**
 * 设置图像分辨率改变通知回调，打开文件前使用。
 *
 * @param[in] nPort 通道号
 * @param[out] EncChangeCBFun 分辨率改变通知回调
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetEncTypeChangeCallBack(LONG nPort, fEncChangeCBFun EncChangeCBFun, void* pUserData);

/**
 * 图像分辨率改变通知回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pUserData 用户自定义参数
 * @param[in] nWidth 图像宽
 * @param[in] nHeight 图像高
 */
typedef void(CALLBACK *fEncChangeCBFunEx)(LONG nPort, void* pUserData,LONG nWidth, LONG nHeight);

/**
 * 设置图像分辨率改变通知回调，打开文件前使用。
 *
 * @param[in] nPort 通道号
 * @param[out] EncChangeCBFun 分辨率改变通知回调
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetEncTypeChangeCallBackEx(LONG nPort, fEncChangeCBFunEx EncChangeCBFun, void* pUserData);

/**
 * 查询信息。
 *
 * @param[in] nPort 通道号
 * @param[in] cmdType 指定状态查询指令，见CMD_TYPE_E
 * @param[in] buf 存放信息的缓冲
 * @param[in] buflen 缓冲长度
 * @param[out] returnlen 获取的信息的有效数据长度
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_QueryInfo(LONG nPort, int cmdType, char* buf, int buflen, int* returnlen);

/**
 * 获取视频实时码率。
 *
 * @param[in] nPort 通道号
 * @param[out] pBitRate 输出参数，返回视频码率(单位为k)
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetRealFrameBitRate(LONG nPort, double* pBitRate);

/**
 * 获取文件总帧数。
 *
 * @param[in] nPort 通道号
 * @return DWORD，获取当前帧率
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetCurrentFrameRate(LONG nPort);

/**
 * 获取用于显示的图像大小（如果是鱼眼，则为矫正后的鱼眼图像），根据此大小来设置显示窗口的区域，可以不用显卡做缩放
 * 工作，对于那些不支持硬件缩放的显卡来说非常有用。
 *
 * @param[in] nPort 通道号
 * @param[out] pWidth 图像宽
 * @param[out] pHeight 图像高
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPictureSize(LONG nPort,LONG *pWidth,LONG *pHeight);

/**
 * 帧数据回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 数据指针
 * @param[in] nSize 数据长度
 * @param[in] pMutexInfo 帧信息,指向DEMUX_INFO结构
 * @param[in] pMutexInfoEx 帧数据或裸数据，指向DemuInfoEx结构
 * @param[in] pUserData 用户自定义数据
 */
/* Demux帧类型 */
typedef enum
{
	FRAME_UNKNOWN = 0,			// 帧类型不可知
	FRAME_VIDEO,				// 帧类型是视频帧
	FRAME_AUDIO,				// 帧类型是音频帧
	FRAME_DATA					// 帧类型是数据帧
}FRAME_TYPE;

/* Demux帧子类型 */
typedef enum
{
	FRAME_SUB_TYPE_DATA_INVALID = 0,			// 数据无效
	FRAME_SUB_TYPE_VIDEO_I_FRAME = 1,			// I帧
	FRAME_SUB_TYPE_VIDEO_P_FRAME,				// P帧
	FRAME_SUB_TYPE_VIDEO_B_FRAME,				// B帧

	FRAME_SUB_TYPE_VIDEO_SMART_I_FRAME = 19,	// smart I帧
	FRAME_SUB_TYPE_VIDEO_SMART_P_FRAME 			// smart P帧
}FRAME_SUB_TYPE;

/* Demux视频编码格式 */
typedef enum
{
	ENCODE_VIDEO_UNKNOWN = 0,		// 视频编码格式不可知
	ENCODE_VIDEO_MPEG4,				// 视频编码格式是MPEG4
	ENCODE_VIDEO_HI_H264,			// 视频编码格式是海思H264
	ENCODE_VIDEO_JPEG,				// 视频编码格式是标准JPEG
	ENCODE_VIDEO_DH_H264,			// 视频编码格式是大华码流H264
	ENCODE_VIDEO_JPEG2000 = 6,		// 视频编码格式是标准JPEG2000
	ENCODE_VIDEO_AVS = 7,			// 视频编码格式是标准AVS
	ENCODE_VIDEO_STD_H264 = 8,		// 视频编码格式是标准H264
	ENCODE_VIDEO_MPEG2 = 9,			// 视频编码格式是MPEG2
	ENCODE_VIDEO_VNC = 10,			// 视频编码格式是VNC
	ENCODE_VIDEO_SVAC = 11,			// 视频编码格式是SVAC
	ENCODE_VIDEO_DH_H265 = 12		// 视频编码格式是H265
}ENCODE_VIDEO_TYPE;

/* Demux音频编码格式 */
typedef enum 
{
	ENCODE_AUDIO_UNKNOWN = 0,
	ENCODE_AUDIO_PCM = 7,			// 音频编码格式是PCM8
	ENCODE_AUDIO_G729,				// 音频编码格式是G729
	ENCODE_AUDIO_IMA,				// 音频编码格式是IMA
	ENCODE_PCM_MULAW,				// 音频编码格式是PCM MULAW
	ENCODE_AUDIO_G721,				// 音频编码格式是G721
	ENCODE_PCM8_VWIS,				// 音频编码格式是PCM8_VWIS
	ENCODE_MS_ADPCM,				// 音频编码格式是MS_ADPCM
	ENCODE_AUDIO_G711A,				// 音频编码格式是G711A
	ENCODE_AUDIO_AMR,				// 音频编码格式是AMR
	ENCODE_AUDIO_PCM16,				// 音频编码格式是PCM16
	ENCODE_AUDIO_G711U = 22,		// 音频编码格式是G711U
	ENCODE_AUDIO_G723 = 25,			// 音频编码格式是G723
	ENCODE_AUDIO_AAC,				// 音频编码格式是AAC
	ENCODE_AUDIO_G726_40,           // 音频编码格式是G726, 40kbps
	ENCODE_AUDIO_G726_32,           // 音频编码格式是G726, 32kbps
	ENCODE_AUDIO_G726_24,           // 音频编码格式是G726, 24kbps
	ENCODE_AUDIO_G726_16,           // 音频编码格式是G726, 16kbps
	ENCODE_AUDIO_MP2,				// 音频编码格式是mp2
	ENCODE_AUDIO_OGG,				// 音频编码格式是ogg vorbis
	ENCODE_AUDIO_MP3,				// 音频编码格式是mp3
	ENCODE_AUDIO_G722_1,		    // 音频编码格式是G722_1
	ENCODE_AUDIO_OPUS = 38          // 音频编码格式是OPUS
}ENCODE_AUDIO_TYPE;

/* 码流封装格式 */
typedef enum
{
	STREAM_TYPE_UNKNOWN = 0,        // 未知码流
	STREAM_TYPE_MPEG4,              // MPEG4
	STREAM_TYPE_DHPT =3,	        // 大华老码流：DHPT
	STREAM_TYPE_NEW,                // 大华老码流：NEW
	STREAM_TYPE_HB,                 // 大华老码流：HB
	STREAM_TYPE_AUDIO,              // 音频流
	STREAM_TYPE_PS,                 // MPEG-2：PS
	STREAM_TYPE_DHSTD,              // 大华最新的标准码流
	STREAM_TYPE_ASF,                // ASF
	STREAM_TYPE_3GPP,               // 3GP
	STREAM_TYPE_RAW,	            // 大华老码流：裸码流
	STREAM_TYPE_TS,                 // MPEG-2：TS
	STREAM_TYPE_SVC,                // svc
	STREAM_TYPE_AVI,                // AVI
	STREAM_TYPE_MP4,                // MP4
	STREAM_TYPE_CGI,                // CGI
	STREAM_TYPE_WAV,		        // WAV音频
	STREAM_TYPE_FLV,                // FLV

	STREAM_TYPE_MKV,                // mkv
	STREAM_TYPE_RTP,			    // RTP
	STREAM_TYPE_RAW_MPEG4,	        // MPEG4裸码流
	STREAM_TYPE_RAW_H264,	        // H264裸码流
	STREAM_TYPE_RAW_H265,	        // H265裸码流
	STREAM_TYPE_WMV,			    // WMV
	STREAM_TYPE_RAW_MPEG2,	        // MPEG2裸码流
	STREAM_TYPE_RAW_SVAC,	        // SVAC裸码流
	STREAM_TYPE_MOV,
	STREAM_TYPE_VOB,			    // VOB
	STREAM_TYPE_RAW_H263,
	STREAM_TYPE_RM,
	STREAM_TYPE_DHPS,		        // DHPS
}STREAM_TYPE;

/* Demux扩展信息 */
typedef struct 
{
	char*	pHead;				// 帧数据(带大华头)
	int		nLen;				// 帧数据长度
	char*	pBody;				// 裸数据(不带大华头)
	int		nBodyLen;			// 裸数据长度

	int		nRet;				// 0:继续解码 1:不解码，默认为0
	BYTE	nEncryptType;		// 加密类型，0:不加密 1:AES
    BYTE    nRotateAngle;       // 码流旋转角度 0:不旋转 1:90度旋转 2:180度旋转 3:270度旋转
	char    reserved1[2];
	int     nStreamType;        // 码流封装格式,详见STREAM_TYPE定义
	char	reserved[120];
}DemuInfoEx;

/* Demux基本信息 */
typedef struct
{
	int type;			 // 详见FRAME_TYPE定义
	int subtype;		 // 详见FRAME_SUB_TYPE定义
	int encode;			 // 详见ENCODE_VIDEO_TYPE，ENCODE_AUDIO_TYPE定义
	int sequence;		 // 帧序号
	int width;			 // 视频宽
	int height;			 // 视频高
	int rate;			 // 帧率
	int year;			 // 绝对时间年
	int month;           // 绝对时间月
	int day;             // 绝对时间日
	int hour;            // 绝对时间时
	int minute;          // 绝对时间分
	int secode;          // 绝对时间秒
	LONG timestamp;      // 相对时间戳
	int channels;        // 音频通道数
	int bitspersample;   // 音频采样深度
	int samplespersecond;// 音频采样率
}DEMUX_INFO;

typedef void (CALLBACK* fDemuxDecCBFun)(LONG nPort,char * pBuf,	LONG nSize,void * pMutexInfo,void* pMutexInfoEx, void* pUserData);

/**
 * 设置帧数据回调。
 *
 * @param[in]  nPort 通道号
 * @param[out] DecCBFun 帧数据回调函数
 * @param[in]  pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDemuxCallBack(LONG nPort, fDemuxDecCBFun DecCBFun, void* pUserData);

/**
 * H264信息获取回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 数据指针
 * @param[in] nLen 数据长度
 * @param[in] pUserData 用户自定义参数
 */
typedef int (CALLBACK *fH264InfoCBFun)(LONG nPort, char* pBuf, LONG nLen, void* pUserData);

/**
 * 设置H264信息获取回调函数。
 *
 * @param[in]  nPort 通道号
 * @param[out] pH264InfoCBFun H264信息获取回调函数
 * @param[in]  nUser 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_Set264EncodeInfoCallBack(LONG nPort, fH264InfoCBFun pH264InfoCBFun, void* nUser);

/**
 * 设置aes解密密钥。
 *
 * @param[in] nPort 通道号
 * @param[in] szKey 密钥的指针
 * @param[in] nKeylen 密钥的长度
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetSecurityKey(LONG nPort,const char* szKey,DWORD nKeylen);

/************************************************************************/
//> 显示操作
/************************************************************************/

/**
 * 设置或增加显示区域，可以做局部放大显示。
 *
 * @param[in] nPort 通道号
 * @param[in] nRegionNum 显示区域序号,0~(MAX_DISPLAY_WND-1),如果为0,则将设置的区域显示在主窗口中
 * @param[in] pSrcRect 局部显示区域
 * @param[in] hDestWnd 显示窗口句柄
 * @param[in] bEnable 打开(设置)或关闭显示区域
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDisplayRegion(LONG nPort,DWORD nRegionNum, DISPLAYRECT *pSrcRect, HWND hDestWnd, BOOL bEnable);

/**
 * 刷新显示。当用户暂停时如果刷新了窗口，则窗口中的图像因为刷新而消失，
 * 此时调用这个接口可以重新把图像显示出来。只有在暂停和单帧播放时才
 * 执行，其它情况会直接返回。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_RefreshPlay(LONG nPort);

/************************************************************************/
//> 缓冲区操作
/************************************************************************/

/**
 *  获取流播放模式下源缓冲区剩余数据大小(单位为字节)。
 *
 * @param[in] nPort 通道号
 * @return DWORD，当前源缓冲的大小单位BYTE(单位为字节)
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetSourceBufferRemain(LONG nPort);

/**
 * 清空流播放模式下源缓冲区的剩余数据。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_ResetSourceBuffer(LONG nPort);

/**
 * 清空流播放模式下源缓冲区的剩余数据。
 *
 * @param[in] nPort 通道号
 * @param[in] nBufType，如下：
 *			BUF_VIDEO_SRC 1 视频源缓冲
 *			BUF_AUDIO_SRC 2 音频源缓冲
 *			BUF_VIDEO_RENDER 3 解码后视频数据缓冲
 *			BUF_AUDIO_RENDER 4 解码后音频数据缓冲
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_ResetBuffer(LONG nPort,DWORD nBufType);

/**
 * 获取指定缓冲区的大小。
 *
 * @param[in] nPort 通道号
 * @param[in] nBufType，如下：
 *			BUF_VIDEO_SRC 1 视频源缓冲
 *			BUF_AUDIO_SRC 2 音频源缓冲
 *			BUF_VIDEO_RENDER 3 解码后视频数据缓冲
 *			BUF_AUDIO_RENDER 4 解码后音频数据缓冲
 * @return DWORD，根据不同参数返回缓冲区值，源缓冲区返回byte，解码后缓冲区返回帧数
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetBufferValue(LONG nPort,DWORD nBufType);

/************************************************************************/
//> 车载硬盘
/************************************************************************/

/**
 * 初始化硬盘(Windows32平台)。
 *
 * @return UINT，成功返回硬盘数量， 失败返回0
 */
PLAYSDK_API UINT CALLMETHOD PLAY_InitDisk();

/**
 * 进度回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] nPercent 进度百分比, -1表示异常
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK *fPercentCallbackFunc)(LONG nPort, int nPercent, void* pUserData);

/**
 * 进度回调。可以设定文件开始结束时间，如果指定，需要PLAY_SetFileRefCallBack回调后才有效，[0,0] 表示整个文件大小，不需要建立索引，在PLAY_OpenFile之后调用。
 *
 * @param[in] nPort 通道号
 * @param[in] nStartTime 文件开始时间， 单位为从1970/1/1开始经过的秒数
 * @param[in] nEndTime 文件结束时间， 单位为从1970/1/1开始经过的秒数
 * @param[out] pFunCallback 进度回调函数指针
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPercentCallBack(LONG nPort, LONG nStartTime, LONG nEndTime, fPercentCallbackFunc pFunCallback, void* pUserData);

typedef enum
{
	FORMAT_ALL_DATA, //清除所有数据
	FORMAT_KEY_DATA  //清除关键区数据
}FormatType;

/**
 * 格式化硬盘(Windows32平台)。
 *
 * @param[in] disk_no 要读取分区信息的磁盘号
 * @param[in] type 格式化选项
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_FormatDisk(UINT disk_no, FormatType type);

/**
 * 文件查询与定位(Windows32平台)。
 *
 * @param[in] channel 需要查询的录像的通道号
 * @param[in] start_time 录像查询的开始时间
 * @param[in] end_time 录像查询的结束时间
 * @param[in/out] pmax_ret_num 输入查询的最大文件个数，返回查询到的文件个数，文件系统最多一次返回pmax_ret_num传入的条数
 * @param[out] pfile_info 查询到的录像文件存放的位置
 * @param[in] type 查询的录像类型掩码，报警、动检、普通
 * @param[in] hint 暂时无意义，固定设置为0
 * @param[in] driver_type 驱动器类型掩码，指定在某些驱动器类型内查询
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API UINT CALLMETHOD PLAY_QueryFileList(UINT nChannel,DHTIME start_time,DHTIME end_time,UINT *pmax_ret_num,pFILE_INFO pfile_info,UINT type, BYTE hint, UINT driver_type);

/************************************************************************/
//> 鱼眼
/************************************************************************/

typedef enum
{
	FISHEYEMOUNT_MODE_INVALID = 0,					// 安装模式无效
	FISHEYEMOUNT_MODE_CEIL = 1,						// 顶装
	FISHEYEMOUNT_MODE_WALL,							// 壁装
	FISHEYEMOUNT_MODE_FLOOR,						// 地装
	FISHEYEMOUNT_MODE_NUM
}FISHEYE_MOUNTMODE;

typedef enum
{
	FISHEYECALIBRATE_MODE_INVALID = 0,							// 矫正模式无效
	FISHEYECALIBRATE_MODE_OFF = 1,								// 关闭鱼眼算法库，外部关闭
	FISHEYECALIBRATE_MODE_ORIGINAL,								// 原始模式(正方形),带缩放比例
	FISHEYECALIBRATE_MODE_PANORAMA,								// 1p
	FISHEYECALIBRATE_MODE_PANORAMA_PLUS_ONE_EPTZ,				// 1p+1
	FISHEYECALIBRATE_MODE_DOUBLE_PANORAMA,						// 2p
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_DOUBLE_PANORAMA,		// 1+2p
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_THREE_EPTZ_REGION,		// 1+3
	FISHEYECALIBRATE_MODE_PANORAMA_PLUS_THREE_EPTZ_REGION,		// 1p+3
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_TWO_EPTZ_REGION,		// 1+2
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_FOUR_EPTZ_REGION,		// 1+4
	FISHEYECALIBRATE_MODE_PANORAMA_PLUS_FOUR_EPTZ_REGION,		// 1p+4
	FISHEYECALIBRATE_MODE_PANORAMA_PLUS_SIX_EPTZ_REGION,		// 1p+6
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_EIGHT_EPTZ_REGION,		// 1+8
	FISHEYECALIBRATE_MODE_PANORAMA_PLUS_EIGHT_EPTZ_REGION,		// 1p+8
	FISHEYECALIBRATE_MODE_TWO_EPTZ_REGION_WITH_ORIGINAL,		// 1F+2	
	FISHEYECALIBRATE_MODE_FOUR_EPTZ_REGION_WITH_ORIGINAL,		// 1F+4	
	FISHEYECALIBRATE_MODE_DOUBLE_PANORAMA_WITH_ORIGINAL,		// 1F+2p
	FISHEYECALIBRATE_MODE_FOUR_EPTZ_REGION_WITH_PANORAMA,		// 1p(F)+4
	FISHEYECALIBRATE_MODE_TWO_EPTZ_REGION,		                // 2画面
	FISHEYECALIBRATE_MODE_SINGLE,								// 单画面
	FISHEYECALIBRATE_MODE_FOUR_EPTZ_REGION,						// 4画面
	FISHEYECALIBRATE_MODE_USER_DEFINED,				    		// 用户自定义
	FISHEYECALIBRATE_MODE_PHONE,								// 手机模式
	FISHEYECALIBRATE_MODE_ORIGINAL_PLUS_ONE_EPTZ_REGION,		// 1+1
	FISHEYECALIBRATE_MODE_ONE_EPTZ_REGION,						// 1画面
	FISHEYECALIBRATE_MODE_SEMI_SPHERE,							// 半圆
	FISHEYECALIBRATE_MODE_CYLINDER,								// 圆柱
	FISHEYECALIBRATE_MODE_LITTLE_PLANET,						// 小行星
	FISHEYECALIBRATE_MODE_DOUBLE_SPHERE,						// 双目球
	FISHEYECALIBRATE_MODE_DOUBLE_CYLINDER,						// 双目圆柱
	FISHEYECALIBRATE_MODE_DOUBLE_360,

	FISHEYECALIBRATE_MODE_NUM
}FISHEYE_CALIBRATMODE;

typedef enum
{
	FISHEYEEPTZ_CMD_INVALID = 0,	
	FISHEYEEPTZ_CMD_ZOOM_IN = 1,						// 放大
	FISHEYEEPTZ_CMD_ZOOM_OUT,							// 缩小
	FISHEYEEPTZ_CMD_UP,									// 向上移动
	FISHEYEEPTZ_CMD_DOWN,								// 向下移动
	FISHEYEEPTZ_CMD_LEFT,								// 向左移动
	FISHEYEEPTZ_CMD_RIGHT,								// 向右移动
	FISHEYEEPTZ_CMD_ROTATE_CLOCKWISE_AUTO,				// 自动顺时针旋转
	FISHEYEEPTZ_CMD_ROTATE_ANTICLOCKWISE_AUTO,			// 自动逆时针旋转
	FISHEYEEPTZ_CMD_STOP,								// 停止
	FISHEYEEPTZ_CMD_SHOW_REGION,						// 框选放大
	FISHEYEEPTZ_CMD_EXIT_SHOW_REGION,					// 退出框选放大
	FISHEYEEPTZ_CMD_DEFAULT,						    // 恢复默认
	FISHEYEEPTZ_CMD_ORIGIN_ROTATE,						// 圆旋转

	FISHEYEEPTZ_CMD_SET_CUR_REGION = 0x20,              // 配置指定窗口的位置信息
	FISHEYEEPTZ_CMD_GET_CUR_REGION,                     // 获取指定窗口的位置信息
	FISHEYEEPTZ_CMD_IS_IN_PANORAMA_REGION,              // 输入点是否在当前全景点链区域内
	FISHEYEEPTZ_CMD_TAP_VIEW,							// 显示指定位置,即点即看
	FISHEYEEPTZ_CMD_SET_FOCUS,	 				        // 设置窗口位置信息
	FISHEYEEPTZ_CMD_GET_FOCUS,							// 获取窗口位置信息

	FISHEYEEPTZ_CMD_PTZ_CALI,							// 鱼球联动标定
	FISHEYEEPTZ_CMD_GET_PTZ_RLT,						// 获取鱼球联动定位信息
	FISHEYEEPTZ_CMD_NUM
}FISHEYE_EPTZCMD;

typedef enum
{
	FISHEYE_SETPARAM,	// 设置参数
	FISHEYE_GETPARAM	// 获取参数
}FISHEYE_OPERATETYPE;

typedef enum
{
	/* 枪机类型 */
	IPCTYPE_200WN				= 0,	//
	IPCTYPE_130WN				= 1,
	IPCTYPE_D1WN				= 2,
	IPCTYPE_100WN				= 3,
	IPCTYPE_FE					= 4,	// 鱼眼

	//球机类型
	SPCTYPE_D6501				= 100,	// sony机芯65球机
	HSPCTYPE_D6A2030E			= 101,	// 大华机芯2030E，6A球机
	HSPCTYPE_D65A2030E			= 102	// 大华机芯2030E，65A球机
}CAM_TYPE;

/* 镜头类型 */
typedef enum
{
	LENTYPE_NORM				= 0,	// 无畸变镜头
	LENTYPE_Lens0361 			= 1,	// 3.6毫米枪机镜头
	LENTYPE_Lens2880			= 2,	// 130度广角枪机镜头
	LENTYPE_Lens0362 			= 3,	// 3.6毫米枪机镜头
	LENTYPE_Lens0401 			= 4,	// 4.0毫米枪机镜头

	LENTYPE_TEST1				= 100	// 调试用参数
}LEN_TYPE;

typedef struct
{
	int w;
	int h;
}FISHEYE_SIZE;

typedef struct
{
	short x;
	short y;
}FISHEYE_POINT2D;

typedef struct
{
	FISHEYE_MOUNTMODE     subMountMode;			    // 子图像安装模式, 仅当图像主校正模式为用户自定义模式时, 该值有效
	FISHEYE_CALIBRATMODE  subCalibrateMode;	        // 子图像校正模式, 仅当图像主校正模式为用户自定义模式时, 该值有效
	FISHEYE_SIZE          imgOutput;                // 子图像输出分辨率
	FISHEYE_POINT2D       upperLeft;                // 子图像偏移
	int					  reserved[3];				// 保留字节
}FISHEYE_SUBMODE;

typedef struct
{
	FISHEYE_SIZE          mainShowSize;		        // 暂不启用, 主显示比例, 4:3, 16:9等, 算法据此输出适合的最优结果（不变形情况下尽量达到该比例）
	FISHEYE_SIZE          floatMainShowSize;		// 输出双buffer时使用，目前暂时还是用老的操作方法，浮动窗口的主显示窗口分辨率, 浮动圆的宽高比需要为1:1，浮动壁装全景的宽高比需要为16:9
	FISHEYE_SIZE          imgOutput;                // 输出图像分辨率(缩放前), 图像主校正模式为用户自定义模式时为外部输入, 其他模式为内部返回
	FISHEYE_SUBMODE*	  subMode;                  // 子模式信息, 图像主校正模式为用户自定义模式时为外部输入, 其他模式为内部返回
	int		              subModeNum;               // 子模式数, 图像主校正模式为用户自定义模式时为外部输入, 其他模式为内部返回
	int                   outputSizeRatio;		    // 暂不启用, 校正输出图像的缩放比,Q8格式,范围0-256, 256为保持最大输出分辨率
	int                   reserved[1];				// 保留字节
}FISHEYE_OUTPUTFORMAT;

typedef struct
{
	int x;
	int y;
	int hAngle;
	int vAngle;
	int available;
	int reserved[3];
}FISHEYE_REGIONPARAM;

typedef struct
{
	FISHEYE_REGIONPARAM   regionParam[9];
	int              circularOffset;
	int              panoramaOffset;
	int              useRegionParam;           // 为1时表明有效，使用该值进行初始化；没有保存信息时请置为0
	int              reserved[1];
}FISHEYE_MODEINITPARAM;

typedef struct
{	
	/*必设参数*/
	int zoom_type;							// 倍数控制模式----期望自适应变倍和根据框选目标大小变倍两种模式
	int hcam_wax;							// 期望倍数对应球机角度x（水平）
	int hcam_way;							// 期望倍数对应球机角度y（垂直）
	int hcam_wmul;							// 期望倍数设置（基准倍数）
	int cfg_type;							// 配置方式，默认为1：使用配置参数方式,1：使用参数配置方式，0：使用设备类型配置方式

	/* 主相机参数 */							         
	/* 镜头参数 */
	int prm_re;								// 投影半径
	int prm_mul;							// 投影倍率
	int prm_dx;								// x方向偏移
	int prm_dy;								// y方向偏移
	int prm_cw;								// CMOS宽（实际使用宽）
	int prm_ch;								// CMOS高（实际使用高）

	/* 主相机和从相机类型配置（cfg_type为0时设置该参数才有效）,默认130度、130万枪机和200W65球机 */
	LEN_TYPE mlen_type;						// 主相机镜头类型
	CAM_TYPE mcam_type;						// 主相机类型
	CAM_TYPE hcam_type;						// 从相机类型

	/* 球机参数 */
	int himg_width;                         // 从相机图像宽
	int himg_height;                        // 从相机图像高
	int prm_fax;                            // 球机水平视场角

	/* 可默认的参数 */
	/* 主相机参数 */
	int mcam_fc;							// 相机等效焦距
	int mcam_cw;							// 镜头靶面高
	int mcam_ch;							// 镜头靶面宽 
	int cam_height;                         // 相机架设高度（米），（暂时未使用）
	int prm_ma;								// 焦距参数

	/* 从相机参数 */
	/* 球机参数 */
	int prm_hw;								// CMOS宽
	int prm_hh;								// CMOS高
	int prm_fo;								// 等效焦距
	int prm_ca;								// 视野参数
	int prm_mmul;							// 最大倍率
}MHFPTZ_CONFIGPARAM;

typedef struct
{
	FISHEYE_SIZE     mainStreamSize;		    // 对应主码流原始宽高，当传入分辨率与之不等时表明为辅码流是此分辨率缩放而来
	int              originX;					// 输入图像中鱼眼圆的圆心横坐标, 归一化至0-8192坐标系
	int              originY;					// 输入图像中鱼眼圆的圆心纵坐标, 归一化至0-8192坐标系
	int              radius;					// 输入图像中鱼眼圆的半径, 归一化至0-8192坐标系
	int              lensDirection;		        // 旋转角度, Q7格式, 范围0-360*128, 一般配为0
	FISHEYE_MOUNTMODE     mainMountMode;		// 主安装模式
	FISHEYE_CALIBRATMODE  mainCalibrateMode;	// 图像主校正模式
	FISHEYE_MODEINITPARAM modeInitParam;        // 外部传入模式初始化各画面信息，适用于模式切换恢复到上一次的状态,
	FISHEYE_OUTPUTFORMAT *outputFormat;         // 输出图像信息
	MHFPTZ_CONFIGPARAM   *configParam;          // 鱼球联动配置参数
	int              enableAutoContrast;        // 开启自动对比度, 0关闭, 1开启, 该功能会增加算法耗时, 需要性能好的机器才建议开启
	int              alphaHistogram;            // 直方图IIR强度0-255, 默认128, 越大越参考当前帧
	int              alphaGray;                 // 灰度拉伸强度0-255, 默认245, 越大越对比度弱
	FISHEYE_SIZE     captureSize;		        // 对应当前模式下的抓图分辨率
	int              mhfptzIndex;               // IN 鱼球联动球机序号0,1,2....
	int              reserved[1];				// 保留字节
}FISHEYE_OPTPARAM;

typedef struct
{
	FISHEYE_EPTZCMD   ePtzCmd;			// 云台操作，说明见FISHEYE_EPtzCmd定义
	int          winId;				    // 要进行eptz的窗口编号，左上角winId为0，从左到右递增							
	int          arg1;
	int          arg2;
	int          arg3;
	int          arg4;
	int          arg5;
	int          arg6;
	int          reserved0[6];			   // 保留字节
	void*        pParam;                   // 鱼球联动
	void*        pResult;
	void*        pArg;   

	int          reserved1[7];			   // 保留字节
}FISHEYE_EPTZPARAM;

/**
 * 开启视频鱼眼算法功能，需要包含fisheye.dll库。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StartFisheye(LONG nPort);

/**
 * 设置/获取鱼眼参数。
 *
 * @param[in] nPort 通道号
 * @param[in] operatetype 操作类型
 * @param[in/out] pOptParam 鱼眼参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_OptFisheyeParams(LONG nPort, FISHEYE_OPERATETYPE operatetype, FISHEYE_OPTPARAM* pOptParam);

/**
 * 用于浮动模式下开启或关闭第二个鱼眼窗口。
 *
 * @param[in] nPort 通道号
 * @param[in] hDestWnd 显示窗口句柄
 * @param[in] pOptParam 第二个窗口对应的鱼眼参数
 * @param[in] bEnable 打开或关闭显示区域
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_FisheyeSecondRegion(LONG nPort, HWND hDestWnd, FISHEYE_OPTPARAM* pOptParam, BOOL bEnable);

/**
 * 开启eptz(电子云台），进行缩放移动。
 *
 * @param[in] nPort 通道号
 * @param[in/out] pEptzParam 调节参数
 * @param[in] bSecondRegion 是否为浮动模式下的第二个窗口，1为真，默认填0
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_FisheyeEptzUpdate(LONG nPort, FISHEYE_EPTZPARAM* pEptzParam, BOOL bSecondRegion);

/**
 * 停止视频鱼眼算法功能。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopFisheye(LONG nPort);

/**
 * 鱼眼信息回调函数。
 *
 * @param[in] nPort 通道号
 * @param[in] byCorrectMode 矫正模式
 * @param[in] wRadius 半径
 * @param[in] wCircleX 圆心横坐标
 * @param[in] wCircleY 圆心纵坐标
 * @param[in] widthRatio 宽比率
 * @param[in] heightRatio 高比率
 * @param[in] gain 增益
 * @param[in] denoiseLevel 降噪等级
 * @param[in] InstallStyle 鱼眼安装方式
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK* fFishEyeInfoFun)( 
	LONG nPort,
	BYTE byCorrectMode,
	WORD wRadius,
	WORD wCircleX,
	WORD wCircleY,
	UINT widthRatio,
	UINT heightRatio,
	BYTE gain,
	BYTE denoiseLevel,
	BYTE installStyle,
	void* pUserData );

/**
 * 设置获取鱼眼信息回调。
 *
 * @param[in] nPort 通道号
 * @param[out] pFishEyeInfoFun 鱼眼信息回调函数指针，不能为NULL
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetFishEyeInfoCallBack(LONG nPort, fFishEyeInfoFun pFishEyeInfoFun, void* pUserData);

/************************************************************************/
//> 抓图
/************************************************************************/

/**
 * 抓图，将BMP图片保存为指定的文件。PLAY_SetDisplayCallBack设置的视频数
 * 据回调函数，只有在有视频数据解码出来时才调用，并由用户处理视频数
 * 据(如抓图)，如果不断有解码的数据，就不断调用这个回调函数。而PLAY_
 * CatchPic一次只抓一幅图，并能在暂停和单帧播放时实现抓图。建议：如果
 * 用户想实现抓图(一次抓一幅图)，调用PLAY_CatchPic，而如果想得到一段
 * 时间内的视频数据，调用PLAY_SetDisplayCallBack。
 *
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CatchPic(LONG nPort,char* sFileName);

/**
* 抓图，将图片保存为指定的文件。PLAY_SetDisplayCallBack设置的视频数
* 据回调函数，只有在有视频数据解码出来时才调用，并由用户处理视频数
* 据(如抓图)，如果不断有解码的数据，就不断调用这个回调函数。而PLAY_
* CatchPicEx一次只抓一幅图，并能在暂停和单帧播放时实现抓图。建议：如果
* 用户想实现抓图(一次抓一幅图)，调用PLAY_CatchPicEx，而如果想得到一段
* 时间内的视频数据，调用PLAY_SetDisplayCallBack。
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @param[in] ePicfomat  图片格式，见tPicFormats
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CatchPicEx(LONG nPort,char* sFileName,tPicFormats ePicfomat);

/**
 * 图像格式转为BMP格式。
 *
 * @param[in] pBuf 图像数据指针
 * @param[in] nSize 图像数据大小
 * @param[in] nWidth 图像宽度
 * @param[in] nHeight 图像高度
 * @param[in] nType 数据类型，如T_YV12，T_UYVY
 * @param[in] sFileName 要保存的文件名。最好以BMP作为文件扩展名
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_ConvertToBmpFile(char * pBuf,LONG nSize,LONG nWidth,LONG nHeight,LONG nType, char *sFileName);

/*
 * 图像格式转为JPEG格式。
 *
 * @param[in] pYUVBuf 图像数据指针
 * @param[in] nWidth 图像宽度
 * @param[in] nHeight 图像高度
 * @param[in] YUVtype YUV数据类型，如T_YV12，T_UYVY
 * @param[in] quality 图片压缩质量，范围(0, 100]
 * @param[in] sFileName 文件名
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_ConvertToJpegFile(char *pYUVBuf, LONG nWidth, LONG nHeight, int YUVtype, int quality, char *sFileName);

/**
 * 抓取BMP图像。
 *
 * @param[in] nPort 通道号
 * @param[in] pBmpBuf 存放BMP图像数据的缓冲地址，由用户分配，不得小于bmp 图像大小，
 *               推荐大小：sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+w*h*4，
 *        其中w和h分别为图像宽高
 * @param[in] dwBufSize 缓冲区大小
 * @param[out] pBmpSize 获取到的实际bmp图像大小
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPicBMP(LONG nPort, PBYTE pBmpBuf, DWORD dwBufSize, DWORD* pBmpSize);

/**
 * 抓取BMP图像。
 *
 * @param[in] nPort 通道号
 * @param[in] pBmpBuf   存放BMP图像数据的缓冲地址，由用户分配，不得小于bmp 图像大小，
 *   推荐大小：sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+w*h*4，
 *   其中w和h分别为图像宽高。
 * @param[in] dwBufSize 缓冲区大小
 * @param[out] pBmpSize 获取到的实际bmp图像大小
 * @param[in] nWidth 指定的bmp的宽
 * @param[in] nHeight 指定的bmp的高
 * @param[in] nRgbType 指定RGB格式 0：RGB32；1：RGB24；
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPicBMPEx(LONG nPort, PBYTE pBmpBuf, DWORD dwBufSize, DWORD* pBmpSize, LONG nWidth, LONG nHeight, int nRgbType);

/**
 * 抓取JPEG图像。
 *
 * @param[in] nPort 通道号
 * @param[in] pJpegBuf 存放JPEG图像数据的缓冲地址，由用户分配，不得小于JPEG图像大小，
         推荐大小：w*h*3/2，其中w和h分别为图像宽高
 * @param[in] dwBufSize 缓冲区大小
 * @param[out] pJpegSize 获取到的实际JPEG图像大小
 * @param[in] quality JPEG图像的压缩质量，取值范围为(0,100]
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPicJPEG(LONG nPort, PBYTE pJpegBuf, DWORD dwBufSize, DWORD* pJpegSize, int quality);

/**
 * 抓取TIFF图像。
 *
 * @param[in] nPort 通道号
 * @param[in] pTiffBuf 存放TIFF图像数据的缓冲地址，由用户分配，不得小于tiff图像大小，
   推荐大小：w*h*3+1024，
   其中w和h分别为图像宽高
 * @param[in] dwBufSize 缓冲区大小
 * @param[out] pTiffSize 获取到的实际TIFF图像大小
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPicTIFF(LONG nPort, PBYTE pTiffBuf, DWORD dwBufSize, DWORD* pTiffSize);

/**
 * 抓图，可选择格式并指定宽高。
 *
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @param[in] lTargetWidth 指定的图像宽度
 * @param[in] lTargetHeight 指定的图像高度
 * @param[in] ePicfomat 图片格式，详见tPicFomats
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_CatchResizePic(LONG nPort, char* sFileName, LONG lTargetWidth, LONG lTargetHeight, tPicFormats ePicfomat);

/************************************************************************/
//> 画图回调
/************************************************************************/

/*
 *画图回调函数
 * 
 * @param[in] nPort 通道号
 * @param[in] hDc OffScreen表面设备上下文
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK* fDrawCBFun)(LONG nPort,HDC hDc, void* pUserData);

/*
 * 注册一个回调函数，获得当前表面的device context，你可以在这个DC上画图(或文字)，
 * 就好像在窗口的客户区DC上绘图，但这个DC不是窗口客户区的DC，而是DirectDraw里
 * 的Off-Screen表面的DC。注意，如果是使用overlay表面，这个接口无效，可以直接在
 * 窗口上绘图，只要不是透明色就不会被覆盖。
 *
 * @param[in] nPort 通道号
 * @param[out] DrawFun 画图回调函数
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_RigisterDrawFun(LONG nPort, fDrawCBFun DrawCBFun, void* pUserData); 

/*
 *画图回调函数
 * 
 * @param[in] nPort 通道号
 * @param[in] nReginNum 显示区域序号，范围[0,(MAX_DISPLAY_WND-1)]。如果nRegionNum为0，
 *   则将设置的区域显示在主窗口中。
 * @param[in] hDc OffScreen表面设备上下文
 * @param[in] pUserData 用户自定义参数
 */
typedef void (CALLBACK* fDrawCBFunEx)(LONG nPort,LONG nReginNum,HDC hDc, void* pUserData);

/*
 * 注册一个回调函数，获得当前表面的上下文(HDC)，这个DC不是窗口客户区的DC，
 * 而是DirectDraw里的Off-Screen表面的DC。注意。如果是使用overlay表面，
 * 这个接口无效，overlay方式可以直接在窗口上绘图，只要不是透明色就不会被覆盖。
 *
 * @param[in] nPort 通道号
 * @param[in] nReginNum 显示区域序号，范围[0,(MAX_DISPLAY_WND-1)]。如果nRegionNum为0，
 *   则将设置的区域显示在主窗口中
 * @param[out] DrawFunEx 画图回调函数
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_RigisterDrawFunEx(LONG nPort, LONG nReginNum, fDrawCBFunEx DrawFunEx, void* pUserData);

/************************************************************************/
//> 录制或转码功能
/************************************************************************/

/*
 * 开始预录。
 *
 * @param[in] nPort 解码通道
 * @param[in] sFileName 录像位置
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StartPrepareRecord(LONG nPort,const char* pFileName);

/*
 * 停止预录。
 *
 * @param[in] nPort 解码通道
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopPrepareRecord(LONG nPort);

/*
 * 开始流数据录像，只对流模式有用，在PLAY_Play之后调用。
 *
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @param[in] idataType 取值DATA_RECORD_TYPE
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
typedef enum
{
	DATA_RECORD_ORIGINAL = 0,     // 录制原始视频流
	DATA_RECORD_AVI,              // 录制AVI
	DATA_RECORD_ASF,              // 录制ASF  
	DATA_RECORD_ORIGINAL_SEGMENT, // 录制分段的原始视频流
	DATA_RECORD_RESIZE_AVI,       // 录制转变分辨率的AVI，使用PLAY_ResolutionScale设置宽高
	DATA_RECORD_MP4,              // 录制MP4
	DATA_RECORD_RESIZE_MP4,       // 录制转变分辨率的MP4，使用PLAY_ResolutionScale设置宽高
	DATA_RECORD_MP4_NOSEEK,       // 录制不回写MP4 
    DATA_RECORD_RESIZE_MP4_NOSEEK,// 录制转变分辨率的不回写MP4，使用PLAY_ResolutionScale设置宽高
	DATA_RECORD_TS,
    DATA_RECORD_PS,               // 标准PS封装
}DATA_RECORD_TYPE;
PLAYSDK_API BOOL CALLMETHOD PLAY_StartDataRecord(LONG nPort, char *sFileName, int idataType);

/*
 * 保存原始码流，该接口需与PLAY_StartDataRecord或者PLAY_StartDataRecordEx配合着使用。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 流数据
 * @param[in] nSize 大小
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_WriteData(LONG nPort, PBYTE pBuf,DWORD nSize);

/*
 * 停止流数据录像。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopDataRecord(LONG nPort);

/*
 * 回调函数 AVIConvertCallback。
 *
 * @param[in] nPort 通道号
 * @param[in] lMediaChangeType AVI_MEDIACHANGE_FRAMERATE表示帧率改变；AVI_MEDIACHANGE_RESOLUTION表示分辨率改变
 * @param[in] pUserData 用户自定义参数
 * @param[out] pIsNewFile TRUE 分段转换；FALSE 不分段；默认不分段
 * @param[out] sNewFileName 如果分段转换，新的录像文件名
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
typedef void (CALLBACK* fAVIConvertCallback)(LONG nPort, LONG lMediaChangeType, void* pUserData, BOOL *pIsNewFile, char *sNewFileName);

/*
 * 开始AVI转换并设置AVI转换状态回调。
 *
 * @param[in] nPort 通道号
 * @param[in] sFileName 文件名
 * @param[out] pAVIFunc 回调函数
 * @param[in] pUserData 用户自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StartAVIConvert(LONG nPort, char *sFileName, fAVIConvertCallback pAVIFunc, void* pUserData);

/*
 * 停止AVI转换。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_StopAVIConvert(LONG nPort);

/************************************************************************/
//> 解码及显示设置
/************************************************************************/

/*
 * 指定解码器(Windows平台)， PLAY_Play之前调用有效。
 *
 * @param[in] nPort 通道号
 * @param[in] decodeType 解码模式（仅限于H264， Hevc)
 * @param[in] renderType 渲染模式
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetEngine(LONG nPort,DecodeType decodeType,RenderType renderType);

/*
 * 设置图像质量，当设置成高质量时画面效果好，但CPU利用率高。在支持多路播放时，
 * 可以设为低质量，以降低CPU利用率。当某路放大播放时将该路设置成高质量，
 * 以达到好的画面效果。
 *
 * @param[in] nPort 通道号
 * @param[in] bHighQuality 为TRUE(1)时图像高质量，为FALSE(0)时低质量(默认值)
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetPicQuality(LONG nPort,BOOL bHighQuality);

/*
 * 获取图像质量。
 *
 * @param[in] nPort 通道号
 * @param[out] bHighQuality 输出参数，TRUE表示高质量，FALSE表示低质量
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_GetPictureQuality(LONG nPort,BOOL *bHighQuality);

/*
 * 垂直同步显示开关。此接口需在PLAY_Play之后调用，重新播放时需重新设置。
 * 在播放动态图像出现断层时，可以使用此接口打开垂直同步功能。
 *
 * @param[in] nPort 通道号
 * @param[in] bEnable TRUE打开垂直同步，FALSE关闭垂直同步
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_VerticalSyncEnable(LONG nPort, BOOL bEnable);

/*
 * 是否启用高清图像内部调整策略。
 *
 * @param[in] nPort 通道号
 * @param[in] bEnable 详见PLAY_STRATEGE_E定义
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
typedef enum _PLAY_STRATEGE
{
	PLAY_THROW_FRAME_NO = 0,						// 不抽帧
	PLAY_THROW_FRAME_FLAG_HIGHT = 1,				// 默认策略抽帧，大于1080P码流4倍数(含)以上抽帧，[1080P,720P]码流8倍数(含)以上抽帧，小于720P码流16倍数(含)以上抽帧
	PLAY_THROW_FRAME_FLAG_ALL = 2,					// 强制抽I帧解码
	PLAY_THROW_FRAME_FLAG_ADAPTION = 3,				// 自适应解码能力抽帧
	PLAY_THROW_FRAME_FLAG_ADAPTION_LOW_CPU = 4,		// 自适应解码能力抽帧，低cpu占用率
} PLAY_STRATEGE_E;
PLAYSDK_API BOOL CALLMETHOD PLAY_EnableLargePicAdjustment(LONG nPort, int bEnable);

/*
 * 设置解码线程数。
 *
 * @param[in] nPort 通道号
 * @param[in] nNum 线程数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecodeThreadNum(LONG nPort, DWORD nNum);

/*
 * 设置解码策略，错误码流花屏或跳秒。
 *
 * @param[in] nPort 通道号
 * @param[in] nStrategyType 
 *				16: 表示解码中遇到frame不连续，提前返回
 *               8: 表示解码中遇到码流数据不符合协议当成解码错误
 *				 0 : 表示解码中遇到码流数据不符合协议继续解码，错误码流会花屏
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDecodeStrategy(LONG nPort, int nStrategyType);

/*
 * 抗锯齿使能开关，仅支持Windows。
 *
 * @param[in] nPort 通道号
 * @param[in] bEnable TRUE打开抗锯齿处理，FALSE关闭抗锯齿处理
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_AntiAliasEnable(LONG nPort, BOOL bEnable);

/************************************************************************/
//> 私有数据
/************************************************************************/

/*
 * 显示私有数据，例如规则框，规则框报警，移动侦测等。
 *
 * @param[in] nPort 通道号
 * @param[in] bTrue TRUE：打开 FALSE：关闭
 * @param[in] nReserve 保留参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_RenderPrivateData(LONG nPort, BOOL bTrue, LONG nReserve);

/*
 * 数据帧回调 PLAY_SetDataCallBack。
 *
 * @param[in] nPort 通道号
 * @param[in] pBuf 带大华头的原始数据
 * @param[in] nSize  数据大小
 * @param[in] pUserData  用户自定义数据
 */
typedef void (CALLBACK* fDataCBFun)(LONG nPort,char * pBuf,LONG nSize, void* pUserData);

/*
 * 数据帧回调，回调带大华头的原始数据，外层自己实现解析。
 *
 * @param[in] nPort 通道号
 * @param[out] pDataCBFun 回调函数
 * @param[in] pUserData 用户自定义数据
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetDataCallBack(LONG nPort, fDataCBFun pDataCBFun, void* pUserData);

/*
 * IVS解码回调函数。
 *
 * @param[in] pIVSBuf 辅助帧数据(json或智能帧结构体数据)，当为智能帧结构体数据时，pIVSBuf为IVS Object结构体数组的起始地址
 * @param[in] nIVSType 辅助帧数据类型,详见IVS_TYPE
 *			取值为IVSINFOTYPE_RAWDATA时，对应原始json数据
 *			取值为IVSINFOTYPE_TRACK时，单个IVS object对应结构体 SP_IVS_OBJ_EX；
 *			取值为IVSINFOTYPE_TRACK_EX_B0时，单个IVS object对应结构体 SP_IVS_COMMON_OBJ；
 * @param[in] nIVSBufLen 辅助帧数据长度(json或智能帧结构体数据)，
 *			  当为智能帧结构体数据时，nIVSBufLen为IVS Object的个数乘以单个IVS object的长度，单个IVS object的长度可由type备注类型获得
 * @param[in] nFrameSeq 辅助帧id
 * @param[in] pReserved 保留参数
 * @param[in] pUserData 自定义参数
 */
/* IVS类型 */
typedef enum _IVS_TYPE
{
	IVSINFOTYPE_PRESETPOS			= 1,						
	IVSINFOTYPE_MOTINTRKS			= 2,				
	IVSINFOTYPE_MOTINTRKS_EX		= 3,			
	IVSINFOTYPE_LIGHT				= 4,			
	IVSINFOTYPE_RAWDATA				= 5,   // jason数据
	IVSINFOTYPE_TRACK				= 6,   // 智能分析信息 
	IVSINFOTYPE_TRACK_EX_B0			= 7,   // 智能结构化数据信息
	IVSINFOTYPE_MOTIONFRAME			= 9,	
	IVSINFOTYPE_VIDEO_CONCENTRATION = 10,
	IVSINFOTYPE_OVERLAY_PIC			= 11,
	IVSINFOTYPE_OSD_INFO			= 12,  // 叠加图片帧，辅助帧(0x12)
	IVSINFOTYPE_GPS_INFO			= 13,  // GPS辅助帧
	IVSINFOTYPE_TAGGING_INFO		= 14,  // 景物点信息标注帧，辅助帧(0x13)
	IVSINFOTYPE_TRACK_A1			= 15,  // NVR浓缩信息轨迹点
	IVSINFOTYPE_DATA_WITH_LARGE_AMOUNT = 16,
    IVSINFOTYPE_TRACK_A1_EX         = 17,  // NVR浓缩信息轨迹点(扩展)
}IVS_TYPE;

/* IVSINFOTYPE_OVERLAY_PIC类型对应的结构 */
typedef struct 
{
	unsigned char nOverLayPicPurpose;	// 叠加图片用途
	unsigned char nOverLayPicAction;	// 叠加图片动作
	unsigned char nOverLayPicCodeFormat;// 叠加图片编码格式
}OVERLAY_PIC_INFO;

/* IVSINFOTYPE_OSD_INFO类型对应的结构 */
typedef struct 
{
	unsigned short nOsdTopLeftCornercoordinateX; // 字符叠加区域左上角x坐标
	unsigned short nOsdTopLeftCornercoordinateY; // 字符叠加区域左上角y坐标 
	unsigned char  nOsdWordSize;				 // 字号(字符大小)
	unsigned char  nOsdWordAlignment;			 // 字符对齐方式
}OSD_DATA_INFO;

typedef void (CALLMETHOD *fIVSInfoCallbackFunc)(char* pIVSBuf, LONG nIVSType, LONG nIVSBufLen, LONG nFrameSeq, void* pReserved, void* pUserData);

/*
 * IVS信息获取函数。
 *
 * @param[in] nPort 通道号
 * @param[out] pFunc 解码回调函数
 * @param[in] pUserData 自定义参数
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetIVSCallBack(LONG nPort, fIVSInfoCallbackFunc pFunc, void* pUserData);

/*
 * GPS信息回调函数。
 *
 * @param[in] pBuf 辅助帧数据
 * @param[in] nLen 辅助帧长度 
 * @param[in] pUserData 自定义
 * @return int 无意义
 */
typedef int (CALLBACK *fGPSInfoCallbackFunc)(char* pBuf, LONG nLen, void* pUserData);

/*
 * GPS信息获取函数。
 *
 * @param[in] nPort 通道号
 * @param[out] pFunc 回调函数  
 * @param[in] pUserData 自定义
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetGPSCallBack(LONG nPort, fGPSInfoCallbackFunc pFunc, void* pUserData);

/************************************************************************/
//> 不推荐使用的接口
/************************************************************************/

/*
 * 获取错误码，此接口无效，请使用PLAY_GetLastErrorEx接口。
 *
 * @param[in] nPort,通道号
 * @return DWORD，获得错误码。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_GetLastError(LONG nPort);

/*
 * 打开文件并自动分配通道号。
 *
 * @param[in] sFileName 文件名
 * @return DWORD，失败返回0，否则返回通道号
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_CreateFile(LPSTR sFileName);

/*
 * 关闭播放文件并释放自动分配的通道号。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_DestroyFile(LONG nPort);

/*
 * 打开流接口并自动分配通道号。
 *
 * @param[in] nBufPoolSize 置播放器中存放数据流的缓冲区大小，范围是[SOURCE_BUF_MIN,SOURCE_BUF_MAX]
 * @return DWORD,失败返回0，否则返回通道号
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API DWORD CALLMETHOD PLAY_CreateStream(DWORD nBufPoolSize);

/*
 * 关闭数据流，并释放自动分配的通道号。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_DestroyStream(LONG nPort);

/*
 * 与PLAY_OneByOneBack重复，请使用PLAY_OneByOneBack。
 *
 * @param[in] nPort 通道号
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_BackOne(LONG nPort);

/*
 * 设置分辨率改变通知消息。
 *
 * @param[in] nPort 通道号
 * @param[in] hWnd 消息发送的窗口
 * @param[in] nMsg 用户输入的消息，当解码时编码格式发生改变时用户在hWnd窗口过程中收到这个消息
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetEncChangeMsg(LONG nPort,HWND hWnd,UINT nMsg);

/*
 * 设置文件结束时要发送的消息。
 *
 * @param[in] nPort 通道号
 * @param[in] hWnd 消息发送窗口
 * @param[in] nMsg 用户自定义的输入的消息，当播放到文件结束时用户在hWnd窗口过程中
 * @return BOOL，成功返回TRUE，失败返回FALSE
 * @note 如果返回失败，可以调用PLAY_GetLastErrorEx接口获取错误码。
 */
PLAYSDK_API BOOL CALLMETHOD PLAY_SetFileEndMsg(LONG nPort,HWND hWnd,UINT nMsg);

#ifdef __cplusplus
}
#endif

#endif
