-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRtpPacket.py
83 lines (65 loc) · 2.59 KB
/
RtpPacket.py
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
import sys
from time import time
HEADER_SIZE = 12
class RtpPacket:
header = bytearray(HEADER_SIZE)
def __init__(self):
pass
def encode(self, version, padding, extension, cc, seqnum, marker, pt, ssrc, payload):
"""Encode the RTP packet with header fields and payload."""
timestamp = int(time())
header = bytearray(HEADER_SIZE)
# --------------
# TO COMPLETE
# --------------
# Fill the header bytearray with RTP header fields
#***********************************************
currFree = 7
header[0] = header[0] | version << (currFree - 2); currFree -= 2
header[0] = header[0] | padding << (currFree - 1); currFree -= 1
header[0] = header[0] | extension << (currFree - 1); currFree -= 1
header[0] = header[0] | cc; currFree = 7
#***********************************************
header[1] = header[1] | marker << (currFree - 1); currFree -= 1
header[1] = header[1] | pt; currFree = 7
#***********************************************
header[2] = seqnum >> 8 & 0xFF
header[3] = seqnum & 0xFF
#***********************************************
header[4] = timestamp >> (8 * 3) & 0xFF
header[5] = timestamp >> (8 * 2) & 0xFF
header[6] = timestamp >> (8 * 1) & 0xFF
header[7] = timestamp & 0xFF
#***********************************************
header[8] = ssrc >> (8 * 3) & 0xFF
header[9] = ssrc >> (8 * 2) & 0xFF
header[10] = ssrc >> (8 * 1) & 0xFF
header[11] = ssrc & 0xFF
self.header = header
# Get the payload from the argument
self.payload = payload
def decode(self, byteStream):
"""Decode the RTP packet."""
self.header = bytearray(byteStream[:HEADER_SIZE])
self.payload = byteStream[HEADER_SIZE:]
def version(self):
"""Return RTP version."""
return int(self.header[0] >> 6)
def seqNum(self):
"""Return sequence (frame) number."""
seqNum = self.header[2] << 8 | self.header[3]
return int(seqNum)
def timestamp(self):
"""Return timestamp."""
timestamp = self.header[4] << 24 | self.header[5] << 16 | self.header[6] << 8 | self.header[7]
return int(timestamp)
def payloadType(self):
"""Return payload type."""
pt = self.header[1] & 127
return int(pt)
def getPayload(self):
"""Return payload."""
return self.payload
def getPacket(self):
"""Return RTP packet."""
return self.header + self.payload