zhangzengfei
2022-07-20 c90c3e794bdd95127d0c34ff1d9e8759d18a0445
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/******************************************************************************
* 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