Guido van Rossum | f06ee5f | 1996-11-27 19:52:01 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 2 | |
| 3 | # Play CMIF movie files |
| 4 | |
| 5 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 6 | # Help function |
| 7 | |
| 8 | def help(): |
| 9 | print 'Usage: Vplay [options] [file] ...' |
| 10 | print |
| 11 | print 'Options:' |
| 12 | print '-M magnify : magnify the image by the given factor' |
| 13 | print '-d : write some debug stuff on stderr' |
| 14 | print '-l : loop, playing the movie over and over again' |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 15 | print '-m delta : drop frames closer than delta seconds (default 0.)' |
Guido van Rossum | e178332 | 1992-09-07 09:35:23 +0000 | [diff] [blame] | 16 | print '-n : don\'t wait after each file' |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 17 | print '-q : quiet, no informative messages' |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 18 | print '-r delta : regenerate input time base delta seconds apart' |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 19 | print '-s speed : speed change factor (default 1.0)' |
| 20 | print '-t : use a 2nd thread for read-ahead' |
| 21 | print '-x left : window offset from left of screen' |
| 22 | print '-y top : window offset from top of screen' |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 23 | print '-w width : window width' |
| 24 | print '-h height : window height' |
| 25 | print '-b color : background color (white,black or (r,g,b))' |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 26 | print 'file ... : file(s) to play; default film.video' |
| 27 | print |
| 28 | print 'User interface:' |
| 29 | print 'Press the left mouse button to stop or restart the movie.' |
| 30 | print 'Press ESC or use the window manager Close or Quit command' |
| 31 | print 'to close the window and play the next file (if any).' |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 32 | |
| 33 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 34 | # Imported modules |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 35 | |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 36 | import sys |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 37 | sys.path.append('/ufs/guido/src/video') # Increase chance of finding VFile |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 38 | import VFile |
| 39 | import time |
| 40 | import gl, GL |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 41 | from DEVICE import REDRAW, ESCKEY, LEFTMOUSE, WINSHUT, WINQUIT |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 42 | import getopt |
| 43 | import string |
| 44 | |
| 45 | |
| 46 | # Global options |
| 47 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 48 | debug = 0 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 49 | looping = 0 |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 50 | magnify = 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 51 | mindelta = 0 |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 52 | nowait = 0 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 53 | quiet = 0 |
| 54 | regen = None |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 55 | speed = 1.0 |
| 56 | threading = 0 |
| 57 | xoff = yoff = None |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 58 | xwsiz = ywsiz = None |
| 59 | bgcolor = None |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 60 | |
| 61 | |
| 62 | # Main program -- mostly command line parsing |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 63 | |
| 64 | def main(): |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 65 | global debug, looping, magnify, mindelta, nowait, quiet, regen, speed |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 66 | global threading, xoff, yoff, xwsiz, ywsiz, bgcolor |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 67 | |
| 68 | # Parse command line |
| 69 | try: |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 70 | opts, args = getopt.getopt(sys.argv[1:], \ |
| 71 | 'M:dlm:nqr:s:tx:y:w:h:b:') |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 72 | except getopt.error, msg: |
| 73 | sys.stdout = sys.stderr |
| 74 | print 'Error:', msg, '\n' |
| 75 | help() |
| 76 | sys.exit(2) |
| 77 | |
| 78 | # Interpret options |
| 79 | try: |
| 80 | for opt, arg in opts: |
Guido van Rossum | e0be2b3 | 1992-09-01 14:45:57 +0000 | [diff] [blame] | 81 | if opt == '-M': magnify = float(eval(arg)) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 82 | if opt == '-d': debug = debug + 1 |
| 83 | if opt == '-l': looping = 1 |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 84 | if opt == '-m': mindelta = float(eval(arg)) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 85 | if opt == '-n': nowait = 1 |
| 86 | if opt == '-q': quiet = 1 |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 87 | if opt == '-r': regen = float(eval(arg)) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 88 | if opt == '-s': |
| 89 | try: |
| 90 | speed = float(eval(arg)) |
| 91 | except: |
| 92 | sys.stdout = sys.stderr |
| 93 | print 'Option -s needs float argument' |
| 94 | sys.exit(2) |
| 95 | if opt == '-t': |
| 96 | try: |
| 97 | import thread |
| 98 | threading = 1 |
| 99 | except ImportError: |
| 100 | print 'Sorry, this version of Python', |
| 101 | print 'does not support threads:', |
| 102 | print '-t ignored' |
| 103 | if opt == '-x': xoff = string.atoi(arg) |
| 104 | if opt == '-y': yoff = string.atoi(arg) |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 105 | if opt == '-w': xwsiz = string.atoi(arg) |
| 106 | if opt == '-h': ywsiz = string.atoi(arg) |
| 107 | if opt == '-b': |
| 108 | if arg == 'black': |
| 109 | bgcolor = (0,0,0) |
| 110 | elif arg == 'white': |
| 111 | bgcolor = (255,255,255) |
| 112 | else: |
| 113 | try: |
| 114 | bgcolor = eval(arg) |
| 115 | xxr, xxg, xxb = bgcolor |
| 116 | except: |
| 117 | print '-b needs (r,g,b) tuple' |
| 118 | sys.exit(2) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 119 | except string.atoi_error: |
| 120 | sys.stdout = sys.stderr |
Guido van Rossum | 42e9be4 | 1992-12-24 11:38:29 +0000 | [diff] [blame] | 121 | print 'Option', opt, 'requires integer argument' |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 122 | sys.exit(2) |
| 123 | |
| 124 | # Check validity of certain options combinations |
| 125 | if nowait and looping: |
| 126 | print 'Warning: -n and -l are mutually exclusive; -n ignored' |
| 127 | nowait = 0 |
| 128 | if xoff <> None and yoff == None: |
| 129 | print 'Warning: -x without -y ignored' |
| 130 | if xoff == None and yoff <> None: |
| 131 | print 'Warning: -y without -x ignored' |
| 132 | |
| 133 | # Process all files |
| 134 | if not args: args = ['film.video'] |
| 135 | sts = 0 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 136 | for filename in args: |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 137 | sts = (process(filename) or sts) |
| 138 | |
| 139 | # Exit with proper exit status |
| 140 | sys.exit(sts) |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 141 | |
| 142 | |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 143 | # Process one movie file |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 144 | |
| 145 | def process(filename): |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 146 | try: |
Guido van Rossum | 21a3ff9 | 1993-12-17 15:11:41 +0000 | [diff] [blame] | 147 | vin = VFile.VinFile(filename) |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 148 | except IOError, msg: |
| 149 | sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n') |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 150 | return 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 151 | except VFile.Error, msg: |
| 152 | sys.stderr.write(msg + '\n') |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 153 | return 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 154 | except EOFError: |
| 155 | sys.stderr.write(filename + ': EOF in video header\n') |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 156 | return 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 157 | |
| 158 | if not quiet: |
Guido van Rossum | e178332 | 1992-09-07 09:35:23 +0000 | [diff] [blame] | 159 | vin.printinfo() |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 160 | |
| 161 | gl.foreground() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 162 | |
Guido van Rossum | e0be2b3 | 1992-09-01 14:45:57 +0000 | [diff] [blame] | 163 | width, height = int(vin.width * magnify), int(vin.height * magnify) |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 164 | xborder = yborder = 0 |
| 165 | if xwsiz: |
| 166 | vin.xorigin = (xwsiz - width)/2 |
| 167 | width = xwsiz |
| 168 | if ywsiz: |
| 169 | vin.yorigin = (ywsiz - height)/2 |
| 170 | height = ywsiz |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 171 | if xoff <> None and yoff <> None: |
| 172 | scrheight = gl.getgdesc(GL.GD_YPMAX) |
| 173 | gl.prefposition(xoff, xoff+width-1, \ |
| 174 | scrheight-yoff-height, scrheight-yoff-1) |
| 175 | else: |
| 176 | gl.prefsize(width, height) |
| 177 | |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 178 | win = gl.winopen(filename) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 179 | gl.clear() |
| 180 | |
| 181 | if quiet: vin.quiet = 1 |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 182 | vin.initcolormap() |
| 183 | |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 184 | if bgcolor: |
| 185 | r, g, b = bgcolor |
| 186 | vin.clearto(r,g,b) |
| 187 | |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 188 | gl.qdevice(ESCKEY) |
| 189 | gl.qdevice(WINSHUT) |
| 190 | gl.qdevice(WINQUIT) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 191 | gl.qdevice(LEFTMOUSE) |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 192 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 193 | stop = 0 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 194 | |
| 195 | while not stop: |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 196 | gl.wintitle(filename) |
| 197 | stop = (playonce(vin) or nowait) |
| 198 | gl.wintitle('(done) ' + filename) |
| 199 | if not looping: |
| 200 | while not stop: |
| 201 | dev, val = gl.qread() |
Guido van Rossum | 2de9b68 | 1992-09-07 15:11:30 +0000 | [diff] [blame] | 202 | if dev == REDRAW: |
Jack Jansen | 772eca6 | 1993-01-27 11:42:21 +0000 | [diff] [blame] | 203 | if bgcolor: |
| 204 | r,g,b = bgcolor |
| 205 | vin.clearto(r,g,b) |
| 206 | else: |
| 207 | vin.clear() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 208 | if dev == LEFTMOUSE and val == 1: |
| 209 | break # Continue outer loop |
| 210 | if dev == ESCKEY and val == 1 or \ |
| 211 | dev in (WINSHUT, WINQUIT): |
| 212 | stop = 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 213 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 214 | # Set xoff, yoff for the next window from the current window |
| 215 | global xoff, yoff |
| 216 | xoff, yoff = gl.getorigin() |
| 217 | width, height = gl.getsize() |
| 218 | scrheight = gl.getgdesc(GL.GD_YPMAX) |
| 219 | yoff = scrheight - yoff - height |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 220 | gl.winclose(win) |
| 221 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 222 | return 0 |
| 223 | |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 224 | |
| 225 | # Play a movie once; return 1 if user wants to stop, 0 if not |
| 226 | |
| 227 | def playonce(vin): |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 228 | vin.rewind() |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 229 | vin.colormapinited = 1 |
| 230 | vin.magnify = magnify |
| 231 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 232 | if threading: |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 233 | MAXSIZE = 20 # Don't read ahead too much |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 234 | import thread |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 235 | import Queue |
Guido van Rossum | 21a3ff9 | 1993-12-17 15:11:41 +0000 | [diff] [blame] | 236 | queue = Queue.Queue(MAXSIZE) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 237 | stop = [] |
| 238 | thread.start_new_thread(read_ahead, (vin, queue, stop)) |
| 239 | # Get the read-ahead thread going |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 240 | while queue.qsize() < MAXSIZE/2 and not stop: |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 241 | time.sleep(0.100) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 242 | |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 243 | tin = 0 |
Guido van Rossum | e178332 | 1992-09-07 09:35:23 +0000 | [diff] [blame] | 244 | toffset = 0 |
| 245 | oldtin = 0 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 246 | told = 0 |
| 247 | nin = 0 |
| 248 | nout = 0 |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 249 | nlate = 0 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 250 | nskipped = 0 |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 251 | data = None |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 252 | |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 253 | tlast = t0 = time.time() |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 254 | |
| 255 | while 1: |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 256 | if gl.qtest(): |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 257 | dev, val = gl.qread() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 258 | if dev == ESCKEY and val == 1 or \ |
| 259 | dev in (WINSHUT, WINQUIT) or \ |
| 260 | dev == LEFTMOUSE and val == 1: |
| 261 | if debug: sys.stderr.write('\n') |
| 262 | if threading: |
| 263 | stop.append(None) |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 264 | while 1: |
| 265 | item = queue.get() |
| 266 | if item == None: break |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 267 | return (dev != LEFTMOUSE) |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 268 | if dev == REDRAW: |
| 269 | gl.reshapeviewport() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 270 | if data: vin.showframe(data, cdata) |
| 271 | if threading: |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 272 | if debug and queue.empty(): sys.stderr.write('.') |
| 273 | item = queue.get() |
| 274 | if item == None: break |
| 275 | tin, data, cdata = item |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 276 | else: |
| 277 | try: |
| 278 | tin, size, csize = vin.getnextframeheader() |
| 279 | except EOFError: |
| 280 | break |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 281 | tin = tin*0.001 |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 282 | nin = nin+1 |
Guido van Rossum | e178332 | 1992-09-07 09:35:23 +0000 | [diff] [blame] | 283 | if tin+toffset < oldtin: |
| 284 | print 'Fix reversed time:', oldtin, 'to', tin |
| 285 | toffset = oldtin - tin |
| 286 | tin = tin + toffset |
| 287 | oldtin = tin |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 288 | if regen: tout = nin * regen |
| 289 | else: tout = tin |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 290 | tout = tout / speed |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 291 | if tout - told < mindelta: |
| 292 | nskipped = nskipped + 1 |
Guido van Rossum | e178332 | 1992-09-07 09:35:23 +0000 | [diff] [blame] | 293 | if not threading: |
| 294 | vin.skipnextframedata(size, csize) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 295 | else: |
| 296 | if not threading: |
| 297 | try: |
| 298 | data, cdata = \ |
| 299 | vin.getnextframedata(size, csize) |
| 300 | except EOFError: |
| 301 | if not quiet: |
| 302 | print '[incomplete last frame]' |
| 303 | break |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 304 | now = time.time() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 305 | dt = (tout-told) - (now-tlast) |
| 306 | told = tout |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 307 | if debug: sys.stderr.write(`round(dt, 3)` + ' ') |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 308 | if dt < 0: nlate = nlate + 1 |
| 309 | if dt > 0: |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 310 | time.sleep(dt) |
| 311 | now = time.time() |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 312 | tlast = now |
| 313 | vin.showframe(data, cdata) |
| 314 | nout = nout + 1 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 315 | |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 316 | t1 = time.time() |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 317 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 318 | if debug: sys.stderr.write('\n') |
| 319 | |
| 320 | if quiet: return 0 |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 321 | |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 322 | print 'Recorded:', nin, 'frames in', round(tin, 3), 'sec.', |
| 323 | if tin: print '-- average', round(nin/tin, 1), 'frames/sec', |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 324 | print |
| 325 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 326 | if nskipped: print 'Skipped', nskipped, 'frames' |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 327 | |
| 328 | tout = t1-t0 |
| 329 | print 'Played:', nout, |
Guido van Rossum | 605909d | 1993-12-28 21:28:31 +0000 | [diff] [blame] | 330 | print 'frames in', round(tout, 3), 'sec.', |
| 331 | if tout: print '-- average', round(nout/tout, 1), 'frames/sec', |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 332 | print |
| 333 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 334 | if nlate: print 'There were', nlate, 'late frames' |
Guido van Rossum | 78aab86 | 1992-08-20 11:52:42 +0000 | [diff] [blame] | 335 | |
| 336 | return 0 |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 337 | |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 338 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 339 | # Read-ahead thread |
| 340 | |
| 341 | def read_ahead(vin, queue, stop): |
| 342 | try: |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 343 | while not stop: queue.put(vin.getnextframe()) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 344 | except EOFError: |
Guido van Rossum | 9ee7e15 | 1992-08-25 12:29:30 +0000 | [diff] [blame] | 345 | pass |
| 346 | queue.put(None) |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 347 | stop.append(None) |
| 348 | |
| 349 | |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 350 | # Don't forget to call the main program |
| 351 | |
Guido van Rossum | e755aa5 | 1992-08-21 12:34:55 +0000 | [diff] [blame] | 352 | try: |
| 353 | main() |
| 354 | except KeyboardInterrupt: |
| 355 | print '[Interrupt]' |