diff --git a/Demo/sgi/video/video.py b/Demo/sgi/video/video.py
index df74d00..d9872d5 100755
--- a/Demo/sgi/video/video.py
+++ b/Demo/sgi/video/video.py
@@ -6,11 +6,13 @@
 import sys
 import al
 import AL
+import colorsys
 
 BUFFERSIZE = 32000
 
 class Struct(): pass
 epoch = Struct()
+epoch.correcttiming = 1
 EndOfFile = 'End of file'
 bye = 'bye'
 
@@ -29,13 +31,19 @@
         sys.exit(1)
     line = f.readline()
     if not line: raise EndOfFile
-    if line[:4] = 'CMIF': line = f.readline()
+    if line[:4] = 'CMIF':
+	if line[:14] = 'CMIF video 2.0':
+	    line = f.readline()
+	    colorinfo = eval(line[:-1])
+	else:
+	    colorinfo = (8,0,0,0)
+	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
+    return f, w, h, pf, colorinfo
 
-def loadframe(f,w,h,pf,af,spkr):
+def loadframe(f,w,h,pf,af,spkr, (ybits,ibits,qbits,chrompack),mf):
     line = f.readline()
     if line = '':
 	raise EndOfFile
@@ -52,21 +60,54 @@
     if len(data) <> size:
 	raise EndOfFile
     if pf:
-    	rectzoom(pf, pf)
     	w = w/pf
     	h = h/pf
-    	data = unpackrect(w, h, 1, data)
+    if chrompack:
+	cw = (w+chrompack-1)/chrompack
+	ch = (h+chrompack-1)/chrompack
+	chromdata = f.read(2*cw*ch)
+	rectzoom(pf*chrompack*mf,pf*chrompack*mf)
+	pixmode(5,16)
+	writemask(0x7ff - ((1<<ybits)-1))
+	lrectwrite(0,0,cw-1,ch-1,chromdata)
+	writemask((1<<ybits)-1)
+	pixmode(5,8)
+    if pf:
+    	rectzoom(pf*mf, pf*mf)
+    elif mf <> 1:
+	rectzoom(mf,mf)
     lrectwrite(0,0,w-1,h-1,data)
     # This is ugly here, but the only way to get the two
     # channels started in sync
     #if af <> None:
     #	playsound(af,spkr)
     ct = time.millitimer() - epoch.epoch
-    if tijd > 0 and ct < tijd:
+    if epoch.correcttiming and tijd > 0 and ct < tijd:
     	time.millisleep(tijd-ct)
     #swapbuffers()
     return tijd
 
+def initcmap(ybits,ibits,qbits,chrompack):
+    if ybits+ibits+qbits > 11:
+	raise 'Sorry, 11 bits max'
+    maxy = pow(2,ybits)
+    maxi = pow(2,ibits)
+    maxq = pow(2,qbits)
+    for i in range(2048,4096-256):
+	mapcolor(i, 0, 255, 0)
+    for y in range(maxy):
+      yv = float(y)/float(maxy-1)
+      for i in range(maxi):
+	iv = (float(i)/float(maxi-1))-0.5
+	for q in range(maxq):
+	  qv = (float(q)/float(maxq-1))-0.5
+	  index = 2048 + y + (i << ybits) + (q << (ybits+ibits))
+
+	  rv,gv,bv = colorsys.yiq_to_rgb(yv,iv,qv)
+	  r,g,b = int(rv*255.0), int(gv*255.0), int(bv*255.0)
+	  if index < 4096 - 256:
+	      mapcolor(index, r,g,b)
+
 def playsound(af, spkr):
     nsamp = spkr.getfillable()
     data = af.read(nsamp*2)
@@ -75,17 +116,27 @@
 def main():
 	looping = 0
 	packfactor = 0
-	opts, args = getopt.getopt(sys.argv[1:], 'p:l')
+	magfactor = 1
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], 'm:p:lF')
+	except getopt.error:
+		sys.stderr.write('usage: video ' + \
+	'[-l] [-p pf] [-m mag] [-F] [moviefile [soundfile [skipbytes]]]\n')
+		sys.exit(2)
 	for opt, arg in opts:
-		if opt = '-p':
+		if opt = '-m':
+			magfactor = int(eval(arg))
+		elif opt = '-p':
 			packfactor = int(eval(arg))
 		elif opt = '-l':
 			looping = 1
+		elif opt = '-F':
+			epoch.correcttiming = 0
 	if args:
 		filename = args[0]
 	else:
 		filename = 'film.video'
-	f, w, h, pf = openvideo(filename)
+	f, w, h, pf, cinfo = openvideo(filename)
 	if 0 < packfactor <> pf:
 		w = w/pf*packfactor
 		h = h/pf*packfactor
@@ -101,11 +152,21 @@
 	else:
 		af, spkr = None, None
 	foreground()
-	prefsize(w,h)
+	prefsize(w*magfactor,h*magfactor)
 	win = winopen(filename)
-	RGBmode()
+	if pf:
+	    #doublebuffer()
+	    cmode()
+	else:
+	    RGBmode()
 	#doublebuffer()
 	gconfig()
+	if pf:
+	    initcmap(cinfo)
+	    color(2048)
+	    clear()
+	    writemask(2047)
+	    pixmode(5,8)	# 8 bit pixels
 	qdevice(ESCKEY)
 	qdevice(WINSHUT)
 	qdevice(WINQUIT)
@@ -119,7 +180,7 @@
 	    while 1:
 		if running:
 		    try:
-			tijd = loadframe(f, w, h, pf, af, spkr)
+			tijd = loadframe(f, w, h, pf, af, spkr, cinfo,magfactor)
 			nframe = nframe + 1
 		    except EndOfFile:
 			running = 0
