Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 1 | #! /ufs/guido/bin/sgi/python-405 |
| 2 | #! /ufs/guido/bin/sgi/python |
| 3 | |
| 4 | # Capture a CMIF movie using the Indigo video library and board |
| 5 | |
| 6 | |
| 7 | # Usage: |
| 8 | # |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 9 | # makemovie [-a] [-q queuesize] [-r rate] [-w width] [moviefile [audiofile]] |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 10 | |
| 11 | |
| 12 | # Options: |
| 13 | # |
| 14 | # -a : record audio as well |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 15 | # -q queuesize : set the capture queue size (default 2) |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 16 | # -r rate : capture 1 out of every 'rate' frames (default and min 2) |
| 17 | # -w width : initial window width (default interactive placement) |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 18 | # -n : Don't write to file, only timing info |
| 19 | # -d : drop fields if needed |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 20 | # -g bits : greyscale (2, 4 or 8 bits) |
| 21 | # -G : 2-bit greyscale dithered |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 22 | # -m : monochrome dithered |
| 23 | # -M value : monochrome tresholded with value |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 24 | # -f : Capture fields (in stead of frames) |
| 25 | # -P frames : preallocate space for 'frames' frames |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 26 | # |
| 27 | # moviefile : here goes the movie data (default film.video); |
| 28 | # the format is documented in cmif-film.ms |
| 29 | # audiofile : with -a, here goes the audio data (default film.aiff); |
| 30 | # audio data is recorded in AIFF format, using the |
| 31 | # input sampling rate, source and volume set by the |
| 32 | # audio panel, in mono, 8 bits/sample |
| 33 | |
| 34 | |
| 35 | # User interface: |
| 36 | # |
| 37 | # Start the application. Resize the window to the desired movie size. |
| 38 | # Press the left mouse button to start recording, release it to end |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 39 | # recording. You can record as many times as you wish, but each time |
| 40 | # you overwrite the output file(s), so only the last recording is |
| 41 | # kept. |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 42 | # |
| 43 | # Press ESC or select the window manager Quit or Close window option |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 44 | # to quit. If you quit before recording anything, the output file(s) |
| 45 | # are not touched. |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 46 | |
| 47 | |
| 48 | import sys |
| 49 | sys.path.append('/ufs/guido/src/video') |
| 50 | import sv, SV |
| 51 | import VFile |
| 52 | import gl, GL, DEVICE |
| 53 | import al, AL |
| 54 | import time |
| 55 | import posix |
| 56 | import getopt |
| 57 | import string |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 58 | import imageop |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 59 | import sgi |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 60 | |
| 61 | # Main program |
| 62 | |
| 63 | def main(): |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 64 | format = SV.RGB8_FRAMES |
| 65 | qsize = 2 |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 66 | audio = 0 |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 67 | rate = 2 |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 68 | width = 0 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 69 | norecord = 0 |
| 70 | drop = 0 |
| 71 | mono = 0 |
| 72 | grey = 0 |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 73 | greybits = 0 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 74 | monotreshold = -1 |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 75 | fields = 0 |
| 76 | preallocspace = 0 |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 77 | |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 78 | opts, args = getopt.getopt(sys.argv[1:], 'aq:r:w:ndg:mM:GfP:') |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 79 | for opt, arg in opts: |
| 80 | if opt == '-a': |
| 81 | audio = 1 |
| 82 | elif opt == '-q': |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 83 | qsize = string.atoi(arg) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 84 | elif opt == '-r': |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 85 | rate = string.atoi(arg) |
| 86 | if rate < 2: |
| 87 | sys.stderr.write('-r rate must be >= 2\n') |
| 88 | sys.exit(2) |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 89 | elif opt == '-w': |
| 90 | width = string.atoi(arg) |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 91 | elif opt == '-n': |
| 92 | norecord = 1 |
| 93 | elif opt == '-d': |
| 94 | drop = 1 |
| 95 | elif opt == '-g': |
| 96 | grey = 1 |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 97 | greybits = string.atoi(arg) |
| 98 | if not greybits in (2,4,8): |
| 99 | print 'Only 2, 4 or 8 bit greyscale supported' |
| 100 | elif opt == '-G': |
| 101 | grey = 1 |
| 102 | greybits = -2 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 103 | elif opt == '-m': |
| 104 | mono = 1 |
| 105 | elif opt == '-M': |
| 106 | mono = 1 |
| 107 | monotreshold = string.atoi(arg) |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 108 | elif opt == '-f': |
| 109 | fields = 1 |
| 110 | elif opt == '-P': |
| 111 | preallocspace = string.atoi(arg) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 112 | |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 113 | if args[2:]: |
| 114 | sys.stderr.write('usage: Vrec [options] [file [audiofile]]\n') |
| 115 | sys.exit(2) |
| 116 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 117 | if args: |
| 118 | filename = args[0] |
| 119 | else: |
| 120 | filename = 'film.video' |
| 121 | |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 122 | if args[1:] and not audio: |
| 123 | sys.stderr.write('-a turned on by appearance of 2nd file\n') |
| 124 | audio = 1 |
| 125 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 126 | if audio: |
| 127 | if args[1:]: |
| 128 | audiofilename = args[1] |
| 129 | else: |
| 130 | audiofilename = 'film.aiff' |
| 131 | else: |
| 132 | audiofilename = None |
| 133 | |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 134 | if norecord: |
| 135 | filename = audiofilename = '' |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 136 | v = sv.OpenVideo() |
| 137 | # Determine maximum window size based on signal standard |
| 138 | param = [SV.BROADCAST, 0] |
| 139 | v.GetParam(param) |
| 140 | if param[1] == SV.PAL: |
| 141 | x = SV.PAL_XMAX |
| 142 | y = SV.PAL_YMAX |
| 143 | elif param[1] == SV.NTSC: |
| 144 | x = SV.NTSC_XMAX |
| 145 | y = SV.NTSC_YMAX |
| 146 | else: |
| 147 | print 'Unknown video standard', param[1] |
| 148 | sys.exit(1) |
| 149 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 150 | gl.foreground() |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 151 | gl.maxsize(x, y) |
| 152 | gl.keepaspect(x, y) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 153 | gl.stepunit(8, 6) |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 154 | if width: |
| 155 | gl.prefsize(width, width*3/4) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 156 | win = gl.winopen(filename) |
Guido van Rossum | 32517f9 | 1992-09-04 13:26:59 +0000 | [diff] [blame] | 157 | if width: |
| 158 | gl.maxsize(x, y) |
| 159 | gl.keepaspect(x, y) |
| 160 | gl.stepunit(8, 6) |
| 161 | gl.winconstraints() |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 162 | x, y = gl.getsize() |
| 163 | print x, 'x', y |
| 164 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 165 | v.SetSize(x, y) |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 166 | |
| 167 | if drop: |
| 168 | param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF] |
| 169 | else: |
| 170 | param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON] |
| 171 | if mono or grey: |
| 172 | param = param+[SV.COLOR, SV.MONO, SV.INPUT_BYPASS, 1] |
| 173 | else: |
| 174 | param = param+[SV.COLOR, SV.DEFAULT_COLOR, SV.INPUT_BYPASS, 0] |
| 175 | v.SetParam(param) |
Guido van Rossum | ff3da05 | 1992-12-09 22:16:35 +0000 | [diff] [blame] | 176 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 177 | v.BindGLWindow(win, SV.IN_REPLACE) |
| 178 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 179 | gl.qdevice(DEVICE.LEFTMOUSE) |
| 180 | gl.qdevice(DEVICE.WINQUIT) |
| 181 | gl.qdevice(DEVICE.WINSHUT) |
| 182 | gl.qdevice(DEVICE.ESCKEY) |
| 183 | |
| 184 | print 'Press left mouse to start recording, release it to stop' |
| 185 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 186 | while 1: |
| 187 | dev, val = gl.qread() |
| 188 | if dev == DEVICE.LEFTMOUSE: |
| 189 | if val == 1: |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 190 | info = format, x, y, qsize, rate |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 191 | record(v, info, filename, audiofilename,\ |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 192 | mono, grey, greybits, monotreshold, \ |
| 193 | fields, preallocspace) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 194 | elif dev == DEVICE.REDRAW: |
| 195 | # Window resize (or move) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 196 | x, y = gl.getsize() |
| 197 | print x, 'x', y |
| 198 | v.SetSize(x, y) |
| 199 | v.BindGLWindow(win, SV.IN_REPLACE) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 200 | elif dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT): |
| 201 | # Quit |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 202 | v.CloseVideo() |
| 203 | gl.winclose(win) |
| 204 | break |
| 205 | |
| 206 | |
| 207 | # Record until the mouse is released (or any other GL event) |
| 208 | # XXX audio not yet supported |
| 209 | |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 210 | def record(v, info, filename, audiofilename, mono, grey, greybits, \ |
| 211 | monotreshold, fields, preallocspace): |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 212 | import thread |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 213 | format, x, y, qsize, rate = info |
| 214 | fps = 59.64 # Fields per second |
| 215 | # XXX (Strange: need fps of Indigo monitor, not of PAL or NTSC!) |
| 216 | tpf = 1000.0 / fps # Time per field in msec |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 217 | if filename: |
| 218 | vout = VFile.VoutFile().init(filename) |
| 219 | if mono: |
| 220 | vout.format = 'mono' |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 221 | elif grey and greybits == 8: |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 222 | vout.format = 'grey' |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 223 | elif grey: |
| 224 | vout.format = 'grey'+`abs(greybits)` |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 225 | else: |
| 226 | vout.format = 'rgb8' |
| 227 | vout.width = x |
| 228 | vout.height = y |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 229 | if fields: |
| 230 | vout.packfactor = (1,-2) |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 231 | vout.writeheader() |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 232 | if preallocspace: |
| 233 | print 'Preallocating space...' |
| 234 | vout.prealloc(preallocspace) |
| 235 | print 'done.' |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 236 | MAXSIZE = 20 # XXX should be a user option |
| 237 | import Queue |
| 238 | queue = Queue.Queue().init(MAXSIZE) |
| 239 | done = thread.allocate_lock() |
| 240 | done.acquire_lock() |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 241 | convertor = None |
| 242 | if grey: |
| 243 | if greybits == 2: |
| 244 | convertor = imageop.grey2grey2 |
| 245 | elif greybits == 4: |
| 246 | convertor = imageop.grey2grey4 |
| 247 | elif greybits == -2: |
| 248 | convertor = imageop.dither2grey2 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 249 | thread.start_new_thread(saveframes, \ |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 250 | (vout, queue, done, mono, monotreshold, convertor)) |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 251 | if audiofilename: |
| 252 | audiodone = thread.allocate_lock() |
| 253 | audiodone.acquire_lock() |
| 254 | audiostop = [] |
| 255 | initaudio(audiofilename, audiostop, audiodone) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 256 | gl.wintitle('(rec) ' + filename) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 257 | lastid = 0 |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 258 | t0 = time.millitimer() |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 259 | count = 0 |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 260 | ids = [] |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 261 | v.InitContinuousCapture(info) |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 262 | while not gl.qtest(): |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 263 | try: |
| 264 | cd, id = v.GetCaptureData() |
Guido van Rossum | 42e07af | 1992-09-22 15:01:43 +0000 | [diff] [blame] | 265 | except sv.error: |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 266 | #time.millisleep(10) # XXX is this necessary? |
| 267 | sgi.nap(1) # XXX Try by Jack |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 268 | continue |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 269 | ids.append(id) |
| 270 | |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 271 | id = id + 2*rate |
| 272 | ## if id <> lastid + 2*rate: |
| 273 | ## print lastid, id |
| 274 | lastid = id |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 275 | count = count+1 |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 276 | if fields: |
| 277 | data1, data2 = cd.GetFields() |
| 278 | cd.UnlockCaptureData() |
| 279 | if filename: |
| 280 | queue.put((data1, int(id*tpf))) |
| 281 | queue.put((data2, int((id+1)*tpf))) |
| 282 | else: |
| 283 | data = cd.InterleaveFields(1) |
| 284 | cd.UnlockCaptureData() |
| 285 | if filename: |
| 286 | queue.put((data, int(id*tpf))) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 287 | t1 = time.millitimer() |
| 288 | gl.wintitle('(busy) ' + filename) |
| 289 | print lastid, 'fields in', t1-t0, 'msec', |
| 290 | print '--', 0.1 * int(lastid * 10000.0 / (t1-t0)), 'fields/sec' |
Guido van Rossum | 9533ebe | 1992-12-14 12:29:43 +0000 | [diff] [blame] | 291 | print 'Captured',count*2, 'fields,', |
| 292 | print 0.1*int(count*20000.0/(t1-t0)), 'f/s', |
| 293 | if lastid: |
| 294 | print count*200.0/lastid, '%,', |
| 295 | print count*rate*200.0/lastid, '% of wanted rate', |
| 296 | print |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 297 | print 'Ids:', |
| 298 | t0 = ids[0] |
| 299 | del ids[0] |
| 300 | for t1 in ids: |
| 301 | print t1-t0, |
| 302 | t0 = t1 |
| 303 | print |
| 304 | if filename and audiofilename: |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 305 | audiostop.append(None) |
| 306 | audiodone.acquire_lock() |
| 307 | v.EndContinuousCapture() |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 308 | if filename: |
| 309 | queue.put(None) # Sentinel |
| 310 | done.acquire_lock() |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 311 | gl.wintitle('(done) ' + filename) |
| 312 | |
| 313 | |
| 314 | # Thread to save the frames to the file |
| 315 | |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 316 | def saveframes(vout, queue, done, mono, monotreshold, convertor): |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 317 | while 1: |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 318 | x = queue.get() |
| 319 | if not x: |
| 320 | break |
| 321 | data, t = x |
Jack Jansen | 6bc8c7f | 1992-12-23 15:37:20 +0000 | [diff] [blame] | 322 | if convertor: |
| 323 | data = convertor(data, len(data), 1) |
| 324 | elif mono and monotreshold >= 0: |
Jack Jansen | 3b25371 | 1992-12-14 12:25:21 +0000 | [diff] [blame] | 325 | data = imageop.grey2mono(data, len(data), 1,\ |
| 326 | monotreshold) |
| 327 | elif mono: |
| 328 | data = imageop.dither2mono(data, len(data), 1) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 329 | vout.writeframe(t, data, None) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 330 | sys.stderr.write('Done writing video\n') |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 331 | vout.close() |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 332 | done.release_lock() |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 333 | |
| 334 | |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 335 | # Initialize audio recording |
| 336 | |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 337 | AQSIZE = 8000 # XXX should be a user option |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 338 | |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 339 | def initaudio(filename, stop, done): |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 340 | import thread, aiff |
| 341 | afile = aiff.Aiff().init(filename, 'w') |
| 342 | afile.nchannels = AL.MONO |
| 343 | afile.sampwidth = AL.SAMPLE_8 |
| 344 | params = [AL.INPUT_RATE, 0] |
| 345 | al.getparams(AL.DEFAULT_DEVICE, params) |
| 346 | print 'audio sampling rate =', params[1] |
| 347 | afile.samprate = params[1] |
| 348 | c = al.newconfig() |
| 349 | c.setchannels(AL.MONO) |
| 350 | c.setqueuesize(AQSIZE) |
| 351 | c.setwidth(AL.SAMPLE_8) |
| 352 | aport = al.openport(filename, 'r', c) |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 353 | thread.start_new_thread(audiorecord, (afile, aport, stop, done)) |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 354 | |
| 355 | |
| 356 | # Thread to record audio samples |
| 357 | |
| 358 | # XXX should use writesampsraw for efficiency, but then destroy doesn't |
| 359 | # XXX seem to set the #samples in the header correctly |
| 360 | |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 361 | def audiorecord(afile, aport, stop, done): |
| 362 | while not stop: |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 363 | data = aport.readsamps(AQSIZE/2) |
| 364 | ## afile.writesampsraw(data) |
| 365 | afile.writesamps(data) |
| 366 | del data |
| 367 | afile.destroy() |
| 368 | print 'Done writing audio' |
Guido van Rossum | 62f6bc8 | 1992-09-03 16:56:04 +0000 | [diff] [blame] | 369 | done.release_lock() |
Guido van Rossum | 8a861be | 1992-08-20 14:46:46 +0000 | [diff] [blame] | 370 | |
| 371 | |
Guido van Rossum | 180924d | 1992-08-20 11:46:28 +0000 | [diff] [blame] | 372 | # Don't forget to call the main program |
| 373 | |
Guido van Rossum | e0be2b3 | 1992-09-01 14:45:57 +0000 | [diff] [blame] | 374 | try: |
| 375 | main() |
| 376 | except KeyboardInterrupt: |
| 377 | print '[Interrupt]' |