blob: 1c5273c376b1c438f54d3f45bd9490cd83af0fa1 [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
Jack Jansen3b253711992-12-14 12:25:21 +000026 print 'usage: Vreceive [-m mcastgrp] [-p port] [-c type]'
Guido van Rossum7b47c791992-09-24 15:01:37 +000027 print '-m mcastgrp: multicast group (default ' + `DEFMCAST` + ')'
28 print '-p port : port (default ' + `DEFPORT` + ')'
Jack Jansen3b253711992-12-14 12:25:21 +000029 print '-c type : signal type: rgb8, grey or mono (default rgb8)'
Guido van Rossum7b47c791992-09-24 15:01:37 +000030 sys.exit(2)
31
Guido van Rossumba066151992-09-22 17:23:17 +000032
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000033# Main program: parse options and main loop.
34
Guido van Rossumba066151992-09-22 17:23:17 +000035def main():
36
Guido van Rossum7b47c791992-09-24 15:01:37 +000037 sys.stdout = sys.stderr
Guido van Rossumba066151992-09-22 17:23:17 +000038
Guido van Rossum7b47c791992-09-24 15:01:37 +000039 group = DEFMCAST
40 port = DEFPORT
41 width = DEFWIDTH
42 height = DEFHEIGHT
Jack Jansen3b253711992-12-14 12:25:21 +000043 vtype = 'rgb8'
Guido van Rossum67b48951992-09-24 12:54:35 +000044
Guido van Rossum7b47c791992-09-24 15:01:37 +000045 try:
Jack Jansen3b253711992-12-14 12:25:21 +000046 opts, args = getopt.getopt(sys.argv[1:], 'm:p:c:')
Guido van Rossum7b47c791992-09-24 15:01:37 +000047 except getopt.error, msg:
48 usage(msg)
49
50 try:
51 for opt, optarg in opts:
52 if opt == '-p':
53 port = string.atoi(optarg)
54 if opt == '-m':
55 group = gethostbyname(optarg)
Jack Jansen3b253711992-12-14 12:25:21 +000056 if opt == '-c':
57 vtype = optarg
Guido van Rossum7b47c791992-09-24 15:01:37 +000058 except string.atoi_error, msg:
59 usage('bad integer: ' + msg)
60
61 s = opensocket(group, port)
Guido van Rossumba066151992-09-22 17:23:17 +000062
63 gl.foreground()
64 gl.prefsize(width, height)
65 wid = gl.winopen('Vreceive')
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000066 gl.winconstraints()
Guido van Rossumba066151992-09-22 17:23:17 +000067 gl.qdevice(DEVICE.ESCKEY)
68 gl.qdevice(DEVICE.WINSHUT)
69 gl.qdevice(DEVICE.WINQUIT)
70
Jack Jansen3b253711992-12-14 12:25:21 +000071 lvo = LiveVideoOut.LiveVideoOut().init(wid, width, height, vtype)
Guido van Rossumba066151992-09-22 17:23:17 +000072
Guido van Rossumba066151992-09-22 17:23:17 +000073 ifdlist = [gl.qgetfd(), s.fileno()]
74 ofdlist = []
75 xfdlist = []
76 timeout = 1.0
77 selectargs = (ifdlist, ofdlist, xfdlist, timeout)
78
79 while 1:
80
81 if gl.qtest():
82 dev, val = gl.qread()
83 if dev in (DEVICE.ESCKEY, \
84 DEVICE.WINSHUT, DEVICE.WINQUIT):
85 break
86 if dev == DEVICE.REDRAW:
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000087 lvo.reshapewindow()
Guido van Rossumba066151992-09-22 17:23:17 +000088 elif s.avail():
89 data = s.recv(16*1024)
90 pos, w, h = struct.unpack('hhh', data[:6])
91 if (w, h) <> (width, height):
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000092 x, y = gl.getorigin()
Guido van Rossumba066151992-09-22 17:23:17 +000093 y = y + height - h
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000094 gl.winposition(x, x+w-1, y, y+h-1)
Guido van Rossumba066151992-09-22 17:23:17 +000095 width, height = w, h
Guido van Rossumcfb6bb21992-09-24 16:03:56 +000096 lvo.resizevideo(width, height)
Guido van Rossumba066151992-09-22 17:23:17 +000097 lvo.putnextpacket(pos, data[6:])
98 else:
99 x = select.select(selectargs)
100
101 lvo.close()
102
Guido van Rossum67b48951992-09-24 12:54:35 +0000103
104# Subroutine to create and properly initialize the receiving socket
105
106def opensocket(group, port):
107
108 # Create the socket
109 s = socket(AF_INET, SOCK_DGRAM)
110
Guido van Rossum67b48951992-09-24 12:54:35 +0000111 # Allow multiple copies of this program on one machine
112 s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
113
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000114 # Bind the port to it
115 s.bind('', port)
116
Guido van Rossum67b48951992-09-24 12:54:35 +0000117 # Look up the group once
118 group = gethostbyname(group)
119
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000120 # Construct binary group address
Guido van Rossum67b48951992-09-24 12:54:35 +0000121 group_bytes = eval(regsub.gsub('\.', ',', group))
122 grpaddr = 0
123 for byte in group_bytes: grpaddr = (grpaddr << 8) | byte
124
125 # Construct struct mreq from grpaddr and ifaddr
126 ifaddr = INADDR_ANY
127 mreq = struct.pack('ll', grpaddr, ifaddr)
128
129 # Add group membership
130 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
131
132 return s
133
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000134
Guido van Rossumba066151992-09-22 17:23:17 +0000135main()