from gl import * from GL import * from DEVICE import * import time import sys import al import AL BUFFERSIZE = 32000 class Struct(): pass epoch = Struct() EndOfFile = 'End of file' bye = 'bye' def openspkr(): conf = al.newconfig() conf.setqueuesize(BUFFERSIZE) conf.setwidth(AL.SAMPLE_16) conf.setchannels(AL.MONO) return al.openport('spkr','w',conf) def openvideo(name): try: f = open(name, 'r') except: sys.stderr.write(name + ': cannot open\n') sys.exit(1) line = f.readline() if not line: raise EndOfFile if line[:4] = 'CMIF': 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 def loadframe(f,w,h,pf,af,spkr): line = f.readline() if line = '': raise EndOfFile x = eval(line[:-1]) if type(x) = type(0) or type(x) = type(0.0): tijd = x if pf = 0: size = w*h*4 else: size = (w/pf) * (h/pf) else: tijd, size = x data = f.read(size) if len(data) <> size: raise EndOfFile if pf: rectzoom(pf, pf) w = w/pf h = h/pf data = unpackrect(w, h, 1, data) 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: time.millisleep(tijd-ct) #swapbuffers() return tijd def playsound(af, spkr): nsamp = spkr.getfillable() data = af.read(nsamp*2) spkr.writesamps(data) def main(): foreground() if len(sys.argv) > 1: filename = sys.argv[1] else: filename = 'film.video' f, w, h, pf = openvideo(filename) if len(sys.argv) > 2: audiofilename = sys.argv[2] af = open(audiofilename, 'r') spkr = openspkr() if len(sys.argv) > 3: af.seek(eval(sys.argv[3])) else: af, spkr = None, None prefsize(w,h) win = winopen(filename) RGBmode() #doublebuffer() gconfig() qdevice(ESCKEY) qdevice(WINSHUT) qdevice(WINQUIT) running = 1 epoch.epoch = time.millitimer() nframe = 0 tijd = 1 try: while 1: if running: try: tijd = loadframe(f, w, h, pf, af, spkr) nframe = nframe + 1 except EndOfFile: running = 0 t = time.millitimer() if tijd > 0: print 'Recorded at', print 0.1 * int(nframe * 10000.0 / tijd), print 'frames/sec' print 'Played', nframe, 'frames at', print 0.1 * int(nframe * 10000.0 / (t-epoch.epoch)), print 'frames/sec' if af <> None: playsound(af,spkr) if not running or qtest(): dev, val = qread() if dev in (ESCKEY, WINSHUT, WINQUIT): raise bye elif dev = REDRAW: reshapeviewport() except bye: pass main()