//MRNetSdkApi.h
#ifndef __MRNETSDK_API_H__
#define __MRNETSDK_API_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "MRComm.h"

#define MRNSDK_API		extern "C"__declspec(dllexport)
#define MRNSDK_CALL		__stdcall

// 透明数据通道信息
typedef struct{
	MRPARAM_IN const char *szIP;		// 服务器IP地址
	MRPARAM_IN unsigned short wPort;	// 端口号
	MRPARAM_IN const char *szUserName;	// 用户名
	MRPARAM_IN const char *szPassword;	// 密码
	MRPARAM_IN const char *szDeviceID;	// 设备ID
	MRPARAM_IN int nTimeout;			// 超时时间(毫秒)
	MRPARAM_IN void *userdata;			// 用户数据
	MRPARAM_IN int nFiFoNums;			// 发送的FiFo总数
	MRPARAM_IN int (*fdCloseHandle)(	// 关闭通知回调函数
		MRPARAM_IN LONG lDataPort,			// 数据通道句柄
		MRPARAM_IN void *userdata			// 用户数据
		);
	// 获得数据回调函数, pTranPort - 透明通道句柄, nState - 状态(0 - 断开，1 - 正常), pkt - 数据帧, userdata - 用户数据
	MRPARAM_IN int (*fdGetDataHandle)(		// 获得数据回调函数
		MRPARAM_IN LONG lDataPort,				// 数据通道句柄
		MRPARAM_IN MRAVFrame *pkt,			// 帧数据
		MRPARAM_IN void *userdata				// 用户数据
		);
	
	MRPARAM_IN const char *szUserCmd;	// 发送的用户消息
	MRPARAM_OUT const char *szAckMsg;	// 回送的消息
}MRSDK_TRANDATA_PORT_T;

// 透明消息通道信息
typedef struct{
	MRPARAM_IN const char *szIP;		// 服务器IP地址
	MRPARAM_IN unsigned short wPort;	// 端口号
	MRPARAM_IN const char *szUserName;	// 用户名
	MRPARAM_IN const char *szPassword;	// 密码
	MRPARAM_IN const char *szDeviceID;	// 设备ID
	MRPARAM_IN int nTimeout;			// 超时时间(毫秒)
	MRPARAM_IN void *userdata;			// 用户数据
	MRPARAM_IN int (*fdCloseHandle)(	// 消息通道关闭通知回调函数
		MRPARAM_IN LONG lMsgPort,				// 消息句柄
		MRPARAM_IN void *userdata			// 用户数据
		);
	// 获得消息回调函数, pTranPort - 透明通道句柄, nState - 状态(0 - 断开，1 - 正常), pkt - 数据帧, userdata - 用户数据
	MRPARAM_IN int (*fdGetMsgHandle)(			// 获得消息回调函数
		MRPARAM_IN LONG lMsgPort,				// 消息句柄
		MRPARAM_IN const char *szMsg,			// 消息
		MRPARAM_IN const char *szFileName,		// 文件名
		MRPARAM_IN void *userdata				// 用户数据
		);
	
	MRPARAM_IN const char *szUserCmd;	// 发送的用户消息
	MRPARAM_OUT const char *szAckMsg;	// 回送的消息
}MRSDK_TRANMSG_PORT_T;

/* fdMRNCb_ChnReLink
 * 通道重连回调函数
	lStreamHandle : 流句柄
	nState        : 状态, 1 - 连接端口(返回1重连， 0 - 不重连)，2 - 连接断开，10 - 重连成功 
	userdata       : 用户数据
 * 当nState为1时，返回1系统自动重连，返回0将断开连接, 其他状态值对返回值不理睬
*/
typedef int  (*fdMRNCb_ChnReLink)(
					MRPARAM_IN LONG lStreamHandle, 
					MRPARAM_IN int   nState, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_ChnGetData
 * 通道获取数据回调函数
	lStreamHandle : 流句柄
	pAvFrame      : 帧数据指针
	userdata       : 用户数据
*/
typedef void (*fdMRNCb_ChnGetData)(
					MRPARAM_IN LONG lStreamHandle, 
					MRPARAM_IN MRAVFrame *pAvFrame, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_ChnGetDecFrame
 * 获取通道解码数据回调函数
	lStreamHandle : 流句柄
	stream_index  : 流索引
	nTimeTick     : 时间戳(毫秒)
	pYBuff        : 解码Y数据指针
	pUBuff        : 解码U数据指针
	pVBuff        : 解码V数据指针
	nWidth        : 图像宽度
	nHeight       : 图像高度
	nYStride      : Y跨度
	nUVStride     : UV跨度
	userdata      : 用户数据
 * 用户不能修改YUV数据内容，否则后续的解码会出错
*/
typedef void (*fdMRNCb_ChnGetDecFrame)(
					MRPARAM_IN LONG lStreamHandle, 
					MRPARAM_IN int stream_index,
					MRPARAM_IN DWORD nTimeTick,
					MRPARAM_IN BYTE *pYBuff, 
					MRPARAM_IN BYTE *pUBuff, 
					MRPARAM_IN BYTE *pVBuff,
					MRPARAM_IN int nWidth,
					MRPARAM_IN int nHeight,
					MRPARAM_IN int nYStride, 
					MRPARAM_IN int nUVStride, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_ChnDrawDC
 * 获得图像OSD回调函数
	lStreamHandle : 流句柄
	stream_index  : 流索引
	hDC           : HDC指针
	userdata      : 用户数据
*/
typedef void (*fdMRNCb_ChnDrawDC)(
					MRPARAM_IN LONG lStreamHandle, 
					MRPARAM_IN int stream_index, 
					MRPARAM_IN HDC hDC, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_VodGetPassword
 * 远程文件回放密码回调函数
	szFileName    : 文件名称
	szPassword    : 返回密码
	userdata      : 用户数据
 * 返回0成功，其他为错误代码
 * 只有当文件有密码时才会使用
*/
typedef int  (*fdMRNCb_VodGetPassword)(
					MRPARAM_IN const char *szFileName, 
					MRPARAM_OUT char *szPassword, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_TalkDataCallBack
 * 音频对讲获得数据回调函数
	lTalkHandle   : 对讲句柄
	pDataBuf      : 音频数据
	dwBufSize     : 数据长度
	pts           : 时间戳(毫秒)
	userdata      : 用户数据
*/
typedef void (*fdMRNCb_AudioGetData)(
					MRPARAM_IN LONG lTalkHandle, 
					MRPARAM_IN BYTE *pDataBuf, 
					MRPARAM_IN DWORD dwBufSize, 
					MRPARAM_IN int pts, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_AudioStopCallBack
 * 音频对讲停止通知回调函数
	lTalkHandle   : 对讲句柄
	userdata      : 用户数据
*/
typedef void (*fdMRNCb_AudioStop)(
					MRPARAM_IN LONG lTalkHandle, 
					MRPARAM_IN void *userdata
					);

/* fdMRNCb_MulticastRecvData
 * 组播接收数据回调函数
	pHandle		  : 组播通道
	pkt			  : 数据帧
	userdata      : 用户数据
*/
typedef void (*fdMRNCb_MulticastRecvData)(
					MRPARAM_IN void *pHandle, 
					MRPARAM_IN MRAVFrame *pkt,
					MRPARAM_IN void *userdata
					);

/* MRNSDK_Init
 * 网络SDK初始化
	bUseThreadPoll : 使用线程池标志
 * 返回0成功，其他为错误代码
 * 在使用该SDK前，先调用该函数初始化
*/
MRNSDK_API int MRNSDK_CALL   MRNSDK_Init(
								MRPARAM_IN int bUseThreadPoll
								);

/* MRNSDK_SetDownLoadDir
 * 设置下载保存临时目录
	szDir : 临时目录
 * 返回0成功，其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL   MRNSDK_SetDownLoadDir(
								MRPARAM_IN const char *szDir
								);

/* MRNSDK_Cleanup
 * 卸载SDK，清除资源
 * 在结束使用该SDK后，调用该函数清除资源
*/
MRNSDK_API void MRNSDK_CALL  MRNSDK_Cleanup();

/* MRNSDK_GetVersion
 * 获得SDK版本
 * 返回SDK版本
*/
MRNSDK_API DWORD MRNSDK_CALL MRNSDK_GetVersion();

/* MRNSDK_GetLastError
 * 获得错误代码
 * 返回错误代码, MRErrorNo.h文件定义了错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_GetLastError();

/* MRNSDK_LiveSingle
 * 开始预览
   pHandle		: 返回句柄指针
   szIP			: IP地址
   wPort		: 端口
   protocol     : 协议类型, 0 - MRMS私有协议，1 - RTSP协议
   szUserName   : 用户名
   szPassword   : 密码
   szDeviceID	: 设备ID(转发时使用)
   szStreamName : 流名称
   nTimeoutMs   : 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_LiveSingle(
								MRPARAM_OUT LONG *pHandle,
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN WORD wPort, 
								MRPARAM_IN int protocol,
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN const char *szStreamName,
								MRPARAM_IN int nTimeoutMs
								);

MRNSDK_API int MRNSDK_CALL MRNSDK_LiveMultiCast(
								MRPARAM_OUT LONG *pHandle,
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN WORD wPort,
								MRPARAM_IN int emProtocol,
								MRPARAM_IN const char *szStreamName,
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeoutMs
								);

/* MRNSDK_NetVod
 * 开始远程文件回放
   pHandle		: 返回句柄指针
   szIP			: IP地址
   wPort		: 端口
   protocol     : 协议类型, 0 - MRMS私有协议，1 - RTSP协议
   szFileName   : 文件名称
   fdCallBack   : 校验密码回调函数
   userdata     : 回调函数用户数据
   szUserName   : 用户名
   szPassword   : 密码
   szDeviceID	: 设备ID(转发时使用)
   nTimeoutMs   : 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_NetVod(
								MRPARAM_OUT LONG *pHandle,
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN WORD wPort, 
								MRPARAM_IN int protocol, 
								MRPARAM_IN const char *szFileName,
								MRPARAM_IN fdMRNCb_VodGetPassword fdCallBack, 
								MRPARAM_IN void *userdata,
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeoutMs
								);

/* MRNSDK_Stream_GetNums
 * 获得流总数
   lStreamHandle : 流句柄
 * 大于0为流总数，其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_GetNums(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_Stream_GetVideoNums
 * 获得视频流总数
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 大于0为流总数，其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_GetVideoNums(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_Stream_SetStream
 * 设置流信息(组播时有效)
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nb_streams    : 流总数
   stream        : 流信息指针
 * 返回0成功，其他为错误值
 * 组播时有效
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_SetStream(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nb_streams, 
								MRPARAM_IN MRAVSTREAM_T *stream
								);

/* MRNSDK_Stream_GetStream
 * 获得流信息
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nIndex        : 流索引
   stream        : 返回流信息指针
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_GetStream(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nIndex, 
								MRPARAM_OUT MRAVSTREAM_T *stream
								);

/* MRNSDK_Stream_GetImageSize
 * 获得视频流大小
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nIndex        : 流索引
   pWidth        : 返回宽度指针
   pHeight       : 返回高度指针
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_GetImageSize(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nIndex, 
								MRPARAM_OUT int *pWidth,
								MRPARAM_OUT int *pHeight
								);

/* MRNSDK_Stream_SetVideoWnd
 * 设置视频流显示窗口
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nIndex        : 流索引
   hWnd          : 图像窗口
 * 返回0成功，其他为错误值
 * 设置NULL时，停止解码图像
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_SetVideoWnd(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nIndex, 
								MRPARAM_IN HWND hWnd
								);

/* MRNSDK_Stream_SetAllVideoWnd
 * 设置所有图像流显示窗口
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nb_Videos     : 窗口总数
   pWnd          : 窗口指针
 * 返回0成功，其他为错误值
 * 设置NULL时，停止解码图像
*/
MRNSDK_API int MRNSDK_CALL  MRNSDK_Stream_SetAllVideoWnd(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nb_Videos, 
								MRPARAM_IN HWND *pWnd
								);

/* MRNSDK_Stream_Start
 * 启动流播放、接收
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_Start(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_Stream_Stop
 * 停止流
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_Stop(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_ZoomInPicture
 * 局部放大
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   hWnd          : 显示局部图像窗口(NULL时取消图像放大)
   nIndex        : 视频流索引
   nXPen         : X位置, 按百分比计算
   nYPen         : Y位置, 按百分比计算
   nWPen         : 宽度, 按百分比计算
   nHPen         : 高度, 按百分比计算
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_ZoomInPicture(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN HWND hWnd, 
								MRPARAM_IN int nIndex, 
								MRPARAM_IN int nXPen, 
								MRPARAM_IN int nYPen, 
								MRPARAM_IN int nWPen, 
								MRPARAM_IN int nHPen
								);

/* MRNSDK_Stream_CapJpeg
 * JPEG抓拍
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   hWnd          : 显示局部图像窗口(NULL时取消图像放大)
   nIndex        : 视频流索引
   nQuality      : JPEG压缩质量,(0 - 100), 100为最好， 0为最差 
   szFileName    : 保存的文件名
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_CapJpeg(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nIndex, 
								MRPARAM_IN int nQuality, 
								MRPARAM_IN const char *szFileName
								);

/* MRNSDK_Stream_RefrenshWnd
 * 刷新显示窗口
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   nIndex        : 视频流索引(-1为所有视频流)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_RefrenshWnd(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN int nIndex
								);

/* MRNSDK_Stream_RegGetData
 * 注册获得通道数据回调函数
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   fdCallBack    : 获取数据回调函数指针
   userdata      : 回调函数用户数据
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_RegGetData(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN fdMRNCb_ChnGetData fdCallBack, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_Stream_RegGetDecFrame
 * 注册获得通道解码数据回调函数
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   fdCallBack    : 获取解码数据回调函数指针
   userdata      : 回调函数用户数据
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_RegGetDecFrame(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN fdMRNCb_ChnGetDecFrame fdCallBack, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_Stream_RegDrawDC
 * 注册获取OSD HDC回调函数
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   fdCallBack    : 获取OSD HDC回调函数指针
   userdata      : 回调函数用户数据
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_RegDrawDC(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN fdMRNCb_ChnDrawDC fdCallBack, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_Stream_GetPlayHandle
 * 获得播放句柄
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 返回播放器句柄，0 - 无效句柄
*/
MRNSDK_API LONG MRNSDK_CALL MRNSDK_Stream_GetPlayHandle(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_Stream_SetPlayHandle
 * 设置播放句柄
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   lPlayHandle   : 播放句柄
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_SetPlayHandle(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN LONG lPlayHandle
								);

/* MRNSDK_Stream_ShowVideo
 * 显示、不显示图像
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   bShow         : 显示标志
 * 返回0成功，其他为错误值
 * 不显示图像，SDK也不会解码图像
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_ShowVideo(
								MRPARAM_IN LONG lStreamHandle, 
								MRPARAM_IN BOOL bShow
								);

/* MRNSDK_Stream_SoundExist
 * 判断是否支持音频
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 返回1支持音频，0 - 不支持，其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_SoundExist(
								MRPARAM_IN LONG lStreamHandle
								);

/* MRNSDK_Stream_SoundIsOpen
 * 判断音频是否打开
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
 * 返回1正在播放音频，0 未播放，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_SoundIsOpen(
								MRPARAM_IN LONG lStreamHandle
								);


/* MRNSDK_Stream_SoundPlay
 * 播放音频
   lStreamHandle : 流句柄(MRNSDK_LiveSingle或MRNSDK_NetVod的返回值)
   bStart        : 播放音频标志
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Stream_SoundPlay(
								MRPARAM_IN LONG lStreamHandle,  
								MRPARAM_IN int bStart
								);

/********************************** Live专用 *************************************/
/* MRNSDK_Live_RegRelinkCallback
 * 设置通道断开/重连回调函数
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   fdCallback    : 回调函数指针
   userdata      : 回调函数用户数据
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_RegRelinkCallback(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN fdMRNCb_ChnReLink fdCallback, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_Live_Pause
 * 暂停/恢复码流传输
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   bPause        : TRUE - 暂停传输，FALSE - 恢复传输
 * 返回0成功，其他为错误值
 * 组播时无效，暂停后不接收码流，节省带宽
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_Pause(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN BOOL bPause
								);


/* MRNSDK_Live_SaveToFile
 * 保存码流到文件
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   nFilePackType : 文件打包类型(MR_PACKTYPE_TYPE)
   szFileName    : 文件名
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_SaveToFile(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN int nFilePackType, 
								MRPARAM_IN const char *szFileName
								);

/* MRNSDK_Live_SaveFileSwitch
 * 切换文件
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   szFileName    : 文件名
 * 返回0成功，其他为错误值
 * 在保存文件过程中，需要一定时间打包文件，使用该函数不需要停止在启动录像，
   使用该函数可以最小开销实现停止启动录像，这样就不会丢失数据
 * 内部在遇到关键帧时，自动关闭当前文件，并按新文件名保存录像
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_SaveFileSwitch(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN const char *szFileName
								);

/* MRNSDK_Live_SaveFileState
 * 获得文件保存状态
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   pFileSize     : 返回文件记录大小
   pFileTime     : 返回文件记录时间(秒)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_SaveFileState(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_OUT UINT64 *pFileSize, 
								MRPARAM_OUT DWORD *pFileTime
								);

/* MRNSDK_Live_StopSaveFile
 * 停止录像
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_StopSaveFile(
								MRPARAM_IN LONG lLiveHandle
								);

/* MRNSDK_Live_SetDelayMs
 * 设置图像播放延时时间(缓冲时间)
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   nDelayMs      : 毫秒(该值越大，图像越流畅，但是延时越大，反之亦然)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_SetDelayMs(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN int nDelayMs
								);

/* MRNSDK_Live_SetRecvTimeout
 * 设置流接收超时时间
   lLiveHandle   : 流句柄(MRNSDK_LiveSingle的返回值)
   nTimeout		 : 单位秒
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Live_SetRecvTimeout(
								MRPARAM_IN LONG lLiveHandle, 
								MRPARAM_IN int nTimeout
								);

/********************************** VOD专用 *************************************/
/* MRNSDK_Vod_GetInxData
 * 获得索引(特殊用户)
   lVodHandle   : 流句柄( MRNSDK_NetVod 的返回值)
   pInxBuffer   : 返回索引数据指针
 * 大于0为长度，小于0为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_GetInxData(
								MRPARAM_IN LONG lVodHandle, 
								MRPARAM_OUT BYTE **pInxBuffer
								);

/* MRNSDK_Vod_Pause
 * 暂停/恢复播放
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
   bPause        : TRUE - 暂停，FALSE - 恢复
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_Pause(
								MRPARAM_IN LONG lVodHandle, 
								MRPARAM_IN int bPause
								);

/* MRNSDK_Vod_Step
 * 单步播放
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_Step(
								MRPARAM_IN LONG lVodHandle
								);

/* MRNSDK_Vod_SeekToTime
 * 按时间跳转
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
   nSecond       : 时间(秒)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_SeekToTime(
								MRPARAM_IN LONG lVodHandle, 
								MRPARAM_IN int nSecond
								);

/* MRNSDK_Vod_Fast
 * 快进
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
   nFastValue	: 快进值，2, 4, 8, 16可用，0 - 播放器内部自动切换模式，使用 MRNSDK_Vod_GetPlayMode 获得当前模式
 * 返回0成功，其他为错误值
 * 多次调用该函数，实现不同速率播放
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_Fast(
								MRPARAM_IN LONG lVodHandle,
								MRPARAM_IN int nFastValue
								);

/* MRNSDK_Vod_Slow
 * 慢放
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
   nSlowValue	: 快进值，2, 4, 8, 16对应1/2, 1/4, 1/8, 1/16，0 - 播放器内部自动切换模式，使用 MRNSDK_Vod_GetPlayMode 获得当前模式
 * 返回0成功，其他为错误值
 * 多次调用该函数，实现不同速率播放
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_Slow(
								MRPARAM_IN LONG lVodHandle,
								MRPARAM_IN int nSlowValue
								);

/* MRNSDK_Vod_GetPlayMode
 * 获得当前播放模式
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 返回MRPSDK_MODE_TYPE为状态，小于0为错误值
 * MRPSDK_MODE_TYPE在MRPlaySdkApi.h中定义
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_GetPlayMode(
								MRPARAM_IN LONG lVodHandle
								);

/* MRNSDK_Vod_BackKeyFrame
 * 倒退关键帧播放
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 成功返回0，其他为错误值
 * 只支持文件播放
*/
MRNSDK_API int  MRNSDK_CALL MRNSDK_Vod_BackKeyFrame(
								MRPARAM_IN LONG lVodHandle
								);

/* MRNSDK_Vod_GetTolTime
 * 获得文件时间长度
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 大于0为时间长度(秒)，小于0为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_GetTolTime(
								MRPARAM_IN LONG lVodHandle
								);

/* MRNSDK_Vod_GetCurTime
 * 获得当前播放时间
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 大于0为播放时间(秒)，小于0为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_GetCurTime(
								MRPARAM_IN LONG lVodHandle
								);

/* MRNSDK_Vod_GetVideosByFrames
 * 目前未使用
   lVodHandle   : 流句柄(MRNSDK_NetVod 的返回值)
 * 大于0为播放时间(秒)，小于0为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_Vod_GetVideosByFrames(
								MRPARAM_IN LONG lVodHandle, 
								MRPARAM_OUT int *pVChnList
								);

/* MRNSDK_DownLoad_Start
 * 下载文件
   szIP				: IP地址
   wPort			: 端口
   szUserName		: 用户名
   szPassword		: 密码
   szDeviceID		: 设备ID(转发使用)
   nTimeoutMs		: 超时时间
   szRemoteFileName	: 远程文件名
   nStTime			: 开始时间
   nEdTime			: 结束时间
   szLocalFileName  : 保存本地文件名
 * 返回句柄，0 - 失败
 * nStTime和nEdTime不为0时，将从源文件中剪切，nEdTime为0时将整个文件下载
*/
MRNSDK_API LONG MRNSDK_CALL MRNSDK_DownLoad_Start(
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN WORD wPort, 
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeoutMs,
								MRPARAM_IN const char *szRemoteFileName, 
								MRPARAM_IN int nStTime, 
								MRPARAM_IN int nEdTime,
								MRPARAM_IN const char *szLocalFileName
								);

/* MRNSDK_DownLoadCut_Start
 * 剪切文件
   szIP				: IP地址
   wPort			: 端口
   szUserName		: 用户名
   szPassword		: 密码
   szDeviceID		: 设备ID(转发使用)
   nTimeoutMs		: 超时时间
   szRemoteFileName	: 远程文件名
   szCutInx			: 剪切索引, JSON格式
   szLocalFileName  : 保存本地文件名
 * 返回句柄，0 - 失败
*/
MRNSDK_API LONG MRNSDK_CALL MRNSDK_DownLoadCut_Start(
								MRPARAM_IN const char *szIP,
								MRPARAM_IN WORD wPort, 
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeoutMs,
								MRPARAM_IN const char *szRemoteFileName, 
								MRPARAM_IN const char *szCutInx,
								MRPARAM_IN const char *szLocalFileName
								);

/* MRNSDK_DownLoad_GetState
 * 获得下载、剪切状态
   lDownHandle	    : 下载句柄(MRNSDK_DownLoad_Start或MRNSDK_DownLoadCut_Start的返回值)
 * 返回0 - 100为进度，101 - 下载结束，小于0为错误值
*/
MRNSDK_API int  MRNSDK_CALL MRNSDK_DownLoad_GetState(
								MRPARAM_IN LONG lDownHandle
								);

/* MRNSDK_DownLoad_Stop
 * 停止下载、剪切
   lDownHandle	    : 下载句柄(MRNSDK_DownLoad_Start或MRNSDK_DownLoadCut_Start的返回值)
 * 返回0成功，其他为错误值
*/
MRNSDK_API int  MRNSDK_CALL MRNSDK_DownLoad_Stop(
								MRPARAM_IN LONG lDownHandle
								);

/* MRNSDK_SearchDevice
 * 开始搜索设备
   szIPAddr		 : 绑定网口IP地址(多网卡时使用)，NULL为任意网口
   nTimeoutMs	 : 超时时间(ms)
   fdNetSearchCB : 接收回调函数
        szDeviceID	: 设备ID
		szInfo		: 设备信息(JSON格式)
		userdata	: 用户数据
   userdata		 : 用户数据
 * 成功搜索的设备的总数，小于0为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_SearchDevice(
								MRPARAM_IN const char *szIPAddr,
								MRPARAM_IN int nTimeoutMs, 
								MRPARAM_IN void(*fdMRSearchCB)(
										MRPARAM_IN const char *szDeviceID,
										const char *szInfo, 
										void *userdata
										), 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_SearchSetParam
 * 设置设备参数
   szDeviceID	: 设备ID
   szParam      : 参数文本(JSON格式)
 * 返回0成功，其他为错误值
 * 请参考设备搜索程序示例
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_SearchSetParam(
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szParam
								);

/* MRNSDK_SearchFtpUpdate
 * FTP批量设备升级
   szFtpIP		: FTP服务器IP
   wFtpPort		: FTP服务器端口
   szFtpDir		: FTP服务器目录
   szFtpName	: FTP服务器访问用户名
   szFtpPsw		: FTP服务器访问密码
   szFileName	: 升级文件名称
 * 成功返回0， 其他为错误代码
 * 设备收到该消息后，通过FTP下载升级包文件，如果升级包与设备匹配，会自动升级并重启
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_SearchFtpUpdate(
								MRPARAM_IN const char *szFtpIP, 
								MRPARAM_IN unsigned short wFtpPort, 
								MRPARAM_IN const char *szFtpDir, 
								MRPARAM_IN const char*szFtpName, 
								MRPARAM_IN const char *szFtpPsw, 
								MRPARAM_IN const char *szFileName
								);

/* MRNSDK_SearchControl
 * 设备控制(支持默认参数和重启)
   szDeviceID	 : 设备ID
   szCmd		 : 命令，目前支持SapReboot(重启)和SapDefault(出厂默认)
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_SearchControl(
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szCmd
								);


/**************************** 录音 ****************************/
/* MRNSDK_AudioCaptureRecord
 * 启动录音
   pAudioInfo	: 音频参数信息
   fGetData		: 获得数据回调函数
   userdata		: 用户数据
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_AudioCaptureRecord(
								MRPARAM_IN MR_AUDIOPARAM_T *pAudioInfo, 
								MRPARAM_IN fdMRNCb_AudioGetData fGetData, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_AudioCaptureStop
 * 停止录音
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_AudioCaptureStop(void);

/* MRNSDK_TalkStart
 * 启动对讲
	pTalkHandle		: 输出对讲句柄
	szIP			: IP地址
	wPort			: 端口
	szUserName		: 用户名
	szPassword		: 密码
	szDeviceID		: 设备ID(转发使用)
	nTimeroutMs		: 超时时间(毫秒)
	pAudioInfo		: 音频参数
	bTwoWayData		: 双向对讲标志
	fGetDevData		: 获取接收对讲数据回调函数
	fStopHandle	    : 对讲停止通知回调函数
	userdata		: 用户数据
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkStart(
								MRPARAM_OUT LONG *pTalkHandle,
								MRPARAM_IN const char *szIP,
								MRPARAM_IN WORD wPort,
								MRPARAM_IN const char *szUserName,
								MRPARAM_IN const char *szPassword,
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeroutMs,
								MRPARAM_IN MR_AUDIOPARAM_T *pAudioInfo,
								MRPARAM_IN BOOL bTwoWayData,
								MRPARAM_IN fdMRNCb_AudioGetData fGetDevData,
								MRPARAM_IN fdMRNCb_AudioStop fStopHandle,
								MRPARAM_IN void *userdata
								);

/* MRNSDK_TalkSendData
 * 发送对讲数据
	lTalkHandle		: 对讲句柄, MRNSDK_TalkStart的输出值
	pBuffer			: 音频数据
	pts				: 时间戳
	nSize			: 数据大小
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkSendData(
								MRPARAM_IN LONG lTalkHandle, 
								MRPARAM_IN BYTE *pBuffer, 
								MRPARAM_IN int pts, 
								MRPARAM_IN int nSize
								);

/* MRNSDK_TalkStop
 * 停止对讲
	lTalkHandle		: 对讲句柄, MRNSDK_TalkStart 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkStop(
								MRPARAM_IN LONG lTalkHandle
								);

/* MRNSDK_TalkBroadcastStart
 * 启动音频广播通道
	pMultiTalkHandle	: 输出音频广播句柄
	szMultiCastIP		: 组播IP地址
	wMultiCastPort		: 组播端口
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkBroadcastStart(
								MRPARAM_OUT LONG *pTalkBroadHandle,
								MRPARAM_IN const char *szMultiCastIP, 
								MRPARAM_IN WORD wMultiCastPort
								);

/* MRNSDK_TalkMulticastSendData
 * 发送广播音频数据
	lTalkBroadHandle	: 组播对讲句柄，MRNSDK_TalkBroadcastStart 的输出值
	pBuffer				: 音频数据
	pts					: 时间戳
	nSize				: 数据大小
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkBroadcastSendData(
								MRPARAM_IN LONG lTalkBroadHandle,
								MRPARAM_IN BYTE *pBuffer, 
								MRPARAM_IN int pts, 
								MRPARAM_IN int nSize
								);

/* MRNSDK_TalkBroadcastStop
 * 停止音频广播
	lTalkBroadHandle	: 组播对讲句柄，MRNSDK_TalkBroadcastStart 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TalkBroadcastStop(
								MRPARAM_IN LONG lTalkBroadHandle
								);

/* MRNSDK_MulticastDataRecv_Start
 * 启动组播接收通道
   pRecvPort		: 输出接收句柄
   szMultiCast		: 组播地址
   wPort			: 组播端口
   fdRecvHandle		: 接收数据回调函数
   userdata			: 用户数据
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MulticastDataRecv_Start(
								MRPARAM_OUT LONG *pRecvPort,
								MRPARAM_IN const char *szMultiCast, 
								MRPARAM_IN int wPort, 
								MRPARAM_IN fdMRNCb_MulticastRecvData fdRecvHandle, 
								MRPARAM_IN void *userdata
								);

/* MRNSDK_MulticastDataRecv_Stop
 * 停止组播数据接收
   lRecvPort		: 组播接收句柄, MRNSDK_MulticastDataRecv_Start 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MulticastDataRecv_Stop(
								MRPARAM_IN LONG lRecvPort
								);

/* MRNSDK_MulticastDataSend_Start
 * 启动组播发送通道
   pSendPort		: 返回句柄
   bStart			: 启动/停止标志
   szMultiCast		: 组播地址
   wPort			: 组播端口
   nFifoNum			: 发送FIFO总数
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MulticastDataSend_Start(
								MRPARAM_OUT LONG *pSendPort,
								MRPARAM_IN const char *szMultiCast, 
								MRPARAM_IN int wPort,
								MRPARAM_IN int nFifoNum
								);

/* MRNSDK_MulticastDataSend_SendFrame
 * 发送数据
   lSendPort		: 组播发送句柄, MRNSDK_MulticastDataSend_Start 的输出值
   pkt				: 帧数据
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MulticastDataSend_SendFrame(
								MRPARAM_IN LONG lSendPort,
								MRPARAM_IN MRAVFrame *pkt
								);

/* MRNSDK_MulticastDataSend_Stop
 * 停止组播发送通道
   lSendPort		: 组播发送句柄, MRNSDK_MulticastDataSend_Start 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MulticastDataSend_Stop(
								MRPARAM_IN LONG lSendPort
								);

/* MRNSDK_UploadMsgPort_Open
 * 打开上传消息通道
   pMsg			: 返回消息句柄
   szIP			: IP地址
   wPort		: 端口
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   nMaskValue	: 类型掩码, 
					0x01 - 报警信号
					0x02 - 重启/关机消息
					0x04 - GPS数据
					-1 - 所有上传消息
   nTimeOutMs	: 连接超时时间(毫秒)
   fdEventHandle: 连接状态通知回调函数
		lMsg	: 消息句柄，MRNSDK_UploadMsgPort_Open的输出值
		nState  : 状态, 1 - 上线，0 - 断线, 断线时返回1重连，其他值断开连接
		userdata: 用户数据
   fdRecvMsgHandle	: 接收消息回调函数
		lMsg	: 消息句柄, MRNSDK_UploadMsgPort_Open 的输出值
		szMsg   : 收到的消息
		userdata: 用户数据
   userdata		: 用户数据
 * 成功返回0， 其他为错误代码
 * 使用上传消息通道接收设备报警等信号
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_UploadMsgPort_Open(
								MRPARAM_OUT LONG *pMsg, 
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN unsigned short wPort,
								MRPARAM_IN const char *szUserName,
								MRPARAM_IN const char *szPassword,
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nMaskValue,
								MRPARAM_IN int nTimeOutMs,
								MRPARAM_IN int(*fdEventHandle)(
											MRPARAM_IN LONG lMsg, 
											MRPARAM_IN int nState,
											MRPARAM_IN void *userdata
											),
								MRPARAM_IN void(*fdRecvMsgHandle)(
											MRPARAM_IN  LONG lMsg,
											MRPARAM_IN const char *szMsg, 
											MRPARAM_IN void *userdata
											),
								MRPARAM_IN void *userdata
								);

/* MRNSDK_UploadMsgPort_Close
 * 关闭上传消息通道
   lMsg		: 消息句柄, MRNSDK_UploadMsgPort_Open 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_UploadMsgPort_Close(
								MRPARAM_IN LONG lMsg
								);

/* MRNSDK_MsgPort_Open
 * 打开消息通道
   pMsg			: 返回消息句柄
   szIP			: IP地址
   wPort		: 端口
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   nTimeOutMs	: 连接超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MsgPort_Open(
								MRPARAM_OUT LONG *pMsg, 
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN unsigned short wPort,
								MRPARAM_IN const char *szUserName,
								MRPARAM_IN const char *szPassword,
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeOutMs
								);

/* MRNSDK_MsgPort_SendMsg
 * 发送接收消息
   lMsg				: 消息句柄, MRNSDK_MsgPort_Open 的输出值
   szIP				: IP地址
   szSendMsg		: 发送的消息
   szSendFileName	: 发送的文件名
   szRecvMsg		: 回送消息指针地址
   szRecvFileName	: 回送文件名指针地址
   nTimeoutMs		: 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MsgPort_SendMsg(
								MRPARAM_IN LONG lMsg, 
								MRPARAM_IN const char *szSendMsg, 
								MRPARAM_IN const char *szSendFileName, 
								MRPARAM_IN char **szRecvMsg, 
								MRPARAM_IN char **szRecvFileName,
								MRPARAM_IN int nTimeoutMs
								);

/* MRNSDK_MsgPort_Close
 * 关闭消息通道
   lMsg				: 消息句柄, MRNSDK_MsgPort_Open 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_MsgPort_Close(
								MRPARAM_IN LONG lMsg
								);

/* MRNSDK_TranDataPort_Open
 * 打开透明数据通道
   pDataPort	: 返回消息句柄
   pInfo		: 透传数据通道参数
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranDataPort_Open(
								MRPARAM_IN LONG *pDataPort, 
								MRPARAM_IN MRSDK_TRANDATA_PORT_T * pInfo
								);

/* MRNSDK_TranDataPort_SendFrame
 * 透明通道发送一帧数据
   lDataPort : 消息句柄, MRNSDK_TranDataPort_Open 的输出值
   pkt		 : 帧数据指针
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranDataPort_SendFrame(
								MRPARAM_IN LONG lDataPort, 
								MRPARAM_IN MRAVFrame *pkt
								);

/* MRNSDK_TranDataPort_Close
 * 关闭透明数据通道
   lDataPort : 消息句柄, MRNSDK_TranDataPort_Open 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranDataPort_Close(
								MRPARAM_IN LONG lDataPort
								);

/* MRNSDK_TranDataPort_Bind
 * 绑定/解绑定透传数据通道
   bBind		: TRUE - 绑定，FALSE - 解绑定
   lDataPortSrc	: 源透传数据通道句柄
   lDataPortDst	: 目的透传数据通道句柄
 * 成功返回0， 其他为错误代码
 * 绑定成功后，用户将收不到数据回调，该函数主要用于透传数据的转发(比如对讲、串口等转发)
 * 绑定后用户也不能发送数据
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranDataPort_Bind(
								MRPARAM_IN int bBind,			
								MRPARAM_IN LONG lDataPortSrc,
								MRPARAM_IN LONG lDataPortDst
								);

/* MRNSDK_TranMsgPort_Open
 * 打开透明消息通道
   pMsgPort	: 返回消息句柄
   pInfo	: 透明消息通道参数
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranMsgPort_Open(
								MRPARAM_IN LONG *pMsgPort, 
								MRPARAM_IN MRSDK_TRANMSG_PORT_T * pInfo
								);

/* MRNSDK_TranMsgPort_SendMsg
 * 发送消息
   lMsgPort			: 消息句柄， MRNSDK_TranMsgPort_Open 的输出值
   szSendMsg		: 发送的消息指针
   szSendFileName	: 发送的文件名
   nTimeoutMs		: 发送超时时间
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranMsgPort_SendMsg(
								MRPARAM_IN LONG lMsgPort, 
								MRPARAM_IN const char *szSendMsg,
								MRPARAM_IN const char *szSendFileName,
								MRPARAM_IN int nTimeoutMs
								);

/* MRNSDK_TranMsgPort_SendRecvMsg
 * 发送和接收消息
   lMsgPort			: 消息句柄， MRNSDK_TranMsgPort_Open 的输出值
   szSendMsg		: 发送的消息指针
   szSendFileName	: 发送的文件名
   pRecvMsg			: 接收消息指针地址
   pRecvFileName    : 接收文件名指针地址
   nTimeoutMs		: 发送和接收超时时间
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranMsgPort_SendRecvMsg(
								MRPARAM_IN LONG lMsgPort, 
								MRPARAM_IN const char *szSendMsg,
								MRPARAM_IN const char *szSendFileName,
								MRPARAM_OUT char **pRecvMsg,
								MRPARAM_OUT char **pRecvFileName,
								MRPARAM_IN int nTimeoutMs
								);

/* MRNSDK_TranMsgPort_Close
 * 关闭透明消息通道
   lMsgPort			: 消息句柄， MRNSDK_TranMsgPort_Open 的输出值
 * 成功返回0， 其他为错误代码
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranMsgPort_Close(
								MRPARAM_IN LONG lMsgPort
								);

/* MRNSDK_TranMsgPort_Bind
 * 绑定/解绑定透传消息通道
   bBind		: TRUE - 绑定，FALSE - 解绑定
   lMsgPortSrc	: 源消息通道句柄
   lMsgPortDst	: 目的消息通道句柄
 * 成功返回0， 其他为错误代码
 * 绑定成功后，用户将收不到消息回调，该函数主要用于消息转发
 * 绑定后用户也不能发送消息
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_TranMsgPort_Bind(
								MRPARAM_IN int bBind,
								MRPARAM_IN LONG lMsgPortSrc,
								MRPARAM_IN LONG lMsgPortDst
								);

/* MRNSDK_PtzControl
 * 云台控制
   szIP			: IP地址
   wPort		: 端口
   szDeviceID	: 设备ID(转发时需要设置)
   szUserName	: 用户名
   szPassword	: 密码
   nTimeOutMs	: 超时时间(毫秒)
   nChanel		: 通道
   szPtzCmd		: 云台命令,见MRComm.h中MR_PTZCMD_LEFT_START定义
   byValue      : 参数，对于不同的命令，含义不同
				  MR_PTZCMD_LEFT_START - MR_PTZCMD_ZOOM_DEC_STOP : byValue: 为速度值，pExtParam: 无效
				  MR_PTZCMD_PRESET_SET - MR_PTZCMD_PRESET_CLEAN  : byValue: 预置点，pExtParam: 无效
				  MR_PTZCMD_3DLOCATE							 : byValue: 无效，pExtParam: MR_PTZ3DLOCAL_T
   pExtParam    : 扩展参数，不用命令解释不同
 * 返回0成功，其他为错误值
*/
MRNSDK_API int MRNSDK_CALL MRNSDK_PtzControl(
								MRPARAM_IN const char *szIP,
								MRPARAM_IN unsigned short wPort,
								MRPARAM_IN const char *szUserName,
								MRPARAM_IN const char *szPassword,
								MRPARAM_IN const char *szDeviceID,
								MRPARAM_IN int nTimeOutMs,
								MRPARAM_IN int nChanel,
								MRPARAM_IN const char *szPtzCmd,
								MRPARAM_IN unsigned char byValue,
								MRPARAM_IO void *pExtParam
								);
#ifdef __cplusplus
}
#endif
#endif//__MRNETSDK_API_H__
