Alejandro Acuña
2024-08-12 1876e65234c20209001178705cfa50d8f9ded67a
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
// RTPPacket.h: interface for the RTPPacket class.
//
//////////////////////////////////////////////////////////////////////
 
#ifndef AFX_RTPPACKET_H__ABF83EA9_2656_47A8_B910_7F3D8DEF05F3__INCLUDED_
#define AFX_RTPPACKET_H__ABF83EA9_2656_47A8_B910_7F3D8DEF05F3__INCLUDED_
 
#include <winsock.h>
 
// Winsock2 does not define IP_TOS, so define it
// #define IP_TOS 8
 
#define RTP_PAYLOADTYPE_G711_ULAW       0x00
#define RTP_PAYLOADTYPE_G711_ALAW       0x08
#define RTP_PAYLOADTYPE_G729            0x12
#define RTP_PAYLOADTYPE_G723            0x04
#define RTP_PAYLOADTYPE_SID             13  // it is NOT 0x13 as per Duanpei Wu
 
class Tracer;
 
class RTPPacket
{
public:
    RTPPacket(char *buffer, int len) 
    {
        packetPtr           = buffer;
        totalLength         = len;
        numPadding          = packetPtr[0] & 0x20 ? packetPtr[totalLength - 1] : 0;
 
        headerExtension     = (packetPtr[0] & 0x10) != 0;
        contributorCount    = packetPtr[0] & 0x0f;
        marker              = (packetPtr[1] & 0x80) != 0;
        payloadType         = packetPtr[1] & 0x7f;
        seqNo               = ntohs(*((short *)(packetPtr + 2)));
        timestamp           = ntohl(*((unsigned long *)(packetPtr + 4)));
        ssrc                = ntohl(*((unsigned long *)(packetPtr + 8)));
        version             = (packetPtr[0] & 0xc0) >> 6;
 
        headerLength        = 12 + 4 * contributorCount;
        dataLen             = totalLength - headerLength - numPadding;
        rtpData             = packetPtr + headerLength;
    }
    virtual         ~RTPPacket() {}
    static RTPPacket* CreateRTPPacket(char *buffer, int bufferLen, Tracer *tracer);
    bool            HeaderExtension() { return headerExtension; }
    unsigned char   ContributorCount() { return contributorCount; }
    bool            Marker()  { return marker; }
    unsigned char   PayloadType() { return payloadType; }
    unsigned short  SeqNo() { return seqNo; }
    unsigned long   Timestamp() { return timestamp; }
    unsigned long   Ssrc() { return ssrc; }
    unsigned long   DataLen() { return dataLen; }
    char            *RtpData() { return rtpData; }
    char            *RtpHeader() { return packetPtr; }
    unsigned char   Version() { return version; }
    unsigned long   HeaderLength() { return headerLength; }
    RTPPacket       *CloneHeader();
private:
    bool            headerExtension;
    unsigned char   contributorCount;
    bool            marker;
    unsigned char   payloadType;
    unsigned short  seqNo;
    unsigned long   timestamp;
    unsigned long   ssrc;
    unsigned long   dataLen;
    char            *rtpData;
    unsigned char   version;
    unsigned long   headerLength;
 
    char            *packetPtr;
    unsigned long   totalLength;
    unsigned long   numPadding;
};
 
#endif // !defined(AFX_RTPPACKET_H__ABF83EA9_2656_47A8_B910_7F3D8DEF05F3__INCLUDED_)