//libmedserver.h
#ifndef __LIBMEDSERVER_H__
#define __LIBMEDSERVER_H__
#ifdef __cplusplus
extern "C" {
#endif

#if defined(WIN32)
#define LIBMRMS_API		extern __declspec(dllexport)
#define LIBMRMS_CALL	__stdcall
#else
#define LIBMRMS_API
#define LIBMRMS_CALL
#include <netinet/in.h>
#endif//WIN32

#include "MRComm.h"

/* HAVMStream
 * 流通道句柄，libavms_addlivestream的返回值
*/
typedef void* HAVMStream;

/* HAVCStream
 * 客户端通道句柄，libavmc_stream_live_single, libavmc_stream_live_multicast, libavmc_stream_vod的返回值
*/
typedef void* HAVCStream;

/* HAVMSG
 * 消息通道句柄
*/
typedef void* HAVMSG;

/* HSTranDataPort
 * 服务端透明数据通道句柄
*/
typedef void* HSTranDataPort;

/* HCTranDataPort
 * 客户端透明数据通道句柄
*/
typedef void* HCTranDataPort;

/* HSTranMsgPort
 * 服务端透明消息通道句柄
*/
typedef void* HSTranMsgPort;

/* HCTranMsgPort
 * 客户端透明消息通道句柄
*/
typedef void* HCTranMsgPort;

/* HCMsgChnPort
 * 客户消息通道句柄
*/
typedef void* HCMsgChnPort;

/* HSrcPushStream
 * 发起推送流句柄
*/
typedef void* HSrcPushStream;

/* HDstPushStream
 * 接收推送流句柄
*/
typedef void* HDstPushStream;

/* HCUploadMsgChnPort
 * 客户端上传消息句柄
*/
typedef void* HCUploadMsgChnPort;

// 通道状态
typedef enum{
	LIBMS_CHNSTATE_RECONNT = 1,		// 连接断开, 重连查询， 返回1重连
	LIBMS_CHNSTATE_EXIT,			// 链接退出
	LIBMS_CHNSTATE_OK = 10,			// 链接正常
}LIBMS_CHNSTATE_TYPE;


/******************************************************** 用户端接口 *******************************************/
typedef struct{
	MRPARAM_IN const char *szIP;			// IP地址
	MRPARAM_IN unsigned short wPort;		// 端口
	MRPARAM_IN const char *szStreamName;	// 流名称或文件名
	MRPARAM_IN const char *szUserName;		// 用户名
	MRPARAM_IN const char *szPassword;		// 密码
	MRPARAM_IN const char *szDeviceID;		// 设备ID(转发时使用)
	MRPARAM_IN int   ntimeout;				// 超时时间，毫秒
	MRPARAM_IN int (*relink_handle)(		// 重连回调函数
		HAVCStream hstream,						// 流句柄
		int nState,								// 状态, LIBMS_CHNSTATE_TYPE， 返回1系统自动重连，其他断开连接
		void *userdata							// 用户数据
		);
	MRPARAM_IN int (*data_handle)(			// 获得数据回调函数
		MRPARAM_IN HAVCStream hstream,			// 流句柄
		MRPARAM_IN void *userdata,				// 用户数据
		MRPARAM_IN MRAVFrame *pkt				// 帧数据指针
		);
	MRPARAM_IN void *userdata;				// 用户数据
}LIBMC_REMOINFO_T;

// 下载信息
typedef struct LIBMC_DOWNLOAD_T{
	MRPARAM_IN char szIP[128];				// IP地址
	MRPARAM_IN unsigned short wPort;		// 端口
	MRPARAM_IN int nTimeoutMs;				// 超时时间(毫秒)
	MRPARAM_IN BOOL bUserStopFlag;			// 用户停止标志
	MRPARAM_IN int  nErrNo;					// 接收错误代码
	MRPARAM_IN int  nProcess;				// 完成百分比
	MRPARAM_IN int  bDownExit;				// 完成退出标志
	MRPARAM_IN void *context;				// 用户数据
	MRPARAM_IN uint64_t u64TolSize;			// 总大小
	MRPARAM_IN int (*getdata_handle)(		// 获得数据回调函数
			MRPARAM_IN struct LIBMC_DOWNLOAD_T *pDonwload,	// 下载句柄
			MRPARAM_IN int bSeekSet,						// 跳转设置
			MRPARAM_IN unsigned char *pData,				// 数据指针
			MRPARAM_IN int nSize							// 数据大小
			);
	MRPARAM_IN void *userdata;				// 用户数据
}LIBMC_DOWNLOAD_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 nFiFoNums;			// 发送的FiFo总数
	MRPARAM_IN int (*fdCloseHandle)(	// 关闭通知回调函数
			MRPARAM_IN HCTranDataPort pDataPort, // 数据通道句柄
			MRPARAM_IN void *userdata			// 用户数据
			);
	// 获得数据回调函数, pTranPort - 透明通道句柄, nState - 状态(0 - 断开，1 - 正常), pkt - 数据帧, userdata - 用户数据
	MRPARAM_IN int (*fdGetDataHandle)(		// 获得数据回调函数
			MRPARAM_IN HCTranDataPort pDataPort,	// 数据通道句柄
			MRPARAM_IN MRAVFrame *pkt,				// 帧数据
			MRPARAM_IN void *userdata				// 用户数据
			);

	MRPARAM_IN const char *szUserCmd;	// 发送的用户消息
	MRPARAM_OUT char *szAckMsg;			// 回送的消息
}LIBMC_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 HCTranMsgPort pMsgPort,	// 消息句柄
			MRPARAM_IN void *userdata			// 用户数据
			);
	// 获得消息回调函数, pTranPort - 透明通道句柄, nState - 状态(0 - 断开，1 - 正常), pkt - 数据帧, userdata - 用户数据
	MRPARAM_IN int (*fdGetMsgHandle)(			// 获得消息回调函数
			MRPARAM_IN HCTranMsgPort pMsgPort,		// 消息句柄
			MRPARAM_IN const char *szMsg,			// 消息
			MRPARAM_IN const char *szFileName,		// 文件名
			MRPARAM_IN void *userdata				// 用户数据
			);
	
	MRPARAM_IN const char *szUserCmd;	// 发送的用户消息
	MRPARAM_OUT char *szAckMsg;			// 回送的消息
}LIBMC_TRANMSG_PORT_T;


/* libavmc_setdowndir
 * 设置文件临时保存目录
   szDir		: 目录
 * 成功返回0， 其他为错误代码
 * 如果已经启用服务端，不需要再调用该函数
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_setdowndir(
								MRPARAM_IN const char *szDir
								);

/* libavmc_stream_live_single
 * 开始连接流
   phstream		: 返回的流通道句柄
   emProtocol	: 协议类型, MR_NETSTMPRO_TYPE
   pRemoInfo	: 参数信息
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_live_single(
								MRPARAM_IN HAVCStream *phstream, 
								MRPARAM_IN int emProtocol, 
								MRPARAM_IN LIBMC_REMOINFO_T *pRemoInfo
								);

/* libavmc_stream_live_multicast
 * 开始组播连接(数据使用组播传输)
   phstream		: 返回的流通道句柄
   emProtocol	: 协议类型, MR_NETSTMPRO_TYPE
   pRemoInfo	: 参数信息
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_live_multicast(
								MRPARAM_IN HAVCStream *phstream, 
								MRPARAM_IN int emProtocol, 
								MRPARAM_IN LIBMC_REMOINFO_T *pRemoInfo
								);

/* libavmc_stream_vod
 * 开始点播
   hstream		: 通道句柄
   emProtocol	: 协议类型, MR_NETSTMPRO_TYPE
   pRemoInfo	: 参数信息
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_vod(
								MRPARAM_IN HAVCStream *phstream, 
								MRPARAM_IN int emProtocol, 
								MRPARAM_IN LIBMC_REMOINFO_T *pRemoInfo
								);

/* libavmc_stream_settimeout
 * 设置流接收超时时间
   hstream		: 通道句柄
   nTimeoutSecs	: 超时时间(秒)
 * 成功返回0， 其他为错误代码
 * 接收任务超过该时间接收不到数据后会断开连接
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_settimeout(
								MRPARAM_IN HAVCStream hstream, 
								MRPARAM_IN int nTimeoutSecs
								);

/* libavmc_stream_stream_nb
 * 获得流总数
   hstream		: 通道句柄
 * 返回流总数，小于0为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_stream_nb(
								MRPARAM_IN HAVCStream hstream
								);

/* libavmc_stream_getstrminfo
 * 获得流信息
   hstream		: 通道句柄
   nIndex		: 流索引, 0 - stream_nb - 1
   pStream		: 返回的流信息指针
 * 返回流总数，小于0为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_getstrminfo(
								MRPARAM_IN HAVCStream hstream, 
								MRPARAM_IN int nIndex, 
								MRPARAM_OUT MRAVSTREAM_T *pStream
								);

/* libavmc_stream_vod_getindex
 * 获得点播索引
   hstream		: 通道句柄
   pbuffer		: 索引指针地址
 * 返回索引大小，小于0为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_vod_getindex(
								MRPARAM_IN HAVCStream hstream, 
								MRPARAM_IN unsigned char **pbuffer
								);

/* libavmc_stream_stop
 * 停止流
   hstream		: 通道句柄
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_stop(
								MRPARAM_IN HAVCStream hstream
								);

/* libavmc_stream_start
 * 开始流播放
   hstream		: 通道句柄
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_start(
								MRPARAM_IN HAVCStream hstream
								);

/* libavmc_stream_pause
 * 暂停/回放播放
   hstream		: 通道句柄
   bPause		: TRUE - 暂停， FALSE - 恢复
 * 成功返回0， 其他为错误代码
 * 通知服务端暂停或恢复发送收，如果暂停，服务器会暂停数据发送，以节约带宽资源
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_pause(
								MRPARAM_IN HAVCStream hstream, 
								MRPARAM_IN int bPause
								);

/* libavmc_stream_vod_seektime
 * 点播跳转
   hstream		: 通道句柄
   ntime		: 跳转时间(秒)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_stream_vod_seektime(
								MRPARAM_IN HAVCStream hstream, 
								MRPARAM_IN int ntime
								);

/* libavmc_multicastdatarecv_start
 * 启动组播接收通道
   pRecvPort		: 输出接收句柄
   szMultiCast		: 组播地址
   wPort			: 组播端口
   fdRecvHandle		: 接收数据回调函数
		pRecvPort		: 句柄
		pkt				: 帧数据指针
		userdata		: 用户数据
   userdata			: 用户数据
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_multicastdatarecv_start(
								MRPARAM_OUT void **pRecvPort,
								MRPARAM_IN const char *szMultiCast, 
								MRPARAM_IN unsigned short wPort, 
								MRPARAM_IN void(*fdRecvHandle)(
									MRPARAM_IN void *pRecvPort,
									MRPARAM_IN MRAVFrame *pkt,
									MRPARAM_IN void *userdata
									), 
								MRPARAM_IN void *userdata
								);

/* libavmc_multicastdatarecv_stop
 * 停止组播数据接收
   pRecvPort		: 组播接收句柄, libavmc_multicastdatarecv_start的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_multicastdatarecv_stop(
								MRPARAM_IN void *pRecvPort
								);

/* libavmc_multicastdatasend_start
 * 启动组播发送通道
   pSendPort		: 返回句柄
   bStart			: 启动/停止标志
   szMultiCast		: 组播地址
   wPort			: 组播端口
   nFifoNum			: 缓冲个数
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_multicastdatasend_start(
								MRPARAM_OUT void **pSendPort,
								MRPARAM_IN const char *szMultiCast, 
								MRPARAM_IN unsigned short wPort,
								MRPARAM_IN int nFifoNum
								);

/* libavmc_multicastdatasend_sendframe
 * 发送数据
   pSendPort		: 组播发送句柄, libavmc_multicastdatasend_start 的输出值
   pkt				: 帧数据
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_multicastdatasend_sendframe(
								MRPARAM_IN void *pSendPort,
								MRPARAM_IN MRAVFrame *pkt
								);

/* libavmc_multicastdatasend_stop
 * 停止组播发送通道
   pSendPort		: 组播发送句柄, libavmc_multicastdatasend_start 的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_multicastdatasend_stop(
								MRPARAM_IN void *pSendPort
								);

/* libavmc_uploadmsgchn_open
 * 打开上传消息通道
   pMsg			: 返回消息句柄
   szIP			: IP地址
   wPort		: 端口
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   nMaskValue	: 类型掩码, 
					0x01 - 报警信号
					0x02 - 重启/关机消息
					0x04 - GPS数据
					-1 - 所有上传消息
   nTimeOutMs	: 连接超时时间(毫秒)
   fdEventHandle: 连接状态通知回调函数
		pMsg	: 消息句柄，libavmc_uploadmsgchn_open的输出值
		nState  : 状态, 1 - 上线，0 - 断线, 断线时返回1重连，其他值断开连接
		userdata: 用户数据
   fdRecvMsgHandle	: 接收消息回调函数
		pMsg	: 消息句柄，libavmc_uploadmsgchn_open的输出值
		szMsg   : 收到的消息
		userdata: 用户数据
   userdata		: 用户数据
 * 成功返回0， 其他为错误代码
 * 使用上传消息通道接收设备报警等信号
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_uploadmsgchn_open(
								MRPARAM_OUT HCUploadMsgChnPort *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 HCUploadMsgChnPort pMsg, 
											MRPARAM_IN int nState,
											MRPARAM_IN void *userdata
											),
								MRPARAM_IN void(*fdRecvMsgHandle)(
											MRPARAM_IN  HCUploadMsgChnPort pMsg, 
											MRPARAM_IN const char *szMsg, 
											MRPARAM_IN void *userdata
											),
								MRPARAM_IN void *userdata
								);

/* libavmc_uploadmsgchn_close
 * 关闭上传消息通道
   pMsg		: 消息句柄, libavmc_uploadmsgchn_open 的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_uploadmsgchn_close(
								MRPARAM_IN HCUploadMsgChnPort pMsg
								);

/* libavmc_msgchn_open
 * 打开消息通道
   pMsg			: 返回消息句柄
   szIP			: IP地址
   wPort		: 端口
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   nTimeOutMs	: 连接超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_msgchn_open(
								MRPARAM_OUT HCMsgChnPort *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
								);

/* libavmc_msgchn_sendmsg
 * 发送接收消息
   pMsg				: 消息句柄, libavmc_msgchn_open 的输出值
   szIP				: IP地址
   szSendMsg		: 发送的消息
   szSendFileName	: 发送的文件名
   szRecvMsg		: 回送消息指针地址
   szRecvFileName	: 回送文件名指针地址
   nTimeOutMs		: 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_msgchn_sendmsg(
								MRPARAM_IN HCMsgChnPort hMsg, 
								MRPARAM_IN const char *szSendMsg, 
								MRPARAM_IN const char *szSendFileName, 
								MRPARAM_IN char **szRecvMsg, 
								MRPARAM_IN char **szRecvFileName,
								MRPARAM_IN int nTimeOutMs
								);

/* libavmc_msgchn_close
 * 关闭消息通道
   pMsg				: 消息句柄, libavmc_msgchn_open的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_msgchn_close(
								MRPARAM_IN HCMsgChnPort hMsg
								);

/* libavmc_trandataport_open
 * 打开透明数据通道
   pDataPort	: 返回消息句柄
   pInfo		: 透传数据通道参数
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_trandataport_open(
								MRPARAM_IN HCTranDataPort *pDataPort, 
								MRPARAM_IN LIBMC_TRANDATA_PORT_T * pInfo
								);

/* libavmc_trandataport_sendframe
 * 透明通道发送一帧数据
   pDataPort : 消息句柄, libavmc_trandataport_open 的输出值
   pkt		 : 帧数据指针
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_trandataport_sendframe(
								MRPARAM_IN HCTranDataPort pDataPort, 
								MRPARAM_IN MRAVFrame *pkt
								);

/* libavmc_trandataport_close
 * 关闭透明数据通道
   pDataPort		: 消息句柄, libavmc_trandataport_open 的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_trandataport_close(
								MRPARAM_IN HCTranDataPort pDataPort
								);

/* libavmc_tranmsgport_open
 * 打开透明消息通道
   pMsgPort	: 返回消息句柄
   pInfo	: 打开透明消息通道参数
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_tranmsgport_open(
								MRPARAM_IN HCTranMsgPort *pMsgPort, 
								MRPARAM_IN LIBMC_TRANMSG_PORT_T * pInfo
								);

/* libavmc_tranmsgport_open
 * 发送消息
   pMsgPort			: 消息句柄， libavmc_tranmsgport_open 的输出值
   szSendMsg		: 发送的消息指针
   szSendFileName	: 发送的文件名
   nTimeoutMs		: 发送超时时间
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_tranmsgport_sendmsg(
								MRPARAM_IN HCTranMsgPort pMsgPort, 
								MRPARAM_IN const char *szSendMsg,
								MRPARAM_IN const char *szSendFileName,
								MRPARAM_IN int nTimeoutMs
								);

/* libavmc_tranmsgport_sendrecvmsg
 * 发送和接收消息
   pMsgPort			: 消息句柄， libavmc_tranmsgport_open 的输出值
   szSendMsg		: 发送的消息指针
   szSendFileName	: 发送的文件名
   pRecvMsg			: 接收消息指针地址
   pRecvFileName    : 接收文件名指针地址
   nTimeoutMs		: 发送和接收超时时间
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_tranmsgport_sendrecvmsg(
								MRPARAM_IN HCTranMsgPort pMsgPort, 
								MRPARAM_IN const char *szSendMsg,
								MRPARAM_IN const char *szSendFileName,
								MRPARAM_OUT char **pRecvMsg,
								MRPARAM_OUT char **pRecvFileName,
								MRPARAM_IN int nTimeoutMs
								);

/* libavmc_tranmsgport_close
 * 关闭透明消息通道
   pMsg		: 消息句柄, libavmc_tranmsgport_open 的输出值
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_tranmsgport_close(
								MRPARAM_IN HCTranMsgPort pMsgPort
								);

/* libavmc_download_open
 * 下载文件
   pDown		: 下载信息
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   szFileName	: 文件名
   nStTime		: 开始时间
   nEdTime		: 结束时间，0 - 为整个文件
   nTimeroutMs	: 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_download_open(
								MRPARAM_IN LIBMC_DOWNLOAD_T *pDown, 
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szFileName,
								MRPARAM_IN int nStTime, 
								MRPARAM_IN int nEdTime,
								MRPARAM_IN int nTimeroutMs
								);

/* libavmc_downloadcut_open
 * 剪切下载文件
   pDown		: 下载信息
   szUserName	: 用户名
   szPassword	: 密码
   szDeviceID	: 设备ID
   szFileName	: 文件名
   szCutInx		: 剪切索引
   nTimeroutMs	: 超时时间(毫秒)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_downloadcut_open(
								MRPARAM_IN LIBMC_DOWNLOAD_T *pDown, 
								MRPARAM_IN const char *szUserName, 
								MRPARAM_IN const char *szPassword, 
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szFileName,
								MRPARAM_IN const char *szCutInx,
								MRPARAM_IN int nTimeroutMs
								);

/* libavmc_download_close
 * 停止下载
   pDown		: 下载信息
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_download_close(
								MRPARAM_IN LIBMC_DOWNLOAD_T *pDown
								);

/******************************************************** 网络搜索 *******************************************/
/* libavmc_netsearch_start
 * 开始搜索
   szIPAddr		 : 绑定网口IP地址(多网卡时使用)
   nTimeoutMs	 : 超时时间(ms)
   fdNetSearchCB : 接收回调函数
        szDeviceID	: 设备ID
		szInfo		: 设备信息(JSON格式)
		userdata	: 用户数据
   userdata		 : 用户数据
 * 成功搜索的设备的总数，小于0为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netsearch_start(
								MRPARAM_IN const char *szIPAddr,
								MRPARAM_IN int nTimeoutMs, 
								MRPARAM_IN void(*fdNetSearchCB)(
								    MRPARAM_IN const char *szDeviceID,
									MRPARAM_IN const char *szInfo, 
									MRPARAM_IN void *userdata
									), 
								MRPARAM_IN void *userdata
								);

/* libavmc_netsearch_setparam
 * 开始搜索
   szDeviceID	 : 设备ID
   szParam		 : 参数(JSON格式)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netsearch_setparam(
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szParam
								);

/* libavmc_netsearch_control
 * 设备控制(支持默认参数和重启)
   szDeviceID	 : 设备ID
   szCmd		 : 命令，目前支持SapReboot(重启)和SapDefault(出厂默认)
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netsearch_control(
								MRPARAM_IN const char *szDeviceID, 
								MRPARAM_IN const char *szCmd
								);

/* libavmc_netsearch_fptupdate
 * FTP批量设备升级
   szFtpIP		: FTP服务器IP
   wFtpPort		: FTP服务器端口
   szFtpDir		: FTP服务器目录
   szFtpName	: FTP服务器访问用户名
   szFtpPsw		: FTP服务器访问密码
   szFileName	: 升级文件名称
 * 成功返回0， 其他为错误代码
 * 设备收到该消息后，通过FTP下载升级包文件，如果升级包与设备匹配，会自动升级并重启
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netsearch_fptupdate(
								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
								);

/************************************************************************/
/* PTZ网络协议(pelco_p, pelco_d, visca)                                 */
/************************************************************************/
/* libavmc_netptzcmdserver_start
 * 开始网络PTZ协议服务器
   szIP				: 绑定IP地址,NULL为所有网口
   wPort			: 绑定的端口(TCP和UDP复用)
   fdRecvHandleCB	: 接收数据回调函数
		context	: 关联数据
		pAddr   : 发送者地址
		pCmd    : 接收数据指针
		nCmdLen : 接收数据长度
		userdata: 用户数据
   userdata			: 用户数据
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netptzcmdserver_start(
								MRPARAM_IN const char *szIP, 
								MRPARAM_IN unsigned short wPort,
								MRPARAM_IN void(*fdRecvHandleCB)(
											MRPARAM_IN void *context, 
											MRPARAM_IN struct sockaddr_in *pAddr, 
											MRPARAM_IN unsigned char *pCmd, 
											MRPARAM_IN int nCmdLen, 
											MRPARAM_IN void *userdata), 
								MRPARAM_IN void *userdata
								);

/* libavmc_netptzcmdserver_send
 * 回送消息
   context		: 关联数据指针, fdRecvHandleCB的第一个参数
   pAddr        : 接收值地址， fdRecvHandleCB的第二个参数
   pCmd         : 发送的消息指针
   nCmdLen      : 消息长度
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netptzcmdserver_send(
								MRPARAM_IN void *context, 
								MRPARAM_IN struct sockaddr_in *pAddr, 
								MRPARAM_IN unsigned char *pCmd, 
								MRPARAM_IN int nCmdLen
								);

/* libavmc_netptzcmdserver_stop
 * 停止服务
 * 成功返回0， 其他为错误代码
*/
LIBMRMS_API int LIBMRMS_CALL libavmc_netptzcmdserver_stop(void);

#ifdef __cplusplus
}
#endif
#endif//__LIBMEDSERVER_H__
