mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| 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()
 | 
