Remove the SGI demos.  These were all ancient and nobody cared enough.
diff --git a/Demo/README b/Demo/README
index 5266e3b..a4ccc71 100644
--- a/Demo/README
+++ b/Demo/README
@@ -43,12 +43,6 @@
 scripts		Some useful Python scripts that I put in my bin
 		directory.  No optional built-in modules needed.
 
-sgi		Demos that only run on Silicon Graphics machines.
-		These require at least one of the optional built-in
-		modules that only make sense for the SGI, such as
-		'gl', 'al', and 'sv'.  Split in subdirectories
-		per subject.
-
 sockets		Examples for the new built-in module 'socket'.
 
 threads		Demos that use the 'thread' module.  (Currently these
diff --git a/Demo/sgi/al/.cvsignore b/Demo/sgi/al/.cvsignore
deleted file mode 100644
index 11df8b0..0000000
--- a/Demo/sgi/al/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-cmpaf_form.fdc
diff --git a/Demo/sgi/cd/CD.doc b/Demo/sgi/cd/CD.doc
deleted file mode 100755
index 67f6a02..0000000
--- a/Demo/sgi/cd/CD.doc
+++ /dev/null
@@ -1,46 +0,0 @@
-Introduction.
-
-A number of programs have been written which access the Silicon
-Graphics CD-ROM player.  These programs all use the interface defined
-in readcd.py (see readcd.doc for documentation).
-
-Specifying music stretches.
-
-The programs that are capable of reading music CD's all use the same
-syntax to describe which part of the CD is to be read.  The syntax
-closely corresponds to the available methods in readcd.py.
-
-The music to be read is divided into stretches of music.  Each stretch
-must be specified as a separate argument on the command line.  A
-stretch can be a whole CD track, specified as a single number; or it
-can be a start time and a end time.  The start and end times must be
-specified as a tuple, thus: ``(starttime, endtime)''.  Don't forget to
-quote the parenthesis to the shell.  Both starttime and endtime can be
-``None'', a simple number which refers to a CD track, or a tuple
-consisting of either 3 or 4 elements.  A starttime of ``None'' refers
-to the start of the CD, an endtime of ``None'' refers to the end of
-the CD.  A tuple of 3 elements is an absolute time on the CD.  The
-three elements are (minutes, seconds, frames).  A tuple of 4 elements
-is a track-relative time.  The four elements are (track, minutes,
-seconds, frames).
-
-When one stretch ends at the end of a track and the following stretch
-starts at the next track, there is the option of either playing or not
-playing the pause between the two tracks.  When either the end time of
-the first stretch or the start time of the second stretch is specified
-using absolute or track-relative times, the pause will not be played.
-When both times are specified as simple track numbers, the pause will
-be played.
-
-If no stretches are specified, the whole CD will be played.
-
-The programs.
-
-Currently, the following programs exist.
-playcd [ stretch specification ]
-	Play (part of) a CD through the system loadspeaker or
-	headphone set.
-cdaiff [ file [ stretch specification ] ]
-	Copy (part of) a CD to a file.  The file will be written in
-	AIFF format.  If no file is specified, cdaiff will write to
-	the file ``@'' in the current directory.
diff --git a/Demo/sgi/cd/README b/Demo/sgi/cd/README
deleted file mode 100644
index 016e4d1..0000000
--- a/Demo/sgi/cd/README
+++ /dev/null
@@ -1,28 +0,0 @@
-These are some programs to work with the SCSI CD-ROM player's audio
-interface (see cdaudio(3) in IRIX 4.0 or higher; tested only on 4.0.2).
-
-See also the SGI-specific standard module 'readcd', documented as
-"readcd.lib" in the library.
-
-cdwin.py	A trivial window interface to play a CD over the CD
-		player's audio jack.  More functionality is left as an
-		excersice to the reader.  Needs module stdwin.
-
-listcd.py	List the table-of-contents of a CD (data CDs will
-		appear as a single track).
-
-playcd.py	Read audio data from the CD and play it over the
-		Indigo's built-in speker or audio jack.  Needs module al.
-
-sendcd.py	Read audio data from the CD and send it as UDP packets
-		over the network (to recvcd.py).
-
-recvcd.py	Receive UDP packets containing CD audio data (from
-		sendcd.py) and play them over the Indigo's built-in
-		speaker or audio jack.  Needs module al.  (Doesn't
-		actually use module cd.)
-
-cdaiff.py	Dump CD audio to disk in AIFF format.
-
-Note that to read *data* CD-ROMs you must open /dev/rdsk/dks0d4s7 or
-some such special file...
diff --git a/Demo/sgi/cd/cdaiff.py b/Demo/sgi/cd/cdaiff.py
deleted file mode 100755
index a1b490f..0000000
--- a/Demo/sgi/cd/cdaiff.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import sys
-import readcd
-import aifc
-import AL
-import cd
-
-Error = 'cdaiff.Error'
-
-def writeaudio(a, type, data):
-	a.writeframesraw(data)
-
-def main():
-	if len(sys.argv) > 1:
-		a = aifc.open(sys.argv[1], 'w')
-	else:
-		a = aifc.open('@', 'w')
-	a.setsampwidth(AL.SAMPLE_16)
-	a.setnchannels(AL.STEREO)
-	a.setframerate(AL.RATE_44100)
-	r = readcd.Readcd()
-	for arg in sys.argv[2:]:
-		x = eval(arg)
-		try:
-			if len(x) <> 2:
-				raise Error, 'bad argument'
-			r.appendstretch(x[0], x[1])
-		except TypeError:
-			r.appendtrack(x)
-	r.setcallback(cd.audio, writeaudio, a)
-	r.play()
-	a.close()
-
-main()
diff --git a/Demo/sgi/cd/listcd.py b/Demo/sgi/cd/listcd.py
deleted file mode 100755
index 2cfadb6..0000000
--- a/Demo/sgi/cd/listcd.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# List track info from CD player.
-
-import cd
-
-def main():
-	c = cd.open()
-	info = []
-	while 1:
-		try:
-			info.append(c.gettrackinfo(len(info) + 1))
-		except RuntimeError:
-			break
-	for i in range(len(info)):
-		start, total = info[i]
-		print 'Track', zfill(i+1), triple(start), triple(total)
-
-def triple((a, b, c)):
-	return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
-
-def zfill(n):
-	s = `n`
-	return '0' * (2 - len(s)) + s
-
-main()
diff --git a/Demo/sgi/cd/playcd.py b/Demo/sgi/cd/playcd.py
deleted file mode 100755
index 44fa5a0..0000000
--- a/Demo/sgi/cd/playcd.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# Play CD audio on speaker or headphones.
-
-callbacktypes = ['audio','pnum','index','ptime','atime','catalog','ident','control']
-
-def playaudio(port, type, audio):
-	port.writesamps(audio)
-
-def prtrack(cdinfo, type, pnum):
-	if cdinfo.track[pnum] <> '':
-		print 'playing "' + cdinfo.track[pnum] + '"'
-	else:
-		print callbacktypes[type]+': '+`pnum`
-
-def callback(arg, type, data):
-	print callbacktypes[type]+': '+`data`
-
-def tcallback(arg, type, data):
-	print callbacktypes[type]+': '+triple(data)
-
-def triple((a, b, c)):
-	return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
-
-def zfill(n):
-	s = `n`
-	return '0' * (2 - len(s)) + s
-
-def prtrackinfo(info):
-	for i in range(len(info)):
-		start, total = info[i]
-		print 'Track', zfill(i+1), triple(start), triple(total)
-
-statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
-
-def prstatus(status):
-	state, track, curtime, abstime, totaltime, first, last, \
-		scsi_audio, cur_block, dummy = status
-	print 'Status:',
-	if 0 <= state < len(statedict):
-		print statedict[state]
-	else:
-		print state
-	print 'Track: ', track
-	print 'Time:  ', triple(curtime)
-	print 'Abs:   ', triple(abstime)
-	print 'Total: ', triple(totaltime)
-	print 'First: ', first
-	print 'Last:  ', last
-	print 'SCSI:  ', scsi_audio
-	print 'Block: ', cur_block
-	print 'Future:', dummy
-
-def main():
-	import sys, readcd, al, AL, cd, cdplayer
-	verbose = 0
-	r = readcd.Readcd()
-	prstatus(r.getstatus())
-	prtrackinfo(r.gettrackinfo())
-	cdinfo = cdplayer.Cdplayer(r.gettrackinfo())
-	if cdinfo.title <> '':
-		print 'Title: "' + cdinfo.title + '"'
-	if cdinfo.artist <> '':
-		print 'Artist: ' + cdinfo.artist
-	for arg in sys.argv[1:]:
-		if arg == '-v':
-			verbose = 1
-			continue
-		x = eval(arg)
-		try:
-			l = len(x)
-			r.appendstretch(x[0], x[1])
-		except TypeError:
-			r.appendtrack(x)
-	try:
-		oldparams = [AL.OUTPUT_RATE, 0]
-		params = oldparams[:]
-		al.getparams(AL.DEFAULT_DEVICE, oldparams)
-		params[1] = AL.RATE_44100
-		al.setparams(AL.DEFAULT_DEVICE, params)
-		config = al.newconfig()
-		config.setwidth(AL.SAMPLE_16)
-		config.setchannels(AL.STEREO)
-		port = al.openport('CD Player', 'w', config)
-
-		for i in range(8):
-			r.setcallback(i, callback, None)
-		if verbose:
-			r.setcallback(cd.ptime, tcallback, None)
-			r.setcallback(cd.atime, tcallback, None)
-		else:
-			r.removecallback(cd.ptime)
-			r.removecallback(cd.atime)
-		r.setcallback(cd.pnum, prtrack, cdinfo)
-		r.setcallback(cd.audio, playaudio, port)
-
-		data = r.play()
-	except KeyboardInterrupt:
-		status = r.getstatus()
-		print 'Interrupted at '+triple(status[2])+' into track '+ \
-			  `status[1]`+' (absolute time '+triple(status[3])+')'
-	al.setparams(AL.DEFAULT_DEVICE, oldparams)
-
-main()
diff --git a/Demo/sgi/cd/recvcd.py b/Demo/sgi/cd/recvcd.py
deleted file mode 100755
index e7496d1..0000000
--- a/Demo/sgi/cd/recvcd.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Receive UDP packets from sendcd.py and play them on the speaker or
-# audio jack.
-
-import al, AL
-from socket import *
-from cd import DATASIZE
-
-PORT = 50505				# Must match the port in sendcd.py
-
-def main():
-	s = socket(AF_INET, SOCK_DGRAM)
-	s.bind('', PORT)
-
-	oldparams = [AL.OUTPUT_RATE, 0]
-	params = oldparams[:]
-	al.getparams(AL.DEFAULT_DEVICE, oldparams)
-	params[1] = AL.RATE_44100
-	try:
-		al.setparams(AL.DEFAULT_DEVICE, params)
-		config = al.newconfig()
-		config.setwidth(AL.SAMPLE_16)
-		config.setchannels(AL.STEREO)
-		port = al.openport('CD Player', 'w', config)
-
-		while 1:
-			data = s.recv(DATASIZE)
-			if not data:
-				print 'EOF'
-				break
-			port.writesamps(data)
-	except KeyboardInterrupt:
-		pass
-
-	al.setparams(AL.DEFAULT_DEVICE, oldparams)
-
-main()
diff --git a/Demo/sgi/cd/sendcd.py b/Demo/sgi/cd/sendcd.py
deleted file mode 100755
index a6cf8e7..0000000
--- a/Demo/sgi/cd/sendcd.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Read CD audio data from the SCSI CD player and send it as UDP
-# packets to "recvcd.py" on another host.
-#
-# Usage: python sendcd.py [options] host [track | minutes seconds [frames]]
-#
-# Options:
-# "-l"		list track info and quit.
-# "-s"		display status and quit.
-#
-# Arguments:
-# host		host to send the audio data to (required unless -l or -s).
-# track		track number where to start; alternatively,
-# min sec [frames]	absolute address where to start;
-#		default is continue at current point according to status.
-
-import cd
-import sys
-from socket import *
-import getopt
-
-PORT = 50505				# Must match the port in readcd.py
-
-def main():
-	try:
-		optlist, args = getopt.getopt(sys.argv[1:], 'ls')
-	except getopt.error, msg:
-		sys.stderr.write(msg + '\n')
-		sys.exit(2)
-
-	player = cd.open()
-	prstatus(player)
-	size = player.bestreadsize()
-
-	if optlist:
-		for opt, arg in optlist:
-			if opt == '-l':
-				prtrackinfo(player)
-			elif opt == '-s':
-				prstatus(player)
-		return
-
-	if not args:
-		sys.stderr.write('usage: ' + sys.argv[0] + ' host [track]\n')
-		sys.exit(2)
-	host, args = args[0], args[1:]
-
-	sys.stdout.write('waiting for socket... ')
-	sys.stdout.flush()
-	port = socket(AF_INET, SOCK_DGRAM)
-	port.connect(host, PORT)
-	print 'socket connected'
-
-	parser = cd.createparser()
-	parser.setcallback(cd.audio, audiocallback, port)
-	parser.setcallback(cd.pnum, pnumcallback, player)
-	parser.setcallback(cd.index, indexcallback, None)
-	## cd.ptime: too many calls
-	## cd.atime: too many calls
-	parser.setcallback(cd.catalog, catalogcallback, None)
-	parser.setcallback(cd.ident, identcallback, None)
-	parser.setcallback(cd.control, controlcallback, None)
-
-	if len(args) >= 2:
-		if len(args) >= 3:
-			[min, sec, frame] = args[:3]
-		else:
-			[min, sec] = args
-			frame = '0'
-		min, sec, frame = eval(min), eval(sec), eval(frame)
-		print 'Seek to', triple(min, sec, frame)
-		dummy = player.seek(min, sec, frame)
-	elif len(args) == 1:
-		track = eval(args[0])
-		print 'Seek to track', track
-		dummy = player.seektrack(track)
-	else:
-		min, sec, frame = player.getstatus()[3]
-		print 'Try to seek back to', triple(min, sec, frame)
-		try:
-			player.seek(min, sec, frame)
-		except RuntimeError:
-			print 'Seek failed'
-
-	try:
-		while 1:
-			frames = player.readda(size)
-			if frames == '':
-				print 'END OF CD'
-				break
-			parser.parseframe(frames)
-	except KeyboardInterrupt:
-		print '[Interrupted]'
-		pass
-
-def prtrackinfo(player):
-	info = []
-	while 1:
-		try:
-			info.append(player.gettrackinfo(len(info) + 1))
-		except RuntimeError:
-			break
-	for i in range(len(info)):
-		start, total = info[i]
-		print 'Track', zfill(i+1), triple(start), triple(total)
-
-def audiocallback(port, type, data):
-##	sys.stdout.write('#')
-##	sys.stdout.flush()
-	port.send(data)
-
-def pnumcallback(player, type, data):
-	print 'pnum =', `data`
-	prstatus(player)
-
-def indexcallback(arg, type, data):
-	print 'index =', `data`
-
-def catalogcallback(arg, type, data):
-	print 'catalog =', `data`
-
-def identcallback(arg, type, data):
-	print 'ident =', `data`
-
-def controlcallback(arg, type, data):
-	print 'control =', `data`
-
-statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
-
-def prstatus(player):
-	state, track, curtime, abstime, totaltime, first, last, \
-		scsi_audio, cur_block, dummy = player.getstatus()
-	print 'Status:',
-	if 0 <= state < len(statedict):
-		print statedict[state]
-	else:
-		print state
-	print 'Track: ', track
-	print 'Time:  ', triple(curtime)
-	print 'Abs:   ', triple(abstime)
-	print 'Total: ', triple(totaltime)
-	print 'First: ', first
-	print 'Last:  ', last
-	print 'SCSI:  ', scsi_audio
-	print 'Block: ', cur_block
-	print 'Future:', dummy
-
-def triple((a, b, c)):
-	return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
-
-def zfill(n):
-	s = `n`
-	return '0' * (2 - len(s)) + s
-
-main()
diff --git a/Demo/sgi/flp/.cvsignore b/Demo/sgi/flp/.cvsignore
deleted file mode 100644
index 4cee222..0000000
--- a/Demo/sgi/flp/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-tcache.fdc test_cb.fdc test_nocb.fdc
diff --git a/Demo/sgi/flp/tcache.fd b/Demo/sgi/flp/tcache.fd
deleted file mode 100755
index 2ae91fa..0000000
--- a/Demo/sgi/flp/tcache.fd
+++ /dev/null
@@ -1,51 +0,0 @@
-Magic: 12321
-
-Internal Form Definition File
-    (do not change)
-
-Number of forms: 2
-
-=============== FORM ===============
-Name: first
-Width: 340.000000
-Height: 160.000000
-Number of Objects: 1
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 340.000000 160.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 10.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
-=============== FORM ===============
-Name: second
-Width: 150.000000
-Height: 400.000000
-Number of Objects: 1
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 150.000000 400.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 10.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
-==============================
-create_the_forms
diff --git a/Demo/sgi/flp/tcache.py b/Demo/sgi/flp/tcache.py
deleted file mode 100755
index cf713fc..0000000
--- a/Demo/sgi/flp/tcache.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Test bug in caching of forms
-
-import sys
-import os
-import flp
-
-filename = 'tcache.fd'
-cachename = filename + 's'
-
-def first():
-	try:
-		os.unlink(cachename)
-	except os.error:
-		pass
-	first = flp.parse_form(filename, 'first')
-
-def second():
-	forms = flp.parse_forms(filename)
-	k = forms.keys()
-	if 'first' in k and 'second' in k:
-		print 'OK'
-	else:
-		print 'BAD!', k
-
-def main():
-	if sys.argv[1:]:
-		second()
-	else:
-		first()
-		print 'Now run the script again with an argument'
-
-main()
diff --git a/Demo/sgi/flp/test_cb.fd b/Demo/sgi/flp/test_cb.fd
deleted file mode 100755
index e83fd1f..0000000
--- a/Demo/sgi/flp/test_cb.fd
+++ /dev/null
@@ -1,75 +0,0 @@
-Magic: 12321
-
-Internal Form Definition File
-    (do not change)
-
-Number of forms: 1
-
-=============== FORM ===============
-Name: main_form
-Width: 170.000000
-Height: 190.000000
-Number of Objects: 4
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 170.000000 190.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 10.000000 140.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Button 1
-name: button1
-callback: button1CB
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 10.000000 100.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Button 2
-name: button2
-callback: button2CB
-argument: 0
-
---------------------
-class: 11
-type: 6
-box: 10.000000 10.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: EXIT
-name: exitbutton
-callback: exitbuttonCB
-argument: 0
-
-==============================
-create_the_forms
diff --git a/Demo/sgi/flp/test_cb.py b/Demo/sgi/flp/test_cb.py
deleted file mode 100755
index 4163503..0000000
--- a/Demo/sgi/flp/test_cb.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# Example 2 - Using fl in python with callbacks.
-#
-# The form is named 'main_form' and resides on file 'test_cb.fd'.
-# It has three objects named button1, button2 and exitbutton.
-# All buttons have callbacks with the same names as their corresponding
-# buttons but with CB appended.
-#
-import fl		# The forms library
-import FL		# Symbolic constants for the above
-import flp		# The module to parse .fd files
-import sys
-
-# The following struct is created to hold the instance variables
-# main_form, button1, button2 and exitbutton.
-
-class myform:
-	#
-	# The constructor parses and creates the form, but doesn't
-	# display it (yet).
-	def __init__(self, number):
-		#
-		# First we parse the form
-		parsetree = flp.parse_form('test_cb', 'main_form')
-		#
-		# Next we create it
-		
-		flp.create_full_form(self, parsetree)
-
-		# And keep our number
-		self.number = number
-
-	#
-	# The show function displays the form. It doesn't do any interaction,
-	# though.
-	def show(self):
-		self.main_form.show_form(FL.PLACE_SIZE, 1, '')
-
-	# The callback functions
-	def button1CB(self, obj, arg):
-		print 'Button 1 pressed on form', self.number
-
-	def button2CB(self, obj, arg):
-		print 'Button 2 pressed on form', self.number
-
-	def exitbuttonCB(self, obj, arg):
-		print 'Ok, bye bye'
-		sys.exit(0)
-
-#
-# The main program. Instantiate two variables of the forms class
-# and interact with them.
-
-form1 = myform(1)
-form2 = myform(2)
-
-form1.show()
-form2.show()
-
-obj = fl.do_forms()
-print 'do_forms() returned. This should not happen. obj=', obj
diff --git a/Demo/sgi/flp/test_nocb.fd b/Demo/sgi/flp/test_nocb.fd
deleted file mode 100755
index 4d3f7ef..0000000
--- a/Demo/sgi/flp/test_nocb.fd
+++ /dev/null
@@ -1,75 +0,0 @@
-Magic: 12321
-
-Internal Form Definition File
-    (do not change)
-
-Number of forms: 1
-
-=============== FORM ===============
-Name: main_form
-Width: 170.000000
-Height: 190.000000
-Number of Objects: 4
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 170.000000 190.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 10.000000 140.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Button 1
-name: button1
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 10.000000 100.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Button 2
-name: button2
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 6
-box: 10.000000 10.000000 150.000000 40.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: EXIT
-name: exitbutton
-callback: 
-argument: 
-
-==============================
-create_the_forms
diff --git a/Demo/sgi/flp/test_nocb.py b/Demo/sgi/flp/test_nocb.py
deleted file mode 100755
index 6346da3..0000000
--- a/Demo/sgi/flp/test_nocb.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Example 1 - Using fl in python without callbacks.
-#
-# The form is named 'main_form' and resides on file 'test_nocb.fd'.
-# It has three objects named button1, button2 and exitbutton.
-#
-import fl		# The forms library
-import FL		# Symbolic constants for the above
-import flp		# The module to parse .fd files
-import sys
-
-# The following struct is created to hold the instance variables
-# main_form, button1, button2 and exitbutton.
-
-class struct: pass
-container = struct()
-
-#
-# We now first parse the forms file
-
-parsetree = flp.parse_form('test_nocb', 'main_form')
-
-#
-# Next we create it
-
-flp.create_full_form(container, parsetree)
-
-#
-# And display it
-
-container.main_form.show_form(FL.PLACE_MOUSE, 1, '')
-
-#
-# And interact until the exit button is pressed
-while 1:
-	selected_obj = fl.do_forms()
-	if selected_obj == container.button1:
-		print 'Button 1 selected'
-	elif selected_obj == container.button2:
-		print 'Button 2 selected'
-	elif selected_obj == container.exitbutton:
-		print 'Ok, bye bye'
-		sys.exit(0)
-	else:
-		print 'do_forms() returned unknown object ', selected_obj
diff --git a/Demo/sgi/gl/README b/Demo/sgi/gl/README
deleted file mode 100644
index a89a502..0000000
--- a/Demo/sgi/gl/README
+++ /dev/null
@@ -1,35 +0,0 @@
-These demos run only on SGI machines and require the 'gl' built-in module.
-The demonstrate the abilities of SGI's GL library as well as the ease of
-GL programming in Python.  Most demos require the Z-buffer (aka
-24-bitplane) option.  Press ESC to get out of any of them.
-
-backface.py	Demonstrates the 'backface' GL function.
-
-kites.py	Show 3 flying kites.  Demonstrates the rendering speed
-		obtainable by Python programs.
-
-kunst.py	Cute demo showing a ball suspended on four cables in
-		the central room of the CWI building.  You can specify
-		three functions Fx(t), Fy(t), Fz(t) which define the
-		movement of the ball.  Try something like sin(t),
-		cos(t), sin(2*t).
-
-mclock.py	A colorful clock with more options than you can
-		remember.  Works on 8-bit machines, but allows more
-		colors on 24-bit machines.  See mclock.doc for more
-		info.
-
-mixing.py	Demonstrates the effect of color mixing: through
-		frequent color switching it gives the effect of white
-		light.
-
-nurbs.py	A simple demonstration of the 'nurbs' GL functions.
-		Press left mouse button to toggle surface trimming.
-
-zrgb.py		Displays a 3-D Gouraud-shaded figure which can be moved
-		around with the mouse.
-
-glstdwin/	This is quite different: a partial STDWIN emulation
-		using GL!  Requires only small changes to Python
-		programs that use STDWIN.  Some features not yet
-		implemented, e.g., scroll bars.
diff --git a/Demo/sgi/gl/backface.py b/Demo/sgi/gl/backface.py
deleted file mode 100755
index 41c69d6..0000000
--- a/Demo/sgi/gl/backface.py
+++ /dev/null
@@ -1,140 +0,0 @@
-#! /usr/bin/env python
-
-#   backface
-#
-#   draw a cube that can run with backface() turned on or off.
-#   cube is moved when LEFTMOUSE is pressed and mouse itself is moved.
-
-from gl import *
-from DEVICE import *
-from GL import *
-
-CUBE_SIZE = 200.0
-CUBE_OBJ = 1
-
-def main () :
-	#
-	x = 0
-	y = 0
-	moveit = 0
-	#
-	initialize()
-	#
-	while (1) :
-		#
-		while (qtest()) :
-			dev, val = qread()
-			#
-			if dev == ESCKEY :
-				backface(0)
-				return
-				#
-			elif dev == REDRAW :
-				reshapeviewport()
-				drawcube(x,y)
-				#
-			elif dev == LEFTMOUSE :
-				#
-				# LEFTMOUSE down
-				moveit = val
-				#
-			elif dev == BKEY :
-				backface(1)
-				drawcube(x,y)
-				#
-			elif dev == FKEY :
-				backface(0)
-				drawcube(x,y)
-				#
-		if moveit :
-			x = getvaluator(MOUSEX)
-			y = getvaluator(MOUSEY)
-			drawcube(x,y)
-
-
-def initialize () :
-	foreground ()
-	keepaspect (1, 1)
-	gid = winopen('backface')
-	winset(gid)
-	winconstraints()
-	#
-	doublebuffer()
-	gconfig()
-	shademodel(FLAT)
-	#
-	ortho(-1024.0, 1024.0, -1024.0, 1024.0, -1024.0, 1024.0)
-	#
-	qdevice(ESCKEY)
-	qdevice(REDRAW)
-	qdevice(LEFTMOUSE)
-	qdevice(BKEY)
-	qdevice(FKEY)
-	qenter(REDRAW,gid)
-	#
-	backface(1)
-
-#
-# define a cube
-def cube () :
-	#
-	# front face
-	pushmatrix()
-	translate(0.0,0.0,CUBE_SIZE)
-	color(RED)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-	#
-	# right face
-	pushmatrix()
-	translate(CUBE_SIZE, 0.0, 0.0)
-	rotate(900, 'y')
-	color(GREEN)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-	#
-	# back face
-	pushmatrix()
-	translate(0.0, 0.0, -CUBE_SIZE)
-	rotate(1800, 'y')
-	color(BLUE)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-	#
-	# left face
-	pushmatrix()
-	translate(-CUBE_SIZE, 0.0, 0.0)
-	rotate(-900, 'y')
-	color(CYAN)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-	#
-	# top face
-	pushmatrix()
-	translate(0.0, CUBE_SIZE, 0.0)
-	rotate(-900, 'x')
-	color(MAGENTA)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-	#
-	# bottom face
-	pushmatrix()
-	translate(0.0, -CUBE_SIZE, 0.0)
-	rotate(900, 'x')
-	color(YELLOW)
-	rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
-	popmatrix()
-
-def drawcube(x,y) :
-	#
-	pushmatrix()
-	rotate(2*x, 'x')
-	rotate(2*y, 'y')
-	color(BLACK)
-	clear()
-	cube()        
-	popmatrix()
-	swapbuffers()
-
-
-main ()
diff --git a/Demo/sgi/gl/glinfo.py b/Demo/sgi/gl/glinfo.py
deleted file mode 100755
index dae99f1..0000000
--- a/Demo/sgi/gl/glinfo.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#! /usr/bin/env python
-
-# Print the values of all values that can be inquired with getgdesc().
-# See man getgdesc() for a description.
-
-import gl
-import GL
-
-def main():
-	names = []
-	maxlen = 0
-	for name in dir(GL):
-		if name[:3] == 'GD_':
-			names.append(name)
-			maxlen = max(maxlen, len(name))
-	for name in names:
-		print name + (maxlen - len(name))*' ' + '=',
-		print gl.getgdesc(getattr(GL, name))
-
-main()
diff --git a/Demo/sgi/gl/kites.py b/Demo/sgi/gl/kites.py
deleted file mode 100755
index cde69cb..0000000
--- a/Demo/sgi/gl/kites.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#! /usr/bin/env python
-
-# *** This only works correctly on a 24 bit-plane machine. ***
-#
-# A simple Python program that tests the some parts of the
-# GL library. It shows the speed that can be obtained when
-# doing simple graphics.
-#
-# The bottleneck in this program is NOT Python but the graphics
-# engine; i.e Python can feed the graphics pipeline fast enough
-# on the 4D/25G.
-#
-# This program show 3 kites flying around the screen. It uses
-#
-# 	* bgnpolygon, endpolygon
-# 	* v3, n3
-# 	* lmdef, lmbind
-#
-# Usage :
-# 
-# 	ESC 	-> exit program
-# 	MOUSE3 	-> freeze toggle
-# 	MOUSE2 	-> one step (use this in freeze state)
-
-from GL import *
-from gl import *
-import DEVICE
-from math import *
-
-#
-# viewobj : sets the rotation, translation and scaling
-# set appropiate material, call drawobject()
-#
-def viewobj (r, s, t, mat) :
-	pushmatrix()
-	rot (r * 10.0, 'X')
-	rot (r * 10.0, 'Y')
-	rot (r * 10.0, 'Z')
-	scale (s[0], s[1], s[2])
-	translate (t[0], t[1], t[2])
-	lmbind(MATERIAL, mat)
-	drawobject()
-	popmatrix()
-
-#
-# makeobj : the constructor of the object
-#
-def mkobj () :
-	v0 = (-5.0 ,0.0, 0.0)
-	v1 = (0.0 ,5.0, 0.0)
-	v2 = (5.0 ,0.0, 0.0)
-	v3 = (0.0 ,2.0, 0.0)
-	n0 = (sqrt(2.0)/2.0, sqrt(2.0)/2.0, 0.0)
-	vn = ((v0, n0), (v1, n0), (v2, n0), (v3, n0))
-	#
-	return vn
-
-#
-# the object itself as an array of vertices and normals
-#
-kite = mkobj ()
-
-#
-# drawobject : draw a triangle. with bgnpolygon
-#
-def drawobject () :
-	#
-	bgnpolygon()
-	vnarray (kite)
-	endpolygon()
-
-#
-# identity matrix
-#
-idmat=[1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0]
-
-#
-# the rgb-value of light-blue 
-#
-LightBlue = (43,169,255)
-
-#
-# the different materials.
-#
-m1=[SPECULAR,0.0,0.0,0.6,DIFFUSE,0.0,0.0,0.8,SHININESS,20.0,LMNULL]
-m2=[SPECULAR,0.8,0.0,0.1,DIFFUSE,0.8,0.0,0.3,SHININESS,120.0,LMNULL]
-m3=[SPECULAR,0.0,1.0,0.0,DIFFUSE,0.0,0.6,0.0,SHININESS,120.0,LMNULL]
-
-#
-# lightsources
-#
-light1 = [LCOLOR,1.0,1.0,1.0,POSITION,15.0,15.0,0.0,1.0,LMNULL]
-light2 = [LCOLOR,1.0,1.0,1.0,POSITION,-15.0,15.0,0.0,1.0,LMNULL]
-
-#
-# the lightmodel
-#
-model = [AMBIENT,0.2,0.2,0.2,LMNULL]
-
-#
-# initgl : opens the window, configures the pipeline to 2buf and zbuf,
-# sets the viewing, defines and binds the materials
-#
-def initgl () :
-	#
-	# open window
-	#
-	foreground ()
-	keepaspect (1, 1)
-	prefposition (100, 500, 100, 500)
-	w = winopen ('PYTHON lights')
-	keepaspect (1, 1)
-	winconstraints()
-	#
-	# configure pipeline (zbuf, 2buf, GOURAUD and RGBmode)
-	#
-	zbuffer (1)
-	doublebuffer ()
-	shademodel (GOURAUD)
-	RGBmode ()
-	gconfig ()
-	#
-	# define and bind materials (set perspective BEFORE loadmat !)
-	#
-	mmode(MVIEWING)
-	perspective (900, 1.0, 1.0, 20.0)
-	loadmatrix(idmat)
-	lmdef(DEFMATERIAL, 1, m1)
-	lmdef(DEFMATERIAL, 2, m2)
-	lmdef(DEFMATERIAL, 3, m3)
-	lmdef(DEFLIGHT, 1, light1)
-	lmdef(DEFLIGHT, 2, light2)
-	lmdef(DEFLMODEL, 1, model)
-	lmbind(LIGHT0,1)
-	lmbind(LIGHT1,2)
-	lmbind(LMODEL,1)
-	#
-	# set viewing
-	#
-	lookat (0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0)
-	#
-	# ask for the REDRAW and ESCKEY events
-	#
-	qdevice(DEVICE.MOUSE3)
-	qdevice(DEVICE.MOUSE2)
-	qdevice(DEVICE.REDRAW)
-	qdevice(DEVICE.ESCKEY)
-
-#
-# GoForIT : use 2buf to redraw the object 2n times. index i is used as 
-# the (smoothly changing) rotation angle
-#
-def GoForIt(i) :
-	freeze = 1
-	while 1 :
-		if freeze <> 0 :
-			i = i + 1
-		#
-		# clear z-buffer and clear background to light-blue
-		#
-		zclear()
-		c3i (LightBlue)
-		clear()
-		#
-		# draw the 3 traiangles scaled above each other.
-		#
-		viewobj(float(i),[1.0,1.0,1.0],[1.0,1.0,1.0],1)
-		viewobj(float(i),[0.75,0.75,0.75],[0.0,2.0,2.0],2)
-		viewobj(float(i),[0.5,0.5,0.5],[0.0,4.0,4.0],3)
-		#
-		swapbuffers()
-		#
-		if qtest() <> 0 :
-			dev, val = qread()
-			if dev == DEVICE.ESCKEY :
-				break
-			elif dev == DEVICE.REDRAW :
-				reshapeviewport ()
-			elif dev == DEVICE.MOUSE3 and val <> 0 :
-				freeze = 1 - freeze
-			elif dev == DEVICE.MOUSE2 and val <> 0 :
-				i = i + 1
-
-
-# the main program
-#
-def main () :
-	initgl ()
-	GoForIt (0)
-
-#
-# exec main
-#
-main  ()
diff --git a/Demo/sgi/gl/kunst.py b/Demo/sgi/gl/kunst.py
deleted file mode 100755
index f37f979..0000000
--- a/Demo/sgi/gl/kunst.py
+++ /dev/null
@@ -1,426 +0,0 @@
-#! /usr/bin/env python
-# Simulate the artwork in the hall.
-# Jack Jansen, Feb 91.
-
-from gl import *
-from GL import *
-from math import *
-from DEVICE import *
-import sys
-import __main__
-main_dict = __main__.__dict__
-
-SPOTDIRECTION = 103
-SPOTLIGHT = 104
-
-#
-# Make a cylinder paralel with the Z axis with center (X,Y,0)
-# and radius 1
-def mkcyl(nslice, nparts, docircle):
-        cyl = []
-        step = 2.0 / float(nslice)
-        z = -1.0
-        for i in range(nslice):
-            cyl.append(mkslice(z, z+step, nparts, docircle))
-            z = z + step
-        return drawcylinder(cyl)
-#
-# Make one part of a cylinder
-#
-def mkslice(z1, z2, nparts, docircle):
-        if docircle:
-            w1 = z1
-            w2 = z2
-            w1 = sqrt(1.0-w1*w1)
-            w2 = sqrt(1.0-w2*w2)
-            normalz = 1.0
-        else:
-            w1 = 1.0
-            w2 = 1.0
-            normalz = 0.0
-        slice = []
-        step = (2.0*pi)/float(nparts)
-        angle = 0.0
-        for i in range(nparts+1):
-            vx = cos(angle)
-            vy = sin(angle)
-            slice.append( ((vx*w1,vy*w1,z1), (vx*w1, vy*w1, z1*normalz)) )
-            slice.append( ((vx*w2,vy*w2,z2), (vx*w2, vy*w2, z2*normalz)) )
-            angle = angle + step
-        return slice
-#
-# Drawcylinder : draw the cylinder
-#
-class struct: pass
-curobj = struct()
-curobj.curobj = 1
-def drawcylinder(cyl):
-        obj = curobj.curobj
-        curobj.curobj = curobj.curobj+1
-        makeobj(obj)
-        for slice in cyl:
-            bgntmesh()
-            vnarray(slice)
-            endtmesh()
-        closeobj()
-        return obj
-#
-def drawnormals(cyl):
-        for slice in cyl:
-            for triang in slice:
-                bgnline()
-                v3f(triang[0])
-                v3f(triang[0][0] + triang[1][0], triang[0][1] + triang[1][1], triang[0][2] + triang[1][2])
-                endline()
-def drawfloors():
-        obj = curobj.curobj
-        curobj.curobj = curobj.curobj+1
-        makeobj(obj)
-        bgnpolygon()
-        v3i(4,6,-6)
-        v3i(-6,6,-6)
-        v3i(-6,-6,-6)
-        v3i(4,-6,-6)
-        endpolygon()
-        for floor in range(3):
-            pos = -1 + 5*floor
-            bgnpolygon()
-            v3i(4,4,pos)
-            v3i(-6,4,pos)
-            v3i(-6,6,pos)
-            v3i(4,6,pos)
-            endpolygon()
-            bgnpolygon()
-            v3i(-4,4,pos)
-            v3i(-4,-4,pos)
-            v3i(-6,-4,pos)
-            v3i(-6,4,pos)
-            endpolygon()
-            bgnpolygon()
-            v3i(-6,-4,pos)
-            v3i(-6,-6,pos)
-            v3i(4,-6,pos)
-            v3i(4,-4,pos)
-            endpolygon()
-        closeobj()
-        return obj
-def drawdoors():
-        obj = curobj.curobj
-        curobj.curobj = curobj.curobj+1
-        makeobj(obj)
-        for floor in range(3):
-            pos = -1+5*floor
-            bgnpolygon()
-            v3i(-2,6,pos)
-            v3i(-2,6,pos+3)
-            v3i(0,6,pos+3)
-            v3i(0,6,pos)
-            endpolygon()
-        closeobj()
-        return obj
-def drawrailing():
-        obj = curobj.curobj
-        curobj.curobj = curobj.curobj+1
-        makeobj(obj)
-        for floor in range(3):
-            pos = -1 + 5*floor
-            bgnpolygon()
-            v3i(4,4,pos)
-            v3i(4,4,pos-1)
-            v3i(-4,4,pos-1)
-            v3i(-4,4,pos)
-            endpolygon()
-            bgnpolygon()
-            v3i(-4,4,pos)
-            v3i(-4,4,pos-1)
-            v3i(-4,-4,pos-1)
-            v3i(-4,-4,pos)
-            endpolygon()
-            bgnpolygon()
-            v3i(-4,-4,pos)
-            v3i(-4,-4,pos-1)
-            v3i(4,-4,pos-1)
-            v3i(4,-4,pos)
-            endpolygon()
-        closeobj()
-        return obj
-def drawwalls():
-        obj = curobj.curobj
-        curobj.curobj = curobj.curobj+1
-        makeobj(obj)
-        bgnpolygon()
-        v3i(4,6,-6)
-        v3i(4,6,18)
-        v3i(-6,6,18)
-        v3i(-6,6,-6)
-        endpolygon()
-        bgnpolygon()
-        v3i(-6,6,-6)
-        v3i(-6,6,18)
-        v3i(-6,-6,18)
-        v3i(-6,-6,-6)
-        endpolygon()
-        bgnpolygon()
-        v3i(-6,-6,-6)
-        v3i(-6,-6,18)
-        v3i(4,-6,18)
-        v3i(4,-6,-6)
-        endpolygon()
-        bgnpolygon()
-        v3i(4,-6,-6)
-        v3i(4,-6,18)
-        v3i(4,4,18)
-        v3i(4,4,-6)
-        endpolygon()
-        closeobj()
-        return obj
-def axis():
-        bgnline()
-        cpack(0xff0000)
-        v3i(-1,0,0)
-        v3i(1,0,0)
-        v3f(1.0, 0.1, 0.1)
-        endline()
-        bgnline()
-        cpack(0xff00)
-        v3i(0,-1,0)
-        v3i(0,1,0)
-        v3f(0.1, 1.0, 0.1)
-        endline()
-        bgnline()
-        cpack(0xff)
-        v3i(0,0,-1)
-        v3i(0,0,1)
-        v3f(0.1,0.1,1.0)
-        endline()
-#
-green_velvet = [ DIFFUSE, 0.05, 0.4, 0.05, LMNULL]
-silver = [ DIFFUSE, 0.3, 0.3, 0.3, SPECULAR, 0.9, 0.9, 0.95, \
-        SHININESS, 40.0, LMNULL]
-floormat = [ AMBIENT, 0.5, 0.25, 0.15, DIFFUSE, 0.5, 0.25, 0.15, SPECULAR, 0.6, 0.3, 0.2, SHININESS, 20.0, LMNULL]
-wallmat = [ DIFFUSE, 0.4, 0.2, 0.1, AMBIENT, 0.4, 0.20, 0.10, SPECULAR, 0.0, 0.0, 0.0, SHININESS, 20.0, LMNULL]
-offwhite = [ DIFFUSE, 0.8, 0.8, 0.6, AMBIENT, 0.8, 0.8, 0.6, SPECULAR, 0.9, 0.9, 0.9, SHININESS, 30.0, LMNULL]
-doormat = [ DIFFUSE, 0.1, 0.2, 0.5, AMBIENT, 0.2, 0.4, 1.0, SPECULAR, 0.2, 0.4, 1.0, SHININESS, 60.0, LMNULL]
-
-toplight = [ LCOLOR, 1.0, 1.0, 0.5, \
-        POSITION, 0.0, 0.0, 11.0, 1.0, LMNULL]
-floor1light = [ LCOLOR, 1.0, 1.0, 1.0, POSITION, 3.9, -3.9, 0.0, 1.0, \
-        SPOTDIRECTION, 1.0, 1.0, 0.0, SPOTLIGHT, 10.0, 90.0, LMNULL]
-
-lmodel = [ AMBIENT, 0.92, 0.8, 0.5, LOCALVIEWER, 1.0, LMNULL]
-#
-def lighting():
-        lmdef(DEFMATERIAL, 1, green_velvet)
-        lmdef(DEFMATERIAL, 2, silver)
-        lmdef(DEFMATERIAL, 3, floormat)
-        lmdef(DEFMATERIAL, 4, wallmat)
-        lmdef(DEFMATERIAL, 5, offwhite)
-        lmdef(DEFMATERIAL, 6, doormat)
-        lmdef(DEFLIGHT, 1, toplight)
-        lmdef(DEFLIGHT, 2, floor1light)
-        lmdef(DEFLMODEL, 1, lmodel)
-        lmbind(MATERIAL, 1)
-        lmbind(LIGHT0, 1)
-        lmbind(LIGHT1, 2)
-        lmbind(LMODEL, 1)
-IdMat=[1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0]
-#
-def defun(axis):
-        done = 0
-        while not done:
-            print 'F'+axis+'(t) = ',
-            s = sys.stdin.readline(100)
-            print
-            try:
-                s = 'def f'+axis+'(t): return '+s
-                exec(s, main_dict)
-                done = 1
-            except RuntimeError:
-                print 'Sorry, there is a syntax error in your expression'
-def getfunctions():
-        print 'Welcome to the CWI art simulator. You can now enter X, Y and Z'
-        print 'coordinates as a function of t.'
-        print 'Normal trig functions are available. Please use floating point'
-        print 'values only (so 0.0 for 0). Comments to jack@cwi.nl'
-        defun('x')
-        defun('y')
-        defun('z')
-        print 'Ok, here you go. Use mouse+right button to move up/down,'
-        print 'mouse+middle to speed up/slow down time. type ESC to quit simulation'
-def main():
-        getfunctions()
-        foreground()
-        prefposition(100,600,100,600)
-        void = winopen('cyl')
-        qdevice(ESCKEY)
-        qdevice(MOUSE1)
-        qdevice(MOUSE2)
-        qdevice(PKEY)
-        RGBmode()
-        doublebuffer()
-        gconfig()
-        zbuffer(1)
-        mmode(MVIEWING)
-        perspective(400, 1.0, 1.0, 20.0)
-        loadmatrix(IdMat)
-        vx = 0.0
-        vy = -6.0
-        vz = 0.0
-        lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0)
-        lighting()
-        t = -1.0
-        step = 1.0
-        bol = mkcyl(12,24, 1)
-        cable = mkcyl(1, 6, 0)
-        floors = drawfloors()
-        walls = drawwalls()
-        pillar = mkcyl(1,4,0)
-        railing = drawrailing()
-        doors = drawdoors()
-        shademodel(GOURAUD)
-        mousing = -1
-        pausing = 0
-        while 1:
-            #
-            # Check for some user input
-            #
-            if qtest():
-                dev, value = qread()
-                if dev == PKEY and value == 1:
-                        pausing = 1
-                if dev == ESCKEY:
-                    break
-                elif (dev==MOUSE1 or dev==MOUSE2) and value == 1:
-                    if mousing > 0:
-                        vx = 0.0
-                        vy = -6.0
-                        vz = 0.0
-                    mousing = dev
-                    oldx = getvaluator(MOUSEX)
-                    oldy = getvaluator(MOUSEY)
-                elif (dev==MOUSE1 or dev==MOUSE2):
-                    mousing = -1
-            if mousing >= 0:
-                newx = getvaluator(MOUSEX)
-                newy = getvaluator(MOUSEY)
-                if newy <> oldy and mousing==MOUSE1:
-                    vz = vz + float(newy - oldy)/100.0
-                    dist = sqrt(vx*vx + vy*vy + vz*vz)
-                    perspective(400, 1.0, 1.0, dist+16.0)
-                    loadmatrix(IdMat)
-                    if vz < 0.0:
-                        lookat(vx, vy, vz, 0.0, 0.0, 0.0, 1800)
-                    else:
-                        lookat(vx, vy, vz, 0.0, 0.0, 0.0, 0)
-                if newy <> oldy and mousing==MOUSE2:
-                    step = step * exp(float(newy-oldy)/400.0)
-            if getbutton(CTRLKEY) == 0:
-                t = t + step
-            else:
-                t = t - step
-            if getbutton(LEFTSHIFTKEY) == 0:
-                shademodel(GOURAUD)
-            else:
-                shademodel(FLAT)
-            #
-            # Draw background and axis
-            cpack(0x105090)
-            clear()
-            zclear()
-            cpack(0x905010)
-            axis()
-            #
-            # Draw object
-            #
-            bolx = fx(t)
-            boly = fy(t)
-            bolz = fz(t)
-            err = ''
-            if bolx < -4.0 or bolx > 4.0:
-                err = 'X('+`bolx`+') out of range [-4,4]'
-            if boly < -4.0 or boly > 4.0:
-                err = 'Y('+`boly`+') out of range [-4,4]'
-            if bolz < -4.0 or bolz > 8.0:
-                err = 'Z('+`bolz`+') out of range [-4,8]'
-            if not err:
-                pushmatrix()
-                translate(bolx, boly, bolz)
-                scale(0.3, 0.3, 0.3)
-                lmbind(MATERIAL, 2)
-                callobj(bol)
-                popmatrix()
-                #
-                # Draw the cables
-                #
-                bolz = bolz + 0.3
-                pushmatrix()
-                linesmooth(SML_ON)
-                bgnline()
-                v3i(-4,-4,9)
-                v3f(bolx, boly, bolz)
-                endline()
-                bgnline()
-                v3i(-4,4,9)
-                v3f(bolx, boly, bolz)
-                endline()
-                bgnline()
-                v3i(4,-4,9)
-                v3f(bolx, boly, bolz)
-                endline()
-                bgnline()
-                v3i(4,4,9)
-                v3f(bolx, boly, bolz)
-                endline()
-                popmatrix()
-            #
-            # draw the floors
-            #
-            lmbind(MATERIAL, 3)
-            callobj(floors)
-            lmbind(MATERIAL, 4)
-            callobj(walls)
-            lmbind(MATERIAL, 5)
-            pushmatrix()
-            translate(-4.5,4.5,3.0)
-            scale(0.2,0.2,9.0)
-            rotate(450,'z')
-            callobj(pillar)
-            popmatrix()
-            callobj(railing)
-            lmbind(MATERIAL, 6)
-            pushmatrix()
-            translate(0.0, -0.01, 0.0)
-            callobj(doors)
-            popmatrix()
-            if mousing == MOUSE2 or err:
-                cpack(0xff0000)
-                cmov(0.0, 0.0, 0.4)
-                charstr('t='+`t`)
-            if mousing == MOUSE2:
-                cpack(0xff0000)
-                cmov(0.0, 0.0, 0.2)
-                charstr('delta-t='+`step`)
-            if err:
-                cpack(0xff00)
-                cmov(0.0, 0.0, 0.2)
-                print err
-                charstr(err)
-                pausing = 1
-            if pausing:
-                cpack(0xff00)
-                cmov(0.0, 0.0, 0.0)
-                charstr('Pausing, type P to continue')
-            swapbuffers()
-            if pausing:
-                while 1:
-                    dv=qread()
-                    if dv==(PKEY,1):
-                        break
-                    if dv==(ESCKEY,1):
-                        sys.exit(0)
-                pausing = 0
-#
-try:
-    main()
-except KeyboardInterrupt:
-    sys.exit(1)
diff --git a/Demo/sgi/gl/mclock.doc b/Demo/sgi/gl/mclock.doc
deleted file mode 100755
index 2208f33..0000000
--- a/Demo/sgi/gl/mclock.doc
+++ /dev/null
@@ -1,60 +0,0 @@
-Newsgroups: cwi.sgi
-Subject: Re: new clock
-Distribution: cwi.sgi
-References: <2246@charon.cwi.nl>
-
-Last week I wrote:
-
->For your enjoyment I have implemented a colorful clock.
-
-The clock has now been extended with some new facilities: a menu, an
-alarm and a gong.  These may require some explanation beyond what's in
-the usage message.
-
-Menu
-----
-The right mouse button now pops up a menu that allows you to turn the
-seconds hand on or off and to switch the alarm off.
-
-Alarm
------
-
-The left and middle buttons set the alarm.  When it is on, the alarm
-time is displayed as a time on a 24 hour clock in the bottom left
-corner.  It is also indicated by two red triangles, corresponding to the
-little (hours) and big (minutes) hand.  These hands can be moved around:
-the left mouse button moves the minutes hand, the middle button moves
-the hourds hand.  Watch out for differences of twelve hours (always
-check the digital display); these can be corrected by dragging the hours
-hand once around the dial.
-
-When the alarm goes off, two things happen: a shell command specified on
-the command line with the -a option is executed (in the background), and
-the clock's colors change every two seconds, for five minutes.  You can
-also turn the alarm off by using the menu accessible through the right
-mouse button.
-
-There is no default command for the -a option; if it is not specified,
-only the changing of the colors happens.  If you have an 8 ohm speaker
-connected to the audio output of your Personal Iris, a suitable command
-would be:
-
-	mclock -a '/ufs/guido/bin/sgi/play /ufs/guido/lib/sounds/alarm'
-
-Gong
-----
-
-Some people like a clock that makes noises every hour, or even more
-often.  This is supported by the -g and -G options.  With -g you specify
-a shell command to be executed to sound the gong; with -G you can
-specify the interval between gong calls, in seconds (default is one hour).
-The shell command is executed in the background.  It is given two
-arguments: the hours (on a 24 hour clock!) and the minutes.  The
-executable Python script /ufs/guido/bin/sgi/chime is a suitable example.
-Again, this only works if you have installed a speaker (I bet 8 ohm
-speakers are going to be in demand!)
-
---
-Guido van Rossum, Centre for Mathematics and Computer Science (CWI), Amsterdam
-guido@cwi.nl or ..!hp4nl!cwi.nl!guido or guido%cwi.nl@uunet.uu.net
-"A thing of beauty is a joy till sunrise"
diff --git a/Demo/sgi/gl/mclock.py b/Demo/sgi/gl/mclock.py
deleted file mode 100755
index 6af01ba..0000000
--- a/Demo/sgi/gl/mclock.py
+++ /dev/null
@@ -1,736 +0,0 @@
-#! /usr/bin/env python
-
-# "M Clock"
-#
-# An implementation in software of an original design by Rob Juda.
-# Clock implementation: Guido van Rossum.
-# Alarm and Gong features: Sape Mullender.
-#
-# XXX TO DO:
-# add arguments to specify initial window position and size
-# find out local time zone difference automatically
-# add a date indicator
-# allow multiple alarms
-# allow the menu to change more parameters
-
-import sys
-
-from gl import *
-from GL import *
-from DEVICE import *
-import time
-import getopt
-import string
-import os
-from math import pi
-import math
-
-FULLC = 3600		# Full circle in 1/10-ths of a degree
-MIDN = 900		# Angle of the 12 o'clock position
-R, G, B = 0, 1, 2	# Indices of colors in RGB list
-
-HOUR = 3600		# Number of seconds per hour
-MINUTE = 60		# Number of seconds per minute
-
-class struct: pass	# Class to define featureless structures
-Gl = struct()		# Object to hold writable global variables
-
-# Default constants (used in multiple places)
-
-SCREENBG = 127, 156, 191
-NPARTS = 9
-TITLE = 'M Clock'
-
-# Set timezone, check for daylight saving time
-TZDIFF = time.timezone
-if time.localtime(time.time())[-1]:
-	TZDIFF = time.altzone
-
-# Default parameters
-
-Gl.foreground = 0	# If set, run in the foreground
-Gl.fullscreen = 0	# If set, run on full screen
-Gl.tzdiff = TZDIFF	# Seconds west of Greenwich (winter time)
-Gl.nparts = NPARTS	# Number of parts each circle is divided in (>= 2)
-Gl.debug = 0		# If set, print debug output
-Gl.doublebuffer = 1	# If set, use double buffering
-Gl.update = 0		# Update interval; seconds hand is suppressed if > 1
-Gl.colorsubset = 0	# If set, display only a subset of the colors
-Gl.cyan = 0		# If set, display cyan overlay (big hand)
-Gl.magenta = 0		# If set, display magenta overlay (little hand)
-Gl.yellow = 0		# If set, display yellow overlay (fixed background)
-Gl.black = 0		# If set, display black overlay (hands)
-Gl.colormap = 0		# If set, use colormap mode instead of RGB mode
-Gl.warnings = 0		# If set, print warnings
-Gl.title = ''		# Window title (default set later)
-Gl.name = 'mclock'	# Window title for resources
-Gl.border = 1		# If set, use a window border (and title)
-Gl.bg = 0, 0, 0		# Background color R, G, B value
-Gl.iconic = 0		# Set in iconic state
-Gl.fg = 255, 0, 0	# Alarm background RGB (either normal or alarm)
-Gl.ox,Gl.oy = 0,0	# Window origin
-Gl.cx,Gl.cy = 0,0	# Window size
-Gl.alarm_set = 0	# Alarm on or off
-Gl.alarm_on = 0		# Alarm is ringing
-Gl.alarm_time = 0	# Alarm time in seconds after midnight
-Gl.alarm_hours = 0	# Alarm hour setting, 24 hour clock
-Gl.alarm_minutes = 0	# Alarm minutes setting
-Gl.alarm_rgb = 0,0,0	# Alarm display RGB colors
-Gl.alarm_cmd = ''	# Command to execute when alarm goes off
-Gl.mouse2down = 0	# Mouse button state
-Gl.mouse3down = 0	# Mouse button state
-Gl.gong_cmd = ''	# Command to execute when chimes go off
-Gl.gong_int = 3600	# Gong interval
-Gl.indices = R, G, B	# Colors (permuted when alarm is on)
-
-def main():
-	#
-	sys.stdout = sys.stderr		# All output is errors/warnings etc.
-	#
-	try:
-		args = getoptions()
-	except string.atoi_error, value:
-		usage(string.atoi_error, value)
-	except getopt.error, msg:
-		usage(getopt.error, msg)
-	#
-	if args:
-		realtime = 0
-		hours = string.atoi(args[0])
-		minutes = seconds = 0
-		if args[1:]: minutes = string.atoi(args[1])
-		if args[2:]: seconds = string.atoi(args[2])
-		localtime = ((hours*60)+minutes)*60+seconds
-	else:
-		realtime = 1
-	#
-	if Gl.title == '':
-		if realtime:
-			Gl.title = TITLE
-		else:
-			title = ''
-			for arg in args: title = title + ' ' + arg
-			Gl.title = title[1:]
-			del title
-	#
-	wid = makewindow()
-	Gl.ox,Gl.oy = getorigin()
-	Gl.cx,Gl.cy = getsize()
-	initmenu()
-	clearall()
-	#
-	if not Gl.update:
-		Gl.update = 60
-	#
-	if Gl.update <= 1:
-		Gl.timernoise = 6
-	else:
-		Gl.timernoise = 60
-	noise(TIMER0, Gl.timernoise)
-	#
-	qdevice(WINSHUT)
-	qdevice(WINQUIT)
-	qdevice(ESCKEY)
-	if realtime:
-		qdevice(TIMER0)
-	qdevice(REDRAW)
-	qdevice(WINFREEZE)
-	qdevice(WINTHAW)
-	qdevice(MENUBUTTON)	# MOUSE1
-	qdevice(MOUSE3)		# Left button
-	qdevice(MOUSE2)		# Middle button
-	unqdevice(INPUTCHANGE)
-	#
-	lasttime = 0
-	Gl.change = 1
-	while 1:
-		if realtime:
-			localtime = int(time.time() - Gl.tzdiff)
-		if Gl.alarm_set:
-			if localtime%(24*HOUR) == Gl.alarm_time:
-				# Ring the alarm!
-				if Gl.debug:
-					print 'Rrrringg!'
-				Gl.alarm_on = 1
-				if Gl.alarm_cmd <> '':
-					d = os.system(Gl.alarm_cmd+' '+`Gl.alarm_time/3600`+' '+`(Gl.alarm_time/60)%60` + ' &')
-				Gl.change = 1
-				clearall()
-		if Gl.alarm_on:
-			if (localtime - Gl.alarm_time) % (24*HOUR) > 300:
-				# More than 5 minutes away from alarm
-				Gl.alarm_on = 0
-				if Gl.debug:
-					print 'Alarm turned off'
-				Gl.change = 1
-				clearall()
-				Gl.indices = R, G, B
-			else:
-				if localtime % 2 == 0:
-				  # Permute color indices
-				  Gl.indices = Gl.indices[2:] + Gl.indices[:2]
-				  Gl.change = 1
-		if Gl.gong_cmd <> '' and localtime%Gl.gong_int == 0:
-			d = os.system(Gl.gong_cmd+' '+`(localtime/3600)%24`+' '+`(localtime/60)%60` + ' &')
-		if localtime/Gl.update <> lasttime/Gl.update:
-			if Gl.debug: print 'new time'
-			Gl.change = 1
-		if Gl.change:
-			if Gl.debug: print 'drawing'
-			doit(localtime)
-			lasttime = localtime
-			Gl.change = 0
-		dev, data = qread()
-		if Gl.debug and dev <> TIMER0:
-			print dev, data
-		if dev == TIMER0:
-			if Gl.debug > 1:
-				print dev, data
-		elif dev == MOUSE3:
-			mousex = getvaluator(MOUSEX)
-			mousey = getvaluator(MOUSEY)
-			if mouseclick(3, data, mousex, mousey):
-				Gl.change = 1
-		elif dev == MOUSE2:
-			mousex = getvaluator(MOUSEX)
-			mousey = getvaluator(MOUSEY)
-			if mouseclick(2, data, mousex, mousey):
-				Gl.change = 1
-		elif dev == MOUSEX:
-			mousex = data
-			if Gl.mouse2down:
-				mouse2track(mousex, mousey)
-			if Gl.mouse3down:
-				mouse3track(mousex, mousey)
-		elif dev == MOUSEY:
-			mousey = data
-			if Gl.mouse2down:
-				mouse2track(mousex, mousey)
-			if Gl.mouse3down:
-				mouse3track(mousex, mousey)
-		elif dev == REDRAW or dev == REDRAWICONIC:
-			if Gl.debug:
-				if dev == REDRAW: print 'REDRAW'
-				else: print 'REDRAWICONIC'
-			reshapeviewport()
-			Gl.ox,Gl.oy = getorigin()
-			Gl.cx,Gl.cy = getsize()
-			Gl.change = 1
-			clearall()
-		elif dev == MENUBUTTON:
-			if Gl.debug: print 'MENUBUTTON'
-			handlemenu()
-		elif dev == WINFREEZE:
-			if Gl.debug: print 'WINFREEZE'
-			Gl.iconic = 1
-			noise(TIMER0, 60*60) # Redraw every 60 seconds only
-		elif dev == WINTHAW:
-			if Gl.debug: print 'WINTHAW'
-			Gl.iconic = 0
-			noise(TIMER0, Gl.timernoise)
-			Gl.change = 1
-		elif dev == ESCKEY or dev == WINSHUT or dev == WINQUIT:
-			if Gl.debug: print 'Exit'
-			sys.exit(0)
-
-def getoptions():
-	optlist, args = getopt.getopt(sys.argv[1:], 'A:a:B:bc:dFfG:g:n:sT:t:u:wCMYK')
-	for optname, optarg in optlist:
-		if optname == '-A':
-			Gl.fg = eval(optarg)	# Should be (r,g,b)
-		elif optname == '-a':
-			Gl.alarm_cmd = optarg
-		elif optname == '-B':
-			Gl.bg = eval(optarg)	# Should be (r,g,b)
-		elif optname == '-b':
-			Gl.border = 0
-		elif optname == '-c':
-			Gl.colormap = string.atoi(optarg)
-		elif optname == '-d':
-			Gl.debug = Gl.debug + 1
-			Gl.warnings = 1
-		elif optname == '-F':
-			Gl.foreground = 1
-		elif optname == '-f':
-			Gl.fullscreen = 1
-		elif optname == '-G':
-			Gl.gong_int = 60*string.atoi(optarg)
-		elif optname == '-g':
-			Gl.gong_cmd = optarg
-		elif optname == '-n':
-			Gl.nparts = string.atoi(optarg)
-		elif optname == '-s':
-			Gl.doublebuffer = 0
-		elif optname == '-T':
-			Gl.title = Gl.name = optarg
-		elif optname == '-t':
-			Gl.tzdiff = string.atoi(optarg)
-		elif optname == '-u':
-			Gl.update = string.atoi(optarg)
-		elif optname == '-w':
-			Gl.warnings = 1
-		elif optname == '-C':
-			Gl.cyan = Gl.colorsubset = 1
-		elif optname == '-M':
-			Gl.magenta = Gl.colorsubset = 1
-		elif optname == '-Y':
-			Gl.yellow = Gl.colorsubset = 1
-		elif optname == '-K':
-			Gl.black = Gl.colorsubset = 1
-		else:
-			print 'Unsupported option', optname
-	return args
-
-def usage(exc, msg):
-	if sys.argv:
-		progname = os.path.basename(sys.argv[0])
-	else:
-		progname = 'mclock'
-	#
-	print progname + ':',
-	if exc == string.atoi_error:
-		print 'non-numeric argument:',
-	print msg
-	#
-	print 'usage:', progname, '[options] [hh [mm [ss]]]'
-	#
-	print '-A r,g,b  : alarm background red,green,blue [255,0,0]'
-	print '-a cmd    : shell command executed when alarm goes off'
-	print '-B r,g,b  : background red,green,blue [0,0,0]'
-	print '            (-B SCREENBG uses the default screen background)'
-	print '-b        : suppress window border and title'
-	print '-c cmapid : select explicit colormap'
-	print '-d        : more debug output (implies -F, -w)'
-	print '-F        : run in foreground'
-	print '-f        : use full screen'
-	print '-G intrvl : interval between chimes in minutes [60]'
-	print '-g cmd    : shell command executed when chimes go off'
-	print '-s        : single buffer mode'
-	print '-w        : print various warnings'
-	print '-n nparts : number of parts [' + `NPARTS` + ']'
-	print '-T title  : alternate window title [\'' + TITLE + '\']'
-	print '-t tzdiff : time zone difference [' + `TZDIFF` + ']'
-	print '-u update : update interval [60]'
-	print '-CMYK     : Cyan, Magenta, Yellow or blacK overlay only'
-	print 'if hh [mm [ss]] is specified, display that time statically'
-	print 'on machines with < 12 bitplanes, -s is forced on'
-	#
-	sys.exit(2)
-
-def doit(localtime):
-	hands = makehands(localtime)
-	list = makelist(hands)
-	render(list, hands)
-
-def makehands(localtime):
-	localtime = localtime % (12*HOUR)
-	seconds_hand = MIDN + FULLC - (localtime*60) % FULLC
-	big_hand = (MIDN + FULLC - (localtime%HOUR)) % FULLC
-	little_hand = (MIDN + FULLC - ((localtime/12) % HOUR)) % FULLC
-	return little_hand, big_hand, seconds_hand
-
-def makelist(hands):
-	little_hand, big_hand, seconds_hand = hands
-	total = []
-	if Gl.cyan or not Gl.colorsubset:
-		total = total + makesublist(big_hand, Gl.indices[0])
-	if Gl.magenta or not Gl.colorsubset:
-		total = total + makesublist(little_hand, Gl.indices[1])
-	if Gl.yellow or not Gl.colorsubset:
-		total = total + makesublist(MIDN, Gl.indices[2])
-	total.sort()
-	return total
-
-def makesublist(first, icolor):
-	list = []
-	alpha = FULLC/Gl.nparts
-	a = first - alpha/2
-	for i in range(Gl.nparts):
-		angle = (a + i*alpha + FULLC) % FULLC
-		value = 255*(Gl.nparts-1-i)/(Gl.nparts-1)
-		list.append((angle, icolor, value))
-	list.sort()
-	a, icolor, value = list[0]
-	if a <> 0:
-		a, icolor, value = list[len(list)-1]
-		t = 0, icolor, value
-		list.insert(0, t)
-	return list
-
-def rgb_fg():
-	return Gl.fg
-	# Obsolete code:
-	if Gl.alarm_on:
-		return Gl.bg
-	else:
-		return Gl.fg
-
-def rgb_bg():
-	return Gl.bg
-	# Obsolete code:
-	if Gl.alarm_on:
-		return Gl.fg
-	else:
-		return Gl.bg
-
-def clearall():
-	Gl.c3i(rgb_bg())
-	clear()
-	if Gl.doublebuffer:
-		swapbuffers()
-		clear()
-
-def draw_alarm(color):
-	frontbuffer(TRUE)
-	Gl.c3i(color)
-	pushmatrix()
-	rotate(-((Gl.alarm_time/12)%3600), 'z')
-	bgnpolygon()
-	v2f( 0.00,1.00)
-	v2f( 0.04,1.05)
-	v2f(-0.04,1.05)
-	endpolygon()
-	popmatrix()
-	#
-	pushmatrix()
-	rotate(-((Gl.alarm_time)%3600), 'z')
-	bgnpolygon()
-	v2f( 0.00,1.05)
-	v2f( 0.07,1.10)
-	v2f(-0.07,1.10)
-	endpolygon()
-	popmatrix()
-	#
-	cmov2(-1.06, -1.06)
-	charstr(string.rjust(`Gl.alarm_time/3600`,2))
-	charstr(':')
-	charstr(string.zfill((Gl.alarm_time/60)%60,2))
-	frontbuffer(FALSE)
-
-def render(list, (little_hand, big_hand, seconds_hand)):
-	#
-	if Gl.colormap:
-		resetindex()
-	#
-	if not list:
-		Gl.c3i((255, 255, 255)) # White
-		circf(0.0, 0.0, 1.0)
-	else:
-		list.append((3600, 0, 255)) # Sentinel
-	#
-	rgb = [255, 255, 255]
-	a_prev = 0
-	for a, icolor, value in list:
-		if a <> a_prev:
-			[r, g, b] = rgb
-			if Gl.debug > 1:
-				print rgb, a_prev, a
-			Gl.c3i((r, g, b))
-			arcf(0.0, 0.0, 1.0, a_prev, a)
-		rgb[icolor] = value
-		a_prev = a
-	#
-	if Gl.black or not Gl.colorsubset:
-		#
-		# Draw the hands -- in black
-		#
-		Gl.c3i((0, 0, 0))
-		#
-		if Gl.update == 1 and not Gl.iconic:
-			# Seconds hand is only drawn if we update every second
-			pushmatrix()
-			rotate(seconds_hand, 'z')
-			bgnline()
-			v2f(0.0, 0.0)
-			v2f(1.0, 0.0)
-			endline()
-			popmatrix()
-		#
-		pushmatrix()
-		rotate(big_hand, 'z')
-		rectf(0.0, -0.01, 0.97, 0.01)
-		circf(0.0, 0.0, 0.01)
-		circf(0.97, 0.0, 0.01)
-		popmatrix()
-		#
-		pushmatrix()
-		rotate(little_hand, 'z')
-		rectf(0.04, -0.02, 0.63, 0.02)
-		circf(0.04, 0.0, 0.02)
-		circf(0.63, 0.0, 0.02)
-		popmatrix()
-		#
-		# Draw the alarm time, if set or being set
-		#
-		if Gl.alarm_set:
-			draw_alarm(rgb_fg())
-	#
-	if Gl.doublebuffer: swapbuffers()
-
-def makewindow():
-	#
-	if Gl.debug or Gl.foreground:
-		foreground()
-	#
-	if Gl.fullscreen:
-		scrwidth, scrheight = getgdesc(GD_XPMAX), getgdesc(GD_YPMAX)
-		prefposition(0, scrwidth-1, 0, scrheight-1)
-	else:
-		keepaspect(1, 1)
-		prefsize(80, 80)
-	#
-	if not Gl.border:
-		noborder()
-	wid = winopen(Gl.name)
-	wintitle(Gl.title)
-	#
-	if not Gl.fullscreen:
-		keepaspect(1, 1)
-		minsize(10, 10)
-		maxsize(2000, 2000)
-		iconsize(66, 66)
-		winconstraints()
-	#
-	nplanes = getplanes()
-	nmaps = getgdesc(GD_NMMAPS)
-	if Gl.warnings:
-		print nplanes, 'color planes,', nmaps, 'color maps'
-	#
-	if Gl.doublebuffer and not Gl.colormap and nplanes < 12:
-		if Gl.warnings: print 'forcing single buffer mode'
-		Gl.doublebuffer = 0
-	#
-	if Gl.colormap:
-		if not Gl.colormap:
-			Gl.colormap = nmaps - 1
-			if Gl.warnings:
-				print 'not enough color planes available',
-				print 'for RGB mode; forcing colormap mode'
-				print 'using color map number', Gl.colormap
-		if not Gl.colorsubset:
-			needed = 3
-		else:
-			needed = Gl.cyan + Gl.magenta + Gl.yellow
-		needed = needed*Gl.nparts
-		if Gl.bg <> (0, 0, 0):
-			needed = needed+1
-		if Gl.fg <> (0, 0, 0):
-			needed = needed+1
-		if Gl.doublebuffer:
-			if needed > available(nplanes/2):
-				Gl.doublebuffer = 0
-				if Gl.warnings:
-					print 'not enough colors available',
-					print 'for double buffer mode;',
-					print 'forcing single buffer mode'
-			else:
-				nplanes = nplanes/2
-		if needed > available(nplanes):
-			# Do this warning always
-			print 'still not enough colors available;',
-			print 'parts will be left white'
-			print '(needed', needed, 'but have only',
-			print available(nplanes), 'colors available)'
-	#
-	if Gl.doublebuffer:
-		doublebuffer()
-		gconfig()
-	#
-	if Gl.colormap:
-		Gl.c3i = pseudo_c3i
-		fixcolormap()
-	else:
-		Gl.c3i = c3i
-		RGBmode()
-		gconfig()
-	#
-	if Gl.fullscreen:
-		# XXX Should find out true screen size using getgdesc()
-		ortho2(-1.1*1.280, 1.1*1.280, -1.1*1.024, 1.1*1.024)
-	else:
-		ortho2(-1.1, 1.1, -1.1, 1.1)
-	#
-	return wid
-
-def available(nplanes):
-	return pow(2, nplanes) - 1	# Reserve one pixel for black
-
-def fixcolormap():
-	multimap()
-	gconfig()
-	nplanes = getplanes()
-	if Gl.warnings:
-		print 'multimap mode has', nplanes, 'color planes'
-	imap = Gl.colormap
-	Gl.startindex = pow(2, nplanes) - 1
-	Gl.stopindex = 1
-	setmap(imap)
-	mapcolor(0, 0, 0, 0) # Fixed entry for black
-	if Gl.bg <> (0, 0, 0):
-		r, g, b = Gl.bg
-		mapcolor(1, r, g, b) # Fixed entry for Gl.bg
-		Gl.stopindex = 2
-	if Gl.fg <> (0, 0, 0):
-		r, g, b = Gl.fg
-		mapcolor(2, r, g, b) # Fixed entry for Gl.fg
-		Gl.stopindex = 3
-	Gl.overflow_seen = 0
-	resetindex()
-
-def resetindex():
-	Gl.index = Gl.startindex
-
-r0g0b0 = (0, 0, 0)
-
-def pseudo_c3i(rgb):
-	if rgb == r0g0b0:
-		index = 0
-	elif rgb == Gl.bg:
-		index = 1
-	elif rgb == Gl.fg:
-		index = 2
-	else:
-		index = definecolor(rgb)
-	color(index)
-
-def definecolor(rgb):
-	index = Gl.index
-	if index < Gl.stopindex:
-		if Gl.debug: print 'definecolor hard case', rgb
-		# First see if we already have this one...
-		for index in range(Gl.stopindex, Gl.startindex+1):
-			if rgb == getmcolor(index):
-				if Gl.debug: print 'return', index
-				return index
-		# Don't clobber reserverd colormap entries
-		if not Gl.overflow_seen:
-			# Shouldn't happen any more, hence no Gl.warnings test
-			print 'mclock: out of colormap entries'
-			Gl.overflow_seen = 1
-		return Gl.stopindex
-	r, g, b = rgb
-	if Gl.debug > 1: print 'mapcolor', (index, r, g, b)
-	mapcolor(index, r, g, b)
-	Gl.index = index - 1
-	return index
-
-# Compute n**i
-def pow(n, i):
-	x = 1
-	for j in range(i): x = x*n
-	return x
-
-def mouseclick(mouse, updown, x, y):
-	if updown == 1:
-		# mouse button came down, start tracking
-		if Gl.debug:
-			print 'mouse', mouse, 'down at', x, y
-		if mouse == 2:
-			Gl.mouse2down = 1
-			mouse2track(x, y)
-		elif mouse == 3:
-			Gl.mouse3down = 1
-			mouse3track(x, y)
-		else:
-			print 'fatal error'
-		qdevice(MOUSEX)
-		qdevice(MOUSEY)
-		return 0
-	else:
-		# mouse button came up, stop tracking
-		if Gl.debug:
-			print 'mouse', mouse, 'up at', x, y
-		unqdevice(MOUSEX)
-		unqdevice(MOUSEY)
-		if mouse == 2:
-			mouse2track(x, y)
-			Gl.mouse2down = 0
-		elif mouse == 3:
-			mouse3track(x, y)
-			Gl.mouse3down = 0
-		else:
-			print 'fatal error'
-		Gl.alarm_set = 1
-		return 1
-
-def mouse3track(x, y):
-	# first compute polar coordinates from x and y
-	cx, cy = Gl.ox + Gl.cx/2, Gl.oy + Gl.cy/2
-	x, y = x - cx, y - cy
-	if (x, y) == (0, 0): return	# would cause an exception
-	minutes = int(30.5 + 30.0*math.atan2(float(-x), float(-y))/pi)
-	if minutes == 60: minutes = 0
-	a,b = Gl.alarm_minutes/15, minutes/15
-	if (a,b) == (0,3):
-		# Moved backward through 12 o'clock:
-		Gl.alarm_hours = Gl.alarm_hours - 1
-		if Gl.alarm_hours < 0: Gl.alarm_hours = Gl.alarm_hours + 24
-	if (a,b) == (3,0):
-		# Moved forward through 12 o'clock:
-		Gl.alarm_hours = Gl.alarm_hours + 1
-		if Gl.alarm_hours >= 24: Gl.alarm_hours = Gl.alarm_hours - 24
-	Gl.alarm_minutes = minutes
-	seconds = Gl.alarm_hours * HOUR + Gl.alarm_minutes * MINUTE
-	if seconds <> Gl.alarm_time:
-		draw_alarm(rgb_bg())
-		Gl.alarm_time = seconds
-		draw_alarm(rgb_fg())
-
-def mouse2track(x, y):
-	# first compute polar coordinates from x and y
-	cx, cy = Gl.ox + Gl.cx/2, Gl.oy + Gl.cy/2
-	x, y = x - cx, y - cy
-	if (x, y) == (0, 0): return	# would cause an exception
-	hours = int(6.5 - float(Gl.alarm_minutes)/60.0 + 6.0*math.atan2(float(-x), float(-y))/pi)
-	if hours == 12: hours = 0
-	if (Gl.alarm_hours,hours) == (0,11):
-		# Moved backward through midnight:
-		Gl.alarm_hours = 23
-	elif (Gl.alarm_hours,hours) == (12,11):
-		# Moved backward through noon:
-		Gl.alarm_hours = 11
-	elif (Gl.alarm_hours,hours) == (11,0):
-		# Moved forward through noon:
-		Gl.alarm_hours = 12
-	elif (Gl.alarm_hours,hours) == (23,0):
-		# Moved forward through midnight:
-		Gl.alarm_hours = 0
-	elif Gl.alarm_hours < 12:
-		Gl.alarm_hours = hours
-	else:
-		Gl.alarm_hours = hours + 12
-	seconds = Gl.alarm_hours * HOUR + Gl.alarm_minutes * MINUTE
-	if seconds <> Gl.alarm_time:
-		draw_alarm(rgb_bg())
-		Gl.alarm_time = seconds
-		draw_alarm(rgb_fg())
-
-def initmenu():
-	Gl.pup = pup = newpup()
-	addtopup(pup, 'M Clock%t|Alarm On/Off|Seconds Hand On/Off|Quit', 0)
-
-def handlemenu():
-	item = dopup(Gl.pup)
-	if item == 1:
-		# Toggle alarm
-		if Gl.alarm_set:
-			Gl.alarm_set = 0
-			Gl.alarm_on = 0
-		else:
-			Gl.alarm_set = 1
-		Gl.change = 1
-		clearall()
-	elif item == 2:
-		# Toggle Seconds Hand
-		if Gl.update == 1:
-			Gl.update = 60
-			Gl.timernoise = 60
-		else:
-			Gl.update = 1
-			Gl.timernoise = 6
-		Gl.change = 1
-	elif item == 3:
-		if Gl.debug: print 'Exit'
-		sys.exit(0)
-
-main()
diff --git a/Demo/sgi/gl/mixing.py b/Demo/sgi/gl/mixing.py
deleted file mode 100755
index 9a4c9c1..0000000
--- a/Demo/sgi/gl/mixing.py
+++ /dev/null
@@ -1,116 +0,0 @@
-#! /usr/bin/env python
-
-# Use Gouraud shading to mix colors.  Requires Z-buffer.
-# It changes the color assignments so fast that you see white.
-# Left button pauses, middle rotates the square.  ESC to quit.
-# Experiment with a larger window (too slow) or smaller window (really white).
-
-from GL import *
-from gl import *
-import DEVICE
-from math import *
-
-#
-#  tekenvlak : draw a square. with bgnpolygon
-#
-def tekenvlak (vc) :
-	bgnpolygon()
-	#vcarray (vc)
-	for i in vc :
-		c3f (i[1])
-		v3f (i[0])
-	endpolygon()
-
-#
-# tekendoos : draw a box
-#
-def tekendoos (col) :
-	v = [(-5.0,0.0,0.0),(0.0,5.0,0.0),(5.0,0.0,0.0),(0.0,-5.0,0.0)]
-	vc = [(v[0],col[0]),(v[1],col[1]),(v[2],col[2]),(v[3],col[1])]
-	tekenvlak (vc)
-
-#
-# initialize gl
-#
-def initgl () :
-	#
-	# open window
-	#
-	foreground ()
-	keepaspect (1, 1)
-	prefposition (100, 500, 100, 500)
-	w = winopen ('PYTHON RGB')
-	keepaspect (1, 1)
-	winconstraints()
-	#
-	# configure pipeline (2buf, GOURAUD and RGBmode)
-	#
-	doublebuffer ()
-	zbuffer (1)
-	shademodel (GOURAUD)
-	RGBmode ()
-	gconfig ()
-	#
-	# set viewing
-	#
-	perspective (900, 1, 1.0, 10.0)
-	polarview (10.0, 0, 0, 0)
-	#
-	# ask for the REDRAW and ESCKEY events
-	#
-	qdevice(DEVICE.MOUSE2)
-	qdevice(DEVICE.MOUSE3)
-	qdevice(DEVICE.REDRAW)
-	qdevice(DEVICE.ESCKEY)
-
-
-#
-# the color black
-#
-black = 0
-#
-# GoForIT : use 2buf to redraw the object 2n times. index i is used as 
-# the (smoothly changing) rotation angle
-#
-def GoForIt(i) :
-	col = [(255.0,0.0,0.0), (0.0,255.0,0.0), (0.0,0.0,255.0)]
-	twist = 0
-	freeze = 1
-	while 1 :
-		if freeze <> 0 :
-			col[0],col[1],col[2] = col[1],col[2],col[0]
-		#
-		# clear z-buffer and clear background to light-blue
-		#
-		zclear()
-		cpack (black)
-		clear()
-		#
-		tekendoos (col)
-		#
-		swapbuffers()
-		#
-		if qtest() <> 0 :
-			dev, val = qread()
-			if dev == DEVICE.ESCKEY :
-				break
-			elif dev == DEVICE.REDRAW :
-				reshapeviewport ()
-			elif dev == DEVICE.MOUSE2 and val <> 0 :
-				twist = twist + 30
-				perspective (900, 1, 1.0, 10.0)
-				polarview (10.0, 0, 0, twist)
-			elif dev == DEVICE.MOUSE3 and val <> 0 :
-				freeze = 1 - freeze
-
-
-# the main program
-#
-def main () :
-	initgl ()
-	GoForIt (0)
-
-#
-# exec main
-#
-main  ()
diff --git a/Demo/sgi/gl/nurbs.py b/Demo/sgi/gl/nurbs.py
deleted file mode 100755
index 6efef48..0000000
--- a/Demo/sgi/gl/nurbs.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#! /usr/bin/env python
-
-# Rotate a 3D surface created using NURBS.
-#
-# Press left mouse button to toggle surface trimming.
-# Press ESC to quit.
-#
-# See the GL manual for an explanation of NURBS.
-
-from gl import *
-from GL import *
-from DEVICE import *
-
-TRUE = 1
-FALSE = 0
-ORDER = 4
-
-idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
-
-surfknots = [-1, -1, -1, -1, 1, 1, 1, 1]
-
-def make_ctlpoints():
-	c = []
-	#
-	ci = []
-	ci.append((-2.5,  -3.7,  1.0))
-	ci.append((-1.5,  -3.7,  3.0))
-	ci.append((1.5,  -3.7, -2.5))
-	ci.append((2.5,  -3.7,  -0.75))
-	c.append(ci)
-	#
-	ci = []
-	ci.append((-2.5,  -2.0,  3.0))
-	ci.append((-1.5,  -2.0,  4.0))
-	ci.append((1.5,  -2.0,  -3.0))
-	ci.append((2.5,  -2.0,  0.0))
-	c.append(ci)
-	#
-	ci = []
-	ci.append((-2.5, 2.0,  1.0))
-	ci.append((-1.5, 2.0,  0.0))
-	ci.append((1.5,  2.0,  -1.0))
-	ci.append((2.5,  2.0,  2.0))
-	c.append(ci)
-	#
-	ci = []
-	ci.append((-2.5,  2.7,  1.25))
-	ci.append((-1.5,  2.7,  0.1))
-	ci.append((1.5,  2.7,  -0.6))
-	ci.append((2.5,  2.7,  0.2))
-	c.append(ci)
-	#
-	return c
-
-ctlpoints = make_ctlpoints()
-
-trimknots = [0., 0., 0.,  1., 1.,  2., 2.,  3., 3.,   4., 4., 4.]
-
-def make_trimpoints():
-	c = []
-	c.append((1.0, 0.0, 1.0))
-	c.append((1.0, 1.0, 1.0))
-	c.append((0.0, 2.0, 2.0))
-	c.append((-1.0, 1.0, 1.0))
-	c.append((-1.0, 0.0, 1.0))
-	c.append((-1.0, -1.0, 1.0))
-	c.append((0.0, -2.0, 2.0))
-	c.append((1.0, -1.0, 1.0) )
-	c.append((1.0, 0.0, 1.0))
-	return c
-
-trimpoints = make_trimpoints()
-
-def main():
-	init_windows()
-	setup_queue()
-	make_lights()
-	init_view()
-	#
-	set_scene()
-	setnurbsproperty( N_ERRORCHECKING, 1.0 )
-	setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 )
-	trim_flag = 0
-	draw_trim_surface(trim_flag)
-	#
-	while 1:
-		while qtest():
-			dev, val = qread()
-			if dev == ESCKEY:
-				return
-			elif dev == WINQUIT:
-				dglclose(-1)	# this for DGL only
-				return
-			elif dev == REDRAW:
-				reshapeviewport()
-				set_scene()
-				draw_trim_surface(trim_flag)
-			elif dev == LEFTMOUSE:
-				if val:
-					trim_flag = (not trim_flag)
-		set_scene()
-		draw_trim_surface(trim_flag)
-
-def init_windows():
-	foreground()
-	#prefposition(0, 500, 0, 500)
-	wid = winopen('nurbs')
-	wintitle('NURBS Surface')
-	doublebuffer()
-	RGBmode()
-	gconfig()
-	lsetdepth(0x000, 0x7fffff)
-	zbuffer( TRUE )
-
-def setup_queue():
-	qdevice(ESCKEY)
-	qdevice(REDRAW)
-	qdevice(RIGHTMOUSE)
-	qdevice(WINQUIT)
-	qdevice(LEFTMOUSE) #trimming
-
-def init_view():
-	mmode(MPROJECTION)
-	ortho( -4., 4., -4., 4., -4., 4. )
-	#
-	mmode(MVIEWING)
-	loadmatrix(idmat)
-	#
-	lmbind(MATERIAL, 1)
-
-def set_scene():
-	lmbind(MATERIAL, 0)
-	RGBcolor(150,150,150)
-	lmbind(MATERIAL, 1)
-	clear()
-	zclear()
-	#
-	rotate( 100, 'y' )
-	rotate( 100, 'z' )
-
-def draw_trim_surface(trim_flag):
-	bgnsurface()
-	nurbssurface(surfknots, surfknots, ctlpoints, ORDER, ORDER, N_XYZ)
-	if trim_flag:
-		bgntrim()
-		nurbscurve(trimknots, trimpoints, ORDER-1, N_STW)
-		endtrim()
-	endsurface()
-	swapbuffers()
-
-def make_lights():
-	lmdef(DEFLMODEL,1,[])
-	lmdef(DEFLIGHT,1,[])
-	#
-	# define material #1
-	#
-	a = []
-	a = a + [EMISSION, 0.0, 0.0, 0.0]
-	a = a + [AMBIENT,  0.1, 0.1, 0.1]
-	a = a + [DIFFUSE,  0.6, 0.3, 0.3]
-	a = a + [SPECULAR,  0.0, 0.6, 0.0]
-	a = a + [SHININESS, 2.0]
-	a = a + [LMNULL]
-	lmdef(DEFMATERIAL, 1, a)
-	#
-	# turn on lighting
-	#
-	lmbind(LIGHT0, 1)
-	lmbind(LMODEL, 1)
-
-main()
diff --git a/Demo/sgi/gl/zrgb.py b/Demo/sgi/gl/zrgb.py
deleted file mode 100755
index 2ad68c9..0000000
--- a/Demo/sgi/gl/zrgb.py
+++ /dev/null
@@ -1,168 +0,0 @@
-#! /usr/bin/env python
-
-#   zrgb  (Requires Z buffer.)
-#
-# This program demostrates zbuffering 3 intersecting RGB polygons while
-# in doublebuffer mode where, movement of the mouse with the LEFTMOUSE 
-# button depressed will, rotate the 3 polygons. This is done by compound
-# rotations allowing continuous screen-oriented rotations. 
-#
-#    Press the "Esc" key to exit.  
-
-from gl import *
-from GL import *
-from DEVICE import *
-
-
-idmat=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
-
-def main() :
-	#
-	# old and new mouse position
-	#
-	#
-	mode = 0
-	omx = 0
-	mx = 0
-	omy = 0
-	my = 0
-	#
-	objmat=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
-	#
-	initialize ()
-	#
-	draw_scene (objmat)
-	#
-	while (1) :
-		#
-		dev, val = qread()
-		#
-		if dev == ESCKEY :
-			if val :
-				break	
-			# exit when key is going up, not down
-			# this avoids the scenario where a window 
-			# underneath this program's window
-			# would otherwise "eat up" the up-
-			# event of the Esc key being released
-			return        
-			#
-		elif dev == REDRAW :
-			reshapeviewport()
-			draw_scene(objmat)
-			#
-		elif dev == LEFTMOUSE:
-			omx = mx
-			omy = my
-			if val :
-				mode = 1
-			else :
-				mode = 0
-		elif dev == MOUSEX :
-			omx = mx
-			mx = val
-			#print omx, mx
-			objmat = update_scene(objmat,mx,my,omx,omy,mode)
-			#
-		elif dev == MOUSEY :
-			omy = my
-			my = val
-			#print omy, my
-			objmat = update_scene(objmat,mx,my,omx,omy,mode)
-			#
-
-
-def initialize () :
-	#
-	foreground ()
-	keepaspect(5, 4)
-	w = winopen('Zbuffered RGB')
-	#
-	doublebuffer()
-	RGBmode()
-	gconfig()
-	zbuffer(1)
-	lsetdepth(0x0, 0x7FFFFF)
-	#
-	qdevice(ESCKEY)
-	qdevice(LEFTMOUSE)
-	qdevice(MOUSEX)
-	qdevice(MOUSEY)
-
-def update_scene (mat, mx, my, omx, omy, mode) :
-	#
-	if mode == 1 :
-		mat = orient(mat, mx, my, omx, omy)
-		draw_scene(mat)
-	return mat
-
-def orient (mat, mx, my, omx, omy) :
-	#
-	#
-	pushmatrix()
-	loadmatrix(idmat)
-	#
-	if mx - omx : rot (float (mx - omx), 'y')
-	if omy - my : rot (float (omy - my), 'x')
-	#
-	multmatrix(mat)
-	mat = getmatrix()
-	#
-	popmatrix()
-	#
-	return mat
-
-def draw_scene (mat) :
-	RGBcolor(40, 100, 200)
-	clear()
-	zclear()
-	#
-	perspective(400, 1.25, 30.0, 60.0)
-	translate(0.0, 0.0, -40.0)
-	multmatrix(mat)
-	#
-	# skews original view to show all polygons
-	#
-	rotate(-580, 'y')
-	draw_polys()
-	#
-	swapbuffers()
-
-polygon1 = [(-10.0,-10.0,0.0),(10.0,-10.0,0.0),(-10.0,10.0,0.0)]
-
-polygon2 = [(0.0,-10.0,-10.0),(0.0,-10.0,10.0),(0.0,5.0,-10.0)]
-
-polygon3 = [(-10.0,6.0,4.0),(-10.0,3.0,4.0),(4.0,-9.0,-10.0),(4.0,-6.0,-10.0)]
-
-def draw_polys():
-	bgnpolygon()
-	cpack(0x0)
-	v3f(polygon1[0])
-	cpack(0x007F7F7F)
-	v3f(polygon1[1])
-	cpack(0x00FFFFFF)
-	v3f(polygon1[2])
-	endpolygon()
-	#
-	bgnpolygon()
-	cpack(0x0000FFFF)
-	v3f(polygon2[0])
-	cpack(0x007FFF00)
-	v3f(polygon2[1])
-	cpack(0x00FF0000)
-	v3f(polygon2[2])
-	endpolygon()
-	#
-	bgnpolygon()
-	cpack(0x0000FFFF)
-	v3f(polygon3[0])
-	cpack(0x00FF00FF)
-	v3f(polygon3[1])
-	cpack(0x00FF0000)
-	v3f(polygon3[2])
-	cpack(0x00FF00FF)
-	v3f(polygon3[3])
-	endpolygon()
-
-
-main ()
diff --git a/Demo/sgi/video/.cvsignore b/Demo/sgi/video/.cvsignore
deleted file mode 100755
index 6d28ed6..0000000
--- a/Demo/sgi/video/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-VeditForm.fdc
diff --git a/Demo/sgi/video/DisplayVideoIn.py b/Demo/sgi/video/DisplayVideoIn.py
deleted file mode 100755
index 6dbc7bc..0000000
--- a/Demo/sgi/video/DisplayVideoIn.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# Live video input from display class.
-
-import gl
-import GL
-
-# The live video input class.
-# Only instantiate this if have_video is true!
-
-class DisplayVideoIn:
-
-	# Initialize an instance.  Arguments:
-	# vw, vh: size of the video window data to be captured.
-	# position defaults to 0, 0 but can be set later
-	def __init__(self, pktmax, vw, vh, type):
-		self.pktmax = pktmax
-		self.realwidth, self.realheight = vw, vh
-		if type <> 'rgb':
-			raise 'Incorrent video data type', type
-		self.type = type
-		self.width = vw
-		self.height = vh
-		#
-		# Open dummy window
-		#
-		gl.foreground()
-		gl.noport()
-		self.wid = gl.winopen('DisplayVideoIn')
-		
-		self.x0 = 0
-		self.x1 = self.x0 + self.width - 1
-		self.y0 = 0
-		self.y1 = self.y0 + self.height - 1
-		# Compute # full lines per packet
-		self.lpp = pktmax / self.linewidth()
-		if self.lpp <= 0:
-			raise 'No lines in packet', self.linewidth()
-		self.pktsize = self.lpp*self.linewidth()
-		self.data = None
-		self.old_data = None
-		self.dataoffset = 0
-		self.lpos = 0
-		self.hints = 0
-
-	# Change the size of the video being displayed.
-
-	def resizevideo(self, vw, vh):
-		self.width = vw
-		self.height = vh
-		self.x1 = self.x0 + self.width - 1
-		self.y1 = self.y0 + self.height - 1
-
-	def positionvideo(self, x, y):
-		self.x0 = x
-		self.y0 = y
-		self.x1 = self.x0 + self.width - 1
-		self.y1 = self.y0 + self.height - 1
-
-	# Remove an instance.
-	# This turns off continuous capture.
-
-	def close(self):
-		gl.winclose(self.wid)
-
-	# Get the length in bytes of a video line
-	def linewidth(self):
-		return self.width*4
-
-	# Get the next video packet.
-	# This returns (lpos, data) where:
-	# - lpos is the line position
-	# - data is a piece of data
-	# The dimensions of data are:
-	# - pixel depth = 1 byte
-	# - scan line width = self.width (the vw argument to __init__())
-	# - number of scan lines = self.lpp (PKTMAX / vw)
-
-	def getnextpacket(self):
-		if not self.data or self.dataoffset >= len(self.data):
-			self.old_data = self.data
-			self.data = gl.readdisplay(self.x0, self.y0, \
-				  self.x1, self.y1, self.hints)
-			self.dataoffset = 0
-			self.lpos = 0
-		data = self.data[self.dataoffset:self.dataoffset+self.pktsize]
-		while self.old_data and \
-			  self.dataoffset+self.pktsize < len(self.data):
-			odata = self.old_data[self.dataoffset: \
-				  self.dataoffset+self.pktsize]
-			if odata <> data:
-				break
-			print 'skip', self.lpos
-			self.lpos = self.lpos + self.lpp
-			self.dataoffset = self.dataoffset + self.pktsize
-			data = self.data[self.dataoffset:\
-				  self.dataoffset+self.pktsize]
-		lpos = self.lpos
-		self.dataoffset = self.dataoffset + self.pktsize
-		self.lpos = self.lpos + self.lpp
-		return lpos, data
diff --git a/Demo/sgi/video/Dsend.py b/Demo/sgi/video/Dsend.py
deleted file mode 100755
index 7e197f7..0000000
--- a/Demo/sgi/video/Dsend.py
+++ /dev/null
@@ -1,188 +0,0 @@
-#! /usr/bin/env 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()
diff --git a/Demo/sgi/video/LiveVideoIn.py b/Demo/sgi/video/LiveVideoIn.py
deleted file mode 100755
index 661ea73..0000000
--- a/Demo/sgi/video/LiveVideoIn.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# Live video input class.
-# Note that importing this module attempts to initialize video.
-
-
-# Check if video is available.
-# There are three reasons for failure here:
-# (1) this version of Python may not have the sv or imageop modules;
-# (2) this machine may not have a video board;
-# (3) initializing the video board may fail for another reason.
-# The global variable have_video is set to true iff we reall do have video.
-
-try:
-	import sv
-	import SV
-	import imageop
-	try:
-		v = sv.OpenVideo()
-		have_video = 1
-	except sv.error:
-		have_video = 0
-except ImportError:
-	have_video = 0
-
-
-# The live video input class.
-# Only instantiate this if have_video is true!
-
-class LiveVideoIn:
-
-	# Initialize an instance.  Arguments:
-	# vw, vh: size of the video window data to be captured.
-	# For some reason, vw MUST be a multiple of 4.
-	# Note that the data has to be cropped unless vw and vh are
-	# just right for the video board (vw:vh == 4:3 and vh even).
-
-	def __init__(self, pktmax, vw, vh, type):
-		if not have_video:
-			raise RuntimeError, 'no video available'
-		if vw % 4 != 0:
-			raise ValueError, 'vw must be a multiple of 4'
-		self.pktmax = pktmax
-		realvw = vh*SV.PAL_XMAX/SV.PAL_YMAX
-		if realvw < vw:
-			realvw = vw
-		self.realwidth, self.realheight = v.QuerySize(realvw, vh)
-		if not type in ('rgb8', 'grey', 'mono', 'grey2', 'grey4'):
-			raise 'Incorrent video data type', type
-		self.type = type
-		if type in ('grey', 'grey4', 'grey2', 'mono'):
-			v.SetParam([SV.COLOR, SV.MONO, SV.INPUT_BYPASS, 1])
-		else:
-			v.SetParam([SV.COLOR, SV.DEFAULT_COLOR, \
-				  SV.INPUT_BYPASS, 0])
-		# Initialize capture
-		(mode, self.realwidth, self.realheight, qsize, rate) = \
-			v.InitContinuousCapture(SV.RGB8_FRAMES, \
-				self.realwidth, self.realheight, 1, 2)
-		self.width = vw
-		self.height = vh
-		self.x0 = (self.realwidth-self.width)/2
-		self.x1 = self.x0 + self.width - 1
-		self.y0 = (self.realheight-self.height)/2
-		self.y1 = self.y0 + self.height - 1
-		# Compute # full lines per packet
-		self.lpp = pktmax / self.linewidth()
-		self.pktsize = self.lpp*self.linewidth()
-		self.data = None
-		self.dataoffset = 0
-		self.lpos = 0
-		self.justright = (self.realwidth == self.width and \
-			self.realheight == self.height)
-##		if not self.justright:
-##			print 'Want:', self.width, 'x', self.height,
-##			print '; grab:', self.realwidth, 'x', self.realheight
-
-	# Change the size of the video being displayed.
-
-	def resizevideo(self, vw, vh):
-		self.close()
-		self.__init__(self.pktmax, vw, vh, self.type)
-
-	# Remove an instance.
-	# This turns off continuous capture.
-
-	def close(self):
-		v.EndContinuousCapture()
-
-	# Get the length in bytes of a video line
-	def linewidth(self):
-		if self.type == 'mono':
-			return (self.width+7)/8
-		elif self.type == 'grey2':
-			return (self.width+3)/4
-		elif self.type == 'grey4':
-			return (self.width+1)/2
-		else:
-			return self.width
-
-	# Get the next video packet.
-	# This returns (lpos, data) where:
-	# - lpos is the line position
-	# - data is a piece of data
-	# The dimensions of data are:
-	# - pixel depth = 1 byte
-	# - scan line width = self.width (the vw argument to __init__())
-	# - number of scan lines = self.lpp (PKTMAX / vw)
-
-	def getnextpacket(self):
-		if not self.data or self.dataoffset >= len(self.data):
-			try:
-				cd, id = v.GetCaptureData()
-			except sv.error:
-				return None
-			data = cd.InterleaveFields(1)
-			cd.UnlockCaptureData()
-			if self.justright:
-				self.data = data
-			else:
-				self.data = imageop.crop(data, 1, \
-					  self.realwidth, \
-					  self.realheight, \
-					  self.x0, self.y0, \
-					  self.x1, self.y1)
-			self.lpos = 0
-			self.dataoffset = 0
-			if self.type == 'mono':
-				self.data = imageop.dither2mono(self.data, \
-					  self.width, self.height)
-			elif self.type == 'grey2':
-				self.data = imageop.dither2grey2(self.data, \
-					  self.width, self.height)
-			elif self.type == 'grey4':
-				self.data = imageop.grey2grey4(self.data, \
-					  self.width, self.height)
-		data = self.data[self.dataoffset:self.dataoffset+self.pktsize]
-		lpos = self.lpos
-		self.dataoffset = self.dataoffset + self.pktsize
-		self.lpos = self.lpos + self.lpp
-		return lpos, data
diff --git a/Demo/sgi/video/LiveVideoOut.py b/Demo/sgi/video/LiveVideoOut.py
deleted file mode 100755
index 6ee1846..0000000
--- a/Demo/sgi/video/LiveVideoOut.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Live video output (display video on the screen, presumably from the net)
-
-import gl
-from VFile import Displayer
-
-
-# Video output (displayer) class.
-
-class LiveVideoOut:
-
-	# Call this to initialize things.  Arguments:
-	# wid:    the window id where the video is to be displayed (centered)
-	# vw, vh: size of the video image to be displayed
-
-	def __init__(self, wid, vw, vh, type):
-		##print 'Init', wid, xywh
-		##print 'video', vw, vw
-		self.vw = vw
-		self.vh = vh
-		self.disp = Displayer()
-		if not type in ('rgb', 'rgb8', 'grey', 'mono', 'grey2', \
-			  'grey4'):
-			raise 'Incorrent live video output type', type
-		if type == 'rgb':
-			info = (type, vw, vh, 0, 32, 0, 0, 0, 0)
-		else:
-			info = (type, vw, vh, 1, 8, 0, 0, 0, 0)
-		self.disp.setinfo(info)
-		self.wid = wid
-		oldwid = gl.winget()
-		gl.winset(wid)
-		self.disp.initcolormap()
-		self.reshapewindow()
-		gl.winset(oldwid)
-
-	# Call this in response to every REDRAW event for the window
-	# or if the window size has changed for other reasons.
-
-	def reshapewindow(self):
-		oldwid = gl.winget()
-		gl.winset(self.wid)
-		gl.reshapeviewport()
-		w, h = gl.getsize()
-		self.disp.xorigin = (w-self.vw)/2
-		self.disp.yorigin = (h-self.vh)/2
-		self.disp.clear()
-		gl.winset(oldwid)
-
-	# Call this to change the size of the video images being displayed.
-	# Implies reshapewindow().
-
-	def resizevideo(self, vw, vh):
-		self.vw, self.vh = vw, vh
-		self.disp.setsize(vw, vh)
-		self.reshapewindow()
-
-	# Return the number of bytes in one video line
-	def linewidth(self):
-		if self.disp.format == 'rgb':
-			return self.vw*4
-		if self.disp.format == 'mono':
-			return (self.vw+7)/8
-		elif self.disp.format == 'grey2':
-			return (self.vw+3)/4
-		elif self.disp.format == 'grey4':
-			return (self.vw+1)/2
-		else:
-			return self.vw
-
-	# Call this to display the next video packet.  Arguments:
-	# pos:  line number where the packet begins
-	# data: image data of the packet
-	# (these correspond directly to the return values from
-	# LiveVideoIn.getnextpacket()).
-
-	def putnextpacket(self, pos, data):
-		nline = len(data)/self.linewidth()
-		if nline*self.linewidth() <> len(data):
-			print 'Incorrect-sized video fragment ignored'
-			return
-		oldwid = gl.winget()
-		gl.winset(self.wid)
-		self.disp.showpartframe(data, None, (0, pos, self.vw, nline))
-		gl.winset(oldwid)
-
-	# Call this to close the window.
-
-	def close(self):
-		pass
-
-	# Call this to set optional mirroring of video
-	def setmirror(self, mirrored):
-		f, w, h, pf, c0, c1, c2, o, cp = self.disp.getinfo()
-		if type(pf) == type(()):
-			xpf, ypf = pf
-		else:
-			xpf = ypf = pf
-		xpf = abs(xpf)
-		if mirrored:
-			xpf = -xpf
-		info = (f, w, h, (xpf, ypf), c0, c1, c2, o, cp)
-		self.disp.setinfo(info)
-		self.disp.initcolormap()
-		self.disp.clear()
-
-#
-# This derived class has one difference with the base class: the video is
-# not displayed until an entire image has been gotten
-#
-class LiveVideoOutSlow(LiveVideoOut):
-
-	# Reshapewindow - Realloc buffer.
-	# (is also called by __init__() indirectly)
-
-	def reshapewindow(self):
-		LiveVideoOut.reshapewindow(self)
-		self.buffer = '\0'*self.linewidth()*self.vh
-		self.isbuffered = []
-
-	# putnextpacket - buffer incoming data until a complete
-	# image has been received
-
-	def putnextpacket(self, pos, data):
-		if pos in self.isbuffered or pos == 0:
-			LiveVideoOut.putnextpacket(self, 0, self.buffer)
-			self.isbuffered = []
-		self.isbuffered.append(pos)
-		bpos = pos * self.linewidth()
-		epos = bpos + len(data)
-		self.buffer = self.buffer[:bpos] + data + self.buffer[epos:]
diff --git a/Demo/sgi/video/OldVcopy.py b/Demo/sgi/video/OldVcopy.py
deleted file mode 100755
index 0eb1c7f..0000000
--- a/Demo/sgi/video/OldVcopy.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#! /usr/bin/env python
-
-# Copy a video file, interactively, frame-by-frame.
-
-import sys
-import getopt
-from gl import *
-from DEVICE import *
-import VFile
-import VGrabber
-import string
-import imageop
-
-def report(time, iframe):
-	print 'Frame', iframe, ': t =', time
-
-def usage():
-	sys.stderr.write('usage: Vcopy [-t type] [-m threshold] [-a] infile outfile\n')
-	sys.stderr.write('-t Convert to other type\n')
-	sys.stderr.write('-a Automatic\n')
-	sys.stderr.write('-m Convert grey to mono with threshold\n')
-	sys.stderr.write('-d Convert grey to mono with dithering\n')
-	sys.exit(2)
-
-def help():
-	print 'Command summary:'
-	print 'n   get next image from input'
-	print 'w   write current image to output'
-
-class GrabbingVoutFile(VFile.VoutFile, VGrabber.VGrabber):
-	pass
-
-def main():
-	foreground()
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 't:am:d')
-	except getopt.error, msg:
-		print msg
-		usage()
-	if len(args) <> 2:
-		usage()
-	[ifile, ofile] = args
-	print 'open film ', ifile
-	ifilm = VFile.VinFile(ifile)
-	print 'open output ', ofile
-	ofilm = GrabbingVoutFile(ofile)
-	
-	ofilm.setinfo(ifilm.getinfo())
-
-	use_grabber = 0
-	continuous = 0
-	tomono = 0
-	tomonodither = 0
-	for o, a in opts:
-		if o == '-t':
-			ofilm.format = a
-			use_grabber = 1
-		if o == '-a':
-			continuous = 1
-		if o == '-m':
-			if ifilm.format <> 'grey':
-				print '-m only supported for greyscale'
-				sys.exit(1)
-			tomono = 1
-			treshold = string.atoi(a)
-			ofilm.format = 'mono'
-		if o == '-d':
-			if ifilm.format <> 'grey':
-				print '-m only supported for greyscale'
-				sys.exit(1)
-			tomonodither = 1
-			ofilm.format = 'mono'
-			
-	ofilm.writeheader()
-	#
-	prefsize(ifilm.width, ifilm.height)
-	w = winopen(ifile)
-	qdevice(KEYBD)
-	qdevice(ESCKEY)
-	qdevice(WINQUIT)
-	qdevice(WINSHUT)
-	print 'qdevice calls done'
-	#
-	help()
-	#
-	time, data, cdata = ifilm.getnextframe()
-	ifilm.showframe(data, cdata)
-	iframe = 1
-	report(time, iframe)
-	#
-	while 1:
-		if continuous:
-			dev = KEYBD
-		else:
-			dev, val = qread()
-		if dev in (ESCKEY, WINQUIT, WINSHUT):
-			break
-		if dev == REDRAW:
-			reshapeviewport()
-		elif dev == KEYBD:
-			if continuous:
-				c = '0'
-			else:
-				c = chr(val)
-			#XXX Debug
-			if c == 'R':
-				c3i(255,0,0)
-				clear()
-			if c == 'G':
-				c3i(0,255,0)
-				clear()
-			if c == 'B':
-				c3i(0,0,255)
-				clear()
-			if c == 'w' or continuous:
-				if use_grabber:
-					try:
-						data, cdata = ofilm.grabframe()
-					except VFile.Error, msg:
-						print msg
-						break
-				if tomono:
-					data = imageop.grey2mono(data, \
-						  ifilm.width, ifilm.height, \
-						  treshold)
-				if tomonodither:
-					data = imageop.dither2mono(data, \
-						  ifilm.width, ifilm.height)
-				ofilm.writeframe(time, data, cdata)
-				print 'Frame', iframe, 'written.'
-			if c == 'n' or continuous:
-				try:
-					time,data,cdata = ifilm.getnextframe()
-					ifilm.showframe(data, cdata)
-					iframe = iframe+1
-					report(time, iframe)
-				except EOFError:
-					print 'EOF'
-					if continuous:
-						break
-					ringbell()
-		elif dev == INPUTCHANGE:
-			pass
-		else:
-			print '(dev, val) =', (dev, val)
-	ofilm.close()
-
-main()
diff --git a/Demo/sgi/video/README b/Demo/sgi/video/README
deleted file mode 100644
index 6abe698..0000000
--- a/Demo/sgi/video/README
+++ /dev/null
@@ -1,113 +0,0 @@
-CMIF video tools
-================
-
-This directory contains Python and C programs to manipulate files
-containing digitized video in the "CMIF video format".
-
-An introduction to using the basic tools is in the file "video.doc".
-
-A description of the video file format is in the file "cmif-film.ms"
-(troff/nroff -ms input).
-
-
-History
--------
-
-We started this in October 1991, when we had a large framegrabber
-board on loan from SGI for a few weeks: we developed a movie recording
-program and added numerous features, including still frame capture and
-synchronous sound recording using a second machine (the machine
-holding the framegrabber board didn't have audio).
-
-During the following months, when we started using and processing the
-recorded film fragments, the "CMIF video format" was revised several
-times, and we eventually created an object-oriented interface for
-reading and writing various incarnations of these files, called VFile.
-(This module is also used by our flagship application, the CMIF
-editor, not in this directory but in /ufs/guido/mm/.)
-
-When we got our own Indigo entry-level video board (in June 1992) and
-a version of the Irix video library that supported capturing PAL
-format (in August 1992), Sjoerd added an interface to the video
-library to Python (sv) and Guido wrote Vrec.py (based upon a still
-frame grabber by Sjoerd, in turn based upon SGI demo code in C) to
-record a movie using it.  Vrec was soon followed by modernized
-versions of the other programs (Vinfo, Vplay, Vtime) and an
-interactive editor (Vedit).  Finally, VFile was rewritten for more
-modularity, functionality and robustness, and various other tools were
-added as needed.  Also, new options were added to existing tools, and
-several new video file formats were added.
-
-	Guido van Rossum
-	Jack Jansen
-	Sjoerd Mullender
-
-
-Overview of files
------------------
-
-cmif-film.ms	description of the CMIF video file format (more than a
-		little out of date -- read the source for VFile for
-		more info about new file formats)
-
-
-These are programs with a command line interface:
-
-Vrec.py		record video movies using the Indigo video library and
-		board
-
-Vplay.py	play video movies
-
-Vinfo.py	show statistics on movies
-
-Vtime.py	Copy a video file, manipulating the time codes (e.g.
-		faster/slower, or regenerate time codes, or drop
-		frames too close apart)
-
-Vcopy.py	Universal video file copying tool.  Can manipulate the
-		time codes, change the type, size, and packfactor.
-		Subsumes Vtime.py.
-
-Vmkjpeg.py	compress an rgb or grey video file to jpeg[grey] format
-
-Vunjpeg.py	expand a jpeg[grey] video file to rgb or grey format
-
-Vfix.py		truncate the scan line width of a video file to
-		a multiple of 4 ('grey' images only)
-
-Vedit.py	interactive video editing program (uses the FORMS library)
-
-Vsend.py	unicast or multicast live video as UDP packets
-
-Vreceive.py	receive transmissions from Vsend
-
-Vaddcache.py	add a "cached index" to a video file, for faster playing
-
-Vrecb.py	like Vrec.py but uses "burst capture" -- somewhat specialized
-
-Dsend.py	like Vsend.py but sends screen snapshots (to Vreceive.py)
-
-DisplayVideoIn.py	Like LiveVideoIn.py but reads screen snapshots
-
-rgb2video.py	combine a sequence of rgb image files into a CMIF video file
-
-video2rgb.py	split a CMIF video file into a sequence of rgb image files
-
-
-These modules and files are used by the above programs:
-
-VFile.py	classes that read and write CMIF video files
-
-Viewer.py	two viewer classes used by Vedit
-
-LiveVideoIn.py	live video input class, used by Vsend
-
-LiveVideoOut.py	live video output class, used by Vsend and Vreceive
-
-imgconv.py	Image conversion subroutines for rgb2video.py
-
-senddefs.py	Defaults shared by Vsend and Vreceice
-
-watchcursor.py	Generally useful module to define a watch cursor in GL
-
-VeditForm.fd	FORMS' fdesign definition for Vedit's form
diff --git a/Demo/sgi/video/VCR.py b/Demo/sgi/video/VCR.py
deleted file mode 100755
index 535a7da..0000000
--- a/Demo/sgi/video/VCR.py
+++ /dev/null
@@ -1,534 +0,0 @@
-import fcntl
-import IOCTL
-from IOCTL import *
-import sys
-import struct
-import select
-import posix
-import time
-
-DEVICE='/dev/ttyd2'
-
-class UnixFile:
-	def open(self, name, mode):
-		self.fd = posix.open(name, mode)
-		return self
-
-	def read(self, len):
-		return posix.read(self.fd, len)
-
-	def write(self, data):
-		dummy = posix.write(self.fd, data)
-
-	def flush(self):
-		pass
-
-	def fileno(self):
-		return self.fd
-
-	def close(self):
-		dummy = posix.close(self.fd)
-
-def packttyargs(*args):
-	if type(args) <> type(()):
-		raise 'Incorrect argtype for packttyargs'
-	if type(args[0]) == type(1):
-		iflag, oflag, cflag, lflag, line, chars = args
-	elif type(args[0]) == type(()):
-		if len(args) <> 1:
-			raise 'Only 1 argument expected'
-		iflag, oflag, cflag, lflag, line, chars = args[0]
-	elif type(args[0]) == type([]):
-		if len(args) <> 1:
-			raise 'Only 1 argument expected'
-		[iflag, oflag, cflag, lflag, line, chars] = args[0]
-	str = struct.pack('hhhhb', iflag, oflag, cflag, lflag, line)
-	for c in chars:
-		str = str + c
-	return str
-
-def nullttyargs():
-	chars = ['\0']*IOCTL.NCCS
-	return packttyargs(0, 0, 0, 0, 0, chars)
-
-def unpackttyargs(str):
-	args = str[:-IOCTL.NCCS]
-	rawchars = str[-IOCTL.NCCS:]
-	chars = []
-	for c in rawchars:
-		chars.append(c)
-	iflag, oflag, cflag, lflag, line = struct.unpack('hhhhb', args)
-	return (iflag, oflag, cflag, lflag, line, chars)
-
-def initline(name):
-	fp = UnixFile().open(name, 2)
-	ofp = fp
-	fd = fp.fileno()
-	rv = fcntl.ioctl(fd, IOCTL.TCGETA, nullttyargs())
-	iflag, oflag, cflag, lflag, line, chars = unpackttyargs(rv)
-	iflag = iflag & ~(INPCK|ISTRIP|INLCR|IUCLC|IXON|IXOFF)
-	oflag = oflag & ~OPOST
-	cflag = B9600|CS8|CREAD|CLOCAL
-	lflag = lflag & ~(ISIG|ICANON|ECHO|TOSTOP)
-	chars[VMIN] = chr(1)
-	chars[VTIME] = chr(0)
-	arg = packttyargs(iflag, oflag, cflag, lflag, line, chars)
-	dummy = fcntl.ioctl(fd, IOCTL.TCSETA, arg)
-	return fp, ofp
-
-#
-#
-error = 'VCR.error'
-
-# Commands/replies:
-COMPLETION = '\x01'
-ACK  ='\x0a'
-NAK  ='\x0b'
-
-NUMBER_N = 0x30
-ENTER  = '\x40'
-
-EXP_7= '\xde'
-EXP_8= '\xdf'
-
-CL   ='\x56'
-CTRL_ENABLE = EXP_8 + '\xc6'
-SEARCH_DATA = EXP_8 + '\x93'
-ADDR_SENSE = '\x60'
-
-PLAY ='\x3a'
-STOP ='\x3f'
-EJECT='\x2a'
-FF   ='\xab'
-REW  ='\xac'
-STILL='\x4f'
-STEP_FWD ='\x2b'    # Was: '\xad'
-FM_SELECT=EXP_8 + '\xc8'
-FM_STILL=EXP_8 + '\xcd'
-PREVIEW=EXP_7 + '\x9d'
-REVIEW=EXP_7 + '\x9e'
-DM_OFF=EXP_8 + '\xc9'
-DM_SET=EXP_8 + '\xc4'
-FWD_SHUTTLE='\xb5'
-REV_SHUTTLE='\xb6'
-EM_SELECT=EXP_8 + '\xc0'
-N_FRAME_REC=EXP_8 + '\x92'
-SEARCH_PREROLL=EXP_8 + '\x90'
-EDIT_PB_STANDBY=EXP_8 + '\x96'
-EDIT_PLAY=EXP_8 + '\x98'
-AUTO_EDIT=EXP_7 + '\x9c'
-
-IN_ENTRY=EXP_7 + '\x90'
-IN_ENTRY_RESET=EXP_7 + '\x91'
-IN_ENTRY_SET=EXP_7 + '\x98'
-IN_ENTRY_INC=EXP_7 + '\x94'
-IN_ENTRY_DEC=EXP_7 + '\x95'
-IN_ENTRY_SENSE=EXP_7 + '\x9a'
-
-OUT_ENTRY=EXP_7 + '\x92'
-OUT_ENTRY_RESET=EXP_7 + '\x93'
-OUT_ENTRY_SET=EXP_7 + '\x99'
-OUT_ENTRY_INC=EXP_7 + '\x96'
-OUT_ENTRY_DEC=EXP_7 + '\x98'
-OUT_ENTRY_SENSE=EXP_7 + '\x9b'
-
-MUTE_AUDIO = '\x24'
-MUTE_AUDIO_OFF = '\x25'
-MUTE_VIDEO = '\x26'
-MUTE_VIDEO_OFF = '\x27'
-MUTE_AV = EXP_7 + '\xc6'
-MUTE_AV_OFF = EXP_7 + '\xc7'
-
-DEBUG=0
-
-class VCR:
-	def __init__(self):
-		self.ifp, self.ofp = initline(DEVICE)
-		self.busy_cmd = None
-		self.async = 0
-		self.cb = None
-		self.cb_arg = None
-
-	def _check(self):
-		if self.busy_cmd:
-			raise error, 'Another command active: '+self.busy_cmd
-
-	def _endlongcmd(self, name):
-		if not self.async:
-			self.waitready()
-			return 1
-		self.busy_cmd = name
-		return 'VCR BUSY'
-
-	def fileno(self):
-		return self.ifp.fileno()
-
-	def setasync(self, async):
-		self.async = async
-
-	def setcallback(self, cb, arg):
-		self.setasync(1)
-		self.cb = cb
-		self.cb_arg = arg
-
-	def poll(self):
-		if not self.async:
-			raise error, 'Can only call poll() in async mode'
-		if not self.busy_cmd:
-			return
-		if self.testready():
-			if self.cb:
-				apply(self.cb, (self.cb_arg,))
-
-	def _cmd(self, cmd):
-		if DEBUG:
-			print '>>>',`cmd`
-		self.ofp.write(cmd)
-		self.ofp.flush()
-
-	def _waitdata(self, len, tout):
-		rep = ''
-		while len > 0:
-			if tout == None:
-				ready, d1, d2 = select.select( \
-					  [self.ifp], [], [])
-			else:
-				ready, d1, d2 = select.select( \
-					  [self.ifp], [], [], tout)
-			if ready == []:
-##				if rep:
-##					print 'FLUSHED:', `rep`
-				return None
-			data = self.ifp.read(1)
-			if DEBUG:
-				print '<<<',`data`
-			if data == NAK:
-				return NAK
-			rep = rep + data
-			len = len - 1
-		return rep
-
-	def _reply(self, len):
-		data = self._waitdata(len, 10)
-		if data == None:
-			raise error, 'Lost contact with VCR'
-		return data
-
-	def _getnumber(self, len):
-		data = self._reply(len)
-		number = 0
-		for c in data:
-			digit = ord(c) - NUMBER_N
-			if digit < 0 or digit > 9:
-				raise error, 'Non-digit in number'+`c`
-			number = number*10 + digit
-		return number
-
-	def _iflush(self):
-		dummy = self._waitdata(10000, 0)
-##		if dummy:
-##			print 'IFLUSH:', dummy
-
-	def simplecmd(self,cmd):
-		self._iflush()
-		for ch in cmd:
-			self._cmd(ch)
-			rep = self._reply(1)
-			if rep == NAK:
-				return 0
-			elif rep <> ACK:
-				raise error, 'Unexpected reply:' + `rep`
-		return 1
-
-	def replycmd(self, cmd):
-		if not self.simplecmd(cmd[:-1]):
-			return 0
-		self._cmd(cmd[-1])
-
-	def _number(self, number, digits):
-		if number < 0:
-			raise error, 'Unexpected negative number:'+ `number`
-		maxnum = pow(10, digits)
-		if number > maxnum:
-			raise error, 'Number too big'
-		while maxnum > 1:
-			number = number % maxnum
-			maxnum = maxnum / 10
-			digit = number / maxnum
-			ok = self.simplecmd(chr(NUMBER_N + digit))
-			if not ok:
-				raise error, 'Error while transmitting number'
-
-	def initvcr(self, *optarg):
-		timeout = None
-		if optarg <> ():
-			timeout = optarg[0]
-			starttime = time.time()
-		self.busy_cmd = None
-		self._iflush()
-		while 1:
-##			print 'SENDCL'
-			self._cmd(CL)
-			rep = self._waitdata(1, 2)
-##			print `rep`
-			if rep in ( None, CL, NAK ):
-				if timeout:
-					if time.time() - starttime > timeout:
-						raise error, \
-							  'No reply from VCR'
-				continue
-			break
-		if rep <> ACK:
-			raise error, 'Unexpected reply:' + `rep`
-		dummy = self.simplecmd(CTRL_ENABLE)
-
-	def waitready(self):
-		rep = self._waitdata(1, None)
-		if rep == None:
-			raise error, 'Unexpected None reply from waitdata'
-		if rep not in  (COMPLETION, ACK):
-			self._iflush()
-			raise error, 'Unexpected waitready reply:' + `rep`
-		self.busy_cmd = None
-
-	def testready(self):
-		rep = self._waitdata(1, 0)
-		if rep == None:
-			return 0
-		if rep not in  (COMPLETION, ACK):
-			self._iflush()
-			raise error, 'Unexpected waitready reply:' + `rep`
-		self.busy_cmd = None
-		return 1
-
-	def play(self): return self.simplecmd(PLAY)
-	def stop(self): return self.simplecmd(STOP)
-	def ff(self):   return self.simplecmd(FF)
-	def rew(self):  return self.simplecmd(REW)
-	def eject(self):return self.simplecmd(EJECT)
-	def still(self):return self.simplecmd(STILL)
-	def step(self): return self.simplecmd(STEP_FWD)
-
-	def goto(self, (h, m, s, f)):
-		if not self.simplecmd(SEARCH_DATA):
-			return 0
-		self._number(h, 2)
-		self._number(m, 2)
-		self._number(s, 2)
-		self._number(f, 2)
-		if not self.simplecmd(ENTER):
-			return 0
-		return self._endlongcmd('goto')
-
-	# XXXX TC_SENSE doesn't seem to work
-	def faulty_where(self):
-		self._check()
-		self._cmd(TC_SENSE)
-		h = self._getnumber(2)
-		m = self._getnumber(2)
-		s = self._getnumber(2)
-		f = self._getnumber(2)
-		return (h, m, s, f)
-
-	def where(self):
-		return self.addr2tc(self.sense())
-
-	def sense(self):
-		self._check()
-		self._cmd(ADDR_SENSE)
-		num = self._getnumber(5)
-		return num
-
-	def addr2tc(self, num):
-		f = num % 25
-		num = num / 25
-		s = num % 60
-		num = num / 60
-		m = num % 60
-		h = num / 60
-		return (h, m, s, f)
-
-	def tc2addr(self, (h, m, s, f)):
-		return ((h*60 + m)*60 + s)*25 + f
-
-	def fmmode(self, mode):
-		self._check()
-		if mode == 'off':
-			arg = 0
-		elif mode == 'buffer':
-			arg = 1
-		elif mode == 'dnr':
-			arg = 2
-		else:
-			raise error, 'fmmode arg should be off, buffer or dnr'
-		if not self.simplecmd(FM_SELECT):
-			return 0
-		self._number(arg, 1)
-		if not self.simplecmd(ENTER):
-			return 0
-		return 1
-
-	def mute(self, mode, value):
-		self._check()
-		if mode == 'audio':
-			cmds = (MUTE_AUDIO_OFF, MUTE_AUDIO)
-		elif mode == 'video':
-			cmds = (MUTE_VIDEO_OFF, MUTE_VIDEO)
-		elif mode == 'av':
-			cmds = (MUTE_AV_OFF, MUTE_AV)
-		else:
-			raise error, 'mute type should be audio, video or av'
-		cmd = cmds[value]
-		return self.simplecmd(cmd)
-
-	def editmode(self, mode):
-		self._check()
-		if mode == 'off':
-			a0 = a1 = a2 = 0
-		elif mode == 'format':
-			a0 = 4
-			a1 = 7
-			a2 = 4
-		elif mode == 'asmbl':
-			a0 = 1
-			a1 = 7
-			a2 = 4
-		elif mode == 'insert-video':
-			a0 = 2
-			a1 = 4
-			a2 = 0
-		else:
-			raise 'editmode should be off,format,asmbl or insert-video'
-		if not self.simplecmd(EM_SELECT):
-			return 0
-		self._number(a0, 1)
-		self._number(a1, 1)
-		self._number(a2, 1)
-		if not self.simplecmd(ENTER):
-			return 0
-		return 1
-
-	def autoedit(self):
-		self._check()
-		return self._endlongcmd(AUTO_EDIT)
-
-	def nframerec(self, num):
-		if not self.simplecmd(N_FRAME_REC):
-			return 0
-		self._number(num, 4)
-		if not self.simplecmd(ENTER):
-			return 0
-		return self._endlongcmd('nframerec')
-
-	def fmstill(self):
-		if not self.simplecmd(FM_STILL):
-			return 0
-		return self._endlongcmd('fmstill')
-
-	def preview(self):
-		if not self.simplecmd(PREVIEW):
-			return 0
-		return self._endlongcmd('preview')
-
-	def review(self):
-		if not self.simplecmd(REVIEW):
-			return 0
-		return self._endlongcmd('review')
-
-	def search_preroll(self):
-		if not self.simplecmd(SEARCH_PREROLL):
-			return 0
-		return self._endlongcmd('search_preroll')
-
-	def edit_pb_standby(self):
-		if not self.simplecmd(EDIT_PB_STANDBY):
-			return 0
-		return self._endlongcmd('edit_pb_standby')
-
-	def edit_play(self):
-		if not self.simplecmd(EDIT_PLAY):
-			return 0
-		return self._endlongcmd('edit_play')
-
-	def dmcontrol(self, mode):
-		self._check()
-		if mode == 'off':
-			return self.simplecmd(DM_OFF)
-		if mode == 'multi freeze':
-			num = 1000
-		elif mode == 'zoom freeze':
-			num = 2000
-		elif mode == 'digital slow':
-			num = 3000
-		elif mode == 'freeze':
-			num = 4011
-		else:
-			raise error, 'unknown dmcontrol argument: ' + `mode`
-		if not self.simplecmd(DM_SET):
-			return 0
-		self._number(num, 4)
-		if not self.simplecmd(ENTER):
-			return 0
-		return 1
-
-	def fwdshuttle(self, num):
-		if not self.simplecmd(FWD_SHUTTLE):
-			return 0
-		self._number(num, 1)
-		return 1
-
-	def revshuttle(self, num):
-		if not self.simplecmd(REV_SHUTTLE):
-			return 0
-		self._number(num, 1)
-		return 1
-
-	def getentry(self, which):
-		self._check()
-		if which == 'in':
-			cmd = IN_ENTRY_SENSE
-		elif which == 'out':
-			cmd = OUT_ENTRY_SENSE
-		self.replycmd(cmd)
-		h = self._getnumber(2)
-		m = self._getnumber(2)
-		s = self._getnumber(2)
-		f = self._getnumber(2)
-		return (h, m, s, f)
-
-	def inentry(self, arg):
-		return self.ioentry(arg, (IN_ENTRY, IN_ENTRY_RESET, \
-			  IN_ENTRY_SET, IN_ENTRY_INC, IN_ENTRY_DEC))
-
-	def outentry(self, arg):
-		return self.ioentry(arg, (OUT_ENTRY, OUT_ENTRY_RESET, \
-			  OUT_ENTRY_SET, OUT_ENTRY_INC, OUT_ENTRY_DEC))
-
-	def ioentry(self, arg, (Load, Clear, Set, Inc, Dec)):
-		self._check()
-		if type(arg) == type(()):
-			h, m, s, f = arg
-			if not self.simplecmd(Set):
-				return 0
-			self._number(h,2)
-			self._number(m,2)
-			self._number(s,2)
-			self._number(f,2)
-			if not self.simplecmd(ENTER):
-				return 0
-			return 1
-		elif arg == 'reset':
-			cmd = Clear
-		elif arg == 'load':
-			cmd = Load
-		elif arg == '+':
-			cmd = Inc
-		elif arg == '-':
-			cmd = Dec
-		else:
-			raise error, 'Arg should be +,-,reset,load or (h,m,s,f)'
-		return self.simplecmd(cmd)
-
-	def cancel(self):
-		d = self.simplecmd(CL)
-		self.busy_cmd = None
diff --git a/Demo/sgi/video/VFile.py b/Demo/sgi/video/VFile.py
deleted file mode 100755
index 2f435d4..0000000
--- a/Demo/sgi/video/VFile.py
+++ /dev/null
@@ -1,1193 +0,0 @@
-# Classes to read and write CMIF video files.
-# (For a description of the CMIF video format, see cmif-file.ms.)
-
-
-# Layers of functionality:
-#
-# VideoParams: maintain essential parameters of a video file
-# Displayer: display a frame in a window (with some extra parameters)
-# BasicVinFile: read a CMIF video file
-# BasicVoutFile: write a CMIF video file
-# VinFile: BasicVinFile + Displayer
-# VoutFile: BasicVoutFile + Displayer
-#
-# XXX Future extension:
-# BasicVinoutFile: supports overwriting of individual frames
-
-
-# Imported modules
-
-import sys
-try:
-	import gl
-	import GL
-	import GET
-	no_gl = 0
-except ImportError:
-	no_gl = 1
-import colorsys
-import imageop
-
-
-# Exception raised for various occasions
-
-Error = 'VFile.Error'			# file format errors
-CallError = 'VFile.CallError'		# bad call
-AssertError = 'VFile.AssertError'	# internal malfunction
-
-
-# Max nr. of colormap entries to use
-
-MAXMAP = 4096 - 256
-
-
-# Parametrizations of colormap handling based on color system.
-# (These functions are used via eval with a constructed argument!)
-
-def conv_grey(l, x, y):
-	return colorsys.yiq_to_rgb(l, 0, 0)
-
-def conv_grey4(l, x, y):
-	return colorsys.yiq_to_rgb(l*17, 0, 0)
-
-def conv_mono(l, x, y):
-	return colorsys.yiq_to_rgb(l*255, 0, 0)
-
-def conv_yiq(y, i, q):
-	return colorsys.yiq_to_rgb(y, (i-0.5)*1.2, q-0.5)
-
-def conv_hls(l, h, s):
-	return colorsys.hls_to_rgb(h, l, s)
-
-def conv_hsv(v, h, s):
-	return colorsys.hsv_to_rgb(h, s, v)
-
-def conv_rgb(r, g, b):
-	raise Error, 'Attempt to make RGB colormap'
-
-def conv_rgb8(rgb, d1, d2):
-	rgb = int(rgb*255.0)
-	r = (rgb >> 5) & 0x07
-	g = (rgb     ) & 0x07
-	b = (rgb >> 3) & 0x03
-	return (r/7.0, g/7.0, b/3.0)
-
-def conv_jpeg(r, g, b):
-	raise Error, 'Attempt to make RGB colormap (jpeg)'
-
-conv_jpeggrey = conv_grey
-conv_grey2 = conv_grey
-
-
-# Choose one of the above based upon a color system name
-
-def choose_conversion(format):
-	try:
-		return eval('conv_' + format)
-	except:
-		raise Error, 'Unknown color system: ' + `format`
-
-
-# Inverses of the above
-
-def inv_grey(r, g, b):
-	y, i, q = colorsys.rgb_to_yiq(r, g, b)
-	return y, 0, 0
-
-def inv_yiq(r, g, b):
-	y, i, q = colorsys.rgb_to_yiq(r, g, b)
-	return y, i/1.2 + 0.5, q + 0.5
-
-def inv_hls(r, g, b):
-	h, l, s = colorsys.rgb_to_hls(r, g, b)
-	return l, h, s
-
-def inv_hsv(r, g, b):
-	h, s, v = colorsys.rgb_to_hsv(r, g, b)
-	return v, h, s
-
-def inv_rgb(r, g, b):
-	raise Error, 'Attempt to invert RGB colormap'
-
-def inv_rgb8(r, g, b):
-	r = int(r*7.0)
-	g = int(g*7.0)
-	b = int(b*7.0)
-	rgb = ((r&7) << 5) | ((b&3) << 3) | (g&7)
-	return rgb / 255.0, 0, 0
-
-def inv_jpeg(r, g, b):
-	raise Error, 'Attempt to invert RGB colormap (jpeg)'
-
-inv_jpeggrey = inv_grey
-
-
-# Choose one of the above based upon a color system name
-
-def choose_inverse(format):
-	try:
-		return eval('inv_' + format)
-	except:
-		raise Error, 'Unknown color system: ' + `format`
-
-
-# Predicate to see whether this is an entry level (non-XS) Indigo.
-# If so we can lrectwrite 8-bit wide pixels into a window in RGB mode
-
-def is_entry_indigo():
-	# XXX hack, hack.  We should call gl.gversion() but that doesn't
-	# exist in earlier Python versions.  Therefore we check the number
-	# of bitplanes *and* the size of the monitor.
-	xmax = gl.getgdesc(GL.GD_XPMAX)
-	if xmax <> 1024: return 0
-	ymax = gl.getgdesc(GL.GD_YPMAX)
-	if ymax != 768: return 0
-	r = gl.getgdesc(GL.GD_BITS_NORM_SNG_RED)
-	g = gl.getgdesc(GL.GD_BITS_NORM_SNG_GREEN)
-	b = gl.getgdesc(GL.GD_BITS_NORM_SNG_BLUE)
-	return (r, g, b) == (3, 3, 2)
-
-
-# Predicate to see whether this machine supports pixmode(PM_SIZE) with
-# values 1 or 4.
-#
-# XXX Temporarily disabled, since it is unclear which machines support
-# XXX which pixelsizes.
-#
-# XXX The XS appears to support 4 bit pixels, but (looking at osview) it
-# XXX seems as if the conversion is done by the kernel (unpacking ourselves
-# XXX is faster than using PM_SIZE=4)
-
-def support_packed_pixels():
-	return 0   # To be architecture-dependent
-
-
-
-# Tables listing bits per pixel for some formats
-
-bitsperpixel = { \
-	  'rgb': 32, \
-	  'rgb8': 8, \
-	  'grey': 8, \
-	  'grey4': 4, \
-	  'grey2': 2, \
-	  'mono': 1, \
-	  'compress': 32, \
-}
-
-bppafterdecomp = {'jpeg': 32, 'jpeggrey': 8}
-
-
-# Base class to manage video format parameters
-
-class VideoParams:
-
-	# Initialize an instance.
-	# Set all parameters to something decent
-	# (except width and height are set to zero)
-
-	def __init__(self):
-		# Essential parameters
-		self.frozen = 0		# if set, can't change parameters
-		self.format = 'grey'	# color system used
-		# Choose from: grey, rgb, rgb8, hsv, yiq, hls, jpeg, jpeggrey,
-		#              mono, grey2, grey4
-		self.width = 0		# width of frame
-		self.height = 0		# height of frame
-		self.packfactor = 1, 1	# expansion using rectzoom
-		# Colormap info
-		self.c0bits = 8		# bits in first color dimension
-		self.c1bits = 0		# bits in second color dimension
-		self.c2bits = 0		# bits in third color dimension
-		self.offset = 0		# colormap index offset (XXX ???)
-		self.chrompack = 0	# set if separate chrominance data
-		self.setderived()
-		self.decompressor = None
-
-	# Freeze the parameters (disallow changes)
-
-	def freeze(self):
-		self.frozen = 1
-
-	# Unfreeze the parameters (allow changes)
-
-	def unfreeze(self):
-		self.frozen = 0
-
-	# Set some values derived from the standard info values
-
-	def setderived(self):
-		if self.frozen: raise AssertError
-		if bitsperpixel.has_key(self.format):
-			self.bpp = bitsperpixel[self.format]
-		else:
-			self.bpp = 0
-		xpf, ypf = self.packfactor
-		self.xpf = abs(xpf)
-		self.ypf = abs(ypf)
-		self.mirror_image = (xpf < 0)
-		self.upside_down = (ypf < 0)
-		self.realwidth = self.width / self.xpf
-		self.realheight = self.height / self.ypf
-
-	# Set colormap info
-
-	def setcmapinfo(self):
-		stuff = 0, 0, 0, 0, 0
-		if self.format in ('rgb8', 'grey'):
-			stuff = 8, 0, 0, 0, 0
-		if self.format == 'grey4':
-			stuff = 4, 0, 0, 0, 0
-		if self.format == 'grey2':
-			stuff = 2, 0, 0, 0, 0
-		if self.format == 'mono':
-			stuff = 1, 0, 0, 0, 0
-		self.c0bits, self.c1bits, self.c2bits, \
-			  self.offset, self.chrompack = stuff
-
-	# Set the frame width and height (e.g. from gl.getsize())
-
-	def setsize(self, width, height):
-		if self.frozen: raise CallError
-		width = (width/self.xpf)*self.xpf
-		height = (height/self.ypf)*self.ypf
-		self.width, self.height = width, height
-		self.setderived()
-
-	# Retrieve the frame width and height (e.g. for gl.prefsize())
-
-	def getsize(self):
-		return (self.width, self.height)
-
-	# Set the format
-
-	def setformat(self, format):
-		if self.frozen: raise CallError
-		self.format = format
-		self.setderived()
-		self.setcmapinfo()
-
-	# Get the format
-
-	def getformat(self):
-		return self.format
-
-	# Set the packfactor
-
-	def setpf(self, pf):
-		if self.frozen: raise CallError
-		if type(pf) == type(1):
-			pf = (pf, pf)
-		if type(pf) is not type(()) or len(pf) <> 2: raise CallError
-		self.packfactor = pf
-		self.setderived()
-
-	# Get the packfactor
-
-	def getpf(self):
-		return self.packfactor
-
-	# Set all parameters
-
-	def setinfo(self, values):
-		if self.frozen: raise CallError
-		self.setformat(values[0])
-		self.setpf(values[3])
-		self.setsize(values[1], values[2])
-		(self.c0bits, self.c1bits, self.c2bits, \
-			  self.offset, self.chrompack) = values[4:9]
-		if self.format == 'compress' and len(values) > 9:
-			self.compressheader = values[9]
-		self.setderived()
-
-	# Retrieve all parameters in a format suitable for a subsequent
-	# call to setinfo()
-
-	def getinfo(self):
-		return (self.format, self.width, self.height, self.packfactor,\
-			self.c0bits, self.c1bits, self.c2bits, self.offset, \
-			self.chrompack)
-
-	def getcompressheader(self):
-		return self.compressheader
-
-	def setcompressheader(self, ch):
-		self.compressheader = ch
-
-	# Write the relevant bits to stdout
-
-	def printinfo(self):
-		print 'Format:  ', self.format
-		print 'Size:    ', self.width, 'x', self.height
-		print 'Pack:    ', self.packfactor, '; chrom:', self.chrompack
-		print 'Bpp:     ', self.bpp
-		print 'Bits:    ', self.c0bits, self.c1bits, self.c2bits
-		print 'Offset:  ', self.offset
-
-	# Calculate data size, if possible
-	# (Not counting frame header or cdata size)
-
-	def calcframesize(self):
-		if not self.bpp: raise CallError
-		size = self.width/self.xpf * self.height/self.ypf
-		size = (size * self.bpp + 7) / 8
-		return size
-
-	# Decompress a possibly compressed frame. This method is here
-	# since you sometimes want to use it on a VFile instance and sometimes
-	# on a Displayer instance.
-	#
-	# XXXX This should also handle jpeg. Actually, the whole mechanism
-	# should be much more of 'ihave/iwant' style, also allowing you to
-	# read, say, greyscale images from a color movie.
-	
-	def decompress(self, data):
-		if self.format <> 'compress':
-			return data
-		if not self.decompressor:
-			import cl
-			scheme = cl.QueryScheme(self.compressheader)
-			self.decompressor = cl.OpenDecompressor(scheme)
-			headersize = self.decompressor.ReadHeader(self.compressheader)
-			width = self.decompressor.GetParam(cl.IMAGE_WIDTH)
-			height = self.decompressor.GetParam(cl.IMAGE_HEIGHT)
-			params = [cl.ORIGINAL_FORMAT, cl.RGBX, \
-				  cl.ORIENTATION, cl.BOTTOM_UP, \
-				  cl.FRAME_BUFFER_SIZE, width*height*cl.BytesPerPixel(cl.RGBX)]
-			self.decompressor.SetParams(params)
-		data = self.decompressor.Decompress(1, data)
-		return data
-
-
-# Class to display video frames in a window.
-# It is the caller's responsibility to ensure that the correct window
-# is current when using showframe(), initcolormap(), clear() and clearto()
-
-class Displayer(VideoParams):
-
-	# Initialize an instance.
-	# This does not need a current window
-
-	def __init__(self):
-		if no_gl:
-			raise RuntimeError, \
-				  'no gl module available, so cannot display'
-		VideoParams.__init__(self)
-		# User-settable parameters
-		self.magnify = 1.0	# frame magnification factor
-		self.xorigin = 0	# x frame offset
-		self.yorigin = 0	# y frame offset (from bottom)
-		self.quiet = 0		# if set, don't print messages
-		self.fallback = 1	# allow fallback to grey
-		# Internal flags
-		self.colormapinited = 0	# must initialize window
-		self.skipchrom = 0	# don't skip chrominance data
-		self.color0 = None	# magic, used by clearto()
-		self.fixcolor0 = 0	# don't need to fix color0
-		self.mustunpack = (not support_packed_pixels())
-
-	# setinfo() must reset some internal flags
-
-	def setinfo(self, values):
-		VideoParams.setinfo(self, values)
-		self.colormapinited = 0
-		self.skipchrom = 0
-		self.color0 = None
-		self.fixcolor0 = 0
-
-	# Show one frame, initializing the window if necessary
-
-	def showframe(self, data, chromdata):
-		self.showpartframe(data, chromdata, \
-			  (0,0,self.width,self.height))
-
-	def showpartframe(self, data, chromdata, (x,y,w,h)):
-		pmsize = self.bpp
-		xpf, ypf = self.xpf, self.ypf
-		if self.upside_down:
-			gl.pixmode(GL.PM_TTOB, 1)
-		if self.mirror_image:
-			gl.pixmode(GL.PM_RTOL, 1)
-		if self.format in ('jpeg', 'jpeggrey'):
-			import jpeg
-			data, width, height, bytes = jpeg.decompress(data)
-			pmsize = bytes*8
-		elif self.format == 'compress':
-			data = self.decompress(data)
-			pmsize = 32
-		elif self.format in ('mono', 'grey4'):
-			if self.mustunpack:
-				if self.format == 'mono':
-					data = imageop.mono2grey(data, \
-						  w/xpf, h/ypf, 0x20, 0xdf)
-				elif self.format == 'grey4':
-					data = imageop.grey42grey(data, \
-						  w/xpf, h/ypf)
-				pmsize = 8
-		elif self.format == 'grey2':
-			data = imageop.grey22grey(data, w/xpf, h/ypf)
-			pmsize = 8
-		if not self.colormapinited:
-			self.initcolormap()
-		if self.fixcolor0:
-			gl.mapcolor(self.color0)
-			self.fixcolor0 = 0
-		xfactor = yfactor = self.magnify
-		xfactor = xfactor * xpf
-		yfactor = yfactor * ypf
-		if chromdata and not self.skipchrom:
-			cp = self.chrompack
-			cx = int(x*xfactor*cp) + self.xorigin
-			cy = int(y*yfactor*cp) + self.yorigin
-			cw = (w+cp-1)/cp
-			ch = (h+cp-1)/cp
-			gl.rectzoom(xfactor*cp, yfactor*cp)
-			gl.pixmode(GL.PM_SIZE, 16)
-			gl.writemask(self.mask - ((1 << self.c0bits) - 1))
-			gl.lrectwrite(cx, cy, cx + cw - 1, cy + ch - 1, \
-				  chromdata)
-		#
-		if pmsize < 32:
-			gl.writemask((1 << self.c0bits) - 1)
-		gl.pixmode(GL.PM_SIZE, pmsize)
-		w = w/xpf
-		h = h/ypf
-		x = x/xpf
-		y = y/ypf
-		gl.rectzoom(xfactor, yfactor)
-		x = int(x*xfactor)+self.xorigin
-		y = int(y*yfactor)+self.yorigin
-		gl.lrectwrite(x, y, x + w - 1, y + h - 1, data)
-		gl.gflush()
-
-	# Initialize the window: set RGB or colormap mode as required,
-	# fill in the colormap, and clear the window
-
-	def initcolormap(self):
-		self.colormapinited = 1
-		self.color0 = None
-		self.fixcolor0 = 0
-		if self.format in ('rgb', 'jpeg', 'compress'):
-			self.set_rgbmode()
-			gl.RGBcolor(200, 200, 200) # XXX rather light grey
-			gl.clear()
-			return
-		# This only works on an Entry-level Indigo from IRIX 4.0.5
-		if self.format == 'rgb8' and is_entry_indigo() and \
-			  gl.gversion() == 'GL4DLG-4.0.': # Note trailing '.'!
-			self.set_rgbmode()
-			gl.RGBcolor(200, 200, 200) # XXX rather light grey
-			gl.clear()
-			gl.pixmode(GL.PM_SIZE, 8)
-			return
-		self.set_cmode()
-		self.skipchrom = 0
-		if self.offset == 0:
-			self.mask = 0x7ff
-		else:
-			self.mask = 0xfff
-		if not self.quiet:
-			sys.stderr.write('Initializing color map...')
-		self._initcmap()
-		gl.clear()
-		if not self.quiet:
-			sys.stderr.write(' Done.\n')
-
-	# Set the window in RGB mode (may be overridden for Glx window)
-
-	def set_rgbmode(self):
-		gl.RGBmode()
-		gl.gconfig()
-
-	# Set the window in colormap mode (may be overridden for Glx window)
-
-	def set_cmode(self):
-		gl.cmode()
-		gl.gconfig()
-
-	# Clear the window to a default color
-
-	def clear(self):
-		if not self.colormapinited: raise CallError
-		if gl.getdisplaymode() in (GET.DMRGB, GET.DMRGBDOUBLE):
-			gl.RGBcolor(200, 200, 200) # XXX rather light grey
-			gl.clear()
-			return
-		gl.writemask(0xffffffff)
-		gl.clear()
-
-	# Clear the window to a given RGB color.
-	# This may steal the first color index used; the next call to
-	# showframe() will restore the intended mapping for that index
-
-	def clearto(self, r, g, b):
-		if not self.colormapinited: raise CallError
-		if gl.getdisplaymode() in (GET.DMRGB, GET.DMRGBDOUBLE):
-			gl.RGBcolor(r, g, b)
-			gl.clear()
-			return
-		index = self.color0[0]
-		self.fixcolor0 = 1
-		gl.mapcolor(index, r, g, b)
-		gl.writemask(0xffffffff)
-		gl.clear()
-		gl.gflush()
-
-	# Do the hard work for initializing the colormap (internal).
-	# This also sets the current color to the first color index
-	# used -- the caller should never change this since it is used
-	# by clear() and clearto()
-
-	def _initcmap(self):
-		map = []
-		if self.format in ('mono', 'grey4') and self.mustunpack:
-			convcolor = conv_grey
-		else:
-			convcolor = choose_conversion(self.format)
-		maxbits = gl.getgdesc(GL.GD_BITS_NORM_SNG_CMODE)
-		if maxbits > 11:
-			maxbits = 11
-		c0bits = self.c0bits
-		c1bits = self.c1bits
-		c2bits = self.c2bits
-		if c0bits+c1bits+c2bits > maxbits:
-			if self.fallback and c0bits < maxbits:
-				# Cannot display frames in this mode, use grey
-				self.skipchrom = 1
-				c1bits = c2bits = 0
-				convcolor = choose_conversion('grey')
-			else:
-				raise Error, 'Sorry, '+`maxbits`+ \
-				  ' bits max on this machine'
-		maxc0 = 1 << c0bits
-		maxc1 = 1 << c1bits
-		maxc2 = 1 << c2bits
-		if self.offset == 0 and maxbits == 11:
-			offset = 2048
-		else:
-			offset = self.offset
-		if maxbits <> 11:
-			offset = offset & ((1<<maxbits)-1)
-		self.color0 = None
-		self.fixcolor0 = 0
-		for c0 in range(maxc0):
-			c0v = c0/float(maxc0-1)
-			for c1 in range(maxc1):
-				if maxc1 == 1:
-					c1v = 0
-				else:
-					c1v = c1/float(maxc1-1)
-				for c2 in range(maxc2):
-					if maxc2 == 1:
-						c2v = 0
-					else:
-						c2v = c2/float(maxc2-1)
-					index = offset + c0 + (c1<<c0bits) + \
-						(c2 << (c0bits+c1bits))
-					if index < MAXMAP:
-						rv, gv, bv = \
-						  convcolor(c0v, c1v, c2v)
-						r, g, b = int(rv*255.0), \
-							  int(gv*255.0), \
-							  int(bv*255.0)
-						map.append((index, r, g, b))
-						if self.color0 == None:
-							self.color0 = \
-								index, r, g, b
-		self.install_colormap(map)
-		# Permanently make the first color index current
-		gl.color(self.color0[0])
-
-	# Install the colormap in the window (may be overridden for Glx window)
-
-	def install_colormap(self, map):
-		if not self.quiet:
-			sys.stderr.write(' Installing ' + `len(map)` + \
-				  ' entries...')
-		for irgb in map:
-			gl.mapcolor(irgb)
-		gl.gflush() # send the colormap changes to the X server
-
-
-# Read a CMIF video file header.
-# Return (version, values) where version is 0.0, 1.0, 2.0 or 3.[01],
-# and values is ready for setinfo().
-# Raise Error if there is an error in the info
-
-def readfileheader(fp, filename):
-	#
-	# Get identifying header
-	#
-	line = fp.readline(20)
-	if   line == 'CMIF video 0.0\n':
-		version = 0.0
-	elif line == 'CMIF video 1.0\n':
-		version = 1.0
-	elif line == 'CMIF video 2.0\n':
-		version = 2.0
-	elif line == 'CMIF video 3.0\n':
-		version = 3.0
-	elif line == 'CMIF video 3.1\n':
-		version = 3.1
-	else:
-		# XXX Could be version 0.0 without identifying header
-		raise Error, \
-			filename + ': Unrecognized file header: ' + `line`[:20]
-	compressheader = None
-	#
-	# Get color encoding info
-	# (The format may change to 'rgb' later when packfactor == 0)
-	#
-	if version <= 1.0:
-		format = 'grey'
-		c0bits, c1bits, c2bits = 8, 0, 0
-		chrompack = 0
-		offset = 0
-	elif version == 2.0:
-		line = fp.readline()
-		try:
-			c0bits, c1bits, c2bits, chrompack = eval(line[:-1])
-		except:
-			raise Error, filename + ': Bad 2.0 color info'
-		if c1bits or c2bits:
-			format = 'yiq'
-		else:
-			format = 'grey'
-		offset = 0
-	elif version in (3.0, 3.1):
-		line = fp.readline()
-		try:
-			format, rest = eval(line[:-1])
-		except:
-			raise Error, filename + ': Bad 3.[01] color info'
-		if format in ('rgb', 'jpeg'):
-			c0bits = c1bits = c2bits = 0
-			chrompack = 0
-			offset = 0
-		elif format == 'compress':
-			c0bits = c1bits = c2bits = 0
-			chrompack = 0
-			offset = 0
-			compressheader = rest
-		elif format in ('grey', 'jpeggrey', 'mono', 'grey2', 'grey4'):
-			c0bits = rest
-			c1bits = c2bits = 0
-			chrompack = 0
-			offset = 0
-		else:
-			# XXX ought to check that the format is valid
-			try:
-			    c0bits, c1bits, c2bits, chrompack, offset = rest
-			except:
-			    raise Error, filename + ': Bad 3.[01] color info'
-	if format == 'xrgb8':
-		format = 'rgb8' # rgb8 upside-down, for X
-		upside_down = 1
-	else:
-		upside_down = 0
-	#
-	# Get frame geometry info
-	#
-	line = fp.readline()
-	try:
-		x = eval(line[:-1])
-	except:
-		raise Error, filename + ': Bad (w,h,pf) info'
-	if type(x) <> type(()):
-		raise Error, filename + ': Bad (w,h,pf) info'
-	if len(x) == 3:
-		width, height, packfactor = x
-		if packfactor == 0 and version < 3.0:
-			format = 'rgb'
-			c0bits = 0
-	elif len(x) == 2 and version <= 1.0:
-		width, height = x
-		packfactor = 2
-	else:
-		raise Error, filename + ': Bad (w,h,pf) info'
-	if type(packfactor) is type(0):
-		if packfactor == 0: packfactor = 1
-		xpf = ypf = packfactor
-	else:
-		xpf, ypf = packfactor
-	if upside_down:
-		ypf = -ypf
-	packfactor = (xpf, ypf)
-	xpf = abs(xpf)
-	ypf = abs(ypf)
-	width = (width/xpf) * xpf
-	height = (height/ypf) * ypf
-	#
-	# Return (version, values)
-	#
-	values = (format, width, height, packfactor, \
-		  c0bits, c1bits, c2bits, offset, chrompack, compressheader)
-	return (version, values)
-
-
-# Read a *frame* header -- separate functions per version.
-# Return (timecode, datasize, chromdatasize).
-# Raise EOFError if end of data is reached.
-# Raise Error if data is bad.
-
-def readv0frameheader(fp):
-	line = fp.readline()
-	if not line or line == '\n': raise EOFError
-	try:
-		t = eval(line[:-1])
-	except:
-		raise Error, 'Bad 0.0 frame header'
-	return (t, 0, 0)
-
-def readv1frameheader(fp):
-	line = fp.readline()
-	if not line or line == '\n': raise EOFError
-	try:
-		t, datasize = eval(line[:-1])
-	except:
-		raise Error, 'Bad 1.0 frame header'
-	return (t, datasize, 0)
-
-def readv2frameheader(fp):
-	line = fp.readline()
-	if not line or line == '\n': raise EOFError
-	try:
-		t, datasize = eval(line[:-1])
-	except:
-		raise Error, 'Bad 2.0 frame header'
-	return (t, datasize, 0)
-
-def readv3frameheader(fp):
-	line = fp.readline()
-	if not line or line == '\n': raise EOFError
-	try:
-		t, datasize, chromdatasize = x = eval(line[:-1])
-	except:
-		raise Error, 'Bad 3.[01] frame header'
-	return x
-
-
-# Write a CMIF video file header (always version 3.1)
-
-def writefileheader(fp, values):
-	(format, width, height, packfactor, \
-		c0bits, c1bits, c2bits, offset, chrompack) = values
-	#
-	# Write identifying header
-	#
-	fp.write('CMIF video 3.1\n')
-	#
-	# Write color encoding info
-	#
-	if format in ('rgb', 'jpeg'):
-		data = (format, 0)
-	elif format in ('grey', 'jpeggrey', 'mono', 'grey2', 'grey4'):
-		data = (format, c0bits)
-	else:
-		data = (format, (c0bits, c1bits, c2bits, chrompack, offset))
-	fp.write(`data`+'\n')
-	#
-	# Write frame geometry info
-	#
-	data = (width, height, packfactor)
-	fp.write(`data`+'\n')
-	
-def writecompressfileheader(fp, cheader, values):
-	(format, width, height, packfactor, \
-		c0bits, c1bits, c2bits, offset, chrompack) = values
-	#
-	# Write identifying header
-	#
-	fp.write('CMIF video 3.1\n')
-	#
-	# Write color encoding info
-	#
-	data = (format, cheader)
-	fp.write(`data`+'\n')
-	#
-	# Write frame geometry info
-	#
-	data = (width, height, packfactor)
-	fp.write(`data`+'\n')
-
-
-# Basic class for reading CMIF video files
-
-class BasicVinFile(VideoParams):
-
-	def __init__(self, filename):
-		if type(filename) != type(''):
-			fp = filename
-			filename = '???'
-		elif filename == '-':
-			fp = sys.stdin
-		else:
-			fp = open(filename, 'r')
-		self.initfp(fp, filename)
-
-	def initfp(self, fp, filename):
-		VideoParams.__init__(self)
-		self.fp = fp
-		self.filename = filename
-		self.version, values = readfileheader(fp, filename)
-		self.setinfo(values)
-		self.freeze()
-		if self.version == 0.0:
-			w, h, pf = self.width, self.height, self.packfactor
-			if pf == 0:
-				self._datasize = w*h*4
-			else:
-				self._datasize = (w/pf) * (h/pf)
-			self._readframeheader = self._readv0frameheader
-		elif self.version == 1.0:
-			self._readframeheader = readv1frameheader
-		elif self.version == 2.0:
-			self._readframeheader = readv2frameheader
-		elif self.version in (3.0, 3.1):
-			self._readframeheader = readv3frameheader
-		else:
-			raise Error, \
-				filename + ': Bad version: ' + `self.version`
-		self.framecount = 0
-		self.atframeheader = 1
-		self.eofseen = 0
-		self.errorseen = 0
-		try:
-			self.startpos = self.fp.tell()
-			self.canseek = 1
-		except IOError:
-			self.startpos = -1
-			self.canseek = 0
-
-	def _readv0frameheader(self, fp):
-		t, ds, cs = readv0frameheader(fp)
-		ds = self._datasize
-		return (t, ds, cs)
-
-	def close(self):
-		self.fp.close()
-		del self.fp
-		del self._readframeheader
-
-	def rewind(self):
-		if not self.canseek:
-			raise Error, self.filename + ': can\'t seek'
-		self.fp.seek(self.startpos)
-		self.framecount = 0
-		self.atframeheader = 1
-		self.eofseen = 0
-		self.errorseen = 0
-
-	def warmcache(self):
-		print '[BasicVinFile.warmcache() not implemented]'
-
-	def printinfo(self):
-		print 'File:    ', self.filename
-		print 'Size:    ', getfilesize(self.filename)
-		print 'Version: ', self.version
-		VideoParams.printinfo(self)
-
-	def getnextframe(self):
-		t, ds, cs = self.getnextframeheader()
-		data, cdata = self.getnextframedata(ds, cs)
-		return (t, data, cdata)
-
-	def skipnextframe(self):
-		t, ds, cs = self.getnextframeheader()
-		self.skipnextframedata(ds, cs)
-		return t
-
-	def getnextframeheader(self):
-		if self.eofseen: raise EOFError
-		if self.errorseen: raise CallError
-		if not self.atframeheader: raise CallError
-		self.atframeheader = 0
-		try:
-			return self._readframeheader(self.fp)
-		except Error, msg:
-			self.errorseen = 1
-			# Patch up the error message
-			raise Error, self.filename + ': ' + msg
-		except EOFError:
-			self.eofseen = 1
-			raise EOFError
-
-	def getnextframedata(self, ds, cs):
-		if self.eofseen: raise EOFError
-		if self.errorseen: raise CallError
-		if self.atframeheader: raise CallError
-		if ds:
-			data = self.fp.read(ds)
-			if len(data) < ds:
-				self.eofseen = 1
-				raise EOFError
-		else:
-			data = ''
-		if cs:
-			cdata = self.fp.read(cs)
-			if len(cdata) < cs:
-				self.eofseen = 1
-				raise EOFError
-		else:
-			cdata = ''
-		self.atframeheader = 1
-		self.framecount = self.framecount + 1
-		return (data, cdata)
-
-	def skipnextframedata(self, ds, cs):
-		if self.eofseen: raise EOFError
-		if self.errorseen: raise CallError
-		if self.atframeheader: raise CallError
-		# Note that this won't raise EOFError for a partial frame
-		# since there is no easy way to tell whether a seek
-		# ended up beyond the end of the file
-		if self.canseek:
-			self.fp.seek(ds + cs, 1) # Relative seek
-		else:
-			dummy = self.fp.read(ds + cs)
-			del dummy
-		self.atframeheader = 1
-		self.framecount = self.framecount + 1
-
-
-# Subroutine to return a file's size in bytes
-
-def getfilesize(filename):
-	import os, stat
-	try:
-		st = os.stat(filename)
-		return st[stat.ST_SIZE]
-	except os.error:
-		return 0
-
-
-# Derived class implementing random access and index cached in the file
-
-class RandomVinFile(BasicVinFile):
-
-	def initfp(self, fp, filename):
-		BasicVinFile.initfp(self, fp, filename)
-		self.index = []
-
-	def warmcache(self):
-		if len(self.index) == 0:
-			try:
-				self.readcache()
-			except Error:
-				self.buildcache()
-		else:
-			print '[RandomVinFile.warmcache(): too late]'
-			self.rewind()
-
-	def buildcache(self):
-		self.index = []
-		self.rewind()
-		while 1:
-			try: dummy = self.skipnextframe()
-			except EOFError: break
-		self.rewind()
-
-	def writecache(self):
-		# Raises IOerror if the file is not seekable & writable!
-		import marshal
-		if len(self.index) == 0:
-			self.buildcache()
-			if len(self.index) == 0:
-				raise Error, self.filename + ': No frames'
-		self.fp.seek(0, 2)
-		self.fp.write('\n/////CMIF/////\n')
-		pos = self.fp.tell()
-		data = `pos`
-		data = '\n-*-*-CMIF-*-*-\n' + data + ' '*(15-len(data)) + '\n'
-		try:
-			marshal.dump(self.index, self.fp)
-			self.fp.write(data)
-			self.fp.flush()
-		finally:
-			self.rewind()
-
-	def readcache(self):
-		# Raises Error if there is no cache in the file
-		import marshal
-		if len(self.index) <> 0:
-			raise CallError
-		self.fp.seek(-32, 2)
-		data = self.fp.read()
-		if data[:16] <> '\n-*-*-CMIF-*-*-\n' or data[-1:] <> '\n':
-			self.rewind()
-			raise Error, self.filename + ': No cache'
-		pos = eval(data[16:-1])
-		self.fp.seek(pos)
-		try:
-			self.index = marshal.load(self.fp)
-		except TypeError:
-			self.rewind()
-			raise Error, self.filename + ': Bad cache'
-		self.rewind()
-
-	def getnextframeheader(self):
-		if self.framecount < len(self.index):
-			return self._getindexframeheader(self.framecount)
-		if self.framecount > len(self.index):
-			raise AssertError, \
-				'managed to bypass index?!?'
-		rv = BasicVinFile.getnextframeheader(self)
-		if self.canseek:
-			pos = self.fp.tell()
-			self.index.append((rv, pos))
-		return rv
-
-	def getrandomframe(self, i):
-		t, ds, cs = self.getrandomframeheader(i)
-		data, cdata = self.getnextframedata(ds, cs)
-		return t, data, cdata
-
-	def getrandomframeheader(self, i):
-		if i < 0: raise ValueError, 'negative frame index'
-		if not self.canseek:
-			raise Error, self.filename + ': can\'t seek'
-		if i < len(self.index):
-			return self._getindexframeheader(i)
-		if len(self.index) > 0:
-			rv = self.getrandomframeheader(len(self.index)-1)
-		else:
-			self.rewind()
-			rv = self.getnextframeheader()
-		while i > self.framecount:
-			self.skipnextframedata()
-			rv = self.getnextframeheader()
-		return rv
-
-	def _getindexframeheader(self, i):
-		(rv, pos) = self.index[i]
-		self.fp.seek(pos)
-		self.framecount = i
-		self.atframeheader = 0
-		self.eofseen = 0
-		self.errorseen = 0
-		return rv
-
-
-# Basic class for writing CMIF video files
-
-class BasicVoutFile(VideoParams):
-
-	def __init__(self, filename):
-		if type(filename) != type(''):
-			fp = filename
-			filename = '???'
-		elif filename == '-':
-			fp = sys.stdout
-		else:
-			fp = open(filename, 'w')
-		self.initfp(fp, filename)
-
-	def initfp(self, fp, filename):
-		VideoParams.__init__(self)
-		self.fp = fp
-		self.filename = filename
-		self.version = 3.1 # In case anyone inquries
-
-	def flush(self):
-		self.fp.flush()
-
-	def close(self):
-		self.fp.close()
-		del self.fp
-
-	def prealloc(self, nframes):
-		if not self.frozen: raise CallError
-		data = '\xff' * (self.calcframesize() + 64)
-		pos = self.fp.tell()
-		for i in range(nframes):
-			self.fp.write(data)
-		self.fp.seek(pos)
-
-	def writeheader(self):
-		if self.frozen: raise CallError
-		if self.format == 'compress':
-			writecompressfileheader(self.fp, self.compressheader, \
-				  self.getinfo())
-		else:
-			writefileheader(self.fp, self.getinfo())
-		self.freeze()
-		self.atheader = 1
-		self.framecount = 0
-
-	def rewind(self):
-		self.fp.seek(0)
-		self.unfreeze()
-		self.atheader = 1
-		self.framecount = 0
-
-	def printinfo(self):
-		print 'File:    ', self.filename
-		VideoParams.printinfo(self)
-
-	def writeframe(self, t, data, cdata):
-		if data: ds = len(data)
-		else: ds = 0
-		if cdata: cs = len(cdata)
-		else: cs = 0
-		self.writeframeheader(t, ds, cs)
-		self.writeframedata(data, cdata)
-
-	def writeframeheader(self, t, ds, cs):
-		if not self.frozen: self.writeheader()
-		if not self.atheader: raise CallError
-		data = `(t, ds, cs)`
-		n = len(data)
-		if n < 63: data = data + ' '*(63-n)
-		self.fp.write(data + '\n')
-		self.atheader = 0
-
-	def writeframedata(self, data, cdata):
-		if not self.frozen or self.atheader: raise CallError
-		if data: self.fp.write(data)
-		if cdata: self.fp.write(cdata)
-		self.atheader = 1
-		self.framecount = self.framecount + 1
-
-
-# Classes that combine files with displayers:
-
-class VinFile(RandomVinFile, Displayer):
-
-	def initfp(self, fp, filename):
-		Displayer.__init__(self)
-		RandomVinFile.initfp(self, fp, filename)
-
-	def shownextframe(self):
-		t, data, cdata = self.getnextframe()
-		self.showframe(data, cdata)
-		return t
-
-
-class VoutFile(BasicVoutFile, Displayer):
-
-	def initfp(self, fp, filename):
-		Displayer.__init__(self)
-##		Grabber.__init__(self) # XXX not needed
-		BasicVoutFile.initfp(self, fp, filename)
-
-
-# Simple test program (VinFile only)
-
-def test():
-	import time
-	if sys.argv[1:]: filename = sys.argv[1]
-	else: filename = 'film.video'
-	vin = VinFile(filename)
-	vin.printinfo()
-	gl.foreground()
-	gl.prefsize(vin.getsize())
-	wid = gl.winopen(filename)
-	vin.initcolormap()
-	t0 = time.time()
-	while 1:
-		try: t, data, cdata = vin.getnextframe()
-		except EOFError: break
-		dt = t0 + t - time.time()
-		if dt > 0: time.time(dt)
-		vin.showframe(data, cdata)
-	time.sleep(2)
diff --git a/Demo/sgi/video/VGrabber.py b/Demo/sgi/video/VGrabber.py
deleted file mode 100755
index 242ebf2..0000000
--- a/Demo/sgi/video/VGrabber.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Class to grab frames from a window.
-# (This has fewer user-settable parameters than Displayer.)
-# It is the caller's responsibility to initialize the window and to
-# ensure that it is current when using grabframe()
-
-import gl, GL
-import VFile
-import GET
-from VFile import Error
-
-class VGrabber(VFile.VideoParams):
-
-	# XXX The constructor of VideoParams is just fine, for now
-
-	# Grab a frame.
-	# Return (data, chromdata) just like getnextframe().
-
-	def grabframe(self):
-		grabber = choose_grabber(self.format)
-		return grabber(self.width, self.height, self.packfactor)
-
-
-# Choose one of the grabber functions below based upon a color system name
-
-def choose_grabber(format):
-	try:
-		return eval('grab_' + format)
-	except:
-		raise Error, 'Unknown color system: ' + `format`
-
-
-# Routines to grab data, per color system (only a few really supported).
-# (These functions are used via eval with a constructed argument!)
-
-def grab_rgb(w, h, pf):
-	if gl.getdisplaymode() <> GET.DMRGB:
-		raise Error, 'Sorry, can only grab rgb in single-buf rgbmode'
-	if pf <> (1, 1):
-		raise Error, 'Sorry, only grab rgb with packfactor (1,1)'
-	return gl.lrectread(0, 0, w-1, h-1), None
-
-def grab_rgb8(w, h, pf):
-	if gl.getdisplaymode() <> GET.DMRGB:
-		raise Error, 'Sorry, can only grab rgb8 in single-buf rgbmode'
-	if pf <> (1, 1):
-		raise Error, 'Sorry, can only grab rgb8 with packfactor (1,1)'
-	if not VFile.is_entry_indigo():
-		raise Error, 'Sorry, can only grab rgb8 on entry level Indigo'
-	# XXX Dirty Dirty here.
-	# XXX Set buffer to cmap mode, grab image and set it back.
-	gl.cmode()
-	gl.gconfig()
-	gl.pixmode(GL.PM_SIZE, 8)
-	data = gl.lrectread(0, 0, w-1, h-1)
-	data = data[:w*h]	# BUG FIX for python lrectread
-	gl.RGBmode()
-	gl.gconfig()
-	gl.pixmode(GL.PM_SIZE, 32)
-	return data, None
-
-def grab_grey(w, h, pf):
-	raise Error, 'Sorry, grabbing grey not implemented'
-
-def grab_yiq(w, h, pf):
-	raise Error, 'Sorry, grabbing yiq not implemented'
-
-def grab_hls(w, h, pf):
-	raise Error, 'Sorry, grabbing hls not implemented'
-
-def grab_hsv(w, h, pf):
-	raise Error, 'Sorry, grabbing hsv not implemented'
-
-def grab_jpeg(w, h, pf):
-	data, dummy = grab_rgb(w, h, pf)
-	import jpeg
-	data = jpeg.compress(data, w, h, 4)
-	return data, None
-
-def grab_jpeggrey(w, h, pf):
-	raise Error, 'sorry, grabbing jpeggrey not implemented'
diff --git a/Demo/sgi/video/Vaddcache.py b/Demo/sgi/video/Vaddcache.py
deleted file mode 100755
index 4c8fdac..0000000
--- a/Demo/sgi/video/Vaddcache.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#! /usr/bin/env python
-
-# Add a cache to each of the files given as command line arguments
-
-
-# Usage:
-#
-# Vaddcache [file] ...
-
-
-# Options:
-#
-# file ... : file(s) to modify; default film.video
-
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-import VFile
-import getopt
-
-
-# Global options
-
-# None
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	opts, args = getopt.getopt(sys.argv[1:], '')
-	if not args:
-		args = ['film.video']
-	sts = 0
-	for filename in args:
-		if process(filename):
-			sts = 1
-	sys.exit(sts)
-
-
-# Process one file
-
-def process(filename):
-	try:
-		fp = open(filename, 'r+')
-		vin = VFile.RandomVinFile(fp)
-		vin.filename = filename
-	except IOError, msg:
-		sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(filename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vin.readcache()
-		hascache = 1
-	except VFile.Error:
-		hascache = 0
-
-	if hascache:
-		sys.stderr.write(filename + ': already has a cache\n')
-		vin.close()
-		return 1
-
-	vin.printinfo()
-	vin.warmcache()
-	vin.writecache()
-	vin.close()
-	return 0
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/Vb.py b/Demo/sgi/video/Vb.py
deleted file mode 100755
index e1b06d6..0000000
--- a/Demo/sgi/video/Vb.py
+++ /dev/null
@@ -1,962 +0,0 @@
-#! /usr/bin/env python
-
-# Video bag of tricks: record video(+audio) in various formats and modes
-
-# XXX To do:
-# - audio
-# - improve user interface
-# - help button?
-# - command line options to set initial settings
-# - save settings in a file
-# - ...?
-
-import sys
-import time
-import getopt
-import string
-import os
-sts = os.system('makemap')		# Must be before "import fl" to work
-import sgi
-import gl
-import GL
-import DEVICE
-import fl
-import FL
-import flp
-import watchcursor
-import sv
-import SV
-import VFile
-import VGrabber
-import imageop
-sys.path.append('/ufs/jack/src/av/vcr')
-import VCR
-try:
-	import cl
-except ImportError:
-	cl = None
-
-ARROW = 0
-WATCH = 1
-watchcursor.defwatch(WATCH)
-
-def main():
-##	fl.set_graphics_mode(0, 1)
-	vb = VideoBagOfTricks()
-	while 1:
-		dummy = fl.do_forms()
-		[dummy]
-
-StopCapture = 'StopCapture'
-
-VideoFormatLabels = ['Video off', 'rgb8', 'grey8', 'grey4', 'grey2', \
-	  'grey2 dith', 'mono dith', 'mono thresh', 'rgb24', 'rgb24-jpeg', \
-	  'compress']
-VideoFormats = ['', 'rgb8', 'grey', 'grey4', 'grey2', \
-	  'grey2', 'mono', 'mono', 'rgb', 'jpeg', 'compress']
-
-VideoModeLabels = ['Continuous', 'Burst', 'Single frame', 'VCR sync']
-[VM_CONT, VM_BURST, VM_SINGLE, VM_VCR] = range(1, 5)
-
-AudioFormatLabels = ['Audio off', \
-	  '16 bit mono', '16 bit stereo', '8 bit mono', '8 bit stereo']
-[A_OFF, A_16_MONO, A_16_STEREO, A_8_MONO, A_8_STEREO] = range(1, 6)
-
-VcrSpeedLabels = ['normal', '1/3', '1/5', '1/10', '1/30', 'single-step']
-VcrSpeeds = [None, 5, 4, 3, 2, 1, 0]
-
-RgbSizeLabels = ['full', 'quarter', 'sixteenth']
-
-# init file stuff:
-if os.environ.has_key('HOME'):
-	HOME=os.environ['HOME']
-else:
-	HOME='.'
-VB_INIT_FILE=HOME + '/.Vb_init'
-
-VB_INIT_KEYS=['vfile', 'vmode', 'mono_thresh', 'vformat', 'comp_scheme', \
-	  'rgb24_size', 'afile', 'aformat']
-
-class VideoBagOfTricks:
-
-	# Init/close stuff
-
-	def __init__(self):
-		self.window = None
-		formdef = flp.parse_form('VbForm', 'form')
-		flp.create_full_form(self, formdef)
-		self.setdefaults()
-		if self.vmode <> VM_CONT:
-			self.g_cont.hide_object()
-		if self.vmode <> VM_BURST:
-			self.g_burst.hide_object()
-		if self.vmode <> VM_SINGLE:
-			self.g_single.hide_object()
-		if self.vmode <> VM_VCR:
-			self.g_vcr.hide_object()
-		if self.vformat <> 'compress':
-			self.g_compress.hide_object()
-
-		self.openvideo()
-		self.makewindow()
-		self.bindvideo()
-		if self.use_24:
-			self.optfullsizewindow()
-		self.showform()
-		fl.set_event_call_back(self.do_event)
-
-	def close(self):
-		self.close_video()
-		self.close_audio()
-		self.savedefaults()
-		raise SystemExit, 0
-
-	def showform(self):
-		# Get position of video window
-		gl.winset(self.window)
-		x, y = gl.getorigin()
-		width, height = gl.getsize()
-		# Calculate position of form window
-		x1 = x + width + 10
-		x2 = x1 + int(self.form.w) - 1
-		y2 = y + height - 1
-		y1 = y2 - int(self.form.h) + 1
-		# Position and show form window
-		gl.prefposition(x1, x2, y1, y2)
-		self.form.show_form(FL.PLACE_FREE, FL.TRUE, 'Vb Control')
-
-	def getdefaultdefaults(self):
-		# Video defaults
-		self.vfile = 'film.video'
-		self.vmode = VM_CONT
-		self.mono_thresh = 128
-		self.vformat = 'rgb8'
-		self.comp_scheme = 'Uncompressed'
-		self.rgb24_size = 1
-		# Missing: drop, rate, maxmem, nframes, rate, vcrspeed
-		# Audio defaults:
-		self.afile = 'film.aiff'
-		self.aformat = A_OFF
-
-	def getdefaults(self):
-		self.getdefaultdefaults()
-		# XXXX Read defaults file and override.
-		try:
-			fp = open(VB_INIT_FILE, 'r')
-		except IOError:
-			print 'Vb: no init file'
-			self.initcont = {}
-			return
-		data = fp.read(1000000)
-		try:
-			self.initcont = eval(data)
-		except:
-			print 'Vb: Ill-formatted init file'
-			self.initcont = {}
-		for k in self.initcont.keys():
-			if hasattr(self, k):
-				setattr(self, k, self.initcont[k])
-
-	def savedefaults(self):
-		newdb = {}
-		for k in VB_INIT_KEYS:
-			newdb[k] = getattr(self, k)
-		if newdb <> self.initcont:
-			try:
-				fp = open(VB_INIT_FILE, 'w')
-			except IOError:
-				print 'Vb: Cannot create', VB_INIT_FILE
-				return
-			fp.write(`newdb`)
-			fp.close()
-			
-	def setdefaults(self):
-		self.getdefaults()
-		self.vcr = None
-		self.vout = None
-		self.capturing = 0
-		self.c_vformat.clear_choice()
-		for label in VideoFormatLabels:
-			self.c_vformat.addto_choice(label)
-		self.c_vformat.set_choice(1 + VideoFormats.index(self.vformat))
-		self.c_vmode.clear_choice()
-		for label in VideoModeLabels:
-			self.c_vmode.addto_choice(label)
-		self.c_vmode.set_choice(self.vmode)
-		self.get_vformat()
-		self.b_drop.set_button(1)
-		self.in_rate.set_input('2')
-		self.in_maxmem.set_input('1.0')
-		self.in_nframes.set_input('0')
-		self.in_nframes_vcr.set_input('1')
-		self.in_rate_vcr.set_input('1')
-		self.c_vcrspeed.clear_choice()
-		for label in VcrSpeedLabels:
-			self.c_vcrspeed.addto_choice(label)
-		self.c_vcrspeed.set_choice(4)
-		self.c_rgb24_size.clear_choice()
-		for label in RgbSizeLabels:
-			self.c_rgb24_size.addto_choice(label)
-		self.c_rgb24_size.set_choice(self.rgb24_size)
-		if cl:
-			algs = cl.QueryAlgorithms(cl.VIDEO)
-			self.all_comp_schemes = []
-			for i in range(0, len(algs), 2):
-				if algs[i+1] in (cl.COMPRESSOR, cl.CODEC):
-					self.all_comp_schemes.append(algs[i])
-			self.c_cformat.clear_choice()
-			for label in self.all_comp_schemes:
-				self.c_cformat.addto_choice(label)
-			i = self.all_comp_schemes.index(self.comp_scheme)
-			self.c_cformat.set_choice(i+1)
-		# Audio defaults
-		self.aout = None
-		self.aport = None
-		self.c_aformat.clear_choice()
-		for label in AudioFormatLabels:
-			self.c_aformat.addto_choice(label)
-		self.c_aformat.set_choice(self.aformat)
-		self.get_aformat()
-
-	def openvideo(self):
-		try:
-			self.video = sv.OpenVideo()
-		except sv.error, msg:
-			print 'Error opening video:', msg
-			self.video = None
-		param = [SV.BROADCAST, SV.PAL]
-		if self.video: self.video.GetParam(param)
-		if param[1] == SV.PAL:
-			x = SV.PAL_XMAX
-			y = SV.PAL_YMAX
-		elif param[1] == SV.NTSC:
-			x = SV.NTSC_XMAX
-			y = SV.NTSC_YMAX
-		else:
-			print 'Unknown video standard:', param[1]
-			sys.exit(1)
-		self.maxx, self.maxy = x, y
-		self.curx = 256
-		self.cury = 256*3/4
-
-	def makewindow(self):
-		x, y = self.maxx, self.maxy
-		gl.foreground()
-		gl.maxsize(x, y)
-		gl.keepaspect(x, y)
-		gl.stepunit(8, 6)
-		width = self.curx
-		height = self.cury
-		if width and height:
-			# Place the window at (150, 150) from top left
-			# (the video board likes this location...)
-			x1 = 150
-			x2 = x1+width-1
-			SCRHEIGHT = 768
-			y2 = SCRHEIGHT-1-150
-			y1 = y2-height+1
-			gl.prefposition(x1, x2, y1, y2)
-		self.window = gl.winopen('Vb video')
-		self.settitle()
-		if width:
-			gl.maxsize(x, y)
-			gl.keepaspect(x, y)
-			gl.stepunit(8, 6)
-			gl.winconstraints()
-		gl.qdevice(DEVICE.LEFTMOUSE)
-		gl.qdevice(DEVICE.WINQUIT)
-		gl.qdevice(DEVICE.WINSHUT)
-
-	def optfullsizewindow(self):
-		if not self.window:
-			return
-		gl.winset(self.window)
-		if self.use_24:
-			x, y = self.maxx, self.maxy
-		else:
-			x, y = self.curx, self.cury
-		left, bottom = gl.getorigin()
-		width, height = gl.getsize()
-		bottom = bottom+height-y
-		gl.prefposition(left, left+x-1, bottom, bottom+y-1)
-		gl.winconstraints()
-		if not self.use_24:
-			gl.keepaspect(x, y)
-			gl.stepunit(8, 6)
-			gl.maxsize(self.maxx, self.maxy)
-			gl.winconstraints()
-		self.bindvideo()
-
-	def bindvideo(self):
-		if not self.video: return
-		x, y = gl.getsize()
-		if not self.use_24:
-			self.curx, self.cury = x, y
-		self.video.SetSize(x, y)
-		drop = self.b_drop.get_button()
-		if drop:
-			param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF]
-		else:
-			param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON]
-		if self.rgb:
-			param = param+[SV.COLOR, SV.DEFAULT_COLOR, \
-				       SV.DITHER, 1, \
-				       SV.INPUT_BYPASS, 0]
-		else:
-			param = param+[SV.COLOR, SV.MONO, SV.DITHER, 0, \
-				       SV.INPUT_BYPASS, 1]
-		self.video.BindGLWindow(self.window, SV.IN_REPLACE)
-		self.video.SetParam(param)
-
-	def rebindvideo(self):
-		gl.winset(self.window)
-		self.bindvideo()
-
-	def reset(self):
-		self.close_video()
-		self.close_audio()
-		if self.vcr:
-			try:
-				ok = self.vcr.still()
-			except VCR.error:
-				pass
-			self.vcr = None
-		self.b_capture.set_button(0)
-
-	# Event handler (catches resize of video window)
-
-	def do_event(self, dev, val):
-		#print 'Event:', dev, val
-		if dev in (DEVICE.WINSHUT, DEVICE.WINQUIT):
-			self.close()
-		if dev == DEVICE.REDRAW and val == self.window:
-			self.rebindvideo()
-			self.settitle()
-
-	# Video controls: format, mode, file
-
-	def cb_vformat(self, *args):
-		self.reset()
-		self.get_vformat()
-		if self.mono_use_thresh:
-			s = `self.mono_thresh`
-			s = fl.show_input('Please enter mono threshold', s)
-			if s:
-				try:
-					self.mono_thresh = string.atoi(s)
-				except string.atoi_error:
-					fl.show_message('Bad input, using', \
-						  `self.mono_thresh`, '')
-		self.rebindvideo()
-
-	def cb_cformat(self, *args):
-		i = self.c_cformat.get_choice()
-		self.comp_scheme = self.all_comp_schemes[i-1]
-
-		
-	def cb_vmode(self, *args):
-		if self.vcr:
-			self.vcr = None
-		self.vmode = self.c_vmode.get_choice()
-		self.form.freeze_form()
-		self.g_cont.hide_object()
-		self.g_burst.hide_object()
-		self.g_single.hide_object()
-		self.g_vcr.hide_object()
-		if self.vmode == VM_CONT:
-			self.g_cont.show_object()
-		elif self.vmode == VM_BURST:
-			self.g_burst.show_object()
-		elif self.vmode == VM_SINGLE:
-			self.g_single.show_object()
-		elif self.vmode == VM_VCR:
-			self.g_vcr.show_object()
-		self.form.unfreeze_form()
-
-	def cb_vfile(self, *args):
-		filename = self.vfile
-		hd, tl = os.path.split(filename)
-		filename = fl.file_selector('Video save file:', hd, '', tl)
-		if filename:
-			self.reset()
-			hd, tl = os.path.split(filename)
-			if hd == os.getcwd():
-				filename = tl
-			self.vfile = filename
-
-	# Video mode specific video controls
-
-	def cb_rate(self, *args):
-		pass
-
-	def cb_drop(self, *args):
-		self.rebindvideo()
-
-	def cb_maxmem(self, *args):
-		pass
-
-	def cb_nframes(self, *args):
-		pass
-
-	def cb_fps(self, *args):
-		pass
-
-	def cb_nframes_vcr(self, *args):
-		pass
-
-	def cb_rate_vcr(self, *args):
-		pass
-
-	def cb_vcrspeed(self, *args):
-		pass
-
-	def cb_rgb24_size(self, *args):
-		i = self.c_rgb24_size.get_choice()
-		if i:
-			self.rgb24_size = i
-
-	# Audio controls: format, file
-
-	def cb_aformat(self, *args):
-		self.get_aformat()
-
-	def cb_afile(self, *args):
-		filename = self.afile
-		hd, tl = os.path.split(filename)
-		filename = fl.file_selector('Audio save file:', hd, '', tl)
-		if filename:
-			self.reset()
-			hd, tl = os.path.split(filename)
-			if hd == os.getcwd():
-				filename = tl
-			self.afile = filename
-
-	# General controls: capture, reset, play, quit
-
-	def cb_capture(self, *args):
-		if self.capturing:
-			raise StopCapture
-		if not self.b_capture.get_button():
-			return
-		if not self.video or not self.vformat:
-			gl.ringbell()
-			return
-		if self.vmode == VM_CONT:
-			self.cont_capture()
-		elif self.vmode == VM_BURST:
-			self.burst_capture()
-		elif self.vmode == VM_SINGLE:
-			self.single_capture(None, None)
-		elif self.vmode == VM_VCR:
-			self.vcr_capture()
-
-	def cb_reset(self, *args):
-		self.reset()
-
-	def cb_play(self, *args):
-		self.reset()
-		sts = os.system('Vplay -q ' + self.vfile + ' &')
-
-	def cb_quit(self, *args):
-		self.close()
-
-	# Capture routines
-
-	def burst_capture(self):
-		self.setwatch()
-		gl.winset(self.window)
-		x, y = gl.getsize()
-		if self.use_24:
-			fl.show_message('Sorry, no 24 bit continuous capture yet', '', '')
-			return
-		vformat = SV.RGB8_FRAMES
-		nframes = self.getint(self.in_nframes, 0)
-		if nframes == 0:
-			maxmem = self.getint(self.in_maxmem, 1.0)
-			memsize = int(maxmem * 1024 * 1024)
-			nframes = self.calcnframes(memsize)
-		info = (vformat, x, y, nframes, 1)
-		try:
-			info2, data, bitvec = self.video.CaptureBurst(info)
-		except sv.error, msg:
-			self.b_capture.set_button(0)
-			self.setarrow()
-			fl.show_message('Capture error:', str(msg), '')
-			return
-		if info <> info2: print info, '<>', info2
-		self.save_burst(info2, data, bitvec)
-		self.setarrow()
-
-	def calcnframes(self, memsize):
-		gl.winset(self.window)
-		x, y = gl.getsize()
-		pixels = x*y
-		pixels = pixels/2	# XXX always assume fields
-		if self.mono or self.grey:
-			n = memsize/pixels
-		else:
-			n = memsize/(4*pixels)
-		return max(1, n)
-
-	def save_burst(self, info, data, bitvec):
-		(vformat, x, y, nframes, rate) = info
-		self.open_if_closed()
-		fieldsize = x*y/2
-		nskipped = 0
-		realframeno = 0
-		tpf = 1000 / 50.0     # XXX
-		for frameno in range(0, nframes*2):
-			if frameno <> 0 and \
-				  bitvec[frameno] == bitvec[frameno-1]:
-				nskipped = nskipped + 1
-				continue
-			#
-			# Save field.
-			# XXX Works only for fields and top-to-bottom
-			#
-			start = frameno*fieldsize
-			field = data[start:start+fieldsize]
-			realframeno = realframeno + 1
-			fn = int(realframeno*tpf)
-			if not self.write_frame(fn, field):
-				break
-
-	def cont_capture(self):
-		saved_label = self.b_capture.label
-		self.b_capture.label = 'Stop\n' + saved_label
-		self.open_if_closed()
-		self.init_cont()
-		fps = 59.64		# Fields per second
-		# XXX (fps of Indigo monitor, not of PAL or NTSC!)
-		tpf = 1000.0 / fps	# Time per field in msec
-		self.capturing = 1
-		self.start_audio()
-		while 1:
-			try:
-				void = fl.check_forms()
-			except StopCapture:
-				break
-			try:
-				cd, id = self.video.GetCaptureData()
-			except sv.error:
-				sgi.nap(1)
-				continue
-			id = id + 2*self.rate
-			data = cd.InterleaveFields(1)
-			cd.UnlockCaptureData()
-			t = id*tpf
-			if not self.write_frame(t, data):
-				break
-		self.stop_audio()
-		self.capturing = 0
-		self.end_cont()
-		if self.aout:
-			# If recording audio, can't capture multiple sequences
-			self.reset()
-		self.b_capture.label = saved_label
-
-	def single_capture(self, stepfunc, timecode):
-		self.open_if_closed()
-		self.init_cont()
-		while 1:
-			try:
-				cd, id = self.video.GetCaptureData()
-				break
-			except sv.error:
-				pass
-			sgi.nap(1)
-			if stepfunc:		# This might step the video
-				d=stepfunc()	# to the next frame
-		if not self.use_24:
-			data = cd.InterleaveFields(1)
-		else:
-			x, y = self.vout.getsize()
-			if self.use_compress:
-				if self.rgb24_size == 1:
-					data = cd.YUVtoYUV422DC(0)
-				elif self.rgb24_size == 2:
-					data = cd.YUVtoYUV422DC_quarter(1)
-					x = x/2
-					y = y/2
-				elif self.rgb24_size == 3:
-					data = cd.YUVtoYUV422DC_sixteenth(1)
-					x = x/4
-					y = y/4
-			else:
-				data = cd.YUVtoRGB(1)
-				if self.maxx*self.maxy*4 <> len(data):
-					print 'maxx,maxy,exp,got=', self.maxx,
-					print self.maxy,self.maxx*self.maxy*4,
-					print len(data)
-					fl.showmessage('Wrong sized data')
-					return 0
-				if self.rgb24_size <> 1:
-					data = imageop.scale(data, 4, \
-						  self.maxx, self.maxy, x, y)
-			if self.use_jpeg:
-				import jpeg
-				data = jpeg.compress(data, x, y, 4)
-			if self.use_compress:
-				data = self.compressor.Compress(1, data)
-		cd.UnlockCaptureData()
-		self.end_cont()
-		if timecode == None:
-			timecode = (self.nframes+1) * (1000/25)
-		return self.write_frame(timecode, data)
-
-	def vcr_capture(self):
-		if not self.vcr:
-			try:
-				print 'Connecting to VCR ...'
-				self.vcr = VCR.VCR()
-				print 'Waiting for VCR to come online ...'
-				self.vcr.initvcr()
-				print 'Preparing VCR ...'
-				if not (self.vcr.fmmode('dnr') and \
-					  self.vcr.dmcontrol('digital slow')):
-					self.vcr_error('digital slow failed')
-					return
-				print 'VCR OK.'
-			except VCR.error, msg:
-				self.vcr = None
-				self.vcr_error(msg)
-				return
-		if not self.vcr.still():
-			self.vcr_error('still failed')
-			return
-		self.open_if_closed()
-		rate = self.getint(self.in_rate_vcr, 1)
-		rate = max(rate, 1)
-		vcrspeed = self.c_vcrspeed.get_choice()
-		vcrspeed = VcrSpeeds[vcrspeed]
-		if vcrspeed == 0:
-			stepfunc = self.vcr.step
-		else:
-			stepfunc = None
-		self.speed_factor = rate
-		addr = start_addr = self.vcr.sense()
-		if not self.single_capture(None, 0):
-			return
-		print 'captured %02d:%02d:%02d:%02d' % self.vcr.addr2tc(addr)
-		count = self.getint(self.in_nframes_vcr, 1) - 1
-		if count <= 0:
-			while rate > 0:
-				if not self.vcr.step():
-					self.vcr_error('step failed')
-				here = self.vcr.sense()
-				if here > addr:
-					rate = rate - (here - addr)
-				addr = here
-			return
-		if not self.vcr.fwdshuttle(vcrspeed):
-			self.vcr_error('fwd shuttle failed')
-			return
-		cycle = 0
-		while count > 0:
-			try:
-				here = self.vcr.sense()
-			except VCR.error, msg:
-				self.vcr_error(msg)
-				break
-			if here <> addr:
-				if here <> addr+1:
-					print 'Missed', here-addr-1,
-					print 'frame' + 's'*(here-addr-1 <> 1)
-				cycle = (cycle+1) % rate
-				if cycle == 0:
-					tc = (here-start_addr)*40
-					if not self.single_capture(stepfunc, \
-						  tc):
-						break
-					print 'captured %02d:%02d:%02d:%02d' \
-						  % self.vcr.addr2tc(here)
-					count = count -1
-				addr = here
-		if self.vcr and not self.vcr.still():
-			self.vcr_error('still failed')
-
-	def vcr_error(self, msg):
-		self.reset()
-		fl.show_message('VCR error:', str(msg), '')
-
-	# Init/end continuous capture mode
-
-	def init_cont(self):
-		qsize = 1
-		if self.vmode == VM_CONT:
-			self.rate = self.getint(self.in_rate, 2)
-		else:
-			self.rate = 2
-		x, y = self.vout.getsize()
-		if self.use_24:
-			info = (SV.YUV411_FRAMES, x, y, qsize, self.rate)
-		else:
-			info = (SV.RGB8_FRAMES, x, y, qsize, self.rate)
-		info2 = self.video.InitContinuousCapture(info)
-		if info2 <> info:
-			# XXX This is really only debug info
-			print 'Info mismatch: requested', info, 'got', info2
-
-	def end_cont(self):
-		self.video.EndContinuousCapture()
-
-	# Misc stuff
-
-	def settitle(self):
-		gl.winset(self.window)
-		x, y = gl.getsize()
-		title = 'Vb ' + self.vfile + ' (%dx%d)' % (x, y)
-		gl.wintitle(title)
-
-	def get_vformat(self):
-		i = self.c_vformat.get_choice()
-		label = VideoFormatLabels[i-1]
-		format = VideoFormats[i-1]
-		if format == 'compress' and cl == None:
-			fl.show_message('Sorry, no compression library support')
-			format = ''
-			label = 'Video off'
-		self.vformat = format
-		if self.vformat == '':
-			self.form.freeze_form()
-			self.g_video.hide_object()
-			self.g_cont.hide_object()
-			self.g_burst.hide_object()
-			self.g_single.hide_object()
-			self.form.unfreeze_form()
-		else:
-			self.g_video.show_object()
-			if self.vmode == VM_CONT:
-				self.g_cont.show_object()
-			elif self.vmode == VM_BURST:
-				self.g_burst.show_object()
-			elif self.vmode == VM_SINGLE:
-				self.g_single.show_object()
-		#
-		self.rgb = (format[:3] == 'rgb' or format == 'compress')
-		self.mono = (format == 'mono')
-		self.grey = (format[:4] == 'grey')
-		self.use_24 = (format in ('rgb', 'jpeg', 'compress'))
-		if self.use_24:
-			self.g_rgb24.show_object()
-		else:
-			self.g_rgb24.hide_object()
-		self.use_jpeg = (format == 'jpeg')
-		self.mono_use_thresh = (label == 'mono thresh')
-		self.use_compress = (format == 'compress')
-		if self.use_compress:
-			self.g_compress.show_object()
-		else:
-			self.g_compress.hide_object()
-		s = format[4:]
-		if self.grey and s:
-			self.greybits = string.atoi(s)
-		else:
-			self.greybits = 8
-		if label == 'grey2 dith':
-			self.greybits = -2
-		#
-		convertor = None
-		if self.grey:
-			if self.greybits == 2:
-				convertor = imageop.grey2grey2
-			elif self.greybits == 4:
-				convertor = imageop.grey2grey4
-			elif self.greybits == -2:
-				convertor = imageop.dither2grey2
-		self.convertor = convertor
-		self.optfullsizewindow()
-
-	def get_aformat(self):
-		self.reset()
-		self.aformat = self.c_aformat.get_choice()
-		if self.aformat == A_OFF:
-			self.g_audio.hide_object()
-		else:
-			self.g_audio.show_object()
-
-	def init_compressor(self, w, h):
-		self.compressor = None
-		scheme = cl.QuerySchemeFromName(cl.VIDEO, self.comp_scheme)
-		self.compressor = cl.OpenCompressor(scheme)
-		parambuf = [cl.IMAGE_WIDTH, w, \
-			  cl.IMAGE_HEIGHT, h, \
-			  cl.ORIGINAL_FORMAT, cl.YUV422DC]
-		self.compressor.SetParams(parambuf)
-		return self.compressor.Compress(0, '')
-
-	def open_if_closed(self):
-		if not self.vout:
-			self.open_video()
-		if not self.aout:
-			self.open_audio()
-
-	# File I/O handling
-
-	def open_video(self):
-		self.close_video()
-		gl.winset(self.window)
-		x, y = gl.getsize()
-		if self.use_24:
-			if self.rgb24_size == 2:
-				x, y = x/2, y/2
-			elif self.rgb24_size == 3:
-				x, y = x/4, y/4
-		vout = VFile.VoutFile(self.vfile)
-		vout.setformat(self.vformat)
-		if self.vformat == 'compress':
-			cheader = self.init_compressor(x, y)
-			vout.setcompressheader(cheader)
-		vout.setsize(x, y)
-		if self.vmode == VM_BURST:
-			vout.setpf((1, -2))
-		vout.writeheader()
-		self.vout = vout
-		self.nframes = 0
-		self.speed_factor = 1
-		self.t_nframes.label = `self.nframes`
-
-	def write_frame(self, t, data):
-		t = t * self.speed_factor
-		if not self.vout:
-			gl.ringbell()
-			return 0
-		if self.convertor:
-			data = self.convertor(data, len(data), 1)
-		elif self.mono:
-			if self.mono_use_thresh:
-				data = imageop.grey2mono(data, \
-					  len(data), 1,\
-					  self.mono_thresh)
-			else:
-				data = imageop.dither2mono(data, \
-					  len(data), 1)
-		try:
-			self.vout.writeframe(int(t), data, None)
-		except IOError, msg:
-			self.reset()
-			if msg == (0, 'Error 0'):
-				msg = 'disk full??'
-			fl.show_message('IOError', str(msg), '')
-			return 0
-		self.nframes = self.nframes + 1
-		self.t_nframes.label = `self.nframes`
-		return 1
-
-	def close_video(self):
-		if not self.vout:
-			return
-		self.nframes = 0
-		self.t_nframes.label = ''
-		try:
-			self.vout.close()
-		except IOError, msg:
-			if msg == (0, 'Error 0'):
-				msg = 'disk full??'
-			fl.show_message('IOError', str(msg), '')
-		self.vout = None
-		self.compressor = None
-
-	# Watch cursor handling
-
-	def setwatch(self):
-		gl.winset(self.form.window)
-		gl.setcursor(WATCH, 0, 0)
-		gl.winset(self.window)
-		gl.setcursor(WATCH, 0, 0)
-
-	def setarrow(self):
-		gl.winset(self.form.window)
-		gl.setcursor(ARROW, 0, 0)
-		gl.winset(self.window)
-		gl.setcursor(ARROW, 0, 0)
-
-	# Numeric field handling
-
-	def getint(self, field, default):
-		try:
-			value = string.atoi(field.get_input())
-		except string.atoi_error:
-			value = default
-		field.set_input(`value`)
-		return value
-
-	def getfloat(self, field, default):
-		try:
-			value = float(eval(field.get_input()))
-		except:
-			value = float(default)
-		field.set_input(`value`)
-		return value
-
-	# Audio stuff
-
-	def open_audio(self):
-		if self.aformat == A_OFF:
-			return
-		import aifc
-		import al
-		import AL
-		import thread
-		self.close_audio()
-		params = [AL.INPUT_RATE, 0]
-		al.getparams(AL.DEFAULT_DEVICE, params)
-		rate = params[1]
-		self.aout = aifc.open(self.afile, 'w')
-		if self.aformat in (A_16_STEREO, A_8_STEREO):
-			nch = AL.STEREO
-		else:
-			nch = AL.MONO
-		if self.aformat in (A_16_STEREO, A_16_MONO):
-			width = AL.SAMPLE_16
-		else:
-			width = AL.SAMPLE_8
-		self.aout.setnchannels(nch)
-		self.aout.setsampwidth(width)
-		self.aout.setframerate(rate)
-		c = al.newconfig()
-		c.setqueuesize(8000)
-		c.setchannels(nch)
-		c.setwidth(width)
-		self.aport = al.openport('Vb audio record', 'r', c)
-		self.audio_stop = 0
-		self.audio_ok = 0
-		self.audio_busy = 1
-		thread.start_new_thread(self.record_audio, ())
-
-	def start_audio(self):
-		if self.aformat == A_OFF:
-			return
-		self.audio_ok = 1
-
-	def record_audio(self, *args):
-		# This function runs in a separate thread
-		# Currently no semaphores are used
-		while not self.audio_stop:
-			data = self.aport.readsamps(4000)
-			if self.audio_ok:
-				self.aout.writeframes(data)
-			data = None
-		self.audio_busy = 0
-
-	def stop_audio(self):
-		self.audio_ok = 0
-
-	def close_audio(self):
-		if self.aout:
-			self.audio_ok = 0
-			self.audio_stop = 1
-			while self.audio_busy:
-				time.sleep(0.1)
-			self.aout.close()
-			self.aout = None
-		if self.aport:
-			self.aport.closeport()
-			self.aport = None
-
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
-	sys.exit(1)
diff --git a/Demo/sgi/video/VbForm.fd b/Demo/sgi/video/VbForm.fd
deleted file mode 100644
index fd9759f..0000000
--- a/Demo/sgi/video/VbForm.fd
+++ /dev/null
@@ -1,615 +0,0 @@
-Magic: 12321
-
-Internal Form Definition File
-    (do not change)
-
-Number of forms: 1
-
-=============== FORM ===============
-Name: form
-Width: 450.000000
-Height: 260.000000
-Number of Objects: 40
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 450.000000 260.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 5
-box: 330.000000 150.000000 110.000015 60.000004
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 1
-size: 11.000000
-lcol: 0
-label: Capture
-name: b_capture
-callback: cb_capture
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 330.000000 10.000000 110.000008 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Quit
-name: b_quit
-callback: cb_quit
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 330.000000 50.000000 110.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Playback
-name: b_play
-callback: cb_play
-argument: 0
-
---------------------
-class: 42
-type: 0
-box: 80.000000 220.000000 120.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Format:
-name: c_vformat
-callback: cb_vformat
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 330.000000 220.000000 110.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Reset
-name: b_reset
-callback: cb_reset
-argument: 0
-
---------------------
-class: 42
-type: 0
-box: 80.000000 50.000000 120.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Format:
-name: c_aformat
-callback: cb_aformat
-argument: 0
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 1668246586 540019308
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_audio
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 10.000000 10.000000 190.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Set audio file...
-name: b_afile
-callback: cb_afile
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 876099360 892416522
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 1147496041 1852404841
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_video
-callback: 
-argument: 
-
---------------------
-class: 42
-type: 0
-box: 80.000000 180.000000 120.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Mode:
-name: c_vmode
-callback: cb_vmode
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 10.000000 90.000000 190.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Set video file...
-name: b_vfile
-callback: cb_vfile
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 544171552 1331849829
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_single
-callback: 
-argument: 
-
---------------------
-class: 31
-type: 2
-box: 220.000000 150.000000 100.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: Frames/sec
-name: in_fps
-callback: cb_fps
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_burst
-callback: 
-argument: 
-
---------------------
-class: 31
-type: 1
-box: 220.000000 150.000000 100.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: Max Mbytes:
-name: in_maxmem
-callback: cb_maxmem
-argument: 0
-
---------------------
-class: 31
-type: 2
-box: 220.000000 90.000000 100.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: Nr. of frames:
-name: in_nframes
-callback: cb_nframes
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_cont
-callback: 
-argument: 
-
---------------------
-class: 31
-type: 2
-box: 250.000000 150.000000 40.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: Capture rate:
-name: in_rate
-callback: cb_rate
-argument: 0
-
---------------------
-class: 2
-type: 0
-box: 220.000000 150.000000 30.000000 30.000000
-boxtype: 0
-colors: 47 47
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: 1/
-name: 
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 290.000000 150.000000 30.000000 30.000000
-boxtype: 0
-colors: 47 47
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: fr
-name: 
-callback: 
-argument: 
-
---------------------
-class: 13
-type: 0
-box: 220.000000 90.000000 100.000000 30.000000
-boxtype: 0
-colors: 7 3
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Fielddrop
-name: b_drop
-callback: cb_drop
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 330.000000 90.000000 110.000000 30.000002
-boxtype: 2
-colors: 47 47
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: t_nframes
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 330.000000 120.000000 110.000000 30.000000
-boxtype: 0
-colors: 47 47
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Frames done:
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 640 235
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_vcr
-callback: 
-argument: 
-
---------------------
-class: 31
-type: 2
-box: 220.000000 90.000000 100.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: # frames wtd:
-name: in_nframes_vcr
-callback: cb_nframes_vcr
-argument: 0
-
---------------------
-class: 31
-type: 2
-box: 220.000000 150.000000 100.000000 30.000000
-boxtype: 2
-colors: 13 5
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: Sample rate:
-name: in_rate_vcr
-callback: cb_rate_vcr
-argument: 0
-
---------------------
-class: 42
-type: 0
-box: 220.000000 10.000000 100.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 0
-style: 0
-size: 11.000000
-lcol: 0
-label: VCR speed:
-name: c_vcrspeed
-callback: cb_vcrspeed
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 640 235
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 58720287 33751040
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: g_rgb24
-callback: 
-argument: 
-
---------------------
-class: 42
-type: 0
-box: 260.000000 220.000000 60.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Size:
-name: c_rgb24_size
-callback: cb_rgb24_size
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 10000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 10.000000
-lcol: 0
-label: 
-name: g_compress
-callback: 
-argument: 
-
---------------------
-class: 42
-type: 0
-box: 80.000000 140.000000 120.000000 30.000000
-boxtype: 5
-colors: 7 0
-alignment: 2
-style: 0
-size: 11.000000
-lcol: 0
-label: Scheme:
-name: c_cformat
-callback: cb_cformat
-argument: 0
-
---------------------
-class: 20000
-type: 0
-box: 0.000000 0.000000 0.000000 0.000000
-boxtype: 0
-colors: 0 0
-alignment: 4
-style: 0
-size: 10.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
-==============================
-create_the_forms
diff --git a/Demo/sgi/video/Vcopy.py b/Demo/sgi/video/Vcopy.py
deleted file mode 100755
index ef4647a..0000000
--- a/Demo/sgi/video/Vcopy.py
+++ /dev/null
@@ -1,291 +0,0 @@
-#! /usr/bin/env python
-
-# Universal (non-interactive) CMIF video file copier.
-
-
-# Possibilities:
-#
-# - Manipulate the time base:
-#   = resample at a fixed rate
-#   = divide the time codes by a speed factor (to make it go faster/slower)
-#   = drop frames that are less than n msec apart (to accommodate slow players)
-# - Convert to a different format
-# - Magnify (scale) the image
-
-
-# Usage function (keep this up-to-date if you change the program!)
-
-def usage():
-	print 'Usage: Vcopy [options] [infile [outfile]]'
-	print
-	print 'Options:'
-	print
-	print '-t type    : new image type (default unchanged)'
-	print
-	print '-M magnify : image magnification factor (default unchanged)'
-	print '-w width   : output image width (default height*4/3 if -h used)'
-	print '-h height  : output image height (default width*3/4 if -w used)'
-	print
-	print '-p pf      : new x and y packfactor (default unchanged)'
-	print '-x xpf     : new x packfactor (default unchanged)'
-	print '-y ypf     : new y packfactor (default unchanged)'
-	print
-	print '-m delta   : drop frames closer than delta msec (default 0)'
-	print '-r delta   : regenerate input time base delta msec apart'
-	print '-s speed   : speed change factor (default unchanged)'
-	print
-	print 'infile     : input file (default film.video)'
-	print 'outfile    : output file (default out.video)'
-
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-
-import VFile
-import imgconv
-import imageop
-import getopt
-import string
-
-
-# Global options
-
-speed = 1.0
-mindelta = 0
-regen = None
-newpf = None
-newtype = None
-magnify = None
-newwidth = None
-newheight = None
-
-
-# Function to turn a string into a float
-
-atof_error = 'atof_error' # Exception if it fails
-
-def atof(s):
-	try:
-		return float(eval(s))
-	except:
-		raise atof_error
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	global speed, mindelta, regen, newpf, newtype, \
-	       magnify, newwidth, newheight
-
-	# Parse command line
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], \
-			  'M:h:m:p:r:s:t:w:x:y:')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print 'Error:', msg, '\n'
-		usage()
-		sys.exit(2)
-
-	xpf = ypf = None
-	
-	# Interpret options
-	try:
-		for opt, arg in opts:
-			if opt == '-M': magnify = atof(arg)
-			if opt == '-h': height = string.atoi(arg)
-			if opt == '-m': mindelta = string.atoi(arg)
-			if opt == '-p': xpf = ypf = string.atoi(arg)
-			if opt == '-r': regen = string.atoi(arg)
-			if opt == '-s': speed = atof(arg)
-			if opt == '-t': newtype = arg
-			if opt == '-w': newwidth = string.atoi(arg)
-			if opt == '-x': xpf = string.atoi(arg)
-			if opt == '-y': ypf = string.atoi(arg)
-	except string.atoi_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires integer argument'
-		sys.exit(2)
-	except atof_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires float argument'
-		sys.exit(2)
-
-	if xpf or ypf:
-		newpf = (xpf, ypf)
-
-	if newwidth or newheight:
-		if magnify:
-			sys.stdout = sys.stderr
-			print 'Options -w or -h are incompatible with -M'
-			sys.exit(2)
-		if not newheight:
-			newheight = newwidth * 3 / 4
-		elif not newwidth:
-			newwidth = newheight * 4 / 3
-
-	# Check filename arguments
-	if len(args) < 1:
-		args.append('film.video')
-	if len(args) < 2:
-		args.append('out.video')
-	if len(args) > 2:
-		usage()
-		sys.exit(2)
-	if args[0] == args[1]:
-		sys.stderr.write('Input file can\'t be output file\n')
-		sys.exit(2)
-
-	# Do the right thing
-	sts = process(args[0], args[1])
-
-	# Exit
-	sys.exit(sts)
-
-
-# Copy one file to another
-
-def process(infilename, outfilename):
-	global newwidth, newheight, newpf
-
-	try:
-		vin = VFile.BasicVinFile(infilename)
-	except IOError, msg:
-		sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(infilename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vout = VFile.BasicVoutFile(outfilename)
-	except IOError, msg:
-		sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-
-	print '=== input file ==='
-	vin.printinfo()
-
-	vout.setinfo(vin.getinfo())
-
-	scale = 0
-	flip = 0
-	decompress = 0
-
-	vinfmt = vin.format
-	if vinfmt == 'compress':
-		if not newtype or newtype == 'compress':
-			# compressed->compressed: copy compression header
-			vout.setcompressheader(vin.getcompressheader())
-		else:
-			# compressed->something else: go via rgb-24
-			decompress = 1
-			vinfmt = 'rgb'
-	elif newtype == 'compress':
-		# something else->compressed: not implemented
-		sys.stderr.write('Sorry, conversion to compressed not yet implemented\n')
-		return 1
-	if newtype:
-		vout.setformat(newtype)
-		try:
-			convert = imgconv.getconverter(vinfmt, vout.format)
-		except imgconv.error, msg:
-			sys.stderr.write(str(msg) + '\n')
-			return 1
-
-	if newpf:
-		xpf, ypf = newpf
-		if not xpf: xpf = vin.xpf
-		if not ypf: ypf = vout.ypf
-		newpf = (xpf, ypf)
-		vout.setpf(newpf)
-
-	if newwidth and newheight:
-		scale = 1
-
-	if vin.upside_down <> vout.upside_down or \
-		  vin.mirror_image <> vout.mirror_image:
-		flip = 1
-
-	inwidth, inheight = vin.getsize()
-	inwidth = inwidth / vin.xpf
-	inheight = inheight / vin.ypf
-
-	if magnify:
-		newwidth = int(vout.width * magnify)
-		newheight = int(vout.height * magnify)
-		scale = 1
-
-	if scale:
-		vout.setsize(newwidth, newheight)
-	else:
-		newwidth, newheight = vout.getsize()
-
-	if vin.packfactor <> vout.packfactor:
-		scale = 1
-
-	if scale or flip:
-		if vout.bpp not in (8, 32):
-			sys.stderr.write('Can\'t scale or flip this type\n')
-			return 1
-
-	newwidth = newwidth / vout.xpf
-	newheight = newheight / vout.ypf
-
-	print '=== output file ==='
-	vout.printinfo()
-	vout.writeheader()
-
-	told = 0
-	nin = 0
-	nout = 0
-	tin = 0
-	tout = 0
-
-	while 1:
-		try:
-			tin, data, cdata = vin.getnextframe()
-		except EOFError:
-			break
-		if decompress:
-			data = vin.decompress(data)
-		nin = nin + 1
-		if regen:
-			tout = nin * regen
-		else:
-			tout = tin
-		tout = int(tout / speed)
-		if tout - told < mindelta:
-			continue
-		told = tout
-		if newtype:
-			data = convert(data, inwidth, inheight)
-		if scale:
-			data = imageop.scale(data, vout.bpp/8, \
-				  inwidth, inheight, newwidth, newheight)
-		if flip:
-			x0, y0 = 0, 0
-			x1, y1 = newwidth-1, newheight-1
-			if vin.upside_down <> vout.upside_down:
-				y1, y0 = y0, y1
-			if vin.mirror_image <> vout.mirror_image:
-				x1, x0 = x0, x1
-			data = imageop.crop(data, vout.bpp/8, \
-				  newwidth, newheight, x0, y0, x1, y1)
-		print 'Writing frame', nout
-		vout.writeframe(tout, data, cdata)
-		nout = nout + 1
-
-	vout.close()
-	vin.close()
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/VcrIndex.py b/Demo/sgi/video/VcrIndex.py
deleted file mode 100755
index 80212ee..0000000
--- a/Demo/sgi/video/VcrIndex.py
+++ /dev/null
@@ -1,327 +0,0 @@
-#
-# A VCR index.
-#
-import os
-import string
-
-error='VcrIndex.error'
-VERSION_STRING='#!VcrIndex 1.1\n'
-PREV_VERSION_STRING='#!VcrIndex 1.0\n'
-
-class VcrIndex:
-	def __init__(self, name):
-		self.curmovie = None
-		self.curscene = None
-		self.modified = 0
-		self.filename = name
-		self.basename = os.path.basename(name)
-		self.editable = []
-		if not name:
-			self.movies = {}
-			return
-		try:
-			fp = open(name, 'r')
-		except IOError:
-			self.movies = {}
-			return
-		header = fp.readline()
-		if header == PREV_VERSION_STRING:
-			print 'Converting old-format database...'
-			data = fp.read(100000)
-			self.movies = eval(data)
-			for m in self.movies.keys():
-				d = self.movies[m]
-				newd = {}
-				for s in d.keys():
-					newsd = {}
-					newsd['START'] = d[s]
-					if s == 'START':
-						s = '-ALL-'
-					newd[s] = newsd
-				
-				self.movies[m] = newd
-			print 'Done.'
-			return
-		if header <> VERSION_STRING:
-			print 'VcrIndex: incorrect version string:', header
-			self.movies = {}
-			return
-		data = fp.read(100000)
-		self.movies = eval(data)
-	#
-	# Save database to given file (or same file as read from if no
-	# filename given).
-	# 
-	def save(self, name):
-		if not name:
-			name = self.filename
-		if not name:
-			raise error, 'No filename given'
-		self.filename = name
-		bupname = name + '~'
-		try:
-			os.unlink(bupname)
-		except os.error:
-			pass
-		try:
-			os.rename(name, bupname)
-		except os.error:
-			pass
-		fp = open(name, 'w')
-		data = str(self.movies)
-		fp.write(VERSION_STRING)
-		fp.write(data)
-		fp.write('\n')
-		fp.close()
-		self.modified = 0
-	#
-	# Get a list of movie names in tape order
-	#
-	def get_movienames(self):
-		names = self.movies.keys()
-		sorted = []
-		for name in names:
-			sorted.append(self.movies[name]['-ALL-']['START'], name)
-		sorted.sort()
-		rv = []
-		for pos, name in sorted:
-			rv.append(name)
-		return rv
-	#
-	# Get a list of scene names in tape order
-	#
-	def get_scenenames(self):
-		if not self.curmovie:
-			return []
-		scenedict = self.movies[self.curmovie]
-		names = scenedict.keys()
-		sorted = []
-		for name in names:
-			sorted.append(scenedict[name], name)
-		sorted.sort()
-		rv = []
-		for pos, name in sorted:
-			rv.append(name)
-		return rv
-	#
-	# Get a list of scene ids (format '00:02:32:12 name') in tape order
-	#
-	def get_sceneids(self):
-		if not self.curmovie:
-			return []
-		scenedict = self.movies[self.curmovie]
-		names = scenedict.keys()
-		sorted = []
-		for name in names:
-			sorted.append(scenedict[name]['START'], name)
-		sorted.sort()
-		rv = []
-		for pos, name in sorted:
-			str = '%02d:%02d:%02d:%02d ' % pos
-			rv.append(str + name)
-		return rv
-	#
-	# Does a movie exist?
-	#
-	def movie_exists(self, name):
-		return self.movies.has_key(name)
-	#
-	# Select a movie.
-	#
-	def movie_select(self, name):
-		if not self.movies.has_key(name):
-			raise error, 'No such movie: '+name
-		self.curmovie = name
-		self.curscene = None
-	#
-	# Get movie dictionary, or raise an error if no current movie.
-	#
-	def _getmoviedict(self):
-		if not self.curmovie:
-			raise error, 'No current movie'
-		return self.movies[self.curmovie]
-	#
-	# Rename a movie.
-	#
-	def movie_rename(self, newname):
-		scenedict = self._getmoviedict()
-		if self.movie_exists(newname):
-			raise error, 'Movie already exists: '+newname
-		del self.movies[self.curmovie]
-		self.movies[newname] = scenedict
-		self.curmovie = newname
-		self.modified = 1
-	#
-	# Copy a movie.
-	#
-	def movie_copy(self, newname):
-		scenedict = self._getmoviedict()
-		if self.movie_exists(newname):
-			raise error, 'Movie already exists: '+newname
-		newdict = {}
-		for k in scenedict.keys():
-			olddata = scenedict[k]
-			newdata = {}
-			for i in olddata.keys():
-				newdata[i] = olddata[i]
-			newdict[k] = newdata
-		self.movies[newname] = newdict
-		self.curmovie = newname
-		self.modified = 1
-	#
-	# Delete a movie.
-	#
-	def movie_delete(self):
-		if not self.curmovie:
-			raise error, 'No current movie'
-		del self.movies[self.curmovie]
-		self.curmovie = None
-		self.curscene = None
-		self.modified = 1
-	#
-	# Create a new movie.
-	#
-	def movie_new(self, name, pos):
-		if self.movie_exists(name):
-			raise error, 'Movie already exists: '+name
-		newdict = {}
-		newsdict = {}
-		newsdict['START'] = pos
-		newdict['-ALL-'] = newsdict
-		self.movies[name] = newdict
-		self.curmovie = name
-		self.curscene = None
-		self.modified = 1
-	#
-	# Does a scene exist?
-	#
-	def scene_exists(self, name):
-		scenedict = self._getmoviedict()
-		return scenedict.has_key(name)
-	#
-	# Select a current scene.
-	#
-	def scene_select(self, name):
-		scenedict = self._getmoviedict()
-		if not scenedict.has_key(name):
-			raise error, 'No such scene: '+name
-		self.curscene = name
-	#
-	# Rename a scene.
-	#
-	def scene_rename(self, newname):
-		scenedict = self._getmoviedict()
-		if not self.curscene:
-			raise error, 'No current scene'
-		if scenedict.has_key(newname):
-			raise error, 'Scene already exists: '+newname
-		if self.curscene == '-ALL-':
-			raise error, 'Cannot rename -ALL-'
-		scenedict[newname] = scenedict[self.curscene]
-		del scenedict[self.curscene]
-		self.curscene = newname
-		self.modified = 1
-	#
-	# Copy a scene.
-	#
-	def scene_copy(self, newname):
-		scenedict = self._getmoviedict()
-		if not self.curscene:
-			raise error, 'No current scene'
-		if scenedict.has_key(newname):
-			raise error, 'Scene already exists: '+newname
-		scenedict[newname] = scenedict[self.curscene]
-		self.curscene = newname
-		self.modified = 1
-	#
-	# Delete a scene.
-	#
-	def scene_delete(self):
-		scenedict = self._getmoviedict()
-		if not self.curscene:
-			raise error, 'No current scene'
-		if self.curscene == '-ALL-':
-			raise error, 'Cannot delete -ALL-'
-		del scenedict[self.curscene]
-		self.curscene = None
-		self.modified = 1
-	#
-	# Add a new scene.
-	#
-	def scene_new(self, newname, pos):
-		scenedict = self._getmoviedict()
-		if scenedict.has_key(newname):
-			raise error, 'Scene already exists: '+newname
-		newdict = {}
-		newdict['START'] = pos
-		scenedict[newname] = newdict
-		self.curscene = newname
-		self.modified = 1
-	#
-	# Get scene data.
-	#
-	def _getscenedata(self):
-		scenedict = self._getmoviedict()
-		if not self.curscene:
-			raise error, 'No current scene'
-		return scenedict[self.curscene]
-	#
-	# Data manipulation routines.
-	#
-	def pos_get(self):
-		return self._getscenedata()['START']
-	#
-	def pos_set(self, pos):
-		data = self._getscenedata()
-		data['START'] = pos
-		self.modified = 1
-	#
-	def comment_get(self):
-		data = self._getscenedata()
-		if data.has_key('COMMENT'):
-			return data['COMMENT']
-		else:
-			return ''
-	#
-	def comment_set(self, comment):
-		data = self._getscenedata()
-		data['COMMENT'] = comment
-		self.modified = 1
-	#
-	# Get the scene id of the current scene.
-	#
-	def get_cursceneid(self):
-		pos = self._getscenedata()['START']
-		str = '%02d:%02d:%02d:%02d ' % pos
-		return str + self.curscene
-	#
-	# Convert a scene id to a scene name.
-	#
-	def scene_id2name(self, id):
-		pos = string.find(id, ' ')
-		if pos <= 0:
-			raise error, 'Not a scene id: '+id
-		return id[pos+1:]
-	#
-	# Select a scene given a position.
-	#
-	def pos_select(self, pos):
-		prevmovie = None
-		movies = self.get_movienames()
-		for movie in movies:
-			mpos = self.movies[movie]['-ALL-']['START']
-			if mpos > pos:
-				break
-			prevmovie = movie
-		if not prevmovie:
-			raise error, 'Scene before BOT'
-			
-		self.movie_select(prevmovie)
-		scenes = self.get_scenenames()
-		scenedict = self._getmoviedict()
-		prevscene = 'START'
-		for scene in scenes:
-			if scenedict[scene]['START'] > pos:
-				break
-			prevscene = scene
-		self.scene_select(prevscene)
diff --git a/Demo/sgi/video/Vedit.py b/Demo/sgi/video/Vedit.py
deleted file mode 100755
index 60ef49f..0000000
--- a/Demo/sgi/video/Vedit.py
+++ /dev/null
@@ -1,301 +0,0 @@
-#! /usr/bin/env python
-
-# Edit CMIF movies interactively -- copy one or more files to an output file
-
-
-# XXX To do:
-#
-# - convert between formats (grey, rgb, rgb8, ...)
-# - change size
-# - cut out a given area of the image
-# - change time base (a la Vtime)
-
-
-import sys
-import os
-import gl, GL, DEVICE
-import fl, FL
-import flp
-import Viewer
-import getopt
-import string
-import watchcursor
-
-ARROW = 0
-WATCH = 1
-watchcursor.defwatch(WATCH)
-
-
-def main():
-	qsize = 40
-	opts, args = getopt.getopt(sys.argv[1:], 'q:')
-	for o, a in opts:
-		if o == '-q':
-			qsize = string.atoi(a)
-	ed = Editor(qsize)
-	if args[0:]:
-		ed.open_input(args[0])
-	if args[1:]:
-		ed.open_output(args[1])
-	while 1:
-		dummy = fl.do_forms()
-
-
-class Editor:
-
-	def __init__(self, qsize):
-		self.qsize = qsize
-		self.vin = None
-		self.vout = None
-		self.ifile = ''
-		self.ofile = ''
-		formdef = flp.parse_form('VeditForm', 'form')
-		flp.create_full_form(self, formdef)
-		self.form.show_form(FL.PLACE_SIZE, FL.TRUE, 'Vedit')
-		fl.set_event_call_back(self.do_event)
-
-	def do_event(self, dev, val):
-		if dev == DEVICE.REDRAW:
-			if self.vin:
-				self.vin.redraw(val)
-			if self.vout:
-				self.vout.redraw(val)
-
-	def busy(self):
-		gl.winset(self.form.window)
-		gl.setcursor(WATCH, 0, 0)
-
-	def ready(self):
-		gl.winset(self.form.window)
-		gl.setcursor(ARROW, 0, 0)
-
-
-	def iocheck(self):
-		self.msg('')
-		if self.vin == None and self.vout == None:
-			self.err('Please open input and output files first')
-			return 0
-		return self.icheck() and self.ocheck()
-
-	def icheck(self):
-		self.msg('')
-		if self.vin == None:
-			self.err('Please open an input file first')
-			return 0
-		return 1
-
-	def ocheck(self):
-		self.msg('')
-		if self.vout == None:
-			self.err('Please open an output file first')
-			return 0
-		return 1
-
-
-	def cb_in_new(self, *args):
-		self.msg('')
-		hd, tl = os.path.split(self.ifile)
-		filename = fl.file_selector('Input video file', hd, '', tl)
-		if not filename: return
-		self.open_input(filename)
-
-	def cb_in_close(self, *args):
-		self.msg('')
-		self.close_input()
-
-	def cb_in_skip(self, *args):
-		if not self.icheck(): return
-		if not self.vin.get(): self.err('End of input file')
-		self.ishow()
-
-	def cb_in_back(self, *args):
-		if not self.icheck(): return
-		if not self.vin.backup(): self.err('Begin of input file')
-		self.ishow()
-
-	def cb_in_slider(self, *args):
-		if not self.icheck(): return
-		left, pos, right = self.vin.qinfo()
-		i = int(self.in_slider.get_slider_value())
-		i = max(i, left)
-		i = min(i, right)
-		if i == pos: return
-		if not self.vin.seek(i):
-			self.err('Input seek failed')
-		self.ishow()
-
-	def cb_in_rewind(self, *args):
-		if not self.icheck(): return
-		self.vin.rewind()
-		self.ishow()
-
-
-	def cb_copy(self, *args):
-		if not self.iocheck(): return
-		data = self.vin.get()
-		if not data:
-			self.err('End of input file')
-			self.ishow()
-			return
-		if self.vout.getinfo() <> self.vin.getinfo():
-			print 'Copying info...'
-			self.vout.setinfo(self.vin.getinfo())
-			if self.vin.format == 'compress':
-				self.vout.setcompressheader(\
-					  self.vin.getcompressheader())
-		self.vout.put(data)
-		self.oshow()
-		self.ishow()
-
-	def cb_uncopy(self, *args):
-		if not self.iocheck(): return
-		if not self.vout.backup():
-			self.err('Output buffer exhausted')
-			return
-		self.oshow()
-		if not self.vin.backup():
-			self.err('Begin of input file')
-			return
-		self.ishow()
-
-
-	def cb_out_new(self, *args):
-		self.msg('')
-		hd, tl = os.path.split(self.ofile)
-		filename = fl.file_selector('Output video file', hd, '', tl)
-		if not filename: return
-		self.open_output(filename)
-
-	def cb_out_close(self, *args):
-		self.msg('')
-		self.close_output()
-
-	def cb_out_skip(self, *args):
-		if not self.ocheck(): return
-		if not self.vout.forward(): self.err('Output buffer exhausted')
-		self.oshow()
-		
-	def cb_out_back(self, *args):
-		if not self.ocheck(): return
-		if not self.vout.backup(): self.err('Output buffer exhausted')
-		self.oshow()
-
-	def cb_out_slider(self, *args):
-		if not self.ocheck(): return
-		i = int(self.out_slider.get_slider_value())
-		left, pos, right = self.vout.qinfo()
-		i = int(self.out_slider.get_slider_value())
-		i = max(i, left)
-		i = min(i, right)
-		if i == pos: return
-		if not self.vout.seek(i):
-			self.err('Output seek failed')
-		self.oshow()
-
-	def cb_out_trunc(self, *arcs):
-		if not self.ocheck(): return
-		self.vout.trunc()
-		self.oshow()
-
-	def cb_out_rewind(self, *args):
-		if not self.ocheck(): return
-		self.vout.rewind()
-		self.oshow()
-
-
-	def cb_quit(self, *args):
-		self.close_input()
-		self.close_output()
-		sys.exit(0)
-
-
-	def open_input(self, filename):
-		self.ifile = filename
-		basename = os.path.split(filename)[1]
-		title = 'in: ' + basename
-		try:
-			vin = Viewer.InputViewer(filename, title)
-		except:
-			self.err('Can\'t open input file', filename)
-			return
-		self.close_input()
-		self.vin = vin
-		self.in_file.label = basename
-		self.ishow()
-
-	def close_input(self):
-		if self.vin:
-			self.busy()
-			self.msg('Closing input file...')
-			self.vin.close()
-			self.ready()
-		self.msg('')
-		self.vin = None
-		self.in_file.label = '(none)'
-		self.format('in')
-
-	def ishow(self):
-		self.vin.show()
-		self.format('in')
-
-	def open_output(self, filename):
-		self.ofile = filename
-		basename = os.path.split(filename)[1]
-		title = 'out: ' + basename
-		try:
-			vout = Viewer.OutputViewer(filename, \
-				title, self.qsize)
-		except:
-			self.err('Can\'t open output file', filename)
-			return
-		self.close_output()
-		self.vout = vout
-		self.out_file.label = basename
-		if self.vin:
-			self.vout.setinfo(self.vin.getinfo())
-			self.oshow()
-
-	def close_output(self):
-		if self.vout:
-			self.busy()
-			self.msg('Closing output file...')
-			self.vout.close()
-			self.ready()
-		self.msg('')
-		self.vout = None
-		self.out_file.label = '(none)'
-		self.format('out')
-
-	def oshow(self):
-		self.vout.show()
-		self.format('out')
-
-
-	def msg(self, *args):
-		str = string.strip(string.join(args))
-		self.msg_area.label = str
-
-	def err(self, *args):
-		gl.ringbell()
-		apply(self.msg, args)
-
-	def format(self, io):
-		v = getattr(self, 'v' + io)
-		if v == None:
-			left = right = pos = 0
-		else:
-			left, pos, right = v.qinfo()
-		getattr(self, io + '_info1').label = `left`
-		getattr(self, io + '_info2').label = `pos`
-		getattr(self, io + '_info3').label = `right`
-		sl = getattr(self, io + '_slider')
-		self.form.freeze_form()
-		sl.set_slider_bounds(left, right)
-		sl.set_slider_value(pos)
-		self.form.unfreeze_form()
-
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/VeditForm.fd b/Demo/sgi/video/VeditForm.fd
deleted file mode 100644
index ba59de4..0000000
--- a/Demo/sgi/video/VeditForm.fd
+++ /dev/null
@@ -1,435 +0,0 @@
-Magic: 12321
-
-Internal Form Definition File
-    (do not change)
-
-Number of forms: 1
-
-=============== FORM ===============
-Name: form
-Width: 510.000000
-Height: 350.000000
-Number of Objects: 28
-
---------------------
-class: 1
-type: 1
-box: 0.000000 0.000000 510.000000 350.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 1
-type: 6
-box: 10.000000 130.000000 240.000000 209.999985
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 1
-type: 6
-box: 260.000000 130.000000 240.000000 209.999985
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: 
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 10.000000 10.000000 430.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: CMIF Video Editor, by Guido van Rossum
-name: msg_area
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 4
-box: 200.000000 90.000000 120.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: -> Copy ->
-name: 
-callback: cb_copy
-argument: 0
-
---------------------
-class: 11
-type: 4
-box: 210.000000 220.000000 30.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: @>
-name: 
-callback: cb_in_skip
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 20.000000 140.000000 220.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Rewind
-name: 
-callback: cb_in_rewind
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 270.000000 140.000000 100.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Reset
-name: 
-callback: cb_out_rewind
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 20.000000 260.000000 160.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: New input file...
-name: 
-callback: cb_in_new
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 330.000000 260.000000 160.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: New output file...
-name: 
-callback: cb_out_new
-argument: 0
-
---------------------
-class: 2
-type: 0
-box: 20.000000 300.000000 220.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: (none)
-name: in_file
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 270.000000 300.000000 220.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: (none)
-name: out_file
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 450.000000 10.000000 50.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Quit
-name: 
-callback: cb_quit
-argument: 0
-
---------------------
-class: 11
-type: 4
-box: 270.000000 220.000000 30.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: @<
-name: 
-callback: cb_out_back
-argument: 0
-
---------------------
-class: 11
-type: 4
-box: 20.000000 220.000000 30.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: @<
-name: 
-callback: cb_in_back
-argument: 0
-
---------------------
-class: 11
-type: 4
-box: 460.000000 220.000000 30.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: @>
-name: 
-callback: cb_out_skip
-argument: 0
-
---------------------
-class: 11
-type: 4
-box: 200.000000 50.000000 120.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Uncopy
-name: 
-callback: cb_uncopy
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 190.000000 260.000000 50.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Close
-name: 
-callback: cb_in_close
-argument: 0
-
---------------------
-class: 11
-type: 0
-box: 270.000000 260.000000 50.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Close
-name: 
-callback: cb_out_close
-argument: 0
-
---------------------
-class: 21
-type: 1
-box: 60.000000 220.000000 140.000000 30.000000
-boxtype: 2
-colors: 47 47
-alignment: 1
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: in_slider
-callback: cb_in_slider
-argument: 0
-
---------------------
-class: 21
-type: 1
-box: 310.000000 220.000000 140.000000 30.000000
-boxtype: 2
-colors: 47 47
-alignment: 1
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: out_slider
-callback: cb_out_slider
-argument: 0
-
---------------------
-class: 2
-type: 0
-box: 20.000000 180.000000 30.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 8.000000
-lcol: 0
-label: 
-name: in_info1
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 100.000000 180.000000 60.000004 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: in_info2
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 210.000000 180.000000 30.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 8.000000
-lcol: 0
-label: 
-name: in_info3
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 270.000000 180.000000 30.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 8.000000
-lcol: 0
-label: 
-name: out_info1
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 350.000000 180.000000 60.000004 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: 
-name: out_info2
-callback: 
-argument: 
-
---------------------
-class: 2
-type: 0
-box: 460.000000 180.000000 30.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 8.000000
-lcol: 0
-label: 
-name: out_info3
-callback: 
-argument: 
-
---------------------
-class: 11
-type: 0
-box: 390.000000 140.000000 100.000000 30.000000
-boxtype: 1
-colors: 47 47
-alignment: 4
-style: 0
-size: 11.000000
-lcol: 0
-label: Truncate
-name: 
-callback: cb_out_trunc
-argument: 0
-
-==============================
-create_the_forms
diff --git a/Demo/sgi/video/Vfix.py b/Demo/sgi/video/Vfix.py
deleted file mode 100755
index 4870c1b..0000000
--- a/Demo/sgi/video/Vfix.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#! /usr/bin/env python
-
-# Copy a video file, fixing the line width to be a multiple of 4
-
-
-# Usage:
-#
-# Vfix [infile [outfile]]
-
-
-# Options:
-#
-# infile     : input file (default film.video)
-# outfile    : output file (default out.video)
-
-
-import sys
-import imageop
-sys.path.append('/ufs/guido/src/video')
-import VFile
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	args = sys.argv[1:]
-	if len(args) < 1:
-		args.append('film.video')
-	if len(args) < 2:
-		args.append('out.video')
-	if len(args) > 2:
-		sys.stderr.write('usage: Vfix [infile [outfile]]\n')
-		sys.exit(2)
-	sts = process(args[0], args[1])
-	sys.exit(sts)
-
-
-# Copy one file to another
-
-def process(infilename, outfilename):
-	try:
-		vin = VFile.BasicVinFile(infilename)
-	except IOError, msg:
-		sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(infilename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vout = VFile.BasicVoutFile(outfilename)
-	except IOError, msg:
-		sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-
-	info = vin.getinfo()
-	if info[0] <> 'grey':
-		sys.stderr.write('Vfix: input not in grey format\n')
-		return 1
-	vout.setinfo(info)
-	inwidth, height = vin.getsize()
-	pf = vin.packfactor
-	if (inwidth/pf)%4 == 0:
-		sys.stderr.write('Vfix: fix not necessary\n')
-		return 1
-	outwidth = (inwidth/pf/4)*4*pf
-	print 'inwidth =', inwidth, 'outwidth =', outwidth
-	vout.setsize(outwidth, height)
-	vout.writeheader()
-	n = 0
-	try:
-		while 1:
-			t, data, cdata = vin.getnextframe()
-			n = n + 1
-			sys.stderr.write('Frame ' + `n` + '...')
-			data = imageop.crop(data, 1, inwidth/pf, height/pf, \
-				0, 0, outwidth/pf-1, height/pf-1)
-			vout.writeframe(t, data, None)
-			sys.stderr.write('\n')
-	except EOFError:
-		pass
-	return 0
-
-
-# Don't forget to call the main program
-
-main()
diff --git a/Demo/sgi/video/Vgeneric.py b/Demo/sgi/video/Vgeneric.py
deleted file mode 100755
index 182adbe..0000000
--- a/Demo/sgi/video/Vgeneric.py
+++ /dev/null
@@ -1,2 +0,0 @@
-import sys, posixpath
-exec('import ' + posixpath.basename(sys.argv[0]) + '\n')
diff --git a/Demo/sgi/video/Viewer.py b/Demo/sgi/video/Viewer.py
deleted file mode 100755
index 07cba54..0000000
--- a/Demo/sgi/video/Viewer.py
+++ /dev/null
@@ -1,255 +0,0 @@
-import gl, GL
-import VFile
-import os
-
-
-class InputViewer:
-
-	def __init__(self, filename, title, *args):
-		try:
-			self.vin = VFile.VinFile(filename)
-		except (EOFError, VFile.Error):
-			raise IOError, 'bad video input file'
-		self.vin.warmcache()
-		if not title:
-			title = os.path.split(filename)[1]
-		self.filename = filename
-		self.title = title
-		self.qsize = len(self.vin.index)
-		gl.foreground()
-		gl.prefsize(self.vin.width, self.vin.height)
-		self.wid = -1
-		self.reset()
-
-	def close(self):
-		self.vin.close()
-		if self.wid > 0:
-			gl.winclose(self.wid)
-
-	def rewind(self):
-		self.vin.rewind()
-		self.reset()
-
-	def getinfo(self):
-		return self.vin.getinfo()
-
-	# Internal
-	def reset(self):
-		if self.wid > 0:
-			gl.winset(self.wid)
-			gl.clear()
-			self.vin.initcolormap()
-		self.qindex = 0
-
-	def show(self):
-		if self.wid < 0:
-			gl.foreground()
-			gl.prefsize(self.vin.width, self.vin.height)
-			self.wid = gl.winopen(self.title)
-			gl.clear()
-			self.vin.initcolormap()
-		gl.winset(self.wid)
-		if self.qindex >= self.qsize:
-			self.vin.clear()
-			return
-		dt, d, cd = self.vin.getrandomframe(self.qindex)
-		self.vin.showframe(d, cd)
-
-	def redraw(self, wid):
-		if wid == self.wid >= 0:
-			gl.winset(self.wid)
-			gl.reshapeviewport()
-			self.vin.clear()
-			self.show()
-
-	def get(self):
-		if self.qindex >= self.qsize:
-			return None
-		if self.qindex > 0:
-			prevt, ds, cs = \
-				  self.vin.getrandomframeheader(self.qindex-1)
-		else:
-			prevt = 0
-		t, data, cdata = self.vin.getrandomframe(self.qindex)
-		self.qindex = self.qindex + 1
-		return t-prevt, data, cdata
-
-	def backup(self):
-		if self.qindex == 0:
-			return 0
-		self.qindex = self.qindex - 1
-		return 1
-
-	def seek(self, i):
-		if not 0 <= i <= self.qsize:
-			return 0
-		self.qindex = i
-		return 1
-
-	def tell(self):
-		return self.qindex
-
-	def qsizes(self):
-		return self.qindex, self.qsize - self.qindex
-
-	def qinfo(self):
-		return 0, self.qindex, self.qsize
-
-
-class OutputViewer:
-
-	def __init__(self, filename, title, qsize):
-		try:
-			self.vout = VFile.VoutFile(filename)
-		except (EOFError, VFile.Error):
-			raise IOError, 'bad video output file'
-		if not title:
-			title = os.path.split(filename)[1]
-		self.filename = filename
-		self.title = title
-		self.qsize = qsize
-		gl.foreground()
-		self.wid = -1
-		self.reset()
-
-	def close(self):
-		while self.queue:
-			self.flushq()
-		self.vout.close()
-		if self.wid > 0:
-			gl.winclose(self.wid)
-
-	def rewind(self):
-		info = self.vout.getinfo()
-		self.vout.close()
-		self.vout = VFile.VoutFile(self.filename)
-		self.vout.setinfo(info)
-		self.reset()
-
-	def getinfo(self):
-		return self.vout.getinfo()
-
-	def setinfo(self, info):
-		if info == self.getinfo(): return # No change
-		self.vout.setinfo(info)
-		if self.wid > 0:
-			gl.winclose(self.wid)
-			self.wid = -1
-
-	# Internal
-	def reset(self):
-		if self.wid > 0:
-			gl.winset(self.wid)
-			gl.clear()
-			self.vout.initcolormap()
-		self.queue = []
-		self.spares = []
-		self.written = 0
-		self.lastt = 0
-
-	# Internal
-	def flushq(self):
-		if self.written == 0:
-			self.vout.writeheader()
-		dt, d, cd = self.queue[0]
-		self.lastt = self.lastt + dt
-		self.vout.writeframe(self.lastt, d, cd)
-		del self.queue[0]
-		self.written = self.written + 1
-
-	def show(self):
-		if self.wid < 0:
-			gl.foreground()
-			gl.prefsize(self.vout.width, self.vout.height)
-			self.wid = gl.winopen(self.title)
-			gl.clear()
-			self.vout.initcolormap()
-		gl.winset(self.wid)
-		if not self.queue:
-			self.vout.clear()
-			return
-		dt, d, cd = self.queue[-1]
-		self.vout.showframe(d, cd)
-
-	def redraw(self, wid):
-		if wid == self.wid >= 0:
-			gl.winset(self.wid)
-			gl.reshapeviewport()
-			self.vout.clear()
-			self.show()
-
-	def backup(self):
-		if len(self.queue) < 1: return 0
-		self.spares.insert(0, self.queue[-1])
-		del self.queue[-1]
-		return 1
-
-	def forward(self):
-		if not self.spares: return 0
-		self.queue.append(self.spares[0])
-		del self.spares[0]
-		return 1
-
-	def put(self, item):
-		self.queue.append(item)
-		self.spares = []
-		while len(self.queue) > self.qsize:
-			self.flushq()
-
-	def seek(self, i):
-		i = i - self.written
-		if not 0 <= i <= len(self.queue) + len(self.spares):
-			return 0
-		while i < len(self.queue):
-			if not self.backup():
-				return 0
-		while i > len(self.queue):
-			if not self.forward():
-				return 0
-		return 1
-
-	def trunc(self):
-		del self.spares[:]
-
-	def tell(self):
-		return self.written + len(self.queue)
-
-	def qsizes(self):
-		return len(self.queue), len(self.spares)
-
-	def qinfo(self):
-		first = self.written
-		pos = first + len(self.queue)
-		last = pos + len(self.spares)
-		return first, pos, last
-
-
-def test():
-	import sys
-	a = InputViewer(sys.argv[1], '')
-	b = OutputViewer(sys.argv[2], '')
-	b.setinfo(a.getinfo())
-	
-	while 1:
-		a.show()
-		data = a.get()
-		if data is None:
-			break
-		b.put(data)
-		b.show()
-
-	while a.backup():
-		data = a.get()
-		b.put(data)
-		b.show()
-		if a.backup(): a.show()
-	
-	while 1:
-		data = a.get()
-		if data is None:
-			break
-		b.put(data)
-		b.show()
-		a.show()
-
-	b.close()
diff --git a/Demo/sgi/video/Vinfo.py b/Demo/sgi/video/Vinfo.py
deleted file mode 100755
index 0d9d294..0000000
--- a/Demo/sgi/video/Vinfo.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#! /usr/bin/env python
-
-# Print some info about a CMIF movie file
-
-
-# Usage:
-#
-# Vinfo [-d] [-q] [-s] [-t] [file] ...
-
-
-# Options:
-#
-# -d       : print deltas between frames instead of frame times
-# -q       : quick: don't read the frames
-# -s       : don't print times (but do count frames and print the total)
-# -t       : terse (one line/file, implies -s)
-# file ... : file(s) to inspect; default film.video
-
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-import VFile
-import getopt
-import string
-
-
-# Global options
-
-short = 0
-quick = 0
-delta = 0
-terse = 0
-maxwidth = 10
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	global short, quick, delta, terse, maxwidth
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'dqst')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print msg
-		print 'usage: Vinfo [-d] [-q] [-s] [-t] [file] ...'
-		sys.exit(2)
-	for opt, arg in opts:
-		if opt == '-q':
-			quick = 1
-		if opt == '-d':
-			delta = 1
-		if opt == '-s':
-			short = 1
-		if opt == '-t':
-			terse = short = 1
-	if not args:
-		args = ['film.video']
-	for filename in args:
-		maxwidth = max(maxwidth, len(filename))
-	sts = 0
-	for filename in args:
-		if process(filename):
-			sts = 1
-	sys.exit(sts)
-
-
-# Process one file
-
-def process(filename):
-	try:
-		vin = VFile.RandomVinFile(filename)
-	except IOError, msg:
-		sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(filename + ': EOF in video file\n')
-		return 1
-
-	if terse:
-		print string.ljust(filename, maxwidth),
-		kbytes = (VFile.getfilesize(filename) + 1023) / 1024
-		print string.rjust(`kbytes`, 5) + 'K',
-		print ' ', string.ljust(`vin.version`, 5),
-		print string.ljust(vin.format, 8),
-		print string.rjust(`vin.width`, 4),
-		print string.rjust(`vin.height`, 4),
-		if type(vin.packfactor) == type(()):
-			xpf, ypf = vin.packfactor
-			s = string.rjust(`xpf`, 2) + ',' + \
-				  string.rjust(`ypf`, 2)
-		else:
-			s = string.rjust(`vin.packfactor`, 2)
-			if type(vin.packfactor) == type(0) and \
-				  vin.format not in ('rgb', 'jpeg') and \
-				  (vin.width/vin.packfactor) % 4 <> 0:
-				s = s + '!  '
-			else:
-				s = s + '   '
-		print s,
-		sys.stdout.flush()
-	else:
-		vin.printinfo()
-
-	if quick:
-		if terse:
-			print
-		vin.close()
-		return 0
-
-	try:
-		vin.readcache()
-		if not terse:
-			print '[Using cached index]'
-	except VFile.Error:
-		if not terse:
-			print '[Constructing index on the fly]'
-
-	if not short:
-		if delta:
-			print 'Frame time deltas:',
-		else:
-			print 'Frame times:',
-
-	n = 0
-	t = 0
-	told = 0
-	datasize = 0
-	while 1:
-		try:
-			t, ds, cs = vin.getnextframeheader()
-			vin.skipnextframedata(ds, cs)
-		except EOFError:
-			break
-		datasize = datasize + ds
-		if cs: datasize = datasize + cs
-		if not short:
-			if n%8 == 0:
-				sys.stdout.write('\n')
-			if delta:
-				sys.stdout.write('\t' + `t - told`)
-				told = t
-			else:
-				sys.stdout.write('\t' + `t`)
-		n = n+1
-
-	if not short: print
-
-	if terse:
-		print string.rjust(`n`, 6),
-		if t: print string.rjust(`int(n*10000.0/t)*0.1`, 5),
-		print
-	else:
-		print 'Total', n, 'frames in', t*0.001, 'sec.',
-		if t: print '-- average', int(n*10000.0/t)*0.1, 'frames/sec',
-		print
-		print 'Total data', 0.1 * int(datasize / 102.4), 'Kbytes',
-		if t:
-			print '-- average',
-			print 0.1 * int(datasize / 0.1024 / t), 'Kbytes/sec',
-		print
-
-	vin.close()
-	return 0
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/Vmkjpeg.py b/Demo/sgi/video/Vmkjpeg.py
deleted file mode 100755
index 0c9687a..0000000
--- a/Demo/sgi/video/Vmkjpeg.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#! /usr/bin/env python
-
-# Compress an rgb or grey video file to jpeg format
-
-
-# Usage:
-#
-# Vmkjpeg [infile [outfile]]
-
-
-# Options:
-#
-# infile     : input file (default film.video)
-# outfile    : output file (default out.video)
-
-
-import sys
-import jpeg
-sys.path.append('/ufs/guido/src/video')
-import VFile
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	args = sys.argv[1:]
-	if len(args) < 1:
-		args.append('film.video')
-	if len(args) < 2:
-		args.append('out.video')
-	if len(args) > 2:
-		sys.stderr.write('usage: Vmkjpeg [infile [outfile]]\n')
-		sys.exit(2)
-	sts = process(args[0], args[1])
-	sys.exit(sts)
-
-
-# Copy one file to another
-
-def process(infilename, outfilename):
-	try:
-		vin = VFile.BasicVinFile(infilename)
-	except IOError, msg:
-		sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(infilename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vout = VFile.BasicVoutFile(outfilename)
-	except IOError, msg:
-		sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-
-	info = vin.getinfo()
-	if info[0] == 'rgb':
-		width, height = vin.getsize()
-		bytes = 4
-		format = 'jpeg'
-	elif info[0] == 'grey':
-		width, height = vin.getsize()
-		pf = vin.packfactor
-		width, height = width / pf, height / pf
-		bytes = 1
-		format = 'jpeggrey'
-	else:
-		sys.stderr.write('Vmkjpeg: input not in rgb or grey format\n')
-		return 1
-	info = (format,) + info[1:]
-	vout.setinfo(info)
-	vout.writeheader()
-	n = 0
-	try:
-		while 1:
-			t, data, cdata = vin.getnextframe()
-			n = n + 1
-			sys.stderr.write('Frame ' + `n` + '...')
-			data = jpeg.compress(data, width, height, bytes)
-			vout.writeframe(t, data, None)
-			sys.stderr.write('\n')
-	except EOFError:
-		pass
-	return 0
-
-
-# Don't forget to call the main program
-
-main()
diff --git a/Demo/sgi/video/Vplay.py b/Demo/sgi/video/Vplay.py
deleted file mode 100755
index 176c0e5..0000000
--- a/Demo/sgi/video/Vplay.py
+++ /dev/null
@@ -1,355 +0,0 @@
-#! /usr/bin/env python
-
-# Play CMIF movie files
-
-
-# Help function
-
-def help():
-	print 'Usage: Vplay [options] [file] ...'
-	print
-	print 'Options:'
-	print '-M magnify : magnify the image by the given factor'
-	print '-d         : write some debug stuff on stderr'
-	print '-l         : loop, playing the movie over and over again'
-	print '-m delta   : drop frames closer than delta seconds (default 0.)'
-	print '-n         : don\'t wait after each file'
-	print '-q         : quiet, no informative messages'
-	print '-r delta   : regenerate input time base delta seconds apart'
-	print '-s speed   : speed change factor (default 1.0)'
-	print '-t         : use a 2nd thread for read-ahead'
-	print '-x left    : window offset from left of screen'
-	print '-y top     : window offset from top of screen'
-	print '-w width   : window width'
-	print '-h height  : window height'
-	print '-b color   : background color (white,black or (r,g,b))'
-	print 'file ...   : file(s) to play; default film.video'
-	print
-	print 'User interface:'
-	print 'Press the left mouse button to stop or restart the movie.'
-	print 'Press ESC or use the window manager Close or Quit command'
-	print 'to close the window and play the next file (if any).'
-
-
-# Imported modules
-
-import sys
-sys.path.append('/ufs/guido/src/video') # Increase chance of finding VFile
-import VFile
-import time
-import gl, GL
-from DEVICE import REDRAW, ESCKEY, LEFTMOUSE, WINSHUT, WINQUIT
-import getopt
-import string
-
-
-# Global options
-
-debug = 0
-looping = 0
-magnify = 1
-mindelta = 0
-nowait = 0
-quiet = 0
-regen = None
-speed = 1.0
-threading = 0
-xoff = yoff = None
-xwsiz = ywsiz = None
-bgcolor = None
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	global debug, looping, magnify, mindelta, nowait, quiet, regen, speed
-	global threading, xoff, yoff, xwsiz, ywsiz, bgcolor
-
-	# Parse command line
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], \
-			  'M:dlm:nqr:s:tx:y:w:h:b:')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print 'Error:', msg, '\n'
-		help()
-		sys.exit(2)
-
-	# Interpret options
-	try:
-		for opt, arg in opts:
-			if opt == '-M': magnify = float(eval(arg))
-			if opt == '-d': debug = debug + 1
-			if opt == '-l': looping = 1
-			if opt == '-m': mindelta = float(eval(arg))
-			if opt == '-n': nowait = 1
-			if opt == '-q': quiet = 1
-			if opt == '-r': regen = float(eval(arg))
-			if opt == '-s':
-				try:
-					speed = float(eval(arg))
-				except:
-					sys.stdout = sys.stderr
-					print 'Option -s needs float argument'
-					sys.exit(2)
-			if opt == '-t':
-				try:
-					import thread
-					threading = 1
-				except ImportError:
-					print 'Sorry, this version of Python',
-					print 'does not support threads:',
-					print '-t ignored'
-			if opt == '-x': xoff = string.atoi(arg)
-			if opt == '-y': yoff = string.atoi(arg)
-			if opt == '-w': xwsiz = string.atoi(arg)
-			if opt == '-h': ywsiz = string.atoi(arg)
-			if opt == '-b':
-				if arg == 'black':
-					bgcolor = (0,0,0)
-				elif arg == 'white':
-					bgcolor = (255,255,255)
-				else:
-					try:
-						bgcolor = eval(arg)
-						xxr, xxg, xxb = bgcolor
-					except:
-						print '-b needs (r,g,b) tuple'
-						sys.exit(2)
-	except string.atoi_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires integer argument'
-		sys.exit(2)
-
-	# Check validity of certain options combinations
-	if nowait and looping:
-		print 'Warning: -n and -l are mutually exclusive; -n ignored'
-		nowait = 0
-	if xoff <> None and yoff == None:
-		print 'Warning: -x without -y ignored'
-	if xoff == None and yoff <> None:
-		print 'Warning: -y without -x ignored'
-
-	# Process all files
-	if not args: args = ['film.video']
-	sts = 0
-	for filename in args:
-		sts = (process(filename) or sts)
-
-	# Exit with proper exit status
-	sys.exit(sts)
-
-
-# Process one movie file
-
-def process(filename):
-	try:
-		vin = VFile.VinFile(filename)
-	except IOError, msg:
-		sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(filename + ': EOF in video header\n')
-		return 1
-
-	if not quiet:
-		vin.printinfo()
-	
-	gl.foreground()
-
-	width, height = int(vin.width * magnify), int(vin.height * magnify)
-	xborder = yborder = 0
-	if xwsiz:
-		vin.xorigin = (xwsiz - width)/2
-		width = xwsiz
-	if ywsiz:
-		vin.yorigin = (ywsiz - height)/2
-		height = ywsiz
-	if xoff <> None and yoff <> None:
-		scrheight = gl.getgdesc(GL.GD_YPMAX)
-		gl.prefposition(xoff, xoff+width-1, \
-			scrheight-yoff-height, scrheight-yoff-1)
-	else:
-		gl.prefsize(width, height)
-
-	win = gl.winopen(filename)
-	gl.clear()
-
-	if quiet: vin.quiet = 1
-	vin.initcolormap()
-
-	if bgcolor:
-		r, g, b = bgcolor
-		vin.clearto(r,g,b)
-
-	gl.qdevice(ESCKEY)
-	gl.qdevice(WINSHUT)
-	gl.qdevice(WINQUIT)
-	gl.qdevice(LEFTMOUSE)
-
-	stop = 0
-
-	while not stop:
-		gl.wintitle(filename)
-		stop = (playonce(vin) or nowait)
-		gl.wintitle('(done) ' + filename)
-		if not looping:
-			while not stop:
-				dev, val = gl.qread()
-				if dev == REDRAW:
-					if bgcolor:
-						r,g,b = bgcolor
-						vin.clearto(r,g,b)
-					else:
-						vin.clear()
-				if dev == LEFTMOUSE and val == 1:
-					break # Continue outer loop
-				if dev == ESCKEY and val == 1 or \
-						dev in (WINSHUT, WINQUIT):
-					stop = 1
-
-	# Set xoff, yoff for the next window from the current window
-	global xoff, yoff
-	xoff, yoff = gl.getorigin()
-	width, height = gl.getsize()
-	scrheight = gl.getgdesc(GL.GD_YPMAX)
-	yoff = scrheight - yoff - height
-	gl.winclose(win)
-
-	return 0
-
-
-# Play a movie once; return 1 if user wants to stop, 0 if not
-
-def playonce(vin):
-	vin.rewind()
-	vin.colormapinited = 1
-	vin.magnify = magnify
-
-	if threading:
-		MAXSIZE = 20 # Don't read ahead too much
-		import thread
-		import Queue
-		queue = Queue.Queue(MAXSIZE)
-		stop = []
-		thread.start_new_thread(read_ahead, (vin, queue, stop))
-		# Get the read-ahead thread going
-		while queue.qsize() < MAXSIZE/2 and not stop:
-			time.sleep(0.100)
-
-	tin = 0
-	toffset = 0
-	oldtin = 0
-	told = 0
-	nin = 0
-	nout = 0
-	nlate = 0
-	nskipped = 0
-	data = None
-
-	tlast = t0 = time.time()
-
-	while 1:
-		if gl.qtest():
-			dev, val = gl.qread()
-			if dev == ESCKEY and val == 1 or \
-					dev in (WINSHUT, WINQUIT) or \
-					dev == LEFTMOUSE and val == 1:
-				if debug: sys.stderr.write('\n')
-				if threading:
-					stop.append(None)
-					while 1:
-						item = queue.get()
-						if item == None: break
-				return (dev != LEFTMOUSE)
-			if dev == REDRAW:
-				gl.reshapeviewport()
-				if data: vin.showframe(data, cdata)
-		if threading:
-			if debug and queue.empty(): sys.stderr.write('.')
-			item = queue.get()
-			if item == None: break
-			tin, data, cdata = item
-		else:
-			try:
-				tin, size, csize = vin.getnextframeheader()
-			except EOFError:
-				break
-		tin = tin*0.001
-		nin = nin+1
-		if tin+toffset < oldtin:
-			print 'Fix reversed time:', oldtin, 'to', tin
-			toffset = oldtin - tin
-		tin = tin + toffset
-		oldtin = tin
-		if regen: tout = nin * regen
-		else: tout = tin
-		tout = tout / speed
-		if tout - told < mindelta:
-			nskipped = nskipped + 1
-			if not threading:
-				vin.skipnextframedata(size, csize)
-		else:
-			if not threading:
-				try:
-					data, cdata = \
-					  vin.getnextframedata(size, csize)
-				except EOFError:
-					if not quiet:
-						print '[incomplete last frame]'
-					break
-			now = time.time()
-			dt = (tout-told) - (now-tlast)
-			told = tout
-			if debug: sys.stderr.write(`round(dt, 3)` + ' ')
-			if dt < 0: nlate = nlate + 1
-			if dt > 0:
-				time.sleep(dt)
-				now = time.time()
-			tlast = now
-			vin.showframe(data, cdata)
-			nout = nout + 1
-
-	t1 = time.time()
-
-	if debug: sys.stderr.write('\n')
-
-	if quiet: return 0
-
-	print 'Recorded:', nin, 'frames in', round(tin, 3), 'sec.',
-	if tin: print '-- average', round(nin/tin, 1), 'frames/sec',
-	print
-
-	if nskipped: print 'Skipped', nskipped, 'frames'
-
-	tout = t1-t0
-	print 'Played:', nout,
-	print 'frames in', round(tout, 3), 'sec.',
-	if tout: print '-- average', round(nout/tout, 1), 'frames/sec',
-	print
-
-	if nlate: print 'There were', nlate, 'late frames'
-
-	return 0
-
-
-# Read-ahead thread
-
-def read_ahead(vin, queue, stop):
-	try:
-		while not stop: queue.put(vin.getnextframe())
-	except EOFError:
-		pass
-	queue.put(None)
-	stop.append(None)
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/Vrec.py b/Demo/sgi/video/Vrec.py
deleted file mode 100755
index 11039bb..0000000
--- a/Demo/sgi/video/Vrec.py
+++ /dev/null
@@ -1,413 +0,0 @@
-#! /usr/bin/env python
-#! /ufs/guido/bin/sgi/python-405
-
-# Capture a CMIF movie using the Indigo video library and board
-
-# The CMIF video file format is documented in cmif-film.ms.
-# Audio data is recorded in AIFF format, using the input sampling
-# rate, source and volume set by the audio panel, in mono, 8
-# bits/sample.
-
-
-# Usage and help functions (keep this up-to-date if you change the program!)
-
-def usage():
-	print 'Usage: Vrec [options] [moviefile [audiofile]]'
-	print
-	print 'Options:'
-	print '-a            : record audio as well'
-	print '-q queuesize  : set the capture queue size (default 2)'
-	print '-r rate       : capture 1 out of every "rate" frames', \
-	                     '(default and min 2)'
-	print '-w width      : initial window width', \
-                             '(default 256, use 0 for interactive placement)'
-	print '-n            : Don\'t write to file, only timing info'
-	print '-d            : drop fields if needed'
-	print '-g bits       : greyscale (2, 4 or 8 bits)'
-	print '-G            : 2-bit greyscale dithered'
-	print '-m            : monochrome dithered'
-	print '-M value      : monochrome thresholded with value'
-	print '-f            : Capture fields (in stead of frames)'
-	print '-P frames     : preallocate space for "frames" frames'
-	print 'moviefile     : here goes the movie data (default film.video)'
-	print 'audiofile     : with -a, here goes the audio data', \
-		  	     '(default film.aiff)'
-
-def help():
-	print 'Press the left mouse button to start recording, release it to'
-	print 'end recording.  You can record as many times as you wish, but'
-	print 'each recording overwrites the output file(s) -- only the last'
-	print 'recording is kept.'
-	print
-	print 'Press ESC or use the window manager Quit or Close window option'
-	print 'to quit.  If you quit before recording anything, the output'
-	print 'file(s) are not touched.'
-
-
-# Imported modules
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-import sv, SV
-import VFile
-import gl, GL, DEVICE
-import al, AL
-import time
-import posix
-import getopt
-import string
-import imageop
-import sgi
-
-
-# Main program
-
-def main():
-	format = SV.RGB8_FRAMES
-	qsize = 2
-	audio = 0
-	rate = 2
-	width = 0
-	norecord = 0
-	drop = 0
-	mono = 0
-	grey = 0
-	greybits = 0
-	monotreshold = -1
-	fields = 0
-	preallocspace = 0
-
-	# Parse command line
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'aq:r:w:ndg:mM:GfP:')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print 'Error:', msg, '\n'
-		usage()
-		sys.exit(2)
-
-	# Interpret options
-	try:
-		for opt, arg in opts:
-			if opt == '-a':
-				audio = 1
-			elif opt == '-q':
-				qsize = string.atoi(arg)
-			elif opt == '-r':
-				rate = string.atoi(arg)
-				if rate < 2:
-					sys.stderr.write( \
-						  '-r rate must be >= 2\n')
-					sys.exit(2)
-			elif opt == '-w':
-				width = string.atoi(arg)
-			elif opt == '-n':
-				norecord = 1
-			elif opt == '-d':
-				drop = 1
-			elif opt == '-g':
-				grey = 1
-				greybits = string.atoi(arg)
-				if not greybits in (2, 4, 8):
-					sys.stderr.write( \
-				'Only 2, 4 or 8 bit greyscale supported\n')
-					sys.exit(2)
-			elif opt == '-G':
-				grey = 1
-				greybits = -2
-			elif opt == '-m':
-				mono = 1
-			elif opt == '-M':
-				mono = 1
-				monotreshold = string.atoi(arg)
-			elif opt == '-f':
-				fields = 1
-			elif opt == '-P':
-				preallocspace = string.atoi(arg)
-	except string.atoi_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires integer argument'
-		sys.exit(2)
-
-	# Check excess arguments
-	# If norecord is on, refuse filename arguments
-	if norecord:
-		if args:
-			sys.stdout = sys.stderr
-			print 'With -n, no filename arguments are used\n'
-			usage()
-			sys.exit(2)
-	elif args[2:]:
-		sys.stdout = sys.stderr
-		print 'Too many filename arguments\n'
-		usage()
-		sys.exit(2)
-
-	# Process file arguments
-	if args:
-		filename = args[0]
-	else:
-		filename = 'film.video'
-
-	if args[1:] and not audio:
-		sys.stderr.write('-a turned on by appearance of 2nd file\n')
-		audio = 1
-
-	if audio:
-		if args[1:]:
-			audiofilename = args[1]
-		else:
-			audiofilename = 'film.aiff'
-	else:
-		audiofilename = None
-
-	if norecord:
-		filename = audiofilename = ''
-
-	# Open video
-	v = sv.OpenVideo()
-	# Determine maximum window size based on signal standard
-	param = [SV.BROADCAST, 0]
-	v.GetParam(param)
-	if param[1] == SV.PAL:
-		x = SV.PAL_XMAX
-		y = SV.PAL_YMAX
-	elif param[1] == SV.NTSC:
-		x = SV.NTSC_XMAX
-		y = SV.NTSC_YMAX
-	else:
-		print 'Unknown video standard', param[1]
-		sys.exit(1)
-
-	gl.foreground()
-	gl.maxsize(x, y)
-	gl.keepaspect(x, y)
-	gl.stepunit(8, 6)
-	if width:
-		height = width*3/4
-		x1 = 150
-		x2 = x1 + width-1
-		y2 = 768-150
-		y1 = y2-height+1
-		gl.prefposition(x1, x2, y1, y2)
-	win = gl.winopen(filename)
-	if width:
-		gl.maxsize(x, y)
-		gl.keepaspect(x, y)
-		gl.stepunit(8, 6)
-		gl.winconstraints()
-	x, y = gl.getsize()
-	print x, 'x', y
-
-	v.SetSize(x, y)
-
-	if drop:
-		param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF]
-	else:
-		param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON]
-	if mono or grey:
-		param = param+[SV.COLOR, SV.MONO, SV.DITHER, 0, \
-			       SV.INPUT_BYPASS, 1]
-	else:
-		param = param+[SV.COLOR, SV.DEFAULT_COLOR, SV.INPUT_BYPASS, 0]
-
-	v.BindGLWindow(win, SV.IN_REPLACE)
-	v.SetParam(param)
-
-	gl.qdevice(DEVICE.LEFTMOUSE)
-	gl.qdevice(DEVICE.WINQUIT)
-	gl.qdevice(DEVICE.WINSHUT)
-	gl.qdevice(DEVICE.ESCKEY)
-
-	help()
-
-	while 1:
-		dev, val = gl.qread()
-		if dev == DEVICE.LEFTMOUSE:
-			if val == 1:
-				info = format, x, y, qsize, rate
-				record(v, info, filename, audiofilename,\
-					  mono, grey, greybits, monotreshold, \
-					  fields, preallocspace)
-		elif dev == DEVICE.REDRAW:
-			# Window resize (or move)
-			x, y = gl.getsize()
-			print x, 'x', y
-			v.SetSize(x, y)
-			v.BindGLWindow(win, SV.IN_REPLACE)
-		elif dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT):
-			# Quit
-			v.CloseVideo()
-			gl.winclose(win)
-			break
-
-
-# Record until the mouse is released (or any other GL event)
-# XXX audio not yet supported
-
-def record(v, info, filename, audiofilename, mono, grey, greybits, \
-	  monotreshold, fields, preallocspace):
-	import thread
-	format, x, y, qsize, rate = info
-	fps = 59.64 # Fields per second
-	# XXX (Strange: need fps of Indigo monitor, not of PAL or NTSC!)
-	tpf = 1000.0 / fps # Time per field in msec
-	if filename:
-		vout = VFile.VoutFile(filename)
-		if mono:
-			format = 'mono'
-		elif grey and greybits == 8:
-			format = 'grey'
-		elif grey:
-			format = 'grey'+`abs(greybits)`
-		else:
-			format = 'rgb8'
-		vout.setformat(format)
-		vout.setsize(x, y)
-		if fields:
-			vout.setpf((1, -2))
-		vout.writeheader()
-		if preallocspace:
-			print 'Preallocating space...'
-			vout.prealloc(preallocspace)
-			print 'done.'
-		MAXSIZE = 20 # XXX should be a user option
-		import Queue
-		queue = Queue.Queue(MAXSIZE)
-		done = thread.allocate_lock()
-		done.acquire_lock()
-		convertor = None
-		if grey:
-			if greybits == 2:
-				convertor = imageop.grey2grey2
-			elif greybits == 4:
-				convertor = imageop.grey2grey4
-			elif greybits == -2:
-				convertor = imageop.dither2grey2
-		thread.start_new_thread(saveframes, \
-			  (vout, queue, done, mono, monotreshold, convertor))
-		if audiofilename:
-			audiodone = thread.allocate_lock()
-			audiodone.acquire_lock()
-			audiostop = []
-			initaudio(audiofilename, audiostop, audiodone)
-	gl.wintitle('(rec) ' + filename)
-	lastid = 0
-	t0 = time.time()
-	count = 0
-	ids = []
-	v.InitContinuousCapture(info)
-	while not gl.qtest():
-		try:
-			cd, id = v.GetCaptureData()
-		except sv.error:
-			#time.sleep(0.010) # XXX is this necessary?
-			sgi.nap(1)	# XXX Try by Jack
-			continue
-		ids.append(id)
-		
-		id = id + 2*rate
-##		if id <> lastid + 2*rate:
-##			print lastid, id
-		lastid = id
-		count = count+1
-		if fields:
-			data1, data2 = cd.GetFields()
-			cd.UnlockCaptureData()
-			if filename:
-				queue.put((data1, int(id*tpf)))
-				queue.put((data2, int((id+1)*tpf)))
-		else:
-			data = cd.InterleaveFields(1)
-			cd.UnlockCaptureData()
-			if filename:
-				queue.put((data, int(id*tpf)))
-	t1 = time.time()
-	gl.wintitle('(busy) ' + filename)
-	print lastid, 'fields in', round(t1-t0, 3), 'sec',
-	print '--', round(lastid/(t1-t0), 1), 'fields/sec'
-	print 'Captured',count*2, 'fields,',
-	print round(count*2/(t1-t0), 1), 'f/s',
-	if lastid:
-		print '(',
-		print round(count*200.0/lastid), '%, or',
-		print round(count*rate*200.0/lastid), '% of wanted rate )',
-	print
-	if ids:
-		print 'Ids:',
-		t0 = ids[0]
-		del ids[0]
-		for t1 in ids:
-			print t1-t0,
-			t0 = t1
-		print
-	if filename and audiofilename:
-		audiostop.append(None)
-		audiodone.acquire_lock()
-	v.EndContinuousCapture()
-	if filename:
-		queue.put(None) # Sentinel
-		done.acquire_lock()
-	gl.wintitle('(done) ' + filename)
-
-
-# Thread to save the frames to the file
-
-def saveframes(vout, queue, done, mono, monotreshold, convertor):
-	while 1:
-		x = queue.get()
-		if not x:
-			break
-		data, t = x
-		if convertor:
-			data = convertor(data, len(data), 1)
-		elif mono and monotreshold >= 0:
-			data = imageop.grey2mono(data, len(data), 1,\
-				  monotreshold)
-		elif mono:
-			data = imageop.dither2mono(data, len(data), 1)
-		vout.writeframe(t, data, None)
-	sys.stderr.write('Done writing video\n')
-	vout.close()
-	done.release_lock()
-
-
-# Initialize audio recording
-
-AQSIZE = 8000 # XXX should be a user option
-
-def initaudio(filename, stop, done):
-	import thread, aifc
-	afile = aifc.open(filename, 'w')
-	afile.setnchannels(AL.MONO)
-	afile.setsampwidth(AL.SAMPLE_8)
-	params = [AL.INPUT_RATE, 0]
-	al.getparams(AL.DEFAULT_DEVICE, params)
-	print 'audio sampling rate =', params[1]
-	afile.setframerate(params[1])
-	c = al.newconfig()
-	c.setchannels(AL.MONO)
-	c.setqueuesize(AQSIZE)
-	c.setwidth(AL.SAMPLE_8)
-	aport = al.openport(filename, 'r', c)
-	thread.start_new_thread(audiorecord, (afile, aport, stop, done))
-
-
-# Thread to record audio samples
-
-def audiorecord(afile, aport, stop, done):
-	while not stop:
-		data = aport.readsamps(AQSIZE/2)
-		afile.writesampsraw(data)
-		del data
-	afile.close()
-	print 'Done writing audio'
-	done.release_lock()
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/Vrecb.py b/Demo/sgi/video/Vrecb.py
deleted file mode 100755
index 5cdde9e..0000000
--- a/Demo/sgi/video/Vrecb.py
+++ /dev/null
@@ -1,429 +0,0 @@
-#! /usr/bin/env python
-
-# Capture a CMIF movie using the Indigo video library and board in burst mode
-
-
-# User interface:
-#
-# Start the application.  Resize the window to the desired movie size.
-# Press the left mouse button to start recording, release it to end
-# recording.  You can record as many times as you wish, but each time
-# you overwrite the output file(s), so only the last recording is
-# kept.
-#
-# Press ESC or select the window manager Quit or Close window option
-# to quit.  If you quit before recording anything, the output file(s)
-# are not touched.
-
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-import sv, SV
-import VFile
-import gl, GL, DEVICE
-import al, AL
-import time
-import posix
-import getopt
-import string
-import imageop
-import sgi
-
-
-# Usage and help functions (keep this up-to-date if you change the program!)
-
-def usage():
-	print 'Usage: Vrecb [options] [moviefile [audiofile]]'
-	print
-	print 'Options:'
-	print '-a            : record audio as well'
-	print '-r rate       : capture 1 out of every "rate" frames', \
-	                     '(default and min 1)'
-	print '-w width      : initial window width', \
-                             '(default 256, use 0 for interactive placement)'
-	print '-d            : drop fields if needed'
-	print '-g bits       : greyscale (2, 4 or 8 bits)'
-	print '-G            : 2-bit greyscale dithered'
-	print '-m            : monochrome dithered'
-	print '-M value      : monochrome thresholded with value'
-	print '-f            : Capture fields (instead of frames)'
-	print '-n number     : Capture this many frames (default 60)'
-	print '-N memsize    : Capture frames fitting in this many kbytes'
-	print 'moviefile     : here goes the movie data (default film.video)'
-
-def help():
-	print 'Press the left mouse button to start recording.'
-	print 'Recording time is determined by the -n option.'
-	print 'You can record as many times as you wish, but each'
-	print 'recording overwrites the output file(s) -- only the'
-	print 'last recording is kept.'
-	print
-	print 'Press ESC or use the window manager Quit or Close window option'
-	print 'to quit.  If you quit before recording anything, the output'
-	print 'file(s) are not touched.'
-
-
-# Main program
-
-def main():
-	format = SV.RGB8_FRAMES
-	audio = 0
-	rate = 1
-	width = 256
-	drop = 0
-	mono = 0
-	grey = 0
-	greybits = 0
-	monotreshold = -1
-	fields = 0
-	number = 0
-	memsize = 0
-
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'ar:w:dg:mM:Gfn:N:')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print 'Error:', msg, '\n'
-		usage()
-		sys.exit(2)
-
-	try:
-		for opt, arg in opts:
-			if opt == '-a':
-				audio = 1
-			if opt == '-r':
-				rate = string.atoi(arg)
-				if rate < 1:
-				    sys.stderr.write('-r rate must be >= 1\n')
-				    sys.exit(2)
-			elif opt == '-w':
-				width = string.atoi(arg)
-			elif opt == '-d':
-				drop = 1
-			elif opt == '-g':
-				grey = 1
-				greybits = string.atoi(arg)
-				if not greybits in (2,4,8):
-				    sys.stderr.write( \
-				    'Only 2, 4 or 8 bit greyscale supported\n')
-				    sys.exit(2)
-			elif opt == '-G':
-				grey = 1
-				greybits = -2
-			elif opt == '-m':
-				mono = 1
-			elif opt == '-M':
-				mono = 1
-				monotreshold = string.atoi(arg)
-			elif opt == '-f':
-				fields = 1
-			elif opt == '-n':
-				number = string.atoi(arg)
-			elif opt == '-N':
-				memsize = string.atoi(arg)
-				if 0 < memsize < 1024:
-					memsize = memsize * 1024
-				if 0 < memsize < 1024*1024:
-					memsize = memsize * 1024
-				print 'memsize', memsize
-	except string.atoi_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires integer argument'
-		sys.exit(2)
-
-	if number <> 0 and memsize <> 0:
-		sys.stderr.write('-n and -N are mutually exclusive\n')
-		sys.exit(2)
-	if number == 0 and memsize == 0:
-		number = 60
-
-	if not fields:
-		print '-f option assumed until somebody fixes it'
-		fields = 1
-
-	if args[2:]:
-		sys.stderr.write('usage: Vrecb [options] [file [audiofile]]\n')
-		sys.exit(2)
-
-	if args:
-		filename = args[0]
-	else:
-		filename = 'film.video'
-
-	if args[1:] and not audio:
-		sys.stderr.write('-a turned on by appearance of 2nd file\n')
-		audio = 1
-
-	if audio:
-		if args[1:]:
-			audiofilename = args[1]
-		else:
-			audiofilename = 'film.aiff'
-	else:
-		audiofilename = None
-
-	v = sv.OpenVideo()
-	# Determine maximum window size based on signal standard
-	param = [SV.BROADCAST, 0]
-	v.GetParam(param)
-	if param[1] == SV.PAL:
-		x = SV.PAL_XMAX
-		y = SV.PAL_YMAX
-	elif param[1] == SV.NTSC:
-		x = SV.NTSC_XMAX
-		y = SV.NTSC_YMAX
-	else:
-		print 'Unknown video standard', param[1]
-		sys.exit(1)
-
-	gl.foreground()
-	gl.maxsize(x, y)
-	gl.keepaspect(x, y)
-	gl.stepunit(8, 6)
-	if width:
-		height = width*3/4
-		x1 = 150
-		x2 = x1 + width-1
-		y2 = 768-150
-		y1 = y2-height+1
-		gl.prefposition(x1, x2, y1, y2)
-	win = gl.winopen(filename)
-	if width:
-		gl.maxsize(x, y)
-		gl.keepaspect(x, y)
-		gl.stepunit(8, 6)
-		gl.winconstraints()
-	x, y = gl.getsize()
-	print x, 'x', y
-	if memsize:
-		number = calcnumber(x, y, grey or mono, memsize)
-		print number, 'frames'
-	v.SetSize(x, y)
-
-	if drop:
-		param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF]
-	else:
-		param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON]
-	if mono or grey:
-		param = param+[SV.COLOR, SV.MONO, SV.DITHER, 0, \
-			       SV.INPUT_BYPASS, 1]
-	else:
-		param = param+[SV.COLOR, SV.DEFAULT_COLOR, SV.INPUT_BYPASS, 0]
-
-	v.BindGLWindow(win, SV.IN_REPLACE)
-	v.SetParam(param)
-
-	gl.qdevice(DEVICE.LEFTMOUSE)
-	gl.qdevice(DEVICE.WINQUIT)
-	gl.qdevice(DEVICE.WINSHUT)
-	gl.qdevice(DEVICE.ESCKEY)
-
-	help()
-
-	while 1:
-		dev, val = gl.qread()
-		if dev == DEVICE.LEFTMOUSE:
-			if val == 1:
-				info = format, x, y, number, rate
-				record(v, info, filename, audiofilename, \
-					  mono, grey, \
-					  greybits, monotreshold, fields)
-		elif dev == DEVICE.REDRAW:
-			# Window resize (or move)
-			x, y = gl.getsize()
-			print x, 'x', y
-			if memsize:
-			    number = calcnumber(x, y, grey or mono, memsize)
-			    print number, 'frames'
-			v.SetSize(x, y)
-			v.BindGLWindow(win, SV.IN_REPLACE)
-		elif dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT):
-			# Quit
-			v.CloseVideo()
-			gl.winclose(win)
-			break
-
-
-def calcnumber(x, y, grey, memsize):
-	pixels = x*y
-	pixels = pixels/2		# XXX always assume fields
-	if grey: n = memsize/pixels
-	else: n = memsize/(4*pixels)
-	return max(1, n)
-
-
-# Record until the mouse is released (or any other GL event)
-# XXX audio not yet supported
-
-def record(v, info, filename, audiofilename, \
-	               mono, grey, greybits, monotreshold, fields):
-	import thread
-	format, x, y, number, rate = info
-	fps = 59.64 # Fields per second
-	# XXX (Strange: need fps of Indigo monitor, not of PAL or NTSC!)
-	tpf = 1000.0 / fps # Time per field in msec
-	#
-	# Go grab
-	#
-	if audiofilename:
-		gl.wintitle('(start audio) ' + filename)
-		audiodone = thread.allocate_lock()
-		audiodone.acquire_lock()
-		audiostart = thread.allocate_lock()
-		audiostart.acquire_lock()
-		audiostop = []
-		initaudio(audiofilename, audiostop, audiostart, audiodone)
-		audiostart.acquire_lock()
-	gl.wintitle('(rec) ' + filename)
-	try:
-		ninfo, data, bitvec = v.CaptureBurst(info)
-	except sv.error, arg:
-		print 'CaptureBurst failed:', arg
-		print 'info:', info
-		gl.wintitle(filename)
-		return
-	gl.wintitle('(save) '+ filename)
-	#
-	# Check results
-	#
-	if info <> ninfo:
-		print 'Sorry, format changed.'
-		print 'Wanted:',info
-		print 'Got   :',ninfo
-		gl.wintitle(filename)
-		return
-	# print bitvec
-	if x*y*number <> len(data):
-		print 'Funny data length: wanted',x,'*',y,'*', number,'=',\
-			  x*y*number,'got',len(data)
-		gl.wintitle(filename)
-		return
-	#
-	# Save
-	#
-	if filename and audiofilename:
-		audiostop.append(None)
-		audiodone.acquire_lock()
-	if filename:
-		#
-		# Construct header and write it
-		#
-		try:
-			vout = VFile.VoutFile(filename)
-		except IOError, msg:
-			print filename, ':', msg
-			sys.exit(1)
-		if mono:
-			vout.format = 'mono'
-		elif grey and greybits == 8:
-			vout.format = 'grey'
-		elif grey:
-			vout.format = 'grey'+`abs(greybits)`
-		else:
-			vout.format = 'rgb8'
-		vout.width = x
-		vout.height = y
-		if fields:
-			vout.packfactor = (1,-2)
-		else:
-			print 'Sorry, can only save fields at the moment'
-			print '(i.e. you *must* use the -f option)'
-			gl.wintitle(filename)
-			return
-		vout.writeheader()
-		#
-		# Compute convertor, if needed
-		#
-		convertor = None
-		if grey:
-			if greybits == 2:
-				convertor = imageop.grey2grey2
-			elif greybits == 4:
-				convertor = imageop.grey2grey4
-			elif greybits == -2:
-				convertor = imageop.dither2grey2
-		fieldsize = x*y/2
-		nskipped = 0
-		realframeno = 0
-		tpf = 1000 / 50.0     #XXXX
-		# Trying to find the pattern in frame skipping
-		okstretch = 0
-		skipstretch = 0
-		for frameno in range(0, number*2):
-			if frameno <> 0 and \
-				  bitvec[frameno] == bitvec[frameno-1]:
-				nskipped = nskipped + 1
-				if okstretch:
-					print okstretch, 'ok',
-					okstretch = 0
-				skipstretch = skipstretch + 1
-				continue
-			if skipstretch:
-				print skipstretch, 'skipped'
-				skipstretch = 0
-			okstretch = okstretch + 1
-			#
-			# Save field.
-			# XXXX Works only for fields and top-to-bottom
-			#
-			start = frameno*fieldsize
-			field = data[start:start+fieldsize]
-			if convertor:
-				field = convertor(field, len(field), 1)
-			elif mono and monotreshold >= 0:
-				field = imageop.grey2mono( \
-					  field, len(field), 1, monotreshold)
-			elif mono:
-				field = imageop.dither2mono( \
-					  field, len(field), 1)
-			realframeno = realframeno + 1
-			vout.writeframe(int(realframeno*tpf), field, None)
-		print okstretch, 'ok',
-		print skipstretch, 'skipped'
-		print 'Skipped', nskipped, 'duplicate frames'
-		vout.close()
-			
-	gl.wintitle('(done) ' + filename)
-# Initialize audio recording
-
-AQSIZE = 8*8000 # XXX should be a user option
-
-def initaudio(filename, stop, start, done):
-	import thread, aifc
-	afile = aifc.open(filename, 'w')
-	afile.setnchannels(AL.MONO)
-	afile.setsampwidth(AL.SAMPLE_8)
-	params = [AL.INPUT_RATE, 0]
-	al.getparams(AL.DEFAULT_DEVICE, params)
-	print 'audio sampling rate =', params[1]
-	afile.setframerate(params[1])
-	c = al.newconfig()
-	c.setchannels(AL.MONO)
-	c.setqueuesize(AQSIZE)
-	c.setwidth(AL.SAMPLE_8)
-	aport = al.openport(filename, 'r', c)
-	thread.start_new_thread(audiorecord, (afile, aport, stop, start, done))
-
-
-# Thread to record audio samples
-
-def audiorecord(afile, aport, stop, start, done):
-	start.release_lock()
-	leeway = 4
-	while leeway > 0:
-		if stop:
-			leeway = leeway - 1
-		data = aport.readsamps(AQSIZE/8)
-		afile.writesampsraw(data)
-		del data
-	afile.close()
-	print 'Done writing audio'
-	done.release_lock()
-
-
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/Vreceive.py b/Demo/sgi/video/Vreceive.py
deleted file mode 100755
index 84aa5a5..0000000
--- a/Demo/sgi/video/Vreceive.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#! /usr/bin/env python
-
-# Receive live video UDP packets.
-# Usage: Vreceive [port]
-
-import sys
-import struct
-from socket import *			# syscalls and support functions
-from SOCKET import *			# <sys/socket.h>
-from IN import *			# <netinet/in.h>
-import select
-import struct
-import gl, GL, DEVICE
-sys.path.append('/ufs/guido/src/video')
-import LiveVideoOut
-import regsub
-import getopt
-
-from senddefs import *
-
-
-# Print usage message and exit(2).
-
-def usage(msg):
-	print msg
-	print 'usage: Vreceive [-m mcastgrp] [-p port] [-c type]'
-	print '-m mcastgrp: multicast group (default ' + `DEFMCAST` + ')'
-	print '-p port    : port (default ' + `DEFPORT` + ')'
-	print '-c type    : signal type: rgb8, grey or mono (default rgb8)'
-	sys.exit(2)
-
-
-# Main program: parse options and main loop.
-
-def main():
-
-	sys.stdout = sys.stderr
-
-	group = DEFMCAST
-	port = DEFPORT
-	width = DEFWIDTH
-	height = DEFHEIGHT
-	vtype = 'rgb8'
-
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'm:p:c:')
-	except getopt.error, msg:
-		usage(msg)
-
-	try:
-		for opt, optarg in opts:
-			if opt == '-p':
-				port = string.atoi(optarg)
-			if opt == '-m':
-				group = gethostbyname(optarg)
-			if opt == '-c':
-				vtype = optarg
-	except string.atoi_error, msg:
-		usage('bad integer: ' + msg)
-
-	s = opensocket(group, port)
-
-	gl.foreground()
-	gl.prefsize(width, height)
-	wid = gl.winopen('Vreceive')
-	gl.winconstraints()
-	gl.qdevice(DEVICE.ESCKEY)
-	gl.qdevice(DEVICE.WINSHUT)
-	gl.qdevice(DEVICE.WINQUIT)
-
-	lvo = LiveVideoOut.LiveVideoOut(wid, width, height, vtype)
-
-	ifdlist = [gl.qgetfd(), s.fileno()]
-	ofdlist = []
-	xfdlist = []
-	timeout = 1.0
-	selectargs = (ifdlist, ofdlist, xfdlist, timeout)
-
-	while 1:
-
-		if gl.qtest():
-			dev, val = gl.qread()
-			if dev in (DEVICE.ESCKEY, \
-				DEVICE.WINSHUT, DEVICE.WINQUIT):
-				break
-			if dev == DEVICE.REDRAW:
-				lvo.reshapewindow()
-		elif s.avail():
-			data = s.recv(16*1024)
-			pos, w, h = struct.unpack('hhh', data[:6])
-			if (w, h) <> (width, height):
-				x, y =  gl.getorigin()
-				y = y + height - h
-				gl.winposition(x, x+w-1, y, y+h-1)
-				width, height = w, h
-				lvo.resizevideo(width, height)
-			lvo.putnextpacket(pos, data[6:])
-		else:
-			x = select.select(selectargs)
-
-	lvo.close()
-
-
-# Subroutine to create and properly initialize the receiving socket
-
-def opensocket(group, port):
-
-	# Create the socket
-	s = socket(AF_INET, SOCK_DGRAM)
-
-	# Allow multiple copies of this program on one machine
-	s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
-
-	# Bind the port to it
-	s.bind('', port)
-
-	# Look up the group once
-	group = gethostbyname(group)
-
-	# Construct binary group address
-	group_bytes = eval(regsub.gsub('\.', ',', group))
-	grpaddr = 0
-	for byte in group_bytes: grpaddr = (grpaddr << 8) | byte
-
-	# Construct struct mreq from grpaddr and ifaddr
-	ifaddr = INADDR_ANY
-	mreq = struct.pack('ll', grpaddr, ifaddr)
-
-	# Add group membership
-	s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
-
-	return s
-
-
-main()
diff --git a/Demo/sgi/video/Vsend.py b/Demo/sgi/video/Vsend.py
deleted file mode 100755
index 4c47861..0000000
--- a/Demo/sgi/video/Vsend.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#! /usr/bin/env 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
-from socket import *
-from SOCKET import *
-import gl, GL, DEVICE
-sys.path.append('/ufs/guido/src/video')
-import LiveVideoIn
-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 '-w width  : window width (default ' + `DEFWIDTH` + ')'
-	print '-c type   : Type: rgb8, mono or grey (default rgb8)'
-	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 = 'rgb8'
-
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'bh:p:s:t:w:c:')
-	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)
-			if opt == '-w':
-				width = string.atoi(optarg)
-			if opt == '-h':
-				height = string.atoi(optarg)
-			if opt == '-c':
-				vtype = 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))
-
-	if not LiveVideoIn.have_video:
-		print 'Sorry, no video available (use python-405)'
-		sys.exit(1)
-
-	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 = LiveVideoIn.LiveVideoIn(pktmax, width, height, vtype)
-
-	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
-
-	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
-
-		if not frozen:
-			lvo.putnextpacket(pos, data)
-
-		hdr = struct.pack('hhh', pos, width, height)
-		for host in hosts:
-			try:
-				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]
-
-	lvi.close()
-	lvo.close()
-
-
-main()
diff --git a/Demo/sgi/video/Vstat.py b/Demo/sgi/video/Vstat.py
deleted file mode 100755
index a29b1ff..0000000
--- a/Demo/sgi/video/Vstat.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /usr/bin/env python
-
-# Print the value of all video parameters
-
-import sys
-import sv, SV
-
-def main():
-	v = sv.OpenVideo()
-	for name in dir(SV):
-		const = getattr(SV, name)
-		if type(const) is type(0):
-			sys.stdout.flush()
-			params = [const, 0]
-			try:
-				v.GetParam(params)
-			except sv.error, msg:
-##				print name, msg
-				continue
-			print name, params
-
-main()
-
diff --git a/Demo/sgi/video/Vtime.py b/Demo/sgi/video/Vtime.py
deleted file mode 100755
index 651deee..0000000
--- a/Demo/sgi/video/Vtime.py
+++ /dev/null
@@ -1,117 +0,0 @@
-#! /usr/bin/env python
-
-# Manipulate the time base of CMIF movies
-
-
-# Possibilities:
-#
-# - resample at a fixed rate
-# - divide the time codes by a speed factor (to make it go faster/slower)
-# - drop frames that are less than n msec apart (to accommodate slow players)
-
-
-# Usage:
-#
-# Vtime [-m msec] [-r msec] [-s speed] [infile [outfile]]
-
-
-# Options:
-#
-# -m n       : drop frames closer than n msec (default 0)
-# -r n       : regenerate input time base n msec apart
-# -s speed   : speed change factor after other processing (default 1.0)
-# infile     : input file (default film.video)
-# outfile    : output file (default out.video)
-
-
-import sys
-sys.path.append('/ufs/guido/src/video')
-import VFile
-import getopt
-import string
-
-
-# Global options
-
-speed = 1.0
-mindelta = 0
-regen = None
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	global speed, mindelta
-	opts, args = getopt.getopt(sys.argv[1:], 'm:r:s:')
-	for opt, arg in opts:
-		if opt == '-m':
-			mindelta = string.atoi(arg)
-		elif opt == '-r':
-			regen = string.atoi(arg)
-		elif opt == '-s':
-			speed = float(eval(arg))
-	if len(args) < 1:
-		args.append('film.video')
-	if len(args) < 2:
-		args.append('out.video')
-	if len(args) > 2:
-		sys.stderr.write('usage: Vtime [options] [infile [outfile]]\n')
-		sys.exit(2)
-	sts = process(args[0], args[1])
-	sys.exit(sts)
-
-
-# Copy one file to another
-
-def process(infilename, outfilename):
-	try:
-		vin = VFile.BasicVinFile(infilename)
-	except IOError, msg:
-		sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(infilename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vout = VFile.BasicVoutFile(outfilename)
-	except IOError, msg:
-		sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-
-	vout.setinfo(vin.getinfo())
-	vout.writeheader()
-	
-	told = 0
-	nin = 0
-	nout = 0
-	tin = 0
-	tout = 0
-
-	while 1:
-		try:
-			tin, data, cdata = vin.getnextframe()
-		except EOFError:
-			break
-		nin = nin + 1
-		if regen:
-			tout = nin * regen
-		else:
-			tout = tin
-		tout = int(tout / speed)
-		if tout - told < mindelta:
-			continue
-		told = tout
-		vout.writeframe(tout, data, cdata)
-		nout = nout + 1
-
-	vout.close()
-	vin.close()
-
-
-# Don't forget to call the main program
-
-main()
diff --git a/Demo/sgi/video/Vunjpeg.py b/Demo/sgi/video/Vunjpeg.py
deleted file mode 100755
index 3321d23..0000000
--- a/Demo/sgi/video/Vunjpeg.py
+++ /dev/null
@@ -1,97 +0,0 @@
-#! /usr/bin/env python
-
-# Decompress a jpeg or jpeggrey video file to rgb format
-
-
-# Usage:
-#
-# Vunjpeg [infile [outfile]]
-
-
-# Options:
-#
-# infile     : input file (default film.video)
-# outfile    : output file (default out.video)
-
-
-import sys
-import jpeg
-sys.path.append('/ufs/guido/src/video')
-import VFile
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	args = sys.argv[1:]
-	if len(args) < 1:
-		args.append('film.video')
-	if len(args) < 2:
-		args.append('out.video')
-	if len(args) > 2:
-		sys.stderr.write('usage: Vunjpeg [infile [outfile]]\n')
-		sys.exit(2)
-	sts = process(args[0], args[1])
-	sys.exit(sts)
-
-
-# Copy one file to another
-
-def process(infilename, outfilename):
-	try:
-		vin = VFile.BasicVinFile(infilename)
-	except IOError, msg:
-		sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(infilename + ': EOF in video file\n')
-		return 1
-
-	try:
-		vout = VFile.BasicVoutFile(outfilename)
-	except IOError, msg:
-		sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n')
-		return 1
-
-	info = vin.getinfo()
-	if info[0] == 'jpeg':
-		format = 'rgb'
-		width, height = vin.getsize()
-		bytes = 4
-	elif info[0] == 'jpeggrey':
-		format = 'grey'
-		width, height = vin.getsize()
-		pf = vin.packfactor
-		width, height = width/pf, height/pf
-		bytes = 1
-	else:
-		sys.stderr.write('Vunjpeg: input not in jpeg[grey] format\n')
-		return 1
-	info = (format,) + info[1:]
-	vout.setinfo(info)
-	vout.writeheader()
-	sts = 0
-	n = 0
-	try:
-		while 1:
-			t, data, cdata = vin.getnextframe()
-			n = n + 1
-			sys.stderr.write('Frame ' + `n` + '...')
-			data, w, h, b = jpeg.decompress(data)
-			if (w, h, b) <> (width, height, bytes):
-				sys.stderr.write('jpeg data has wrong size\n')
-				sts = 1
-			else:
-				vout.writeframe(t, data, None)
-				sys.stderr.write('\n')
-	except EOFError:
-		pass
-	return sts
-
-
-# Don't forget to call the main program
-
-main()
diff --git a/Demo/sgi/video/aplay.py b/Demo/sgi/video/aplay.py
deleted file mode 100755
index a11f95a..0000000
--- a/Demo/sgi/video/aplay.py
+++ /dev/null
@@ -1,167 +0,0 @@
-#! /usr/bin/env python
-
-# Play synchronous video and audio.
-# Highly experimental!
-
-import sys
-import getopt
-import string
-import os
-
-import VFile
-import aifc
-
-import gl, GL, DEVICE
-import al, AL
-
-
-def usage():
-	sys.stderr.write( \
-		'usage: aplay [-o offset] [-q qsize] videofile audiofile\n')
-	sys.exit(2)
-
-def main():
-	offset = 0
-	qsize = 0 # This defaults to 1/10 second of sound
-	videofile = 'film.video'
-	audiofile = 'film.aiff'
-
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'o:q:')
-	except getopt.error, msg:
-		sys.stderr.write(msg + '\n')
-		usage()
-
-	try:
-		for o, a in opts:
-			if o == '-o':
-				offset = string.atoi(a)
-			if o == '-q':
-				qsize = string.atoi(a)
-	except string.atoi_error:
-		sys.stderr.write(o + ' arg must be integer\n')
-		usage()
-
-	if len(args) > 2:
-		usage()
-
-	if args: videofile = args[0]
-	if args[1:]: audiofile = args[1]
-
-	if not os.path.exists(videofile) and \
-		os.path.exists(videofile + '.video'):
-		if not args[1:] and os.path.exists(videofile + '.aiff'):
-			audiofile = videofile + '.aiff'
-		videofile = videofile + '.video'
-
-	print 'Opening video input file..'
-	vin = VFile.VinFile(videofile)
-
-	print 'Opening audio input file..'
-	ain = aifc.open(audiofile, 'r')
-	print 'rate    :', ain.getframerate()
-	print 'channels:', ain.getnchannels()
-	print 'frames  :', ain.getnframes()
-	print 'width   :', ain.getsampwidth()
-	print 'kbytes  :', \
-		  ain.getnframes() * ain.getnchannels() * ain.getsampwidth()
-
-	print 'Opening audio output port..'
-	c = al.newconfig()
-	c.setchannels(ain.getnchannels())
-	c.setwidth(ain.getsampwidth())
-	nullsample = '\0' * ain.getsampwidth()
-	samples_per_second = ain.getnchannels() * ain.getframerate()
-	if qsize <= 0: qsize = samples_per_second / 10
-	qsize = max(qsize, 512)
-	c.setqueuesize(qsize)
-	saveparams = [AL.OUTPUT_RATE, 0]
-	al.getparams(AL.DEFAULT_DEVICE, saveparams)
-	newparams = [AL.OUTPUT_RATE, ain.getframerate()]
-	al.setparams(AL.DEFAULT_DEVICE, newparams)
-	aport = al.openport(audiofile, 'w', c)
-
-	print 'Opening video output window..'
-	gl.foreground()
-	gl.prefsize(vin.width, vin.height)
-	wid = gl.winopen(videofile + ' + ' + audiofile)
-	gl.clear()
-	vin.initcolormap()
-
-	print 'Playing..'
-	gl.qdevice(DEVICE.ESCKEY)
-	gl.qdevice(DEVICE.LEFTARROWKEY)
-	gl.qdevice(DEVICE.RIGHTARROWKEY)
-##	gl.qdevice(DEVICE.UPARROWKEY)
-##	gl.qdevice(DEVICE.DOWNARROWKEY)
-	gl.qdevice(DEVICE.SPACEKEY)
-
-	while 1:
-		samples_written = 0
-		samples_read = 0
-		lastt = 0
-		pause = 0
-		while 1:
-			if gl.qtest():
-				dev, val = gl.qread()
-				if val == 1:
-					if dev == DEVICE.ESCKEY:
-						sys.exit(0)
-					elif dev == DEVICE.LEFTARROWKEY:
-						offset = offset - 100
-						print 'offset =', offset
-					elif dev == DEVICE.RIGHTARROWKEY:
-						offset = offset + 100
-						print 'offset =', offset
-					elif dev == DEVICE.SPACEKEY:
-						pause = (not pause)
-
-			if pause:
-				continue
-
-			try:
-				t, data, cdata = vin.getnextframe()
-			except EOFError:
-				break
-			t = int(t)
-			dt = t - lastt
-			lastt = t
-			target = samples_per_second * t / 1000
-			n = target - samples_written + qsize - offset
-			if n > 0:
-				# This call will block until the time is right:
-				try:
-					samples = ain.readframes(n)
-				except EOFError:
-					samples = ''
-				k = len(samples) / len(nullsample)
-				samples_read = samples_read + k
-				if k < n:
-					samples = samples + (n-k) * nullsample
-				aport.writesamps(samples)
-				samples_written = samples_written + n
-			vin.showframe(data, cdata)
-
-		while 1:
-			try:
-				samples = ain.readframes(qsize)
-			except EOFError:
-				break
-			if not samples:
-				break
-			aport.writesamps(samples)
-			k = len(samples) / len(nullsample)
-			samples_read = samples_read + k
-			samples_written = samples_written + k
-
-		print samples_read, 'samples ==',
-		print samples_read * 1.0 / samples_per_second, 'sec.'
-		print lastt, 'milliseconds'
-
-		print 'Restarting..'
-		ain.close()
-		ain = aifc.open(audiofile, 'r')
-		vin.rewind()
-
-
-main()
diff --git a/Demo/sgi/video/cmif-film.ms b/Demo/sgi/video/cmif-film.ms
deleted file mode 100755
index aa114d9..0000000
--- a/Demo/sgi/video/cmif-film.ms
+++ /dev/null
@@ -1,200 +0,0 @@
-.de PP
-.LP
-..
-.de pT
-.IP \fB\\$1\fP
-..
-.TL
-CMIF video file format
-.AU
-Jack Jansen
-(Version of 27-Feb-92)
-.SH
-Introduction
-.PP
-The CMIF video format was invented to allow various applications
-to exchange video data. The format consists of
-a header containing global information (like data format)
-followed by a sequence of frames, each consisting of a header
-followed by the actual frame data.
-All information except pixel data is
-encoded in ASCII. Pixel data is \fIalways\fP encoded in Silicon Graphics
-order, which means that the first pixel in the frame is the lower left
-pixel on the screen.
-.PP
-All ASCII data except the first line of the file
-is in python format. This means that
-outer parentheses can be ommitted, and parentheses around a tuple with
-one element can also be omitted. So, the lines
-.IP
-.ft C
-.nf
-('grey',(4))
-('grey',4)
-'grey',4
-.LP
-have the same meaning. 
-To ease parsing in C programs, however, it is advised that there are
-no parenteses around single items, and that there are parentheses around
-lists. So, the second format above is preferred.
-.PP
-The current version is version 3, but this document will also explain
-shortly what the previous formats looked like.
-.SH
-Header.
-.PP
-The header consists of three lines. The first line identifies the file
-as a CMIF video file, and gives the version number.
-It looks as follows:
-.IP
-.ft C
-CMIF video 3.0
-.LP
-All programs expect the layout to be exactly like this, so no
-extra spaces, etc. should be added.
-.PP
-The second line specifies the data format. Its format is a python
-tuple with two members. The first member is a string giving the format
-type and the second is a tuple containing type-specific information.
-The following formats are currently understood:
-.pT rgb
-The video data is 24 bit RGB packed into 32 bit words. 
-R is the least significant byte, then G and then B. The top byte is
-unused.
-.IP
-There is no type-specific information, so the complete data format
-line is
-.IP
-.ft C
-('rgb',())
-.pT grey
-The video data is greyscale, at most 8 bits. Data is packed into
-8 bit bytes (in the low-order bits). The extra information is the
-number of significant bits, so an example data format line is
-.IP
-.ft C
-('grey',(6))
-.pT yiq
-The video data is in YIQ format. This is a format that has one luminance
-component, Y, and two chrominance components, I and Q. The luminance and
-chrominance components are encoded in \fItwo\fP pixel arrays: first an
-array of 8-bit luminance values followed by a array of 16 bit chrominance
-values. See the section on chrominance coding for details.
-.IP
-The type specific part contains the number of bits for Y, I and Q,
-the chrominance packfactor and the colormap offset. So, a sample format
-information line of
-.IP
-.ft C
-('yiq',(5,3,3,2,1024))
-.IP
-means that the pictures have 5 bit Y values (in the luminance array),
-3 bits of I and Q each (in the chrominance array), chrominance data
-is packed for 2x2 pixels, and the first colormap index used is 1024.
-.pT hls
-The video data is in HLS format. L is the luminance component, H and S
-are the chrominance components. The data format and type specific information
-are the same as for the yiq format.
-.pT hsv
-The video data is in HSV format. V is the luminance component, H and S
-are the chrominance components. Again, data format and type specific
-information are the same as for the yiq format.
-.pT rgb8
-The video data is in 8 bit dithered rgb format. This is the format
-used internally by the Indigo. bit 0-2 are green, bit 3-4 are blue and
-bit 5-7 are red. Because rgb8 is treated more-or-less like yiq format
-internally the type-specific information is the same, with zeroes for
-the (unused) chrominance sizes:
-.IP
-.ft C
-('rgb8',(8,0,0,0,0))
-.PP
-The third header line contains width and height of the video image,
-in pixels, and the pack factor of the picture. For compatability, RGB
-images must have a pack factor of 0 (zero), and non-RGB images must
-have a pack factor of at least 1.
-The packfactor is the amount of compression done on the original video
-signal to obtain pictures. In other words, if only one out of three pixels
-and lines is stored (so every 9 original pixels have one pixel in the
-data) the packfactor is three. Width and height are the size of the
-\fIoriginal\fP picture.
-Viewers are expected to enlarge the picture so it is shown in the
-original size. RGB videos cannot be packed.
-So, a size line like
-.IP
-.ft C
-200,200,2
-.LP
-means that this was a 200x200 picture that is stored as 100x100 pixels.
-.SH
-Frame header
-.PP
-Each frame is preceded by a single header line. This line contains timing information
-and optional size information. The time information is mandatory, and
-contains the time this frame should be displayed, in milliseconds since
-the start of the film. Frames should be stored in chronological order.
-.PP
-An optional second number is interpreted as the size of the luminance
-data in bytes. Currently this number, if present, should always be the
-same as \fCwidth*height/(packfactor*packfactor)\fP (times 4 for RGB
-data), but this might change if we come up with variable-length encoding
-for frame data.
-.PP
-An optional third number is the size of the chrominance data
-in bytes. If present, the number should be equal to
-.ft C
-luminance_size2*/(chrompack*chrompack).
-.SH
-Frame data
-.PP
-For RGB films, the frame data is an array of 32 bit pixels containing
-RGB data in the lower 24 bits. For greyscale films, the frame data
-is an array of 8 bit pixels. For split luminance/chrominance films the
-data consists of two parts: first an array of 8 bit luminance values
-followed by an  array of 16 bit chrominance values.
-.PP
-For all data formats, the data is stored left-to-right, bottom-to-top.
-.SH
-Chrominance coding
-.PP
-Since the human eye is apparently more sensitive to luminance changes
-than to chrominance changes we support a coding where we split the luminance
-and chrominance components of the video image. The main point of this
-is that it allows us to transmit chrominance data in a coarser granularity
-than luminance data, for instance one chrominance pixel for every
-2x2 luminance pixels. According to the theory this should result in an
-acceptable picture while reducing the data by a fair amount.
-.PP
-The coding of split chrominance/luminance data is a bit tricky, to
-make maximum use of the graphics hardware on the Personal Iris. Therefore,
-there are the following constraints on the number of bits used:
-.IP -
-No more than 8 luminance bits,
-.IP -
-No more than 11 bits total,
-.IP -
-The luminance bits are in the low-end of the data word, and are stored
-as 8 bit bytes,
-.IP -
-The two sets of chrominance bits are stored in 16 bit words, correctly
-aligned,
-.IP -
-The color map offset is added to the chrominance data. The offset should
-be at most 4096-256-2**(total number of bits). To reduce interference with
-other applications the offset should be at least 1024.
-.LP
-So, as an example, an HLS video with 5 bits L, 4 bits H, 2 bits S and an
-offset of 1024 will look as follows in-core and in-file:
-.IP
-.nf
-.ft C
-	  31         15    11 10 9 8  5 4   0
-         +-----------------------------------+
-incore   +               0+ 1+  S +  H +   L +
-         +-----------------------------------+
-                                  +----------+
-L-array                           +  0 +   L +
-                                  +----------+
-                     +-----------------------+
-C-array              +   0+ 1+  S +  H +   0 +
-                     +-----------------------+
diff --git a/Demo/sgi/video/imgconv.py b/Demo/sgi/video/imgconv.py
deleted file mode 100755
index 8fc98b4..0000000
--- a/Demo/sgi/video/imgconv.py
+++ /dev/null
@@ -1,139 +0,0 @@
-import imageop
-
-error = 'imgconv.error'
-
-LOSSY = 1
-NOT_LOSSY = 0
-
-def null(img, x, y):
-	return img
-	
-def mono2grey(img, x, y):
-	return imageop.mono2grey(img, x, y, 0, 255)
-
-def grey2jpeggrey(img, x, y):
-	import jpeg
-	return jpeg.compress(img, x, y, 1)
-
-def rgb2jpeg(img, x, y):
-	import jpeg
-	return jpeg.compress(img, x, y, 4)
-
-def jpeggrey2grey(img, width, height):
-	import jpeg
-	data, width, height, bytesperpixel = jpeg.decompress(img)
-	if bytesperpixel <> 1: raise RuntimeError, 'not greyscale jpeg'
-	return data
-
-def jpeg2rgb(img, width, height):
-	import jpeg
-	data, width, height, bytesperpixel = jpeg.decompress(img)
-	if bytesperpixel <> 4: raise RuntimeError, 'not rgb jpeg'
-	return data
-
-converters = [ \
-	  ('grey',  'grey4', imageop.grey2grey4,   LOSSY), \
-	  ('grey',  'grey2', imageop.dither2grey2, LOSSY), \
-	  ('grey',  'mono',  imageop.dither2mono,  LOSSY), \
-	  ('mono',  'grey',  mono2grey,            NOT_LOSSY), \
-	  ('grey2', 'grey',  imageop.grey22grey,   NOT_LOSSY), \
-	  ('grey4', 'grey',  imageop.grey42grey,   NOT_LOSSY), \
-	  ('rgb',   'rgb8',  imageop.rgb2rgb8,     LOSSY), \
-	  ('rgb8',  'rgb',   imageop.rgb82rgb,     NOT_LOSSY), \
-	  ('rgb',   'grey',  imageop.rgb2grey,     LOSSY), \
-	  ('grey',  'rgb',   imageop.grey2rgb,     NOT_LOSSY), \
-	  ('jpeggrey','grey',jpeggrey2grey,        NOT_LOSSY), \
-	  ('grey',  'jpeggrey',grey2jpeggrey,      LOSSY), \
-	  ('jpeg',  'rgb',   jpeg2rgb,             NOT_LOSSY), \
-	  ('rgb',   'jpeg',  rgb2jpeg,             LOSSY), \
-]
-
-built = {}
-
-def addconverter(fcs, tcs, lossy, func):
-	for i in range(len(converters)):
-		ifcs, itcs, irtn, ilossy = converters[i]
-		if (fcs, tcs) == (ifcs, itcs):
-			converters[i] = (fcs, tcs, func, lossy)
-			return
-	converters.append((fcs,tcs,lossy,func))
-
-def getconverter(fcs, tcs):
-	#
-	# If formats are the same return the dummy converter
-	#
-	if fcs == tcs: return null
-	#
-	# Otherwise, if we have a converter return that one
-	#
-	for ifcs, itcs, irtn, ilossy in converters:
-		if (fcs, tcs) == (ifcs, itcs):
-			return irtn
-	#
-	# Finally, we try to create a converter
-	#
-	if not built.has_key(fcs):
-		built[fcs] = enumerate_converters(fcs)
-	if not built[fcs].has_key(tcs):
-		raise error, 'Sorry, conversion from '+fcs+' to '+tcs+ \
-			  ' is not implemented'
-	if len(built[fcs][tcs]) == 3:
-		#
-		# Converter not instantiated yet
-		#
-		built[fcs][tcs].append(instantiate_converter(built[fcs][tcs]))
-	cf = built[fcs][tcs][3]
-	return cf
-
-def enumerate_converters(fcs):
-	cvs = {}
-	formats = [fcs]
-	steps = 0
-	while 1:
-		workdone = 0
-		for ifcs, itcs, irtn, ilossy in converters:
-			if ifcs == fcs:
-				template = [ilossy, 1, [irtn]]
-			elif cvs.has_key(ifcs):
-				template = cvs[ifcs][:]
-				template[2] = template[2][:]
-				if ilossy:
-					template[0] = ilossy
-				template[1] = template[1] + 1
-				template[2].append(irtn)
-			else:
-				continue
-			if not cvs.has_key(itcs):
-				cvs[itcs] = template
-				workdone = 1
-			else:
-				previous = cvs[itcs]
-				if template < previous:
-					cvs[itcs] = template
-					workdone = 1
-		if not workdone:
-			break
-		steps = steps + 1
-		if steps > len(converters):
-			print '------------------loop in emunerate_converters--------'
-			print 'CONVERTERS:'
-			print converters
-			print 'RESULTS:'
-			print cvs
-			raise error, 'Internal error - loop'
-	return cvs
-
-def instantiate_converter(args):
-	list = args[2]
-	cl = RtConverters(list)
-	args.append(cl.convert)
-	return args
-
-class RtConverters:
-	def __init__(self, list):
-		self.list = list
-
-	def convert(self, img, w, h):
-		for cv in self.list:
-			img = cv(img, w, h)
-		return img
diff --git a/Demo/sgi/video/rgb2video.py b/Demo/sgi/video/rgb2video.py
deleted file mode 100755
index b6c34eb..0000000
--- a/Demo/sgi/video/rgb2video.py
+++ /dev/null
@@ -1,79 +0,0 @@
-import sys
-import VFile
-import getopt
-import imgfile
-import string
-import imgconv
-
-def main():
-	format = None
-	interval = 40
-	outfile = 'film.video'
-
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'f:i:o:')
-	except getopt.error:
-		usage()
-		sys.exit(1)
-	for opt, arg in opts:
-		if opt == '-f':
-			format = arg
-		elif opt == '-i':
-			interval = string.atoi(arg)
-		elif opt == '-o':
-			outfile = arg
-		else:
-			usage()
-			sys.exit(1)
-	if not args:
-		usage()
-		sys.exit(1)
-	
-	xsize, ysize, zsize = imgfile.getsizes(args[0])
-	nxsize = xsize
-	
-	if zsize == 3:
-		oformat = 'rgb'
-	elif zsize == 1:
-		oformat = 'grey'
-		if xsize % 4:
-			addbytes = 4-(xsize%4)
-			nxsize = xsize + addbytes
-			print 'rgb2video: add',addbytes,'pixels per line'
-	else:
-		print 'rgb2video: incorrect number of planes:',zsize
-		sys.exit(1)
-
-	if format == None:
-		format = oformat
-	cfunc = imgconv.getconverter(oformat, format)
-
-	vout = VFile.VoutFile(outfile)
-	vout.format = format
-	vout.width = nxsize
-	vout.height = ysize
-	vout.writeheader()
-	t = 0
-	sys.stderr.write('Processing ')
-	for img in args:
-		sys.stderr.write(img + ' ')
-		if imgfile.getsizes(img) <> (xsize, ysize, zsize):
-			print 'rgb2video: Image is different size:', img
-			sys.exit(1)
-		data = imgfile.read(img)
-		if xsize <> nxsize:
-			ndata = ''
-			for i in range(0,len(data), xsize):
-				curline = data[i:i+xsize]
-				ndata = ndata + curline + ('\0'*(nxsize-xsize))
-			data = ndata
-		vout.writeframe(t, cfunc(data, nxsize, ysize), None)
-		t = t + interval
-	sys.stderr.write('\n')
-	vout.close()
-
-def usage():
-	print 'Usage: rgb2video [-o output] [-i frameinterval] [-f format] rgbfile ...'
-	
-main()
-		
diff --git a/Demo/sgi/video/senddefs.py b/Demo/sgi/video/senddefs.py
deleted file mode 100755
index c3ce2cd..0000000
--- a/Demo/sgi/video/senddefs.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Defaults shared by Vsend and Vreceice
-
-DEFMCAST = '225.0.0.250'
-DEFPORT = 5555
-
-PKTMAX_UCAST = 16*1024 - 6
-PKTMAX_BCAST = 1450
-DEFPKTMAX = PKTMAX_BCAST
-
-DEFWIDTH = 400
-DEFHEIGHT = 300
diff --git a/Demo/sgi/video/svgrab24.c b/Demo/sgi/video/svgrab24.c
deleted file mode 100755
index 3418b14..0000000
--- a/Demo/sgi/video/svgrab24.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * svgrab24 - Grab the current video input image into an rgb file.
- *
- * Jack Jansen, CWI, May 93.
- *
- * Adapted from grabone.c
- */
-
-#ident "$Revision$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <svideo.h>
-#include <gl/gl.h>
-#include <gl/device.h>
-#include <getopt.h>
-#include <image.h>
-
-main(int argc, char *argv[])
-{
-    SVhandle V;
-    svCaptureInfo ci;
-    boolean debug;
-    int ch, errflg;
-    int bufferSize;
-    long *buffer;
-    IMAGE *imgfile;
-    short *r, *g, *b;
-    int x, y;
-    char *ProgName = argv[0];
-
-    debug = FALSE;
-    ci.format = SV_RGB32_FRAMES;
-    ci.width = 0;
-    ci.height = 0;
-    ci.size = 1;
-
-    argv++; argc--;
-    if ( argc > 2 && strcmp(argv[0], "-w") == 0) {
-	ci.width = atoi(argv[1]);
-	argc -= 2;
-	argv += 2;
-    }
-    if ( argc != 1 ) {
-	fprintf(stderr, "Usage: %s [-w width] rgbfilename\n", ProgName);
-	exit(1);
-    }
-
-    /* Open video device */
-    if ((V = svOpenVideo()) == NULL) {
-	svPerror("open");
-	exit(1);
-    }
-
-    if (svQueryCaptureBufferSize(V, &ci, &bufferSize) < 0) {
-        svPerror("svQueryCaptureBufferSize");
-        exit(1);
-    }
-    buffer = malloc(bufferSize);
-
-    if (svCaptureOneFrame(V, ci.format, &ci.width, &ci.height, buffer) < 0) {
-        svPerror("svCaptureOneFrame");
-        exit(1);
-    }
-    if (debug) {
-        printf("captured size: %d by %d\n", ci.width, ci.height);
-    }
-
-    if ( (imgfile=iopen(argv[0], "w", RLE(1), 3, ci.width, ci.height, 3)) == 0) {
-	perror(argv[1]);
-	exit(1);
-    }
-    r = (short *)malloc(ci.width*sizeof(short));
-    g = (short *)malloc(ci.width*sizeof(short));
-    b = (short *)malloc(ci.width*sizeof(short));
-    if ( !r || !g || !b ) {
-	fprintf(stderr, "%s: malloc failed\n", ProgName);
-	exit(1);
-    }
-    for(y=0; y<ci.height; y++) {
-	for(x=0; x<ci.width; x++) {
-	    unsigned long data = *buffer++;
-
-	    r[x] = data & 0xff;
-	    g[x] = (data>>8) & 0xff;
-	    b[x] = (data>>16) & 0xff;
-	}
-	if ( putrow(imgfile, r, y, 0) == 0 ||
-	     putrow(imgfile, g, y, 1) == 0 ||
-	     putrow(imgfile, b, y, 2) == 0) {
-	       fprintf(stderr, "%s: putrow failed\n", ProgName);
-	       exit(1);
-	}
-    }
-    iclose(imgfile);
-    exit(0);
-}
diff --git a/Demo/sgi/video/vcopy.py b/Demo/sgi/video/vcopy.py
deleted file mode 100755
index d32bc1f..0000000
--- a/Demo/sgi/video/vcopy.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copy a video file, interactively, frame-by-frame.
-
-import sys
-import getopt
-from gl import *
-from DEVICE import *
-import VFile
-import string
-import imageop
-
-def report(time, iframe):
-	print 'Frame', iframe, ': t =', time
-
-def usage():
-	sys.stderr.write('usage: vcopy [-t type] [-m treshold] [-a] infile outfile\n')
-	sys.stderr.write('-t Convert to other type\n')
-	sys.stderr.write('-a Automatic\n')
-	sys.stderr.write('-m Convert grey to mono with treshold\n')
-	sys.stderr.write('-d Convert grey to mono with dithering\n')
-	sys.exit(2)
-
-def help():
-	print 'Command summary:'
-	print 'n   get next image from input'
-	print 'w   write current image to output'
-
-def main():
-	foreground()
-	opts, args = getopt.getopt(sys.argv[1:], 't:am:d')
-	if len(args) <> 2:
-		usage()
-	[ifile, ofile] = args
-	print 'open film ', ifile
-	ifilm = VFile.VinFile().init(ifile)
-	print 'open output ', ofile
-	ofilm = VFile.VoutFile().init(ofile)
-	
-	ofilm.setinfo(ifilm.getinfo())
-
-	use_grabber = 0
-	continuous = 0
-	tomono = 0
-	tomonodither = 0
-	for o, a in opts:
-		if o == '-t':
-			ofilm.format = a
-			use_grabber = 1
-		if o == '-a':
-			continuous = 1
-		if o == '-m':
-			if ifilm.format <> 'grey':
-				print '-m only supported for greyscale'
-				sys.exit(1)
-			tomono = 1
-			treshold = string.atoi(a)
-			ofilm.format = 'mono'
-		if o == '-d':
-			if ifilm.format <> 'grey':
-				print '-m only supported for greyscale'
-				sys.exit(1)
-			tomonodither = 1
-			ofilm.format = 'mono'
-			
-	ofilm.writeheader()
-	#
-	prefsize(ifilm.width, ifilm.height)
-	w = winopen(ifile)
-	qdevice(KEYBD)
-	qdevice(ESCKEY)
-	qdevice(WINQUIT)
-	qdevice(WINSHUT)
-	print 'qdevice calls done'
-	#
-	help()
-	#
-	time, data, cdata = ifilm.getnextframe()
-	ifilm.showframe(data, cdata)
-	iframe = 1
-	report(time, iframe)
-	#
-	while 1:
-		if continuous:
-			dev = KEYBD
-		else:
-			dev, val = qread()
-		if dev in (ESCKEY, WINQUIT, WINSHUT):
-			break
-		if dev == REDRAW:
-			reshapeviewport()
-		elif dev == KEYBD:
-			if continuous:
-				c = '0'
-			else:
-				c = chr(val)
-			#XXX Debug
-			if c == 'R':
-				c3i(255,0,0)
-				clear()
-			if c == 'G':
-				c3i(0,255,0)
-				clear()
-			if c == 'B':
-				c3i(0,0,255)
-				clear()
-			if c == 'w' or continuous:
-				if use_grabber:
-					data, cdata = ofilm.grabframe()
-				if tomono:
-					data = imageop.grey2mono(data, \
-						  ifilm.width, ifilm.height, \
-						  treshold)
-				if tomonodither:
-					data = imageop.dither2mono(data, \
-						  ifilm.width, ifilm.height)
-				ofilm.writeframe(time, data, cdata)
-				print 'Frame', iframe, 'written.'
-			if c == 'n' or continuous:
-				try:
-					time,data,cdata = ifilm.getnextframe()
-					ifilm.showframe(data, cdata)
-					iframe = iframe+1
-					report(time, iframe)
-				except EOFError:
-					print 'EOF'
-					if continuous:
-						break
-					ringbell()
-		elif dev == INPUTCHANGE:
-			pass
-		else:
-			print '(dev, val) =', (dev, val)
-	ofilm.close()
-
-main()
diff --git a/Demo/sgi/video/video.doc b/Demo/sgi/video/video.doc
deleted file mode 100755
index 982c008..0000000
--- a/Demo/sgi/video/video.doc
+++ /dev/null
@@ -1,109 +0,0 @@
-	CMIF video tools
-
-This document gives a quick introduction to some of the tools useful
-for recording, editing and playing back video data in CMIF video
-format. All the tools mentioned currently live in /ufs/guido/bin/sgi.
-A description of the CMIF video file format can be found in
-/ufs/jack/cmif-film.ms. 
-
-	Recording video
-
-There are two tools to record video, Vrec and and Vrecb. Vrec does
-continuous capture, but can capture at most 15 frames per second.
-Vrecb uses burst capture, enabling it to capture all frames. It
-captures to main memory, however, so it cannot handle long video
-fragments. The following options are common to both programs:
-
- -r rate	Capture one out of 'rate' frames. Default (and
-		minimum) is 1 for Vrecb, 2 for Vrec. There are some
-		caveats for recording PAL, see below.
- -w width	Set initial window width (and height, implicitly).
- -g bits	Create greyscale film in stead of 8-bit dithered color
-		film. Allowable values for 'bits' are 2, 4 or 8.
- -m		Create monochrome dithered film. These look horrible.
- -M threshold	Create monochrome thresholded film with specified
-		threshold (in range 0..255).
- -G		Create 2-bit dithered greyscale film.
- -f		Capture fields in stead of frames. The film is created
-		in such a way that the picture will be suitably
-		enlarged on playback, so aspect ratio, etc. are
-		maintained.
- -d		Drop fields if they would cause data from two video
-		fields to be combined. See the section on PAL for more
-		details. 
-
-Options for Vrec:
- -a		Record audio as well. You will have to twiddle audio
-		and video later if you want lipsync playback.
- -q queuesize	Set size of the video board circular buffer. A little
-		experimentation with this may lead to more video being
-		captured, but not always.
- -P frames	Preallocate diskspace for 'frames' images. This may
-		enable you to capture more frames.
-
-Options for Vrecb:
- -n number	Capture 'number' frames. Default is 60 (2 seconds).
-
-Both programs accept a filename to store the video on (default
-film.video) and Vrec also accepts an audio file name (default
-film.aiff). When you want to record you press the left mouse button.
-Vrec stops recording when you release the mouse button and Vrecb stops
-after the predetermined number of frames have been recorded. During
-recording the picture may look funny, but do not let this worry you,
-the film will be ok.
-
-After recording and saving, Vrec will print the deltas of the field
-numbers recorded. A list of '4 4 4 4'... means that all possible
-frames (one out of two) have been recorded. Vrecb will tell you how
-many duplicate fields have been skipped. See below on PAL useage
-again.
-
-	PAL caveats
-
-The IndigoVideo board converts the incoming video signal to the 60Hz
-(59.something, actually) display rate. All further operations,
-including capture, are done with respect to display rate. This is
-especially bothersome in the case of PAL video, since it means one out
-of 5 frames will be duplicated. Together with the fact that, in
-continuous capture, you can only capture every second frame this leads
-to strange and wondrous effects. The frame numbers returned by the
-video board (and displayed by Vrec) are display frame numbers, and so
-bear only a very complicated (and probably non-deterministic) relation
-to PAL frame numbers. For recording simple videos this is probably no
-problem. You can use Vrec and try using -d to see which gives the best
-result. On the other hand, if you need every frame and no duplicates
-either you have to use Vrecb and supply the -d and -f option. This
-will give you exactly the fields as they appeared on the PAL tape.
-
-	Video playback
-
-The easiest way to play back a video is to use Vplay. Calling it with
-an argument of -? will make it list all its options. A few options may
-need a bit of explanation:
- -M magnify	Magnify the images by the given factor. This still
-		takes any magnification specified in the film (if it
-		is a field film, for instance) in account.
- -w width and
- -h height	Normally the window will be the correct size for the
-		film. You can set height and width, though, if you
-		want the window to be bigger. This is especially
-		useful if you want to record the film back to
-		videotape, since you can playback in a window that is
-		bigger than PAL size with a black background and you
-		will have no distracting window-manager thingies on
-		your videotape.
-
-	Video Editing
-
-Vedit is a (very simple) video editor that allows you to select images
-from the input movie and copy them to an output movie. Both input and
-output films have a modest buffer that you can move around in.
-
-Vaddcache takes a movie and adds a frame location cache to it. This
-will make some other programs run faster.
-
-rgb2video converts a set of SGI .rgb files to a movie.
-
-There are a few programs that can do image format conversion on movies
-(i.e. convert an 8-bit dithered RGB movie to a greyscale movie), but
-nothing very complete yet. Look at Vcopy.py for more information.
diff --git a/Demo/sgi/video/video2rgb.py b/Demo/sgi/video/video2rgb.py
deleted file mode 100755
index bbfa6b8..0000000
--- a/Demo/sgi/video/video2rgb.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#! /usr/bin/env python
-
-# Convert CMIF movie file(s) to a sequence of rgb images
-
-
-# Help function
-
-def help():
-	print 'Usage: video2rgb [options] [file] ...'
-	print
-	print 'Options:'
-	print '-q         : quiet, no informative messages'
-	print '-m         : create monochrome (greyscale) image files'
-	print '-f prefix  : create image files with names "prefix0000.rgb"'
-	print 'file ...   : file(s) to convert; default film.video'
-
-
-# Imported modules
-
-import sys
-sys.path.append('/ufs/jack/src/av/video') # Increase chance of finding VFile
-import VFile
-import time
-import getopt
-import string
-import imgfile
-import imgconv
-
-
-# Global options
-
-quiet = 0
-prefix = 'film'
-seqno = 0
-mono = 0
-
-
-# Main program -- mostly command line parsing
-
-def main():
-	global quiet, prefix, mono
-
-	# Parse command line
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'qmf:')
-	except getopt.error, msg:
-		sys.stdout = sys.stderr
-		print 'Error:', msg, '\n'
-		help()
-		sys.exit(2)
-
-	# Interpret options
-	try:
-		for opt, arg in opts:
-			if opt == '-q': quiet = 1
-			if opt == '-f': prefix = arg
-			if opt == '-m': mono = 1
-	except string.atoi_error:
-		sys.stdout = sys.stderr
-		print 'Option', opt, 'requires integer argument'
-		sys.exit(2)
-
-	# Process all files
-	if not args: args = ['film.video']
-	sts = 0
-	for filename in args:
-		sts = (process(filename) or sts)
-
-	# Exit with proper exit status
-	sys.exit(sts)
-
-
-# Process one movie file
-
-def process(filename):
-	try:
-		vin = VFile.VinFile(filename)
-	except IOError, msg:
-		sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n')
-		return 1
-	except VFile.Error, msg:
-		sys.stderr.write(msg + '\n')
-		return 1
-	except EOFError:
-		sys.stderr.write(filename + ': EOF in video header\n')
-		return 1
-
-	if not quiet:
-		vin.printinfo()
-	
-	width, height = int(vin.width), int(vin.height)
-
-	try:
-		if mono:
-			cf = imgconv.getconverter(vin.format, 'grey')
-		else:
-			cf = imgconv.getconverter(vin.format, 'rgb')
-	except imgconv.error:
-		print 'Sorry, no converter available for type',vin.format
-		return
-
-	if mono:
-		depth = 1
-		bpp = 1
-	else:
-		depth = 3
-		bpp = 4
-
-	convert(vin, cf, width, height, depth, bpp, vin.packfactor)
-
-def convert(vin, cf, width, height, depth, bpp, pf):
-	global seqno
-
-	if type(pf) == type(()):
-		xpf, ypf = pf
-	elif pf == 0:
-		xpf = ypf = 1
-	else:
-		xpf = ypf = pf
-	while 1:
-		try:
-			time, data, cdata = vin.getnextframe()
-		except EOFError:
-			return
-		if cdata:
-			print 'Film contains chromdata!'
-			return
-		data = cf(data, width/xpf, height/abs(ypf))
-		if pf:
-			data = applypackfactor(data, width, height, pf, bpp)
-		s = `seqno`
-		s = '0'*(4-len(s)) + s
-		fname = prefix + s + '.rgb'
-		seqno = seqno + 1
-		if not quiet:
-			print 'Writing',fname,'...'
-		imgfile.write(fname, data, width, height, depth)
-	
-def applypackfactor(image, w, h, pf, bpp):
-	import imageop
-	if type(pf) == type(()):
-		xpf, ypf = pf
-	elif pf == 0:
-		xpf = ypf = 1
-	else:
-		xpf = ypf = pf
-	w1 = w/xpf
-	h1 = h/abs(ypf)
-	if ypf < 0:
-		ypf = -ypf
-		image = imageop.crop(image, bpp, w1, h1, 0, h1-1, w1-1, 0)
-	return imageop.scale(image, bpp, w1, h1, w, h)
-	
-# Don't forget to call the main program
-
-try:
-	main()
-except KeyboardInterrupt:
-	print '[Interrupt]'
diff --git a/Demo/sgi/video/vinfo.py b/Demo/sgi/video/vinfo.py
deleted file mode 100755
index 7f98237..0000000
--- a/Demo/sgi/video/vinfo.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from gl import *
-from GL import *
-from DEVICE import *
-import time
-import sys
-import getopt
-
-class Struct(): pass
-epoch = Struct()
-EndOfFile = 'End of file'
-bye = 'bye'
-
-def openvideo(filename):
-	f = open(filename, '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):
-	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
-	f.seek(size, 1)
-	return tijd
-
-def main():
-	delta = 0
-	short = 0
-	try:
-		opts, names = getopt.getopt(sys.argv[1:], 'ds')
-	except getopt.error, msg:
-		sys.stderr.write(msg + '\n')
-		sys.stderr.write('usage: vinfo [-d] [-s] [file] ...\n')
-		sys.exit(2)
-	for opt, arg in opts:
-		if opt == '-d': delta = 1	# print delta between frames
-		elif opt == '-s': short = 1	# short: don't print times
-	if names == []:
-		names = ['film.video']
-	for name in names:
-	    try:
-		f, w, h, pf = openvideo(name)
-	    except:
-	    	sys.stderr.write(name + ': cannot open\n')
-	    	continue
-	    if pf == 0:
-	        size = w*h*4
-	    else:
-	        size = (w/pf) * (h/pf)
-	    print name, ':', w, 'x', h, '; pf =', pf, ', size =', size,
-	    if pf == 0:
-		    print '(color)',
-	    else:
-		    print '(' + `(w/pf)` + 'x' + `(h/pf)` + ')',
-		    if (w/pf)%4 <> 0: print '!!!',
-	    print
-	    num = 0
-	    try:
-	    	otijd = 0
-		while not short:
-		    try:
-			tijd = loadframe(f, w, h, pf)
-			if delta: print '\t' + `tijd-otijd`,
-			else: print '\t' + `tijd`,
-			otijd = 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
deleted file mode 100755
index c333e57..0000000
--- a/Demo/sgi/video/vtime.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#
-# 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)
diff --git a/Demo/sgi/video/watchcursor.py b/Demo/sgi/video/watchcursor.py
deleted file mode 100755
index aae3f85..0000000
--- a/Demo/sgi/video/watchcursor.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Define a 16x16 cursor looking like a watch
-
-# X11 bitmap file:
-##define x_width 16
-##define x_height 16
-#static char x_bits[] = {
-#   0xf0, 0x0f, 0xf8, 0x1f, 0x1c, 0x38, 0x8e, 0x71, 0x87, 0xe1, 0x83, 0xc1,
-#   0x83, 0xc1, 0xf3, 0xc1, 0xf3, 0xc1, 0x03, 0xc0, 0x03, 0xc0, 0x07, 0xe0,
-#   0x0e, 0x70, 0x1c, 0x38, 0xf8, 0x1f, 0xf0, 0x0f};
-
-
-watch = [ \
-	0x0ff0,\
-	0x1ff8,\
-	0x381c,\
-	0x718e,\
-	0xe187,\
-	0xc183,\
-	0xc183,\
-	0xc1f3,\
-	0xc1f3,\
-	0xc003,\
-	0xc003,\
-	0xe007,\
-	0x700e,\
-	0x381c,\
-	0x1ff8,\
-	0x0ff0,\
-	]
-
-watch.reverse() # Turn it upside-down
-
-def defwatch(index):
-	import gl
-	gl.defcursor(index, watch*8)
-	gl.curorigin(index, 8, 8)
-
-def test():
-	import gl
-	gl.foreground()
-	gl.winopen('test watchcursor')
-	defwatch(1)
-	gl.setcursor(1, 0, 0)
-	import time
-	time.sleep(10)