/****************************************************************************** * FILE: MediaRelay.h * Description: * Thread receive packet interface class. * * Modified Code History * Mark Date By Modification Reason ******************************************************************************* * 01 2013-5-2 songxw Initial creation. ******************************************************************************/ #if !defined(__TCP_STREAM_TREANS_H__) #define __TCP_STREAM_TREANS_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "jthread.h" #include "TypeDef.h" #include "librtsp.h" #include "str.h" #include "tool.h" #include "StreamParse.h" using namespace std; using namespace jthread; #define CHECK_RTP_PACKET_SIZE 10 #define UDP_PACKET_RECV_MAXSIZE (1024 * 1024) #define TCP_STRAM_HEADER_LEN 2 #define TCP_STREAM_BUFFER_MAX_LEN (1024 * 50) //rtp Í· typedef struct { /**//* byte 0 */ unsigned char csrc_len:4; /**//* expect 0 */ unsigned char extension:1; /**//* expect 1, see RTP_OP below */ unsigned char padding:1; /**//* expect 0 */ unsigned char version:2; /**//* expect 2 */ /**//* byte 1 */ unsigned char payload:7; /**//* RTP_PAYLOAD_RTSP */ unsigned char marker:1; /**//* expect 1 */ /**//* bytes 2, 3 */ unsigned short seq_no; /**//* bytes 4-7 */ unsigned int timestamp; /**//* bytes 8-11 */ unsigned int ssrc; /**//* stream number is used here. */ } RTP_FIXED_HEADER; struct TcpStreamPacket { UINT8* pData; int nLength; TcpStreamPacket& operator=(TcpStreamPacket *oth) { this->pData=oth->pData; this->nLength=oth->nLength; return *this; } }; typedef std::list::iterator TcpPacketIt; class CTcpStreamTrans: public JThread { public: CTcpStreamTrans(); ~CTcpStreamTrans(); //Æô¶¯tcpserverµÄ¼àÌý int CreateTcpServer(int port); //ÉèÖÃÂëÁ÷´«ÊäµÄ²ÎÊý bool SetStreamTransParam(StreamTransType_E streamtype, const char *sendip, int sendport, const char *recvip, int recvport); //ÉèÖÃÂëÁ÷»Øµ÷²ÎÊý void SetStreamCallBackParam(PlayCallBack2 callback, long userdata) { MediaCBFunc = callback; UserData = userdata; } public: void* Thread(void); void ThreadQuit(void); private: // µÈ´ýtcpclientÁ¬½Ó int AcceptClient(int socketfd, char *pSrcIp, UINT16 &SrcPort); //¶Ôgb28181µÄtcpÂëÁ÷½øÐÐÕ´°ü´¦Àí void StickyTcpStramPacket(UINT8 *pData, int TcpRecvLen); bool ReadSelect(int scoketfd, UINT32 timeout); int Connect(void); int IsMark( UINT8* pBuffer, unsigned int BufSize); int GetRtpHeaderSize(UINT8* _frame, int _frameLen); int ParseTcpStream(UINT8* pData, int len); int HandleRecvStream(UINT8* pAFrame, UINT32 FrameSize, int PayLoadType, bool bMark); private: bool ExitFlag; UINT8* RecvBuffer; UINT8 *m_pTcpRecvBufTmp; UINT8 *m_pTcpRecvPacketBuf; int m_sizeOfTcpRecvBufTmp; int m_sizeOfTcpRecvPacketBuf; UINT8 *m_pHeadTmpBuff; int m_HeadTmplen; UINT32 m_tcprecvssrc; std::list m_listTcpStreamPacket; //Èç¹û½ÓÊÕ¶ËΪ tcpserverʱ£¬ÐèÒªaccept tcpclient£» int m_TcpClientFd; int m_TcpServerFd; StreamTransType_E m_eStreamTransType; //ÂëÁ÷´«ÊäÀàÐÍ char m_StreamSendIp[IPSTR_MAX_LEN+1]; int m_StreamSendPort; char m_StreamRecvIp[IPSTR_MAX_LEN+1]; int m_StreamRecvPort; long UserData; //Óû§Êý¾Ý£¬¿ÉÒÔÊǾä±ú»òÕ߯äËüÓ¦ÓÃÖ¸ÕëµØÖ· PlayCallBack2 MediaCBFunc; //ýÌåÁ÷»Øµ÷º¯ÊýÖ¸Õë long m_StreamParseHandle1; long m_StreamParseHandle2; long m_StreamParseHandle3; int m_RecvStreamType; VideoStreamType_E m_eVideoStreamType; }; #endif