home *** CD-ROM | disk | FTP | other *** search
- #!/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(wid, width, height, vtype)
-
- lvi = DisplayVideoIn.DisplayVideoIn(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.sleep(0.010)
- 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()
-