diff --git a/Demo/sgi/video/vcopy.py b/Demo/sgi/video/vcopy.py
index 3afe119..1842094 100755
--- a/Demo/sgi/video/vcopy.py
+++ b/Demo/sgi/video/vcopy.py
@@ -4,27 +4,7 @@
 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
+import VFile
 
 def report(time, iframe):
 	print 'Frame', iframe, ': t =', time
@@ -39,70 +19,87 @@
 	print 'w   write current image to output'
 
 def main():
-	opts, args = getopt.getopt(sys.argv[1:], '')
+	foreground()
+	opts, args = getopt.getopt(sys.argv[1:], 't:a')
 	if len(args) <> 2:
 		usage()
 	[ifile, ofile] = args
-	ifp = open(ifile, 'r')
-	ofp = open(ofile, 'w')
+	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
+	for o, a in opts:
+		if o == '-t':
+			ofilm.format = a
+			use_grabber = 1
+		if o == '-a':
+			continuous = 1
+	ofilm.writeheader()
 	#
-	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()
+	prefsize(ifilm.width, ifilm.height)
+	w = winopen(ifile)
 	qdevice(KEYBD)
 	qdevice(ESCKEY)
 	qdevice(WINQUIT)
 	qdevice(WINSHUT)
+	print 'qdevice calls done'
 	#
 	help()
 	#
-	time, data = loadframe(ifp, w, h, pf)
+	time, data, cdata = ifilm.getnextframe()
+	ifilm.showframe(data, cdata)
 	iframe = 1
 	report(time, iframe)
 	#
 	while 1:
-		dev, val = qread()
+		if continuous:
+			dev = KEYBD
+		else:
+			dev, val = qread()
 		if dev in (ESCKEY, WINQUIT, WINSHUT):
 			break
 		if dev == REDRAW:
 			reshapeviewport()
 		elif dev == KEYBD:
-			c = chr(val)
-			if c == 'n':
+			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()
+				ofilm.writeframe(time, data, cdata)
+				print 'Frame', iframe, 'written.'
+			if c == 'n' or continuous:
 				try:
-					time, data = loadframe(ifp, w, h, pf)
+					time,data,cdata = ifilm.getnextframe()
+					ifilm.showframe(data, cdata)
 					iframe = iframe+1
 					report(time, iframe)
 				except EOFError:
 					print 'EOF'
+					if continuous:
+						break
 					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)
+	ofilm.close()
 
 main()
