diff options
-rwxr-xr-x | Demo/sgi/video/video.py | 85 |
1 files changed, 73 insertions, 12 deletions
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 time 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 @@ def openvideo(name): 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 @@ def loadframe(f,w,h,pf,af,spkr): 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 playsound(af, spkr): 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 @@ def main(): 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 @@ def main(): 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 |