www.pudn.com > H264RtpSource.rar > AllProtocol.h


#pragma once 
 
#ifndef __ALLPROTOCOL_H 
#define __ALLPROTOCOL_H 
#include "typedef.h" 
 
//FIFO队列,这是一个比较经得起考验的FIFO 
//网络中接收到的原始数据 
typedef struct __RTP_PACKET_FIFO 
{ 
	unsigned int Write; 
	unsigned int Read; 
	unsigned int DatCount; 
	unsigned char Buf[20][2004]; 
	int iDataLen[20]; 
}RTP_PACKET_FIFO; 
 
class CGoldQueue; 
class CGoldNode; 
class CAllProtocol 
{ 
public: 
	CAllProtocol(void); 
	virtual ~CAllProtocol(void); 
 
	//启动线程和结束线程的相关函数和变量 
	//结束线程要靠它来控制 
	BOOL bFinishThread; 
	int OpenThread();			//返回值:创建成功:>0;创建失败:<0;已经创建:=0; 
	BOOL CloseThread(); 
 
	//读取一帧H264数据 
	//输入参数:无 
	//输出参数: 
	//		pNode:H264帧数据 
	//返回值: 
	//		0:帧缓冲空,无法取得数据 
	//		>0:取得帧数据 
	CGoldNode* GetFrame(); 
	//********************************************************************** 
	//接口: 用户通过这个函数设置RTP数据采集的端口号 
	void SetRTPPort(unsigned short LocalPort); 
	//接口: 用户调用这个函数,开始链接服务器 
	BOOL USRStart(char *IPaddr, int port); 
	//接口: 连接好,告诉服务端可以发送视频数据或音频数据,但是我们这个只有视频数据 
	BOOL USRStartPlay(unsigned char StartFlag); 
	//接口: 断开和服务端的链接 
	BOOL USRStop(); 
 
//private: 
	//这里有两中通讯,TCP和RTP通讯 
	//TCP满足控制通讯的需要;RTP满足实时数据传输的需要 
	//TCP连接服务器 
	SOCKET m_SocketTCP; 
	//TCP通讯端口号 
	unsigned short m_RemotePort; 
	char * m_RemoteIp; 
	//调用这个函数设置客户端的服务器IP地址和端口号 
	void SetServerAddrr(char* RemoteIp,unsigned short RemotePort); 
	int ConnectTCP(); 
	//RTP接收数据的初始化 
	SOCKET m_SocketRTP; 
	//RTP通讯本地端口号 
	unsigned short m_LocalPort; 
	unsigned long m_LocalIp; 
	int ConnectRTP(); 
	//关闭和服务端的链接 
	void CloseConnect(void); 
 
	//创建一个线程,实时采集RTP视频数据和不断发送心跳;这个地方不需要对TCP数据进行这样的采集; 
	//创建采集数据线程相关的函数和变量 
	HANDLE m_hGetDataThreadId; 
	static DWORD ThreadGetDataEntry(LPVOID pv);	//线程函数; 
	void ThreadGetDataProc(void);						//线程功能模块实现过程函数 
 
	//发送TCP数据,发送客户端心跳,采集视频数据,客户端重新连接服务端等函数和变量 
	//和服务端连接的状态,如果TCP没有连接好,那么发送数据等操作就干脆直接退出来。 
	int m_iLinkStatus; 
	//需要重新建立连接 
	BOOL bConnectRestart; 
	//和重新服务器建立连接的函数 
    BOOL RestartConnnect(); 
	//TCP发送数据,输入参数:Sock,Data,Length; 
	//输出参数:int; 
	int SendTcpData(SOCKET Sock, const char* Data, int Length); 
	//发送数据包, 
	int SendTcpPacket(SOCKET sock, char* usrbuf, int len, unsigned short OperatorType); 
	//接收TCP数据 
	int RecvTcpData(SOCKET Sock,char* Data,int Length); 
	//清空TCP缓冲区中的所有数据 
	void ClearTcpDataBuf(SOCKET Sock); 
	//发送客户端心跳, 
	int SendPulse(); 
	//记录最后一次发送心跳的时间 
	time_t tmLastSendPulse; 
 
	//接收RTP数据 
	//输入参数: 
	//输出参数: 
	void RecvRtpPacket(); 
	bool SPS_GET;				//是否找到第一个I帧 
	int VideoFrameNum;			//记录视频数据得帧数 
	//纯粹的视频处理函数 
    void DealVideo(); 
	//一个对列,存放视频数据 
	CGoldQueue *m_VideoQueue; 
	//第一次取数据 
	BOOL	m_bFirstFrame; 
 
	////FIFO队列,这是一个比较经得起考验的FIFO 
	//网络中接收到的原始数据 
	RTP_PACKET_FIFO RtpPacketFifo; 
	void initFIFO(); 
	BOOL  mu_write_pes_fifo(unsigned char *dat,int len); 
	BOOL  mu_read_pes_fifo(unsigned char **Buf,int &len); 
	//FIFO结束 
 
	///////////////////////////////////////////////////// 
	////得到图象格式 
	BOOL GetPicture(PICTURE *pic); 
	////设置图象格式 
	BOOL SetPicture(PICTURE *pic); 
	//云台控制 
    int ControlPlatform(unsigned char Action, int Step); 
}; 
 
#endif