blob: 17a803f7d42800876bd9e4753f1c2bba729ba180 [file] [log] [blame]
Guido van Rossumba066151992-09-22 17:23:17 +00001#!/ufs/guido/bin/sgi/python-405
2
3# Receive live video UDP packets.
4# Usage: Vreceive [port]
5
6import sys
7import struct
Guido van Rossum67b48951992-09-24 12:54:35 +00008from socket import * # syscalls and support functions
9from SOCKET import * # <sys/socket.h>
10from IN import * # <netinet/in.h>
Guido van Rossumba066151992-09-22 17:23:17 +000011import select
Guido van Rossum67b48951992-09-24 12:54:35 +000012import struct
Guido van Rossumba066151992-09-22 17:23:17 +000013import gl, GL, DEVICE
14sys.path.append('/ufs/guido/src/video')
15import LiveVideoOut
Guido van Rossum67b48951992-09-24 12:54:35 +000016import regsub
Guido van Rossum7b47c791992-09-24 15:01:37 +000017import getopt
Guido van Rossum67b48951992-09-24 12:54:35 +000018
Guido van Rossum7b47c791992-09-24 15:01:37 +000019from senddefs import *
Guido van Rossumba066151992-09-22 17:23:17 +000020
Guido van Rossum7b47c791992-09-24 15:01:37 +000021
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000022# Print usage message and exit(2).
23
Guido van Rossum7b47c791992-09-24 15:01:37 +000024def usage(msg):
25 print msg
26 print 'usage: Vreceive [-m mcastgrp] [-p port]'
27 print '-m mcastgrp: multicast group (default ' + `DEFMCAST` + ')'
28 print '-p port : port (default ' + `DEFPORT` + ')'
29 sys.exit(2)
30
Guido van Rossumba066151992-09-22 17:23:17 +000031
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000032# Main program: parse options and main loop.
33
Guido van Rossumba066151992-09-22 17:23:17 +000034def main():
35
Guido van Rossum7b47c791992-09-24 15:01:37 +000036 sys.stdout = sys.stderr
Guido van Rossumba066151992-09-22 17:23:17 +000037
Guido van Rossum7b47c791992-09-24 15:01:37 +000038 group = DEFMCAST
39 port = DEFPORT
40 width = DEFWIDTH
41 height = DEFHEIGHT
Guido van Rossum67b48951992-09-24 12:54:35 +000042
Guido van Rossum7b47c791992-09-24 15:01:37 +000043 try:
44 opts, args = getopt.getopt(sys.argv[1:], 'm:p:')
45 except getopt.error, msg:
46 usage(msg)
47
48 try:
49 for opt, optarg in opts:
50 if opt == '-p':
51 port = string.atoi(optarg)
52 if opt == '-m':
53 group = gethostbyname(optarg)
54 except string.atoi_error, msg:
55 usage('bad integer: ' + msg)
56
57 s = opensocket(group, port)
Guido van Rossumba066151992-09-22 17:23:17 +000058
59 gl.foreground()
60 gl.prefsize(width, height)
61 wid = gl.winopen('Vreceive')
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000062 gl.winconstraints()
Guido van Rossumba066151992-09-22 17:23:17 +000063 gl.qdevice(DEVICE.ESCKEY)
64 gl.qdevice(DEVICE.WINSHUT)
65 gl.qdevice(DEVICE.WINQUIT)
66
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000067 lvo = LiveVideoOut.LiveVideoOut().init(wid, width, height)
Guido van Rossumba066151992-09-22 17:23:17 +000068
Guido van Rossumba066151992-09-22 17:23:17 +000069 ifdlist = [gl.qgetfd(), s.fileno()]
70 ofdlist = []
71 xfdlist = []
72 timeout = 1.0
73 selectargs = (ifdlist, ofdlist, xfdlist, timeout)
74
75 while 1:
76
77 if gl.qtest():
78 dev, val = gl.qread()
79 if dev in (DEVICE.ESCKEY, \
80 DEVICE.WINSHUT, DEVICE.WINQUIT):
81 break
82 if dev == DEVICE.REDRAW:
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000083 lvo.reshapewindow()
Guido van Rossumba066151992-09-22 17:23:17 +000084 elif s.avail():
85 data = s.recv(16*1024)
86 pos, w, h = struct.unpack('hhh', data[:6])
87 if (w, h) <> (width, height):
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000088 x, y = gl.getorigin()
Guido van Rossumba066151992-09-22 17:23:17 +000089 y = y + height - h
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000090 gl.winposition(x, x+w-1, y, y+h-1)
Guido van Rossumba066151992-09-22 17:23:17 +000091 width, height = w, h
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000092 lvo.resizevideo(width, height)
Guido van Rossumba066151992-09-22 17:23:17 +000093 lvo.putnextpacket(pos, data[6:])
94 else:
95 x = select.select(selectargs)
96
97 lvo.close()
98
Guido van Rossum67b48951992-09-24 12:54:35 +000099
100# Subroutine to create and properly initialize the receiving socket
101
102def opensocket(group, port):
103
104 # Create the socket
105 s = socket(AF_INET, SOCK_DGRAM)
106
Guido van Rossum67b48951992-09-24 12:54:35 +0000107 # Allow multiple copies of this program on one machine
108 s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
109
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000110 # Bind the port to it
111 s.bind('', port)
112
Guido van Rossum67b48951992-09-24 12:54:35 +0000113 # Look up the group once
114 group = gethostbyname(group)
115
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000116 # Construct binary group address
Guido van Rossum67b48951992-09-24 12:54:35 +0000117 group_bytes = eval(regsub.gsub('\.', ',', group))
118 grpaddr = 0
119 for byte in group_bytes: grpaddr = (grpaddr << 8) | byte
120
121 # Construct struct mreq from grpaddr and ifaddr
122 ifaddr = INADDR_ANY
123 mreq = struct.pack('ll', grpaddr, ifaddr)
124
125 # Add group membership
126 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
127
128 return s
129
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000130
Guido van Rossumba066151992-09-22 17:23:17 +0000131main()