-
Notifications
You must be signed in to change notification settings - Fork 0
/
RtpPacket.py
75 lines (65 loc) · 2.24 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
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
# Header at index 0: Set the RTP-version field (V), padding (P), extension (X), contributing sources (CC)
header[0] = 0x00
header[0] = header[0] | (version << 6) | (padding << 5) | (extension << 4) | cc
# V: 2 bits P: 1 bit X: 1 bit CC: 4 bits
# Header at index 1: Set the marker (M) and payload (PT)
header[1] = 0x00
header[1] = header[1] | (marker << 7) | pt
# M: 1 bit PT: 7 bits
# Header at index 2 and 3: Set the sequence number
header[2] = (seqnum >> 8) & 0xFF
header[3] = seqnum & 0xFF
# Header at index 4, 5, 6, 7: Set the timestamp
header[4] = (timestamp >> 24) & 0xFF
header[5] = (timestamp >> 16) & 0xFF
header[6] = (timestamp >> 8) & 0xFF
header[7] = timestamp & 0xFF
# Header at index 8, 9 , 10, 11
header[8] = (ssrc >> 24) & 0xFF
header[9] = (ssrc >> 16) & 0xFF
header[10] = (ssrc >> 8) & 0xFF
header[11] = ssrc & 0xFF
# Set the header of the RTP packet
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