diff options
Diffstat (limited to 'Demo/sgi/video/Dsend.py')
-rwxr-xr-x | Demo/sgi/video/Dsend.py | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/Demo/sgi/video/Dsend.py b/Demo/sgi/video/Dsend.py new file mode 100755 index 0000000..3213caa --- /dev/null +++ b/Demo/sgi/video/Dsend.py @@ -0,0 +1,189 @@ +#!/ufs/guido/bin/sgi/python + +# Send live video UDP packets. +# Usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-w width] +# [host] .. + +import sys +import time +import struct +import string +import math +from socket import * +from SOCKET import * +import gl, GL, DEVICE +sys.path.append('/ufs/guido/src/video') +import DisplayVideoIn +import LiveVideoOut +import SV +import getopt +from IN import * + +from senddefs import * + +def usage(msg): + print msg + print 'usage: Vsend [-b] [-h height] [-p port] [-s size] [-t ttl] [-c type] [-m]', + print '[-w width] [host] ...' + print '-b : broadcast on local net' + print '-h height : window height (default ' + `DEFHEIGHT` + ')' + print '-p port : port to use (default ' + `DEFPORT` + ')' + print '-t ttl : time-to-live (multicast only; default 1)' + print '-s size : max packet size (default ' + `DEFPKTMAX` + ')' + print '-S size : use this packet size/window size' + print '-w width : window width (default ' + `DEFWIDTH` + ')' + print '-v : print packet rate' + print '-x xpos : set x position' + print '-y ypos : set y position' + print '[host] ...: host(s) to send to (default multicast to ' + \ + DEFMCAST + ')' + sys.exit(2) + + +def main(): + sys.stdout = sys.stderr + + hosts = [] + port = DEFPORT + ttl = -1 + pktmax = DEFPKTMAX + width = DEFWIDTH + height = DEFHEIGHT + vtype = 'rgb' + verbose = 0 + xpos = ypos = 0 + + try: + opts, args = getopt.getopt(sys.argv[1:], 'bh:p:s:S:t:w:vx:y:') + except getopt.error, msg: + usage(msg) + + try: + for opt, optarg in opts: + if opt == '-p': + port = string.atoi(optarg) + if opt == '-b': + host = '<broadcast>' + if opt == '-t': + ttl = string.atoi(optarg) + if opt == '-S': + pktmax = string.atoi(optarg) + vidmax = SV.PAL_XMAX*SV.PAL_YMAX + if vidmax <= pktmax: + width = SV.PAL_XMAX + height = SV.PAL_YMAX + pktmax = vidmax + else: + factor = float(vidmax)/float(pktmax) + factor = math.sqrt(factor) + width = int(SV.PAL_XMAX/factor)-7 + height = int(SV.PAL_YMAX/factor)-5 + print 'video:',width,'x',height, + print 'pktsize',width*height,'..', + print pktmax + if opt == '-s': + pktmax = string.atoi(optarg) + if opt == '-w': + width = string.atoi(optarg) + if opt == '-h': + height = string.atoi(optarg) + if opt == '-c': + vtype = optarg + if opt == '-v': + verbose = 1 + if opt == '-x': + xpos = string.atoi(optarg) + if opt == '-y': + ypos = string.atoi(optarg) + except string.atoi_error, msg: + usage('bad integer: ' + msg) + + for host in args: + hosts.append(gethostbyname(host)) + + if not hosts: + hosts.append(gethostbyname(DEFMCAST)) + + gl.foreground() + gl.prefsize(width, height) + gl.stepunit(8, 6) + wid = gl.winopen('Vsend') + gl.keepaspect(width, height) + gl.stepunit(8, 6) + gl.maxsize(SV.PAL_XMAX, SV.PAL_YMAX) + gl.winconstraints() + gl.qdevice(DEVICE.ESCKEY) + gl.qdevice(DEVICE.WINSHUT) + gl.qdevice(DEVICE.WINQUIT) + gl.qdevice(DEVICE.WINFREEZE) + gl.qdevice(DEVICE.WINTHAW) + width, height = gl.getsize() + + lvo = LiveVideoOut.LiveVideoOut().init(wid, width, height, vtype) + + lvi = DisplayVideoIn.DisplayVideoIn().init(pktmax, \ + width, height, vtype) + + if xpos or ypos: + lvi.positionvideo(xpos, ypos) + + s = socket(AF_INET, SOCK_DGRAM) + s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) + if ttl >= 0: + s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, chr(ttl)) + + frozen = 0 + + lasttime = int(time.time()) + nframe = 0 + while 1: + + if gl.qtest(): + dev, val = gl.qread() + if dev in (DEVICE.ESCKEY, \ + DEVICE.WINSHUT, DEVICE.WINQUIT): + break + if dev == DEVICE.WINFREEZE: + frozen = 1 + if dev == DEVICE.WINTHAW: + frozen = 0 + if dev == DEVICE.REDRAW: + w, h = gl.getsize() + x, y = gl.getorigin() + if (w, h) <> (width, height): + width, height = w, h + lvi.resizevideo(width, height) + lvo.resizevideo(width, height) + + rv = lvi.getnextpacket() + if not rv: + time.millisleep(10) + continue + + pos, data = rv + print pos, len(data) # DBG + + if not frozen: + lvo.putnextpacket(pos, data) + + hdr = struct.pack('hhh', pos, width, height) + for host in hosts: + try: + # print len(hdr+data) # DBG + s.sendto(hdr + data, (host, port)) + except error, msg: # really socket.error + if msg[0] <> 121: # no buffer space available + raise error, msg # re-raise it + print 'Warning:', msg[1] + if pos == 0 and verbose: + nframe = nframe+1 + if int(time.time()) <> lasttime: + print nframe / (time.time()-lasttime), 'fps' + nframe = 0 + lasttime = int(time.time()) + + lvi.close() + lvo.close() + + +main() |