blob: 067b4b0db2ef4589a6f4be9da7a85d9a29b8badd [file] [log] [blame]
Guido van Rossumba066151992-09-22 17:23:17 +00001#!/ufs/guido/bin/sgi/python-405
2
3# Send live video UDP packets.
Guido van Rossum7b47c791992-09-24 15:01:37 +00004# Usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-w width]
5# [host] ..
Guido van Rossumba066151992-09-22 17:23:17 +00006
7import sys
8import time
9import struct
Guido van Rossum7b47c791992-09-24 15:01:37 +000010import string
Guido van Rossumba066151992-09-22 17:23:17 +000011from socket import *
Guido van Rossum67b48951992-09-24 12:54:35 +000012from SOCKET import *
Guido van Rossumba066151992-09-22 17:23:17 +000013import gl, GL, DEVICE
14sys.path.append('/ufs/guido/src/video')
15import LiveVideoIn
16import LiveVideoOut
Guido van Rossum67b48951992-09-24 12:54:35 +000017import SV
Guido van Rossum7b47c791992-09-24 15:01:37 +000018import getopt
19from IN import *
Guido van Rossumba066151992-09-22 17:23:17 +000020
Guido van Rossum7b47c791992-09-24 15:01:37 +000021from senddefs import *
22
23def usage(msg):
24 print msg
Jack Jansen3b253711992-12-14 12:25:21 +000025 print 'usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-c type] [-m]',
Guido van Rossum7b47c791992-09-24 15:01:37 +000026 print '[-w width] [host] ...'
27 print '-b : broadcast on local net'
28 print '-h height : window height (default ' + `DEFHEIGHT` + ')'
29 print '-p port : port to use (default ' + `DEFPORT` + ')'
30 print '-t ttl : time-to-live (multicast only; default 1)'
31 print '-s size : max packet size (default ' + `DEFPKTMAX` + ')'
32 print '-w width : window width (default ' + `DEFWIDTH` + ')'
Jack Jansen3b253711992-12-14 12:25:21 +000033 print '-c type : Type: rgb8, mono or grey (default rgb8)'
Guido van Rossum7b47c791992-09-24 15:01:37 +000034 print '[host] ...: host(s) to send to (default multicast to ' + \
35 DEFMCAST + ')'
36 sys.exit(2)
37
Guido van Rossumba066151992-09-22 17:23:17 +000038
39def main():
Guido van Rossum7b47c791992-09-24 15:01:37 +000040 sys.stdout = sys.stderr
41
42 hosts = []
43 port = DEFPORT
44 ttl = -1
45 pktmax = DEFPKTMAX
46 width = DEFWIDTH
47 height = DEFHEIGHT
Jack Jansen3b253711992-12-14 12:25:21 +000048 vtype = 'rgb8'
Guido van Rossum7b47c791992-09-24 15:01:37 +000049
50 try:
Jack Jansen3b253711992-12-14 12:25:21 +000051 opts, args = getopt.getopt(sys.argv[1:], 'bh:p:s:t:w:c:')
Guido van Rossum7b47c791992-09-24 15:01:37 +000052 except getopt.error, msg:
53 usage(msg)
54
55 try:
56 for opt, optarg in opts:
57 if opt == '-p':
58 port = string.atoi(optarg)
59 if opt == '-b':
60 host = '<broadcast>'
61 if opt == '-t':
62 ttl = string.atoi(optarg)
63 if opt == '-s':
64 pktmax = string.atoi(optarg)
65 if opt == '-w':
66 width = string.atoi(optarg)
67 if opt == '-h':
68 height = string.atoi(optarg)
Jack Jansen3b253711992-12-14 12:25:21 +000069 if opt == '-c':
70 vtype = optarg
Guido van Rossum7b47c791992-09-24 15:01:37 +000071 except string.atoi_error, msg:
72 usage('bad integer: ' + msg)
73
74 for host in args:
75 hosts.append(gethostbyname(host))
76
77 if not hosts:
78 hosts.append(gethostbyname(DEFMCAST))
79
Guido van Rossumba066151992-09-22 17:23:17 +000080 if not LiveVideoIn.have_video:
Guido van Rossumff3da051992-12-09 22:16:35 +000081 print 'Sorry, no video available (use python-405)'
Guido van Rossumba066151992-09-22 17:23:17 +000082 sys.exit(1)
83
Guido van Rossumba066151992-09-22 17:23:17 +000084 gl.foreground()
Guido van Rossum7b47c791992-09-24 15:01:37 +000085 gl.prefsize(width, height)
86 gl.stepunit(8, 6)
Guido van Rossumba066151992-09-22 17:23:17 +000087 wid = gl.winopen('Vsend')
Guido van Rossum7b47c791992-09-24 15:01:37 +000088 gl.keepaspect(width, height)
Guido van Rossumba066151992-09-22 17:23:17 +000089 gl.stepunit(8, 6)
Guido van Rossum67b48951992-09-24 12:54:35 +000090 gl.maxsize(SV.PAL_XMAX, SV.PAL_YMAX)
Guido van Rossumba066151992-09-22 17:23:17 +000091 gl.winconstraints()
92 gl.qdevice(DEVICE.ESCKEY)
93 gl.qdevice(DEVICE.WINSHUT)
94 gl.qdevice(DEVICE.WINQUIT)
Guido van Rossum67b48951992-09-24 12:54:35 +000095 gl.qdevice(DEVICE.WINFREEZE)
96 gl.qdevice(DEVICE.WINTHAW)
Guido van Rossumba066151992-09-22 17:23:17 +000097 width, height = gl.getsize()
98
Jack Jansen3b253711992-12-14 12:25:21 +000099 lvo = LiveVideoOut.LiveVideoOut().init(wid, width, height, vtype)
Guido van Rossumba066151992-09-22 17:23:17 +0000100
Jack Jansen3b253711992-12-14 12:25:21 +0000101 lvi = LiveVideoIn.LiveVideoIn().init(pktmax, width, height, vtype)
Guido van Rossumba066151992-09-22 17:23:17 +0000102
103 s = socket(AF_INET, SOCK_DGRAM)
Guido van Rossum67b48951992-09-24 12:54:35 +0000104 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
Guido van Rossum7b47c791992-09-24 15:01:37 +0000105 if ttl >= 0:
106 s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, chr(ttl))
Guido van Rossum67b48951992-09-24 12:54:35 +0000107
108 frozen = 0
Guido van Rossumba066151992-09-22 17:23:17 +0000109
110 while 1:
111
112 if gl.qtest():
113 dev, val = gl.qread()
114 if dev in (DEVICE.ESCKEY, \
115 DEVICE.WINSHUT, DEVICE.WINQUIT):
116 break
Guido van Rossum67b48951992-09-24 12:54:35 +0000117 if dev == DEVICE.WINFREEZE:
118 frozen = 1
119 if dev == DEVICE.WINTHAW:
120 frozen = 0
Guido van Rossumba066151992-09-22 17:23:17 +0000121 if dev == DEVICE.REDRAW:
122 w, h = gl.getsize()
123 x, y = gl.getorigin()
124 if (w, h) <> (width, height):
Guido van Rossumba066151992-09-22 17:23:17 +0000125 width, height = w, h
Guido van Rossumd65f45d1992-09-24 16:53:51 +0000126 lvi.resizevideo(width, height)
Guido van Rossumcfb6bb21992-09-24 16:03:56 +0000127 lvo.resizevideo(width, height)
Guido van Rossumba066151992-09-22 17:23:17 +0000128
129 rv = lvi.getnextpacket()
130 if not rv:
131 time.millisleep(10)
132 continue
133
134 pos, data = rv
Guido van Rossum67b48951992-09-24 12:54:35 +0000135
136 if not frozen:
137 lvo.putnextpacket(pos, data)
Guido van Rossumba066151992-09-22 17:23:17 +0000138
139 hdr = struct.pack('hhh', pos, width, height)
Guido van Rossum7b47c791992-09-24 15:01:37 +0000140 for host in hosts:
141 try:
142 s.sendto(hdr + data, (host, port))
143 except error, msg: # really socket.error
144 if msg[0] <> 121: # no buffer space available
145 raise error, msg # re-raise it
146 print 'Warning:', msg[1]
Guido van Rossumba066151992-09-22 17:23:17 +0000147
148 lvi.close()
149 lvo.close()
150
Guido van Rossum7b47c791992-09-24 15:01:37 +0000151
Guido van Rossumba066151992-09-22 17:23:17 +0000152main()