Guido van Rossum | f06ee5f | 1996-11-27 19:52:01 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 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 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 25 | print 'usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-c type] [-m]', |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 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` + ')' |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 33 | print '-c type : Type: rgb8, mono or grey (default rgb8)' |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 34 | print '[host] ...: host(s) to send to (default multicast to ' + \ |
| 35 | DEFMCAST + ')' |
| 36 | sys.exit(2) |
| 37 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 38 | |
| 39 | def main(): |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 40 | sys.stdout = sys.stderr |
| 41 | |
| 42 | hosts = [] |
| 43 | port = DEFPORT |
| 44 | ttl = -1 |
| 45 | pktmax = DEFPKTMAX |
| 46 | width = DEFWIDTH |
| 47 | height = DEFHEIGHT |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 48 | vtype = 'rgb8' |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 49 | |
| 50 | try: |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 51 | opts, args = getopt.getopt(sys.argv[1:], 'bh:p:s:t:w:c:') |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 52 | 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 Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 69 | if opt == '-c': |
| 70 | vtype = optarg |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 71 | 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 Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 80 | if not LiveVideoIn.have_video: |
Guido van Rossum | ff3da05 | 1992-12-09 22:16:35 +0000 | [diff] [blame] | 81 | print 'Sorry, no video available (use python-405)' |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 82 | sys.exit(1) |
| 83 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 84 | gl.foreground() |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 85 | gl.prefsize(width, height) |
| 86 | gl.stepunit(8, 6) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 87 | wid = gl.winopen('Vsend') |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 88 | gl.keepaspect(width, height) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 89 | gl.stepunit(8, 6) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 90 | gl.maxsize(SV.PAL_XMAX, SV.PAL_YMAX) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 91 | gl.winconstraints() |
| 92 | gl.qdevice(DEVICE.ESCKEY) |
| 93 | gl.qdevice(DEVICE.WINSHUT) |
| 94 | gl.qdevice(DEVICE.WINQUIT) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 95 | gl.qdevice(DEVICE.WINFREEZE) |
| 96 | gl.qdevice(DEVICE.WINTHAW) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 97 | width, height = gl.getsize() |
| 98 | |
Guido van Rossum | 21a3ff9 | 1993-12-17 15:11:41 +0000 | [diff] [blame] | 99 | lvo = LiveVideoOut.LiveVideoOut(wid, width, height, vtype) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 100 | |
Guido van Rossum | 21a3ff9 | 1993-12-17 15:11:41 +0000 | [diff] [blame] | 101 | lvi = LiveVideoIn.LiveVideoIn(pktmax, width, height, vtype) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 102 | |
| 103 | s = socket(AF_INET, SOCK_DGRAM) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 104 | s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 105 | if ttl >= 0: |
| 106 | s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, chr(ttl)) |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 107 | |
| 108 | frozen = 0 |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 109 | |
| 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 Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 117 | if dev == DEVICE.WINFREEZE: |
| 118 | frozen = 1 |
| 119 | if dev == DEVICE.WINTHAW: |
| 120 | frozen = 0 |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 121 | if dev == DEVICE.REDRAW: |
| 122 | w, h = gl.getsize() |
| 123 | x, y = gl.getorigin() |
| 124 | if (w, h) <> (width, height): |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 125 | width, height = w, h |
Guido van Rossum | d65f45d | 1992-09-24 16:53:51 +0000 | [diff] [blame] | 126 | lvi.resizevideo(width, height) |
Guido van Rossum | cfb6bb2 | 1992-09-24 16:03:56 +0000 | [diff] [blame] | 127 | lvo.resizevideo(width, height) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 128 | |
| 129 | rv = lvi.getnextpacket() |
| 130 | if not rv: |
Guido van Rossum | 424e4da | 1993-12-28 21:36:50 +0000 | [diff] [blame] | 131 | time.sleep(0.010) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 132 | continue |
| 133 | |
| 134 | pos, data = rv |
Guido van Rossum | 67b4895 | 1992-09-24 12:54:35 +0000 | [diff] [blame] | 135 | |
| 136 | if not frozen: |
| 137 | lvo.putnextpacket(pos, data) |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 138 | |
| 139 | hdr = struct.pack('hhh', pos, width, height) |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 140 | 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 Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 147 | |
| 148 | lvi.close() |
| 149 | lvo.close() |
| 150 | |
Guido van Rossum | 7b47c79 | 1992-09-24 15:01:37 +0000 | [diff] [blame] | 151 | |
Guido van Rossum | ba06615 | 1992-09-22 17:23:17 +0000 | [diff] [blame] | 152 | main() |