You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.9 KiB
71 lines
1.9 KiB
#!/usr/bin/python -O
|
|
#
|
|
# VideoLAN RTSP Server
|
|
#
|
|
# Author: Cyril Deguet <asmax@via.ecp.fr>
|
|
|
|
|
|
import cfg,socket,struct,time,threading
|
|
|
|
|
|
def ntpTime():
|
|
"Return the current time in NTP decimal format"
|
|
return "%d" % (int(time.time()) + 2208988800L)
|
|
|
|
|
|
|
|
class SdpMessage:
|
|
"Build a SDP message"
|
|
|
|
uri = "http://www.videolan.org/"
|
|
|
|
def __init__(self, sessionName, address, uri):
|
|
"Build the message"
|
|
self.sessionName = sessionName
|
|
self.address = address
|
|
self.uri = uri
|
|
|
|
def getMessage(self):
|
|
"Return the SDP message"
|
|
msg = "v=0\r\n" + \
|
|
"o=asmax " + ntpTime() + " " + ntpTime() + \
|
|
" IN IP4 sphinx.via.ecp.fr\r\n" + \
|
|
"s=" + self.sessionName + "\r\n" + \
|
|
"u=" + self.uri + "\r\n" + \
|
|
"t=0 0\r\n" + \
|
|
"c=IN IP4 " + self.address + "/1\r\n" + \
|
|
"m=video 1234 RTP/MP2T 33\r\n" + \
|
|
"a=control:" + self.uri + "\r\n"
|
|
return msg
|
|
|
|
|
|
|
|
class SapServer(threading.Thread):
|
|
"SAP server class"
|
|
|
|
PORT = 9875
|
|
GROUP = "224.2.127.254"
|
|
TTL = 1
|
|
|
|
def __init__(self):
|
|
# Open the socket
|
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, self.TTL)
|
|
self.sock.connect((self.GROUP, self.PORT))
|
|
|
|
def sendMessage(self, message):
|
|
"Message must be a SdpMessage"
|
|
# FIXME
|
|
header = " " + struct.pack("!BH", 12, 4212) + socket.inet_aton('138.195.156.214')
|
|
data = header + message.getMessage()
|
|
self.sock.send(data)
|
|
|
|
def announce(self):
|
|
for id, session in cfg.announceList.multicastList.items():
|
|
message = SdpMessage(session.name, session.dest, session.uri)
|
|
self.sendMessage(message)
|
|
|
|
def run(self):
|
|
while 1:
|
|
self.announce()
|
|
time.sleep(1)
|
|
|