/******************************************************************************
|
* 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 <stdio.h>
|
#include <sys/types.h>
|
#include <sys/socket.h>
|
#include <string.h>
|
#include <netinet/in.h>
|
#include <arpa/inet.h>
|
#include <unistd.h>
|
#include <fcntl.h>
|
#include <errno.h>
|
#include <poll.h>
|
#include <netinet/tcp.h>
|
#include <vector>
|
#include <list>
|
#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<TcpStreamPacket>::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<TcpStreamPacket> 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
|