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