blob: 334fe666fb7a6a4ea9a39d18c716ff7ec4bba97a [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
22def usage(msg):
23 print msg
24 print 'usage: Vreceive [-m mcastgrp] [-p port]'
25 print '-m mcastgrp: multicast group (default ' + `DEFMCAST` + ')'
26 print '-p port : port (default ' + `DEFPORT` + ')'
27 sys.exit(2)
28
Guido van Rossumba066151992-09-22 17:23:17 +000029
30def main():
31
Guido van Rossum7b47c791992-09-24 15:01:37 +000032 sys.stdout = sys.stderr
Guido van Rossumba066151992-09-22 17:23:17 +000033
Guido van Rossum7b47c791992-09-24 15:01:37 +000034 group = DEFMCAST
35 port = DEFPORT
36 width = DEFWIDTH
37 height = DEFHEIGHT
Guido van Rossum67b48951992-09-24 12:54:35 +000038
Guido van Rossum7b47c791992-09-24 15:01:37 +000039 try:
40 opts, args = getopt.getopt(sys.argv[1:], 'm:p:')
41 except getopt.error, msg:
42 usage(msg)
43
44 try:
45 for opt, optarg in opts:
46 if opt == '-p':
47 port = string.atoi(optarg)
48 if opt == '-m':
49 group = gethostbyname(optarg)
50 except string.atoi_error, msg:
51 usage('bad integer: ' + msg)
52
53 s = opensocket(group, port)
Guido van Rossumba066151992-09-22 17:23:17 +000054
55 gl.foreground()
56 gl.prefsize(width, height)
57 wid = gl.winopen('Vreceive')
58 gl.qdevice(DEVICE.ESCKEY)
59 gl.qdevice(DEVICE.WINSHUT)
60 gl.qdevice(DEVICE.WINQUIT)
61
62 x, y = gl.getorigin()
63 lvo = LiveVideoOut.LiveVideoOut().init(wid, (x, y, width, height), \
64 width, height)
65
Guido van Rossumba066151992-09-22 17:23:17 +000066 ifdlist = [gl.qgetfd(), s.fileno()]
67 ofdlist = []
68 xfdlist = []
69 timeout = 1.0
70 selectargs = (ifdlist, ofdlist, xfdlist, timeout)
71
72 while 1:
73
74 if gl.qtest():
75 dev, val = gl.qread()
76 if dev in (DEVICE.ESCKEY, \
77 DEVICE.WINSHUT, DEVICE.WINQUIT):
78 break
79 if dev == DEVICE.REDRAW:
80 gl.clear()
81 elif s.avail():
82 data = s.recv(16*1024)
83 pos, w, h = struct.unpack('hhh', data[:6])
84 if (w, h) <> (width, height):
85 x, y = gl.getorigin()
86 y = y + height - h
87 width, height = w, h
88 lvo.close()
89 lvo = LiveVideoOut.LiveVideoOut() \
90 .init(wid, (x, y, width, height), \
91 width, height)
92 lvo.putnextpacket(pos, data[6:])
93 else:
94 x = select.select(selectargs)
95
96 lvo.close()
97
Guido van Rossum67b48951992-09-24 12:54:35 +000098
99# Subroutine to create and properly initialize the receiving socket
100
101def opensocket(group, port):
102
103 # Create the socket
104 s = socket(AF_INET, SOCK_DGRAM)
105
106 # Bind the port to it
107 s.bind('', port)
108
109 # Allow multiple copies of this program on one machine
110 s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
111
112 # Look up the group once
113 group = gethostbyname(group)
114
115 # Ugly: construct binary group address
116 group_bytes = eval(regsub.gsub('\.', ',', group))
117 grpaddr = 0
118 for byte in group_bytes: grpaddr = (grpaddr << 8) | byte
119
120 # Construct struct mreq from grpaddr and ifaddr
121 ifaddr = INADDR_ANY
122 mreq = struct.pack('ll', grpaddr, ifaddr)
123
124 # Add group membership
125 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
126
127 return s
128
Guido van Rossumba066151992-09-22 17:23:17 +0000129main()