189 lines
4.4 KiB
Python
Executable File
189 lines
4.4 KiB
Python
Executable File
#!/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.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()
|