diff --git a/Demo/sgi/video/README b/Demo/sgi/video/README
new file mode 100644
index 0000000..8b87582
--- /dev/null
+++ b/Demo/sgi/video/README
@@ -0,0 +1,56 @@
+This directory contains Python and C code we wrote while we had a
+framegrabber board on loan from SGI.
+
+	--Guido and Jack
+
+cam.py		network real-time tv broadcast; see tv.py
+		usage: cam [packfactor [host]]
+		specifying 'all' for host broadcasts
+
+camcorder.py	record video movies or make snapshots (in movie format)
+		usage: camcorder [-c] [-a audiohost [-s]] [moviefile]
+		-c		color (default b/w, packfactor = 2)
+		-a audiohost	syncaudio is running on audiohost
+		-s		start syncaudio (on audiohost)
+		moviefile	(default film.video)
+		keyboard commands:
+		s	stop grabbing (single step if already stopped)
+		c	continuous grabbing
+		r	start recording
+		p	pause recording (record single frame if paused)
+		ESC	quit
+
+statit.py	various statistics operations on movie files
+
+syncaudio.py	record audio synchronized with camcorder -a
+		usage: syncaudio videohost soundfile
+		soundfile format: 16 bits, 16khz, mono
+
+tv.py		receiver for transmissions from cam.py
+
+video.py	player for movies recorded by camcorder.py
+		usage: video [moviefile [soundfile]]
+		default moviefile is film.video
+		default sound is no sound
+
+vinfo.py	print a summary of a movie file
+
+vtime.py	virtual time module imported by syncaudio.py and camcorder.py
+
+
+These are C programs, either for efficiency or because they need to
+link with a C library.
+
+squash.c	make a movie smaller by averaging pixels
+		usage: squash factor [bits] <moviefile >newmoviefile
+		factor		x and y compression factor
+		bits		#bits left per sample in result (default 8)
+
+squash2.c	make a movie smaller by dropping pixels
+		usage: squash2 factor <moviefile >newmoviefile
+		factor		x and y compression factor
+
+tomono.c	like squash2 but outputs a monochrome movie
+
+v2i.c		convert the first image of a movie file to SGI .rgb format
+		link with -limage
diff --git a/Demo/sgi/video/cam.py b/Demo/sgi/video/cam.py
new file mode 100755
index 0000000..f30e1e0
--- /dev/null
+++ b/Demo/sgi/video/cam.py
@@ -0,0 +1,129 @@
+import sys
+from socket import *
+from gl import *
+from GL import *
+from DEVICE import *
+from time import millitimer
+
+HS = 40 # Header size (must be same as in tv.py)
+
+# Rely on UDP packet (de)fragmentation for smoother images
+# (Changed for broadcast)
+MAX = 16000
+
+PF = 2 # Default packfactor
+
+# Default receiver station is voorn.
+# Kwik has no yellow pages, so...
+HOST = '192.16.201.121'
+PORT = 5555
+
+if sys.argv[1:]:
+	PF = eval(sys.argv[1])
+
+if sys.argv[2:]:
+	HOST = sys.argv[2]
+	if HOST = 'all':
+		HOST = '<broadcast>'
+		MAX = 1400
+
+PF2 = PF*PF
+
+def main():
+	centerx, centery = 400, 300
+
+	foreground()
+	wid = winopen('cam')
+	RGBmode()
+	doublebuffer()
+	gconfig()
+	qdevice(ESCKEY)
+
+	w, h = getsize()
+	ortho2(0, w, 0, h)
+	w = w/PF*PF
+	h = h/PF*PF
+
+	readsource(SRC_FRAMEGRABBER)
+
+	s = socket(AF_INET, SOCK_DGRAM)
+	if HOST = '<broadcast>':
+		s.allowbroadcast(1)
+	addr = HOST, PORT
+
+	bytesperline = w/PF2
+	linesperchunk = MAX/bytesperline
+	linesperchunk = linesperchunk/PF*PF
+	nchunks = (h+linesperchunk-1)/linesperchunk
+
+	print 'MAX=', MAX,
+	print 'linesperchunk=', linesperchunk,
+	print 'nchunks=', nchunks,
+	print 'w=', w, 'h=', h
+
+	x1, x2 = 0, w-1
+
+	t1 = millitimer()
+	nframes = 0
+	fps = 0
+
+	msg = ''
+
+	while 1:
+		while qtest():
+			dev, val = qread()
+			if dev = REDRAW:
+				reshapeviewport()
+				w, h = getsize()
+				ortho2(0, w, 0, h)
+				w = w/PF*PF
+				h = h/PF*PF
+
+				bytesperline = w/PF2
+				linesperchunk = MAX/bytesperline
+				linesperchunk = linesperchunk/PF*PF
+				nchunks = (h+linesperchunk-1)/linesperchunk
+
+				print 'MAX=', MAX,
+				print 'linesperchunk=', linesperchunk,
+				print 'nchunks=', nchunks,
+				print 'w=', w, 'h=', h
+
+				x1, x2 = 0, w-1
+
+				fps = 0
+
+			elif dev = ESCKEY:
+				winclose(wid)
+				return
+
+		readsource(SRC_FRAMEGRABBER)
+
+		nframes = nframes+1
+		if nframes >= fps:
+			t2 = millitimer()
+			if t2 <> t1:
+				fps = int(10000.0*nframes/(t2-t1)) * 0.1
+				msg = `fps` +  ' frames/sec'
+				t1 = t2
+				nframes = 0
+
+		RGBcolor(255,255,255)
+		cmov2i(9,9)
+		charstr(msg)
+
+		swapbuffers()
+		rectcopy(centerx-w/2, centery-w/2, centerx+w/2, centery+w/2, 0, 0)
+
+		for i in range(nchunks):
+			y1 = i*linesperchunk
+			y2 = y1 + linesperchunk-1
+			if y2 >= h: y2 = h-1
+			data = lrectread(x1, y1, x2, y2)
+			data2 = packrect(x2-x1+1, y2-y1+1, PF, data)
+			prefix = `w, h, PF, x1, y1, x2, y2`
+			prefix = prefix + ' ' * (HS-len(prefix))
+			data3 = prefix + data2
+			s.sendto(data3, addr)
+
+main()
diff --git a/Demo/sgi/video/camcorder.py b/Demo/sgi/video/camcorder.py
new file mode 100755
index 0000000..a6b7f4a
--- /dev/null
+++ b/Demo/sgi/video/camcorder.py
@@ -0,0 +1,197 @@
+#!/ufs/guido/bin/sgi/python3.3
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+import getopt
+import socket
+import posix
+import vtime
+
+SYNCPORT = 10000
+CTLPORT = 10001
+
+VP_GBXORG = 0x1000001
+VP_GBYORG = 0x1000002
+VP_FBXORG = 0x1000003
+VP_FBYORG = 0x1000004
+VP_WIDTH =  0x1000005
+VP_HEIGHT = 0x1000006
+
+class Struct(): pass
+epoch = Struct()
+
+def getvideosize():
+    w = getvideo(VP_WIDTH)
+    h = getvideo(VP_HEIGHT)
+    print getvideo(VP_GBXORG), getvideo(VP_GBYORG)
+    print getvideo(VP_FBXORG), getvideo(VP_FBYORG)
+    x = 0
+    y = 0
+    return x,y,w,h
+def saveframe(f,x,y,w,h,pf, notime):
+    readsource(SRC_FRONT)
+    if pf:
+    	w = w/pf*pf
+    	h = h/pf*pf
+    data = None
+    data = lrectread(x,y,x+w-1,y+h-1)
+    if pf: data = packrect(w,h,pf,data)
+    if notime: t = 0
+    else: t = time.millitimer()-epoch.epoch
+    f.write(`t` + ',' + `len(data)` + '\n')
+    f.write(data)
+    readsource(SRC_FRAMEGRABBER)
+def drawframe(x,y,w,h,col):
+    drawmode(OVERDRAW)
+    color(col)
+    bgnline()
+    v2i(x-1,y-1) ; v2i(x+w,y-1); v2i(x+w,y+h); v2i(x-1,y+h); v2i(x-1,y-1)
+    endline()
+    drawmode(NORMALDRAW)
+def main():
+    foreground()
+    pf = 2
+    ausync = 0
+    austart = 0
+    optlist, args = getopt.getopt(sys.argv[1:],'ca:s')
+    for opt, arg in optlist:
+	if opt = '-c':
+	    pf = 0
+	elif opt = '-a':
+	    ausync = 1
+	    aumachine = arg
+	elif opt = '-s':
+	    austart = 1
+	else:
+	    print 'Usage: camcorder [-c] [-a audiomachine [-s]]'
+	    sys.exit(1)
+    if austart:
+	if not ausync:
+	    print 'Cannot use -s without -a'
+	    sys.exit(1)
+	print 'Starting audio recorder...'
+	posix.system('rsh '+aumachine+' syncrecord '+socket.gethostname()+' &')
+    if ausync:
+	print 'Syncing to audio recorder...'
+	globtime = vtime.VTime().init(1,aumachine,SYNCPORT)
+	ctl = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
+	ctl.bind((socket.gethostname(),CTLPORT))
+	aua = (socket.gethostbyname(aumachine), CTLPORT)
+	print 'Done.'
+    vidx, vidy, w, h = getvideosize()
+    prefsize(w,h)
+    win = winopen('Camcorder')
+    if len(args) > 1:
+        f = open(args, 'w')
+    else:
+        f = open('film.video', 'w')
+    w, h = getsize()
+    realw, realh = w, h
+    doublebuffer()
+    RGBmode()
+    gconfig()
+    qdevice(LEFTMOUSE)
+    qdevice(RKEY)
+    qdevice(SKEY)
+    qdevice(CKEY)
+    qdevice(PKEY)
+    qdevice(ESCKEY)
+    inrunning = 1
+    outrunning = 0
+    stop = 'stop'
+    readsource(SRC_FRAMEGRABBER)
+    mousing = 0
+    epoch.epoch = time.millitimer()
+    stoptime = epoch.epoch
+    sizewritten = 0
+    x, y = realw/4, realh/4
+    w, h = w/2, h/2
+    drawframe(x,y,w,h,1)
+    nframe = 0
+    try:
+	num = 0
+	while 1:
+	    insingle = 0
+	    outsingle = 0
+	    if mousing:
+		drawframe(x,y,w,h,0)
+		ox, oy = getorigin()
+		if sizewritten:
+		    x = getvaluator(MOUSEX)-ox
+		    y = getvaluator(MOUSEY)-oy
+		else:
+		    w = getvaluator(MOUSEX)-x-ox
+		    h = getvaluator(MOUSEY)-y-oy
+		drawframe(x,y,w,h,1)
+	    if qtest():
+		ev, val = qread()
+		if ev = LEFTMOUSE and val = 1:
+		    drawframe(x,y,w,h,0)
+		    mousing = 1
+		    ox, oy = getorigin()
+		    x = getvaluator(MOUSEX)-ox
+		    y = getvaluator(MOUSEY)-oy
+		elif ev = LEFTMOUSE and val = 0:
+		    mousing = 0
+		    if not sizewritten:
+		    	f.write('CMIF video 1.0\n')
+			f.write(`w,h,pf` + '\n')
+			sizewritten = 1
+		if ev = RKEY and val = 1:
+		    if not inrunning:
+			ringbell()
+		    else:
+			outrunning = 1
+			wasstopped = time.millitimer() - stoptime
+			epoch.epoch = epoch.epoch + wasstopped
+			nframe = 0
+			starttime = time.millitimer()
+			if ausync:
+			    ctl.sendto(`(1,starttime)`, aua)
+		elif ev = PKEY and val = 1 and outrunning:
+		    outrunning = 0
+		    stoptime = time.millitimer()
+		    if ausync:
+			ctl.sendto(`(0,stoptime)`, aua)
+		    nf =  nframe * 1000.0 / (time.millitimer()-starttime)
+		    drawmode(OVERDRAW)
+		    color(0)
+		    clear()
+		    color(1)
+		    cmov2i(5,5)
+		    charstr('Recorded ' + `nf` + ' frames/sec')
+		    drawmode(NORMALDRAW)
+		elif ev = PKEY and val = 1 and not outrunning:
+			outsingle = 1
+		elif ev = CKEY and val = 1:
+			inrunning = 1
+		elif ev = SKEY and val = 1:
+			if outrunning:
+			    ringbell()
+			elif inrunning:
+			    inrunning = 0
+			else:
+			    insingle = 1
+		elif ev = ESCKEY:
+		    if ausync:
+			ctl.sendto(`(2,time.millitimer())`, aua)
+		    raise stop
+	    if inrunning or insingle:
+		rectcopy(vidx,vidy,realw,realh,0,0)
+	        swapbuffers()
+	    if outrunning or outsingle:
+		nframe = nframe + 1
+		if not sizewritten:
+		    f.write('CMIF video 1.0\n')
+		    f.write(`w,h,pf` + '\n')
+		    sizewritten = 1
+		saveframe(f, x, y, w, h, pf, outsingle)
+    except stop:
+	pass
+    drawmode(OVERDRAW)
+    color(0)
+    clear()
+#
+main()
diff --git a/Demo/sgi/video/squash.c b/Demo/sgi/video/squash.c
new file mode 100755
index 0000000..c045084
--- /dev/null
+++ b/Demo/sgi/video/squash.c
@@ -0,0 +1,120 @@
+#include <stdio.h>
+
+long *bm;
+long h, w;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+    char **argv;
+{
+    char lbuf[100];
+    int nh, nw;
+    int x, y, xi, yi;
+    int num;
+    int r, g, b;
+    long data;
+    long *nbm, *nbmp;
+    int i;
+    int bits, mask, roundbit, addbit;
+    int pf;
+    int newfmt = 0;
+
+    if( argc != 2 && argc != 3) {
+       fprintf(stderr, "Usage: squash factor [bits]\n");
+       exit(1);
+    }
+    factor = atoi(argv[1]);
+    if ( argc > 2 ) {
+	bits = atoi(argv[2]);
+	mask = (1 << bits) - 1;
+	mask <<= (8-bits);
+	roundbit = 1 << (7-bits);
+	addbit = 1 << (8-bits);
+	fprintf(stderr, "%x %x %x\n", mask, roundbit, addbit);
+    } else {
+	mask = 0xff;
+	roundbit = 0;
+	addbit = 0;
+    }
+    gets(lbuf);
+    if ( strncmp( lbuf, "CMIF", 4) == 0 ) {
+	newfmt = 1;
+	gets(lbuf);
+	if( sscanf(lbuf, "(%d,%d,%d)", &w, &h, &pf) != 3) {
+	    fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+	    exit(1);
+	}
+	if ( pf != 0 ) {
+	    fprintf(stderr, "%s: packed file\n", argv[0]);
+	    exit(1);
+	}
+    } else {
+	if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+	    fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+	    exit(1);
+	}
+    }
+    nh = h / factor;
+    nw = w / factor;
+    if ( newfmt )
+	printf("CMIF video 1.0\n(%d,%d,%d)\n", nw, nh, 0);
+    else
+	printf("(%d,%d)\n", nw, nh);
+    if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    while( !feof(stdin) ) {
+	gets(lbuf);
+	if ( feof(stdin) ) break;
+	puts(lbuf);
+	fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+	if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+	    fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+		i, h*w*sizeof(long));
+	    exit(1);
+	}
+	nbmp = nbm;
+	for( y=0; y<nh; y++) {
+	    for ( x=0; x<nw; x++) {
+		r = g = b = 0;
+		num = 0;
+		for( xi=0; xi<factor; xi++ ) {
+		    for(yi=0; yi<factor; yi++) {
+			if ( y*factor+yi < h && x*factor+xi < w ) {
+			    num++;
+			    data = BM(x,xi,y,yi);
+			    r += R(data);
+			    g += G(data);
+			    b += B(data);
+			}
+			else fprintf(stderr, "skip %d %d %d %d\n", x, xi, y, yi);
+		    }
+		}
+		r = r/num; g = g/num; b = b/num;
+		if ( (r & mask) != mask && ( r & roundbit) ) r += addbit;
+		if ( (g & mask) != mask && ( g & roundbit) ) g += addbit;
+		if ( (b & mask) != mask && ( b & roundbit) ) b += addbit;
+		data = COMP(r, g, b);
+		*nbmp++ = data;
+	    }
+	}
+	if (nbmp - nbm != nh * nw ) fprintf(stderr, "%d %d\n", nbmp-nbm, nh*nw);
+	fprintf(stderr, "Writing %d\n", (nbmp-nbm)*sizeof(long));
+	fwrite(nbm, 1, (nbmp-nbm)*sizeof(long), stdout);
+    }
+    exit(0);
+}
diff --git a/Demo/sgi/video/squash2.c b/Demo/sgi/video/squash2.c
new file mode 100755
index 0000000..c4d03e9
--- /dev/null
+++ b/Demo/sgi/video/squash2.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+
+long *bm;
+long h, w;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+    char **argv;
+{
+    char lbuf[100];
+    int nh, nw;
+    int x, y, xi, yi;
+    int num;
+    int r, g, b;
+    long data;
+    long *nbm, *nbmp;
+    int i;
+
+    if( argc != 2) {
+       fprintf(stderr, "Usage: squash factor\n");
+       exit(1);
+    }
+    factor = atoi(argv[1]);
+    gets(lbuf);
+    if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+	fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+	exit(1);
+    }
+    nh = h / factor;
+    nw = w / factor;
+    printf("(%d,%d)\n", nw, nh);
+    if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    while( !feof(stdin) ) {
+	gets(lbuf);
+	if ( feof(stdin) ) break;
+	puts(lbuf);
+	fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+	if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+	    fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+		i, h*w*sizeof(long));
+	    exit(1);
+	}
+	nbmp = nbm;
+	for( y=0; y<nh; y++) {
+	    for ( x=0; x<nw; x++) {
+		r = g = b = 0;
+		num = 0;
+		*nbmp++ = BM(x,0,y,0);
+	    }
+	}
+	if (nbmp - nbm != nh * nw ) fprintf(stderr, "%d %d\n", nbmp-nbm, nh*nw);
+	fprintf(stderr, "Writing %d\n", (nbmp-nbm)*sizeof(long));
+	fwrite(nbm, 1, (nbmp-nbm)*sizeof(long), stdout);
+    }
+    exit(0);
+}
diff --git a/Demo/sgi/video/statit.py b/Demo/sgi/video/statit.py
new file mode 100755
index 0000000..360e49e
--- /dev/null
+++ b/Demo/sgi/video/statit.py
@@ -0,0 +1,115 @@
+import sys
+from time import millitimer
+
+def main():
+	filename = 'film2.video'
+	if sys.argv[1:]: filename = sys.argv[1]
+	f = open(filename, 'r')
+
+	line = f.readline()
+	w, h = eval(line[:-1])
+	w2, h2 = w/2, h/2
+	size = w2 * h2
+
+	data = data2 = t = t0 = t1 = None
+	nframes = 0
+	t0 = millitimer()
+	while 1:
+		line = f.readline()
+		if not line: break
+		t = eval(line[:-1])
+		data = None
+		data = f.read(size)
+		if len(data) <> size:
+			raise EOFError
+		dostat(w2, h2, data)
+		nframes = nframes+1
+	t1 = millitimer()
+	
+	t = 0.001 * (t1-t0)
+	fps = 0.1 * int(10*nframes/t)
+	print nframes, 'frames in', t, 'sec. =', fps, 'frames/sec.'
+
+def dostat(w, h, data):
+	print
+	stat3(w, h, data)
+
+# Statistic op 1: frequencies of byte values
+def stat1(w, h, data):
+	bins = [0]*256
+	for c in data:
+		i = ord(c)
+		bins[i] = bins[i]+1
+	prbins(bins)
+
+def prbins(bins):
+	import string
+	s = ''
+	tot = 0
+	for i in range(256):
+		tot = tot + bins[i]
+		s = s + string.rjust(`bins[i]`, 4)
+		if len(s) >= 4*16:
+			print s, string.rjust(`tot`, 7)
+			s = ''
+			tot = 0
+
+# Statistic op 2: run lengths
+def stat2(w, h, data):
+	runs = []
+	for y in range(h):
+		count, value = 0, ord(data[y*w])
+		for c in data[y*w : y*w+w]:
+			i = ord(c)
+			if i <> value:
+				runs.append(count, value)
+				count, value = 0, i
+			count = count+1
+		runs.append(count, value)
+	print len(runs), 'runs =', 0.1 * (10*w*h/len(runs)), 'bytes/run'
+
+# Statistic op 3: frequencies of byte differences
+def stat3(w, h, data):
+	bins = [0]*256
+	prev = 0
+	for c in data:
+		i = ord(c)
+		delta = divmod(i-prev, 256)[1]
+		prev = i
+		bins[delta] = bins[delta]+1
+	prbins(bins)
+
+# Try packing
+def packblock(w, h, data):
+	res = ''
+	for y in range(h):
+		res = res + packline(data[y*w : y*w+w])
+	return res
+
+def packline(line):
+	bytes = []
+	for c in line:
+		bytes.append(ord(c))
+	prev = bytes[0]
+	i, n = 1, len(bytes)
+	while i < n:
+		for pack in (0, 2, 4, 8):
+			if pack = 0:
+				lo, hi = 0, 0
+			else:
+				hi = pow(2, pack-1)-1
+				lo = -hi-1
+			p = prev
+			j = i
+			count = 0
+			while j < n:
+				x = bytes[j]
+				delta = byte(x-p)
+				if not lo <= delta <= hi:
+					break
+				p = x
+				j = j+1
+
+def byte(x): return divmod(x, 256)[1]
+
+main()
diff --git a/Demo/sgi/video/syncaudio.py b/Demo/sgi/video/syncaudio.py
new file mode 100755
index 0000000..742a433
--- /dev/null
+++ b/Demo/sgi/video/syncaudio.py
@@ -0,0 +1,94 @@
+import AL
+import al
+import sys
+import vtime
+import socket
+import time
+
+
+SLEEPTIME = 500		# 500 ms sleeps
+SAMPLEFREQ = 16000	# 16Khz samples
+SAMPLERATE = AL.RATE_16000
+NEEDBUFFERED = SAMPLEFREQ	# Buffer 1 second of sound
+BUFFERSIZE = NEEDBUFFERED*4	# setqueuesize() par for 2 second sound
+
+AVSYNCPORT = 10000	# Port for time syncing
+AVCTLPORT = 10001	# Port for record start/stop
+
+def main():
+    if len(sys.argv) <> 3:
+	print 'Usage: ', sys.argv[0], 'videohostname soundfile'
+	sys.exit(1)
+    #
+    ofile = open(sys.argv[2], 'w')
+    #
+    globaltime = vtime.VTime().init(0,sys.argv[1],AVSYNCPORT)
+    #
+    ctl = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
+    ctl.bind((socket.gethostname(),AVCTLPORT))
+    #
+    inp = openmic()
+    #
+    out = 0		# Open aiff file
+    #
+    while 1:
+	if mainloop(None, ctl, inp, out, globaltime):
+	    break
+	if mainloop(ofile, ctl, inp, out, globaltime):
+	    break
+    pass	# Close aiff file
+    sys.exit(0)
+#
+def openmic():
+    conf = al.newconfig()
+    conf.setqueuesize(BUFFERSIZE)
+    conf.setwidth(AL.SAMPLE_16)
+    conf.setchannels(AL.MONO)
+    return al.openport('micr','r',conf)
+#
+def mainloop(ofile, ctl, inp, out, globaltime):
+    #
+    # Wait for sync packet, keeping 1-2 seconds of sound in the
+    # buffer
+    #
+    totsamps = 0
+    totbytes = 0
+    starttime = time.millitimer()
+    while 1:
+	time.millisleep(SLEEPTIME)
+	if ctl.avail():
+	    break
+	nsamples = inp.getfilled()-NEEDBUFFERED
+	if nsamples>0:
+	    data = inp.readsamps(nsamples)
+	    totsamps = totsamps + nsamples
+	    totbytes = totbytes + len(data)
+	    if ofile <> None:
+		ofile.write(data)
+    #
+    # Compute his starttime and the timestamp of the first byte in the
+    # buffer. Discard all buffered data upto his starttime
+    #
+    startstop,histime = eval(ctl.recv(100))
+    if (ofile = None and startstop = 0) or \
+			   (ofile <> None and startstop = 1):
+	print 'Sync error: saving=',save,' request=',startstop
+	sys.exit(1)
+    filllevel = inp.getfilled()
+    filltime = time.millitimer()
+    filltime = filltime - filllevel / (SAMPLEFREQ/1000)
+    starttime = globaltime.his2mine(histime)
+    nsamples = starttime - filltime
+    if nsamples < 0:
+	print 'Start/stop signal came too late'
+	sys.exit(1)
+    nsamples = nsamples * (SAMPLEFREQ / 1000)
+    data = inp.readsamps(nsamples)
+    totsamps = totsamps + nsamples
+    totbytes = totbytes + len(data)
+    print 'Time: ', time.millitimer()-starttime, ', Bytes: ', totbytes, ', Samples: ', totsamps
+    if ofile <> None:
+	ofile.write(data)
+    return (startstop = 2)
+
+main()
diff --git a/Demo/sgi/video/tomono.c b/Demo/sgi/video/tomono.c
new file mode 100755
index 0000000..546af68
--- /dev/null
+++ b/Demo/sgi/video/tomono.c
@@ -0,0 +1,165 @@
+#include <stdio.h>
+
+long *bm;
+long *nbm;
+long h, w;
+int nh, nw;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+#define CHOICEFUNC(np1, np2) ( random() & 1 )
+
+int inlevels = 3*255;
+int outlevels = 1;
+
+main(argc, argv)
+    char **argv;
+{
+    char lbuf[100];
+    int x, y, xi, yi;
+    int num;
+    int r, g, b;
+    long data;
+    int i;
+    double greyness;
+    int inpixels, outpixels;
+    int resid;
+
+    setvbuf(stdout, 0, _IOFBF, 1024*128);
+    if( argc != 2) {
+       fprintf(stderr, "Usage: tomono factor\n");
+       exit(1);
+    }
+    factor = atoi(argv[1]);
+    gets(lbuf);
+    if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+	fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+	exit(1);
+    }
+    nh = h / factor;
+    nw = w / factor;
+    printf("(%d,%d)\n", nw, nh);
+    if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+	fprintf(stderr, "%s: No memory\n", argv[0]);
+	exit(1);
+    }
+    while( !feof(stdin) ) {
+	gets(lbuf);
+	if ( feof(stdin) ) break;
+	puts(lbuf);
+	fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+	if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+	    fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+		i, h*w*sizeof(long));
+	    exit(1);
+	}
+	/*
+	** Compute picture blackness.
+	*/
+	inpixels = 0;
+	inpixels = countpixels(0,0,w,h);
+	greyness = (double)inpixels/(h*w*inlevels);
+	fprintf(stderr, "%3.1f%% grey\n", 100.0*greyness);
+	outpixels = (int)(greyness*outlevels*nh*nw);
+	fprintf(stderr, "Inpixels: %d (%d) Outpixels %d\n", inpixels, inpixels/inlevels, outpixels);
+	resid = fillpixels(0,0,nw,nh,0,0,w,h,outpixels);
+	if ( resid > 1 ) fprintf(stderr, "Residue: %d pixels\n", resid);
+	fprintf(stderr, "Writing %d\n", (nh*nw)*sizeof(long));
+	fwrite(nbm, 1, (nh*nw)*sizeof(long), stdout);
+    }
+    exit(0);
+}
+
+countpixels(x0,y0,x1,y1)
+{
+    int x, y, tot, data;
+
+    tot = 0;
+    for( y=y0; y<y1; y++)
+	for(x=x0; x<x1; x++) {
+	    data = bm[y*w+x];
+	    tot += R(data);
+	    tot += G(data);
+	    tot += B(data);
+    }
+    return tot;
+}
+
+fillpixels(x0,y0,x1,y1,ox0,oy0,ox1,oy1,npixels)
+{
+    int m, om, p1, p2, np1, np2, rp, resid;
+
+    if ( npixels == 0 ) return 0;
+    if ( x0+1 >= x1 && y0+1 >= y1 ) {
+	if ( npixels ) {
+	    nbm[y0*nw+x0] = 0xffffff;
+/* 	    fprintf(stderr, "->%d,%d\n", x0,y0); */
+	    return npixels - 1;
+	}
+	return 0;
+    }
+    if ( x1-x0 < y1-y0 ) {
+	if ( y1 - y0 <= 2 )
+	    m = y0 + 1;
+	else
+	    m = y0+1+(random()%(y1-y0-1));
+/* 	fprintf(stderr,"%d,%d %d,%d Y %d\n", x0, x1, y0, y1, m); */
+	/* om = (oy0+oy1)/2; */ om = m;
+	p1 = countpixels(ox0,oy0,ox1,om);
+	p2 = countpixels(ox0,om,ox1,oy1);
+	np1 = (int)(((float)p1/(p1+p2))*npixels);
+	np2 = (int)(((float)p2/(p1+p2))*npixels);
+	rp = npixels - np1 - np2;
+	if ( rp ) {
+	    np1 += rp/2;
+	    rp = rp - rp/2;
+	    np2 += rp;
+	}
+	resid = 0;
+	if ( CHOICEFUNC(np1, np2) ) {
+	    resid = fillpixels(x0,y0,x1,m,ox0,oy0,ox1,om,np1+resid);
+	    resid = fillpixels(x0,m,x1,y1,ox0,om,ox1,oy1,np2+resid);
+	} else {
+	    resid = fillpixels(x0,m,x1,y1,ox0,om,ox1,oy1,np2+resid);
+	    resid = fillpixels(x0,y0,x1,m,ox0,oy0,ox1,om,np1+resid);
+	}
+    } else {
+	if ( x1 - x0 <= 2 )
+	    m = x0 + 1;
+	else
+	    m = x0+1+(random()%(x1-x0-1));
+/* 	fprintf(stderr,"%d,%d %d,%d X %d\n", x0, x1, y0, y1, m); */
+	/* om = (ox0+ox1)/2; */ om = m;
+	p1 = countpixels(ox0,oy0,om,oy1);
+	p2 = countpixels(om,oy0,ox1,oy1);
+	np1 = (int)(((float)p1/(p1+p2))*npixels);
+	np2 = (int)(((float)p2/(p1+p2))*npixels);
+	rp = npixels - np1 - np2;
+	if ( rp ) {
+	    np1 += rp/2;
+	    rp = rp - rp/2;
+	    np2 += rp;
+	}
+	resid = 0;
+	if ( CHOICEFUNC(np1, np2) ) {
+	    resid = fillpixels(x0,y0,m,y1,ox0,oy0,om,oy1,np1+resid);
+	    resid = fillpixels(m,y0,x1,y1,om,oy0,ox1,oy1,np2+resid);
+	} else {
+	    resid = fillpixels(m,y0,x1,y1,om,oy0,ox1,oy1,np2+resid);
+	    resid = fillpixels(x0,y0,m,y1,ox0,oy0,om,oy1,np1+resid);
+	}
+    }
+    return resid;
+}
diff --git a/Demo/sgi/video/tv.py b/Demo/sgi/video/tv.py
new file mode 100755
index 0000000..621740c
--- /dev/null
+++ b/Demo/sgi/video/tv.py
@@ -0,0 +1,79 @@
+import string
+
+from socket import *
+from gl import *
+from GL import *
+from DEVICE import *
+from time import millisleep, millitimer
+
+PORT = 5555
+
+PF = 2 # packfactor
+HS = 40 # Header size
+
+def testimage():
+	RGBcolor(0, 0, 0)
+	clear()
+	RGBcolor(0, 255, 0)
+	cmov2i(10, 10)
+	charstr('Waiting...')
+
+def reshape():
+	reshapeviewport()
+	w, h = getsize()
+	ortho2(0, w, 0, h)
+	testimage()
+	return w, h
+
+def main():
+	s = socket(AF_INET, SOCK_DGRAM)
+	s.bind('', PORT)
+
+	foreground()
+	wid = winopen('tv')
+	RGBmode()
+	gconfig()
+	qdevice(ESCKEY)
+
+	oldw, oldh = getsize()
+	ortho2(0, oldw, 0, oldh)
+	testimage()
+
+	t1 = millitimer()
+
+	while 1:
+		if qtest():
+			dev, val = qread()
+			if dev = ESCKEY:
+				winclose(wid)
+				return
+			elif dev = REDRAW:
+				oldw, oldh = reshape()
+		elif s.avail():
+			data = s.recv(17000)
+			header = string.strip(data[:HS])
+			w, h, pf, x1, y1, x2, y2 = eval(header)
+			if (w, h) <> (oldw, oldh):
+				x, y = getorigin()
+				x, y = x-1, y+21 # TWM correction
+				winposition(x, x+w-1, y+oldh-h, y+oldh-1)
+				oldw, oldh = reshape()
+			data2 = data[HS:]
+			dx = (x2-x1+1)/pf
+			dy = (y2-y1+1)/pf
+			data3 = unpackrect(dx, dy, 1, data2)
+			rectzoom(pf, pf)
+			lrectwrite(x1, y1, x1+dx-1, y1+dy-1, data3)
+			t1 = millitimer()
+		else:
+			t2 = millitimer()
+			if t2-t1 >= 5000:
+				testimage()
+				t1 = t2
+			else:
+				millisleep(10)
+
+	winclose(wid)
+	return data
+
+main()
diff --git a/Demo/sgi/video/v2i.c b/Demo/sgi/video/v2i.c
new file mode 100755
index 0000000..41589d4
--- /dev/null
+++ b/Demo/sgi/video/v2i.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <gl/image.h>
+
+long bm[1280];
+short rb[1280], gb[1280], bb[1280];
+long h, w;
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+    char **argv;
+{
+    char lbuf[100];
+    int x, y;
+    int i;
+    IMAGE * of;
+    int pmask;
+
+    if( argc != 3 && argc != 4) {
+       fprintf(stderr, "Usage: v2i videofile imgfile [planemask]\n");
+       exit(1);
+    }
+    if ( argc == 4)
+	pmask = atoi(argv[3]);
+    else
+	pmask = 7;
+    if ( freopen(argv[1], "r", stdin) == NULL ) {
+	perror(argv[1]);
+	exit(1);
+    }
+    gets(lbuf);
+    if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+	fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+	exit(1);
+    }
+    gets(lbuf);		/* Skip time info */
+    if ( w > 1280 ) {
+	fprintf(stderr, "%s: Sorry, too wide\n", argv[0]);
+	exit(1);
+    }
+    if ( (of=iopen(argv[2], "w", RLE(1), 3, w, h, 3)) == 0) {
+	perror(argv[2]);
+	exit(1);
+    }
+    for( y=0; y<h; y++) {
+	if( fread(bm, sizeof(long), w, stdin) != w) {
+	    fprintf(stderr, "%s: short read\n", argv[0]);
+	    exit(1);
+	}
+	for( x=0; x<w; x++) {
+	    if ( pmask & 1) rb[x] = R(bm[x]);
+	    if ( pmask & 2) gb[x] = G(bm[x]);
+	    if ( pmask & 4) bb[x] = B(bm[x]);
+	}
+	putrow(of, rb, y, 0);
+	putrow(of, gb, y, 1);
+	putrow(of, bb, y, 2);
+    }
+    iclose(of);
+    exit(0);
+}
diff --git a/Demo/sgi/video/video.py b/Demo/sgi/video/video.py
new file mode 100755
index 0000000..05c6794
--- /dev/null
+++ b/Demo/sgi/video/video.py
@@ -0,0 +1,112 @@
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+import al
+import AL
+
+BUFFERSIZE = 32000
+
+class Struct(): pass
+epoch = Struct()
+EndOfFile = 'End of file'
+bye = 'bye'
+
+def openspkr():
+    conf = al.newconfig()
+    conf.setqueuesize(BUFFERSIZE)
+    conf.setwidth(AL.SAMPLE_16)
+    conf.setchannels(AL.MONO)
+    return al.openport('spkr','w',conf)
+def openvideo(name):
+    f = open(name, 'r')
+    line = f.readline()
+    if not line: raise EndOfFile
+    if line[:4] = 'CMIF': line = f.readline()
+    x = eval(line[:-1])
+    if len(x) = 3: w, h, pf = x
+    else: w, h = x; pf = 2
+    return f, w, h, pf
+def loadframe(f,w,h,pf,af,spkr):
+    line = f.readline()
+    if line = '':
+	raise EndOfFile
+    x = eval(line[:-1])
+    if type(x) = type(0) or type(x) = type(0.0):
+    	tijd = x
+    	if pf = 0:
+    		size = w*h*4
+    	else:
+    		size = (w/pf) * (h/pf)
+    else:
+    	tijd, size = x
+    data = f.read(size)
+    if len(data) <> size:
+	raise EndOfFile
+    if pf:
+    	rectzoom(pf, pf)
+    	w = w/pf
+    	h = h/pf
+    	data = unpackrect(w, h, 1, data)
+    lrectwrite(0,0,w-1,h-1,data)
+    # This is ugly here, but the only way to get the two
+    # channels started in sync
+    #if af <> None:
+    #	playsound(af,spkr)
+    ct = time.millitimer() - epoch.epoch
+    if tijd > 0 and ct < tijd:
+    	time.millisleep(tijd-ct)
+    swapbuffers()
+    return tijd
+def playsound(af, spkr):
+    nsamp = spkr.getfillable()
+    data = af.read(nsamp*2)
+    spkr.writesamps(data)
+def main():
+    if len(sys.argv) > 1:
+	f, w, h, pf = openvideo(sys.argv[1])
+    else:
+	f, w, h, pf = openvideo('film.video')
+    af = None
+    spkr = None
+    if len(sys.argv) > 2:
+	af = open(sys.argv[2], 'r')
+	spkr = openspkr()
+    if len(sys.argv) > 3:
+	data = af.read(eval(sys.argv[3]))
+	del data
+    foreground()
+    prefsize(w,h)
+    win = winopen('Video player')
+    RGBmode()
+    doublebuffer()
+    gconfig()
+    qdevice(ESCKEY)
+    running = 1
+    epoch.epoch = time.millitimer()
+    nframe = 0
+    tijd = 1
+    try:
+	while 1:
+	    if running:
+		try:
+		    tijd = loadframe(f, w, h, pf, af, spkr)
+		    nframe = nframe + 1
+		except EndOfFile:
+		    running = 0
+		    t = time.millitimer()
+		    if tijd > 0:
+			    print 'Recorded at ', nframe * 1000.0 / tijd,
+			    print 'frames/second (', tijd, 'ms total)'
+		    print 'Played at', nframe * 1000.0 / (t-epoch.epoch),
+		    print 'frames/second'
+	    if af <> None:
+		playsound(af,spkr)
+	    if qtest():
+		if qread() = (ESCKEY,1):
+		    raise bye
+    except bye:
+	pass
+
+main()
diff --git a/Demo/sgi/video/vinfo.py b/Demo/sgi/video/vinfo.py
new file mode 100755
index 0000000..98b29fa
--- /dev/null
+++ b/Demo/sgi/video/vinfo.py
@@ -0,0 +1,55 @@
+#!/ufs/guido/bin/sgi/python3.3
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+
+class Struct(): pass
+epoch = Struct()
+EndOfFile = 'End of file'
+bye = 'bye'
+
+def openvideo(name):
+    f = open(name, 'r')
+    w, h = eval(f.readline()[:-1])
+    return f, w, h
+def loadframe(f, w, h):
+    tijd = f.readline()
+    if tijd = '':
+	raise EndOfFile
+    tijd = eval(tijd[:-1])
+    f.seek(w*h*4,1)
+    return tijd
+def saveframe(name, w, h, tijd, data):
+    f = open(name, 'w')
+    f.write(`w,h` + '\n')
+    f.write(`tijd` + '\n')
+    f.write(data)
+    f.close()
+def main():
+	if len(sys.argv) > 1:
+		names = sys.argv[1:]
+	else:
+		names = ['film.video']
+	for name in names:
+	    f, w, h = openvideo(name)
+	    print name+': '+`w`+'x'+`h`
+	    num = 0
+	    try:
+		while 1:
+		    try:
+			tijd = loadframe(f, w, h)
+			print '\t', tijd,
+			num = num + 1
+			if num % 8 = 0:
+				print
+		    except EndOfFile:
+			raise bye
+	    except bye:
+		pass
+	    if num % 8 <> 0:
+		print
+	    f.close()
+
+main()
diff --git a/Demo/sgi/video/vtime.py b/Demo/sgi/video/vtime.py
new file mode 100755
index 0000000..00d821e
--- /dev/null
+++ b/Demo/sgi/video/vtime.py
@@ -0,0 +1,106 @@
+#
+# Module vtime - Keep virtual time between two nodes.
+#
+# We try for synchronised clocks by sending a packet of the for
+# (1,mytime,0) to the other side, and waiting (at most) a second for
+# a reply. This reply has the form (2,mytime,histime), and we can
+# estimate the time difference by defining histime to be exactly half-way
+# between the time we sent our message and got our reply. We send a
+# final (3,mynewtime,histime) message to allow the other side to do the
+# same computations.
+#
+# Note that the protocol suffers heavily from the 2-army problem.
+# It'll have to do until I can read up on time-sync protocols, though.
+#
+from socket import *
+import time
+
+MSGSIZE = 100
+MSGTIMEOUT = 1000
+
+recv_timeout = 'receive timeout'
+bad_connect = 'Bad connection'
+
+def timeavg(a,b):
+    return int((long(a)+b)/2L)
+def tryrecv(s):
+    cnt = 0
+    while 1:
+	if s.avail():
+	    return s.recvfrom(MSGSIZE)
+	time.millisleep(100)
+	cnt = cnt + 100
+	if cnt > MSGTIMEOUT:
+	    raise recv_timeout
+
+class VTime():
+    def init(self,(client,host,port)):
+	s = socket(AF_INET, SOCK_DGRAM)
+	host = gethostbyname(host)
+	localhost = gethostbyname(gethostname())
+	raddr = (host,port)
+	s.bind((localhost,port))
+	if client:
+	    #
+	    # We loop here because we want the *second* measurement
+	    # for accuracy
+	    for loopct in (0,2):
+		curtijd = time.millitimer()
+		check = `(loopct,curtijd,0)`
+		s.sendto(check,raddr)
+		while 1:
+		    try:
+			if loopct:
+			    data, other = s.recvfrom(MSGSIZE)
+			else:
+			    data, other = tryrecv(s)
+			newtijd = time.millitimer()
+			if other <> raddr:
+			    print 'Someone else syncing to us: ', other
+			    raise bad_connect
+			data = eval(data)
+			if data[:2] = (loopct+1,curtijd):
+			    break
+			if data[0] <> 2:
+			    print 'Illegal sync reply: ', data
+			    raise bad_connect
+		    except recv_timeout:
+			curtijd = time.millitimer()
+			check = `(loopct,curtijd,0)`
+			s.sendto(check,raddr)
+	    histime = data[2]
+	    s.sendto(`(4,newtijd,histime)`,raddr)
+	    mytime = timeavg(curtijd,newtijd)
+	    #mytime = curtijd
+	    self.timediff = histime - mytime
+	else:
+	    while 1:
+		data,other = s.recvfrom(MSGSIZE)
+		if other <> raddr:
+		    print 'Someone else syncing to us: ', other, ' Wanted ', raddr
+		    raise bad_connect
+		data = eval(data)
+		if data[0] in (0,2):
+		    curtijd = time.millitimer()
+		    s.sendto(`(data[0]+1,data[1],curtijd)`,raddr)
+		elif data[0] = 4:
+		    newtijd = time.millitimer()
+		    histime = data[1]
+		    mytime = timeavg(curtijd,newtijd)
+		    #mytime = curtijd
+		    self.timediff = histime-mytime
+		    break
+		else:
+		    print 'Funny data: ', data
+		    raise bad_connect
+	return self
+	#
+    def his2mine(self,tijd):
+	return tijd - self.timediff
+    #
+    def mine2his(self, tijd):
+	return tijd + self.timediff
+
+def test(clt, host, port):
+    xx = VTime().init(clt,host,port)
+    print 'Time diff: ', xx.his2mine(0)
