Initial revision
diff --git a/Demo/sgi/video/vcopy.py b/Demo/sgi/video/vcopy.py
new file mode 100755
index 0000000..a492073
--- /dev/null
+++ b/Demo/sgi/video/vcopy.py
@@ -0,0 +1,108 @@
+# Copy a video file, interactively, frame-by-frame.
+
+import sys
+import getopt
+from gl import *
+from DEVICE import *
+
+def loadframe(f, w, h, pf):
+	line = f.readline()
+	if not line or line = '\n':
+		raise EOFError
+	x = eval(line[:-1])
+	if type(x) = type(0):
+		if pf: size = w*h*4
+		else: size = w*h*pf
+	else:
+		time, size = x
+	data = f.read(size)
+	if len(data) <> size:
+		raise EOFError
+	if pf:
+		windata = unpackrect(w/pf, h/pf, 1, data)
+		rectzoom(pf, pf)
+		lrectwrite(0, 0, w/pf-1, h/pf-1, windata)
+	else:
+		lrectwrite(0, 0, w-1, h-1, data)
+	return time, data
+
+def report(time, iframe):
+	print 'Frame', iframe, ': t =', time
+
+def usage():
+	sys.write('usage: vcopy infile outfile\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():
+	opts, args = getopt.getopt(sys.argv[1:], '')
+	if len(args) <> 2:
+		usage()
+	[ifile, ofile] = args
+	ifp = open(ifile, 'r')
+	ofp = open(ofile, 'w')
+	#
+	line = ifp.readline()
+	if line[:4] = 'CMIF':
+		line = ifp.readline()
+	x = eval(line[:-1])
+	if len(x) = 3:
+		w, h, pf = x
+	else:
+		w, h = x
+		pf = 2
+	if pf:
+		w = (w/pf)*pf
+		h = (h/pf)*pf
+	#
+	ofp.write('CMIF video 1.0\n')
+	ofp.write(`w, h, pf` + '\n')
+	#
+	foreground()
+	prefsize(w, h)
+	wid = winopen(ifile + ' -> ' + ofile)
+	RGBmode()
+	gconfig()
+	qdevice(KEYBD)
+	qdevice(ESCKEY)
+	qdevice(WINQUIT)
+	qdevice(WINSHUT)
+	#
+	help()
+	#
+	time, data = loadframe(ifp, w, h, pf)
+	iframe = 1
+	report(time, iframe)
+	#
+	while 1:
+		dev, val = qread()
+		if dev in (ESCKEY, WINQUIT, WINSHUT):
+			break
+		if dev = REDRAW:
+			reshapeviewport()
+		elif dev = KEYBD:
+			c = chr(val)
+			if c = 'n':
+				try:
+					time, data = loadframe(ifp, w, h, pf)
+					iframe = iframe+1
+					report(time, iframe)
+				except EOFError:
+					print 'EOF'
+					ringbell()
+			elif c = 'w':
+				ofp.write(`time, len(data)` + '\n')
+				ofp.write(data)
+				print 'Frame', iframe, 'written.'
+			else:
+				print 'Character', `c`, 'ignored'
+		elif dev = INPUTCHANGE:
+			pass
+		else:
+			print '(dev, val) =', (dev, val)
+
+main()