-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRtpPacket.py
66 lines (54 loc) · 2.02 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
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)
# Fill the header bytearray with RTP header fields
#Shift bits in arguments to desired position, then use bitmaks to isolate only those bits
#Then use bitwise or operator (|) to concatenate all of the pieces together and assign to the byte array
header[0] = ((version << 6) & 192) | ((padding << 5) & 32) | ((extension << 4) & 16) | ((cc << 1) & 15)
header[1] = ((marker << 7) & 128) | (pt & 127)
header[2] = (seqnum & 255)
header[3] = ((seqnum >> 8) & 255)
header[4] = (timestamp & 255)
header[5] = ((timestamp >> 8) & 255)
header[6] = ((timestamp >> 16) & 255)
header[7] = ((timestamp >> 24) & 255)
header[8] = (ssrc & 255)
header[9] = ((ssrc >> 8) & 255)
header[10] = ((ssrc >> 16) & 255)
header[11] = ((ssrc >> 24) & 255)
# Get the payload from the argument
self.header = header
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