diff --git a/Demo/sgi/video/video2rgb.py b/Demo/sgi/video/video2rgb.py
new file mode 100755
index 0000000..ab90484
--- /dev/null
+++ b/Demo/sgi/video/video2rgb.py
@@ -0,0 +1,165 @@
+#! /ufs/guido/bin/sgi/python
+
+# Play CMIF movie files
+
+
+# Help function
+
+def help():
+	print 'Usage: Vplay [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 "prefix000.rgb"'
+	print 'file ...   : file(s) to play; default film.video'
+
+
+# Imported modules
+
+import sys
+sys.path.append('/ufs/guido/src/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().init(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
+	else:
+		depth = 3
+
+	pf = testpackfactor(vin.packfactor)
+	if pf == None:
+		print 'Sorry, packfactor not supported:', vin.packfactor
+	convert(vin, cf, width, height, depth, pf)
+
+def convert(vin, cf, width, height, depth, pf):
+	global seqno
+
+	while 1:
+		try:
+			time, data, cdata = vin.getnextframe()
+		except EOFError:
+			return
+		if cdata:
+			print 'Film contains chromdata!'
+			return
+		if pf:
+			data = applypackfactor(data, width, height, pf)
+		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 testpackfactor(pf):
+	if type(pf) == type(()):
+		xpf, ypf = pf
+	else:
+		if pf in (0, 1):
+			return 0
+		return None
+	if xpf <> 1:
+		return None
+	return pf
+	
+def applypackfactor(image, w, h, pf):
+	if type(pf) == type(()):
+		xpf, ypf = pf
+	else:
+		xpf = ypf = 1
+	rows = []
+	for i in range(0, (w*h+ypf-1)/abs(ypf), w):
+		rows.append(image[i:i+w])
+	if ypf < 0:
+		rows.reverse()
+		ypf = -ypf
+	image = ''
+	for i in range(0, h):
+		image = image + rows[i/ypf]
+	return image
+	
+# Don't forget to call the main program
+
+try:
+	main()
+except KeyboardInterrupt:
+	print '[Interrupt]'
