| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | #! /ufs/guido/bin/sgi/python-405 | 
					
						
							|  |  |  | #! /ufs/guido/bin/sgi/python | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Capture a CMIF movie using the Indigo video library and board | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Usage: | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | # makemovie [-a] [-q queuesize] [-r rate] [-w width] [moviefile [audiofile]] | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Options: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # -a            : record audio as well | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | # -q queuesize  : set the capture queue size (default 2) | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | # -r rate       : capture 1 out of every 'rate' frames (default and min 2) | 
					
						
							|  |  |  | # -w width      : initial window width (default interactive placement) | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | # -n            : Don't write to file, only timing info | 
					
						
							|  |  |  | # -d		: drop fields if needed | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | # -g bits	: greyscale (2, 4 or 8 bits) | 
					
						
							|  |  |  | # -G            : 2-bit greyscale dithered | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | # -m		: monochrome dithered | 
					
						
							|  |  |  | # -M value	: monochrome tresholded with value | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | # -f		: Capture fields (in stead of frames) | 
					
						
							|  |  |  | # -P frames	: preallocate space for 'frames' frames | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | #  | 
					
						
							|  |  |  | # moviefile     : here goes the movie data (default film.video); | 
					
						
							|  |  |  | #                 the format is documented in cmif-film.ms | 
					
						
							|  |  |  | # audiofile     : with -a, here goes the audio data (default film.aiff); | 
					
						
							|  |  |  | #                 audio data is recorded in AIFF format, using the | 
					
						
							|  |  |  | #                 input sampling rate, source and volume set by the | 
					
						
							|  |  |  | #                 audio panel, in mono, 8 bits/sample | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # User interface: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Start the application.  Resize the window to the desired movie size. | 
					
						
							|  |  |  | # Press the left mouse button to start recording, release it to end | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | # recording.  You can record as many times as you wish, but each time | 
					
						
							|  |  |  | # you overwrite the output file(s), so only the last recording is | 
					
						
							|  |  |  | # kept. | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Press ESC or select the window manager Quit or Close window option | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | # to quit.  If you quit before recording anything, the output file(s) | 
					
						
							|  |  |  | # are not touched. | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | sys.path.append('/ufs/guido/src/video') | 
					
						
							|  |  |  | import sv, SV | 
					
						
							|  |  |  | import VFile | 
					
						
							|  |  |  | import gl, GL, DEVICE | 
					
						
							|  |  |  | import al, AL | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import posix | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | import string | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | import imageop | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | import sgi | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Main program | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	format = SV.RGB8_FRAMES | 
					
						
							|  |  |  | 	qsize = 2 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	audio = 0 | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	rate = 2 | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 	width = 0 | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	norecord = 0 | 
					
						
							|  |  |  | 	drop = 0 | 
					
						
							|  |  |  | 	mono = 0 | 
					
						
							|  |  |  | 	grey = 0 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 	greybits = 0 | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	monotreshold = -1 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 	fields = 0 | 
					
						
							|  |  |  | 	preallocspace = 0 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 	opts, args = getopt.getopt(sys.argv[1:], 'aq:r:w:ndg:mM:GfP:') | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	for opt, arg in opts: | 
					
						
							|  |  |  | 		if opt == '-a': | 
					
						
							|  |  |  | 			audio = 1 | 
					
						
							|  |  |  | 		elif opt == '-q': | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 			qsize = string.atoi(arg) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 		elif opt == '-r': | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 			rate = string.atoi(arg) | 
					
						
							|  |  |  | 			if rate < 2: | 
					
						
							|  |  |  | 				sys.stderr.write('-r rate must be >= 2\n') | 
					
						
							|  |  |  | 				sys.exit(2) | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 		elif opt == '-w': | 
					
						
							|  |  |  | 			width = string.atoi(arg) | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		elif opt == '-n': | 
					
						
							|  |  |  | 			norecord = 1 | 
					
						
							|  |  |  | 		elif opt == '-d': | 
					
						
							|  |  |  | 			drop = 1 | 
					
						
							|  |  |  | 		elif opt == '-g': | 
					
						
							|  |  |  | 			grey = 1 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 			greybits = string.atoi(arg) | 
					
						
							|  |  |  | 			if not greybits in (2,4,8): | 
					
						
							|  |  |  | 				print 'Only 2, 4 or 8 bit greyscale supported' | 
					
						
							|  |  |  | 		elif opt == '-G': | 
					
						
							|  |  |  | 			grey = 1 | 
					
						
							|  |  |  | 			greybits = -2 | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		elif opt == '-m': | 
					
						
							|  |  |  | 			mono = 1 | 
					
						
							|  |  |  | 		elif opt == '-M': | 
					
						
							|  |  |  | 			mono = 1 | 
					
						
							|  |  |  | 			monotreshold = string.atoi(arg) | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		elif opt == '-f': | 
					
						
							|  |  |  | 			fields = 1 | 
					
						
							|  |  |  | 		elif opt == '-P': | 
					
						
							|  |  |  | 			preallocspace = string.atoi(arg) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 	if args[2:]: | 
					
						
							|  |  |  | 		sys.stderr.write('usage: Vrec [options] [file [audiofile]]\n') | 
					
						
							|  |  |  | 		sys.exit(2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	if args: | 
					
						
							|  |  |  | 		filename = args[0] | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		filename = 'film.video' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 	if args[1:] and not audio: | 
					
						
							|  |  |  | 		sys.stderr.write('-a turned on by appearance of 2nd file\n') | 
					
						
							|  |  |  | 		audio = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	if audio: | 
					
						
							|  |  |  | 		if args[1:]: | 
					
						
							|  |  |  | 			audiofilename = args[1] | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			audiofilename = 'film.aiff' | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		audiofilename = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	if norecord: | 
					
						
							|  |  |  | 		filename = audiofilename = '' | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 	v = sv.OpenVideo() | 
					
						
							|  |  |  | 	# Determine maximum window size based on signal standard | 
					
						
							|  |  |  | 	param = [SV.BROADCAST, 0] | 
					
						
							|  |  |  | 	v.GetParam(param) | 
					
						
							|  |  |  | 	if param[1] == SV.PAL: | 
					
						
							|  |  |  | 		x = SV.PAL_XMAX | 
					
						
							|  |  |  | 		y = SV.PAL_YMAX | 
					
						
							|  |  |  | 	elif param[1] == SV.NTSC: | 
					
						
							|  |  |  | 		x = SV.NTSC_XMAX | 
					
						
							|  |  |  | 		y = SV.NTSC_YMAX | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		print 'Unknown video standard', param[1] | 
					
						
							|  |  |  | 		sys.exit(1) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 	gl.foreground() | 
					
						
							|  |  |  | 	gl.maxsize(x, y) | 
					
						
							|  |  |  | 	gl.keepaspect(x, y) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	gl.stepunit(8, 6) | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 	if width: | 
					
						
							|  |  |  | 		gl.prefsize(width, width*3/4) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	win = gl.winopen(filename) | 
					
						
							| 
									
										
										
										
											1992-09-04 13:26:59 +00:00
										 |  |  | 	if width: | 
					
						
							|  |  |  | 		gl.maxsize(x, y) | 
					
						
							|  |  |  | 		gl.keepaspect(x, y) | 
					
						
							|  |  |  | 		gl.stepunit(8, 6) | 
					
						
							|  |  |  | 		gl.winconstraints() | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	x, y = gl.getsize() | 
					
						
							|  |  |  | 	print x, 'x', y | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	v.SetSize(x, y) | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if drop: | 
					
						
							|  |  |  | 		param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF] | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON] | 
					
						
							|  |  |  | 	if mono or grey: | 
					
						
							|  |  |  | 		param = param+[SV.COLOR, SV.MONO, SV.INPUT_BYPASS, 1] | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		param = param+[SV.COLOR, SV.DEFAULT_COLOR, SV.INPUT_BYPASS, 0] | 
					
						
							|  |  |  | 	v.SetParam(param) | 
					
						
							| 
									
										
										
										
											1992-12-09 22:16:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	v.BindGLWindow(win, SV.IN_REPLACE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.LEFTMOUSE) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.WINQUIT) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.WINSHUT) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.ESCKEY) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	print 'Press left mouse to start recording, release it to stop' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while 1: | 
					
						
							|  |  |  | 		dev, val = gl.qread() | 
					
						
							|  |  |  | 		if dev == DEVICE.LEFTMOUSE: | 
					
						
							|  |  |  | 			if val == 1: | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 				info = format, x, y, qsize, rate | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 				record(v, info, filename, audiofilename,\ | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 					  mono, grey, greybits, monotreshold, \ | 
					
						
							|  |  |  | 					  fields, preallocspace) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 		elif dev == DEVICE.REDRAW: | 
					
						
							|  |  |  | 			# Window resize (or move) | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 			x, y = gl.getsize() | 
					
						
							|  |  |  | 			print x, 'x', y | 
					
						
							|  |  |  | 			v.SetSize(x, y) | 
					
						
							|  |  |  | 			v.BindGLWindow(win, SV.IN_REPLACE) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 		elif dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT): | 
					
						
							|  |  |  | 			# Quit | 
					
						
							|  |  |  | 			v.CloseVideo() | 
					
						
							|  |  |  | 			gl.winclose(win) | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Record until the mouse is released (or any other GL event) | 
					
						
							|  |  |  | # XXX audio not yet supported | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | def record(v, info, filename, audiofilename, mono, grey, greybits, \ | 
					
						
							|  |  |  | 	  monotreshold, fields, preallocspace): | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	import thread | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	format, x, y, qsize, rate = info | 
					
						
							|  |  |  | 	fps = 59.64 # Fields per second | 
					
						
							|  |  |  | 	# XXX (Strange: need fps of Indigo monitor, not of PAL or NTSC!) | 
					
						
							|  |  |  | 	tpf = 1000.0 / fps # Time per field in msec | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	if filename: | 
					
						
							|  |  |  | 		vout = VFile.VoutFile().init(filename) | 
					
						
							|  |  |  | 		if mono: | 
					
						
							|  |  |  | 			vout.format = 'mono' | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		elif grey and greybits == 8: | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 			vout.format = 'grey' | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		elif grey: | 
					
						
							|  |  |  | 			vout.format = 'grey'+`abs(greybits)` | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		else: | 
					
						
							|  |  |  | 			vout.format = 'rgb8' | 
					
						
							|  |  |  | 		vout.width = x | 
					
						
							|  |  |  | 		vout.height = y | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		if fields: | 
					
						
							|  |  |  | 			vout.packfactor = (1,-2) | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		vout.writeheader() | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		if preallocspace: | 
					
						
							|  |  |  | 			print 'Preallocating space...' | 
					
						
							|  |  |  | 			vout.prealloc(preallocspace) | 
					
						
							|  |  |  | 			print 'done.' | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		MAXSIZE = 20 # XXX should be a user option | 
					
						
							|  |  |  | 		import Queue | 
					
						
							|  |  |  | 		queue = Queue.Queue().init(MAXSIZE) | 
					
						
							|  |  |  | 		done = thread.allocate_lock() | 
					
						
							|  |  |  | 		done.acquire_lock() | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		convertor = None | 
					
						
							|  |  |  | 		if grey: | 
					
						
							|  |  |  | 			if greybits == 2: | 
					
						
							|  |  |  | 				convertor = imageop.grey2grey2 | 
					
						
							|  |  |  | 			elif greybits == 4: | 
					
						
							|  |  |  | 				convertor = imageop.grey2grey4 | 
					
						
							|  |  |  | 			elif greybits == -2: | 
					
						
							|  |  |  | 				convertor = imageop.dither2grey2 | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		thread.start_new_thread(saveframes, \ | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 			  (vout, queue, done, mono, monotreshold, convertor)) | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		if audiofilename: | 
					
						
							|  |  |  | 			audiodone = thread.allocate_lock() | 
					
						
							|  |  |  | 			audiodone.acquire_lock() | 
					
						
							|  |  |  | 			audiostop = [] | 
					
						
							|  |  |  | 			initaudio(audiofilename, audiostop, audiodone) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	gl.wintitle('(rec) ' + filename) | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	lastid = 0 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	t0 = time.millitimer() | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	count = 0 | 
					
						
							|  |  |  | 	ids = [] | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	v.InitContinuousCapture(info) | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	while not gl.qtest(): | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			cd, id = v.GetCaptureData() | 
					
						
							| 
									
										
										
										
											1992-09-22 15:01:43 +00:00
										 |  |  | 		except sv.error: | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 			#time.millisleep(10) # XXX is this necessary? | 
					
						
							|  |  |  | 			sgi.nap(1)	# XXX Try by Jack | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 			continue | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		ids.append(id) | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 		id = id + 2*rate | 
					
						
							|  |  |  | ##		if id <> lastid + 2*rate: | 
					
						
							|  |  |  | ##			print lastid, id | 
					
						
							|  |  |  | 		lastid = id | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 		count = count+1 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		if fields: | 
					
						
							|  |  |  | 			data1, data2 = cd.GetFields() | 
					
						
							|  |  |  | 			cd.UnlockCaptureData() | 
					
						
							|  |  |  | 			if filename: | 
					
						
							|  |  |  | 				queue.put((data1, int(id*tpf))) | 
					
						
							|  |  |  | 				queue.put((data2, int((id+1)*tpf))) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			data = cd.InterleaveFields(1) | 
					
						
							|  |  |  | 			cd.UnlockCaptureData() | 
					
						
							|  |  |  | 			if filename: | 
					
						
							|  |  |  | 				queue.put((data, int(id*tpf))) | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	t1 = time.millitimer() | 
					
						
							|  |  |  | 	gl.wintitle('(busy) ' + filename) | 
					
						
							|  |  |  | 	print lastid, 'fields in', t1-t0, 'msec', | 
					
						
							|  |  |  | 	print '--', 0.1 * int(lastid * 10000.0 / (t1-t0)), 'fields/sec' | 
					
						
							| 
									
										
										
										
											1992-12-14 12:29:43 +00:00
										 |  |  | 	print 'Captured',count*2, 'fields,', | 
					
						
							|  |  |  | 	print 0.1*int(count*20000.0/(t1-t0)), 'f/s', | 
					
						
							|  |  |  | 	if lastid: | 
					
						
							|  |  |  | 		print count*200.0/lastid, '%,', | 
					
						
							|  |  |  | 		print count*rate*200.0/lastid, '% of wanted rate', | 
					
						
							|  |  |  | 	print | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	print 'Ids:', | 
					
						
							|  |  |  | 	t0 = ids[0] | 
					
						
							|  |  |  | 	del ids[0] | 
					
						
							|  |  |  | 	for t1 in ids: | 
					
						
							|  |  |  | 		print t1-t0, | 
					
						
							|  |  |  | 		t0 = t1 | 
					
						
							|  |  |  | 	print | 
					
						
							|  |  |  | 	if filename and audiofilename: | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 		audiostop.append(None) | 
					
						
							|  |  |  | 		audiodone.acquire_lock() | 
					
						
							|  |  |  | 	v.EndContinuousCapture() | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 	if filename: | 
					
						
							|  |  |  | 		queue.put(None) # Sentinel | 
					
						
							|  |  |  | 		done.acquire_lock() | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	gl.wintitle('(done) ' + filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Thread to save the frames to the file | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | def saveframes(vout, queue, done, mono, monotreshold, convertor): | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	while 1: | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 		x = queue.get() | 
					
						
							|  |  |  | 		if not x: | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		data, t = x | 
					
						
							| 
									
										
										
										
											1992-12-23 15:37:20 +00:00
										 |  |  | 		if convertor: | 
					
						
							|  |  |  | 			data = convertor(data, len(data), 1) | 
					
						
							|  |  |  | 		elif mono and monotreshold >= 0: | 
					
						
							| 
									
										
										
										
											1992-12-14 12:25:21 +00:00
										 |  |  | 			data = imageop.grey2mono(data, len(data), 1,\ | 
					
						
							|  |  |  | 				  monotreshold) | 
					
						
							|  |  |  | 		elif mono: | 
					
						
							|  |  |  | 			data = imageop.dither2mono(data, len(data), 1) | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 		vout.writeframe(t, data, None) | 
					
						
							|  |  |  | 	sys.stderr.write('Done writing video\n') | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 	vout.close() | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	done.release_lock() | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | # Initialize audio recording | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | AQSIZE = 8000 # XXX should be a user option | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | def initaudio(filename, stop, done): | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 	import thread, aiff | 
					
						
							|  |  |  | 	afile = aiff.Aiff().init(filename, 'w') | 
					
						
							|  |  |  | 	afile.nchannels = AL.MONO | 
					
						
							|  |  |  | 	afile.sampwidth = AL.SAMPLE_8 | 
					
						
							|  |  |  | 	params = [AL.INPUT_RATE, 0] | 
					
						
							|  |  |  | 	al.getparams(AL.DEFAULT_DEVICE, params) | 
					
						
							|  |  |  | 	print 'audio sampling rate =', params[1] | 
					
						
							|  |  |  | 	afile.samprate = params[1] | 
					
						
							|  |  |  | 	c = al.newconfig() | 
					
						
							|  |  |  | 	c.setchannels(AL.MONO) | 
					
						
							|  |  |  | 	c.setqueuesize(AQSIZE) | 
					
						
							|  |  |  | 	c.setwidth(AL.SAMPLE_8) | 
					
						
							|  |  |  | 	aport = al.openport(filename, 'r', c) | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	thread.start_new_thread(audiorecord, (afile, aport, stop, done)) | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Thread to record audio samples | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX should use writesampsraw for efficiency, but then destroy doesn't | 
					
						
							|  |  |  | # XXX seem to set the #samples in the header correctly | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | def audiorecord(afile, aport, stop, done): | 
					
						
							|  |  |  | 	while not stop: | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 		data = aport.readsamps(AQSIZE/2) | 
					
						
							|  |  |  | ##		afile.writesampsraw(data) | 
					
						
							|  |  |  | 		afile.writesamps(data) | 
					
						
							|  |  |  | 		del data | 
					
						
							|  |  |  | 	afile.destroy() | 
					
						
							|  |  |  | 	print 'Done writing audio' | 
					
						
							| 
									
										
										
										
											1992-09-03 16:56:04 +00:00
										 |  |  | 	done.release_lock() | 
					
						
							| 
									
										
										
										
											1992-08-20 14:46:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:46:28 +00:00
										 |  |  | # Don't forget to call the main program | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-01 14:45:57 +00:00
										 |  |  | try: | 
					
						
							|  |  |  | 	main() | 
					
						
							|  |  |  | except KeyboardInterrupt: | 
					
						
							|  |  |  | 	print '[Interrupt]' |