Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 1 | #!/ufs/guido/bin/sgi/python-405 |
| 2 | |
| 3 | # Send live video UDP packets. |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 4 | # Usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-w width] |
| 5 | # [host] .. |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 6 | |
| 7 | import sys |
| 8 | import time |
| 9 | import struct |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 10 | import string |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 11 | from socket import * |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 12 | from SOCKET import * |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 13 | import gl, GL, DEVICE |
| 14 | sys.path.append('/ufs/guido/src/video') |
| 15 | import LiveVideoIn |
| 16 | import LiveVideoOut |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 17 | import SV |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 18 | import getopt |
| 19 | from IN import * |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 20 | |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 21 | from senddefs import * |
| 22 | |
| 23 | def usage(msg): |
| 24 | print msg |
| 25 | print 'usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl]', |
| 26 | 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` + ')' |
| 33 | print '[host] ...: host(s) to send to (default multicast to ' + \ |
| 34 | DEFMCAST + ')' |
| 35 | sys.exit(2) |
| 36 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 37 | |
| 38 | def main(): |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 39 | sys.stdout = sys.stderr |
| 40 | |
| 41 | hosts = [] |
| 42 | port = DEFPORT |
| 43 | ttl = -1 |
| 44 | pktmax = DEFPKTMAX |
| 45 | width = DEFWIDTH |
| 46 | height = DEFHEIGHT |
| 47 | |
| 48 | try: |
| 49 | opts, args = getopt.getopt(sys.argv[1:], 'bh:p:s:t:w:') |
| 50 | except getopt.error, msg: |
| 51 | usage(msg) |
| 52 | |
| 53 | try: |
| 54 | for opt, optarg in opts: |
| 55 | if opt == '-p': |
| 56 | port = string.atoi(optarg) |
| 57 | if opt == '-b': |
| 58 | host = '<broadcast>' |
| 59 | if opt == '-t': |
| 60 | ttl = string.atoi(optarg) |
| 61 | if opt == '-s': |
| 62 | pktmax = string.atoi(optarg) |
| 63 | if opt == '-w': |
| 64 | width = string.atoi(optarg) |
| 65 | if opt == '-h': |
| 66 | height = string.atoi(optarg) |
| 67 | except string.atoi_error, msg: |
| 68 | usage('bad integer: ' + msg) |
| 69 | |
| 70 | for host in args: |
| 71 | hosts.append(gethostbyname(host)) |
| 72 | |
| 73 | if not hosts: |
| 74 | hosts.append(gethostbyname(DEFMCAST)) |
| 75 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 76 | if not LiveVideoIn.have_video: |
Guido van Rossum | ff3da05 | 1992-12-09 22:16:35 +0000 | [diff] [blame] | 77 | print 'Sorry, no video available (use python-405)' |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 78 | sys.exit(1) |
| 79 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 80 | gl.foreground() |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 81 | gl.prefsize(width, height) |
| 82 | gl.stepunit(8, 6) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 83 | wid = gl.winopen('Vsend') |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 84 | gl.keepaspect(width, height) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 85 | gl.stepunit(8, 6) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 86 | gl.maxsize(SV.PAL_XMAX, SV.PAL_YMAX) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 87 | gl.winconstraints() |
| 88 | gl.qdevice(DEVICE.ESCKEY) |
| 89 | gl.qdevice(DEVICE.WINSHUT) |
| 90 | gl.qdevice(DEVICE.WINQUIT) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 91 | gl.qdevice(DEVICE.WINFREEZE) |
| 92 | gl.qdevice(DEVICE.WINTHAW) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 93 | width, height = gl.getsize() |
| 94 | |
Guido van Rossum | cfb6bb2 | 1992-09-24 16:03:56 +0000 | [diff] [blame] | 95 | lvo = LiveVideoOut.LiveVideoOut().init(wid, width, height) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 96 | |
| 97 | lvi = LiveVideoIn.LiveVideoIn().init(pktmax, width, height) |
| 98 | |
| 99 | s = socket(AF_INET, SOCK_DGRAM) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 100 | s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 101 | if ttl >= 0: |
| 102 | s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, chr(ttl)) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 103 | |
| 104 | frozen = 0 |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 105 | |
| 106 | while 1: |
| 107 | |
| 108 | if gl.qtest(): |
| 109 | dev, val = gl.qread() |
| 110 | if dev in (DEVICE.ESCKEY, \ |
| 111 | DEVICE.WINSHUT, DEVICE.WINQUIT): |
| 112 | break |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 113 | if dev == DEVICE.WINFREEZE: |
| 114 | frozen = 1 |
| 115 | if dev == DEVICE.WINTHAW: |
| 116 | frozen = 0 |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 117 | if dev == DEVICE.REDRAW: |
| 118 | w, h = gl.getsize() |
| 119 | x, y = gl.getorigin() |
| 120 | if (w, h) <> (width, height): |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 121 | width, height = w, h |
Guido van Rossum | d65f45d | 1992-09-24 16:53:51 +0000 | [diff] [blame] | 122 | lvi.resizevideo(width, height) |
Guido van Rossum | cfb6bb2 | 1992-09-24 16:03:56 +0000 | [diff] [blame] | 123 | lvo.resizevideo(width, height) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 124 | |
| 125 | rv = lvi.getnextpacket() |
| 126 | if not rv: |
| 127 | time.millisleep(10) |
| 128 | continue |
| 129 | |
| 130 | pos, data = rv |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 131 | |
| 132 | if not frozen: |
| 133 | lvo.putnextpacket(pos, data) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 134 | |
| 135 | hdr = struct.pack('hhh', pos, width, height) |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 136 | for host in hosts: |
| 137 | try: |
| 138 | s.sendto(hdr + data, (host, port)) |
| 139 | except error, msg: # really socket.error |
| 140 | if msg[0] <> 121: # no buffer space available |
| 141 | raise error, msg # re-raise it |
| 142 | print 'Warning:', msg[1] |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 143 | |
| 144 | lvi.close() |
| 145 | lvo.close() |
| 146 | |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 147 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 148 | main() |