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 | # Print some info about a CMIF movie file |
| 4 | |
| 5 | |
| 6 | # Usage: |
| 7 | # |
Guido van Rossum | 4df20fa | 1992-09-29 17:07:10 +0000 | [diff] [blame] | 8 | # Vinfo [-d] [-q] [-s] [-t] [file] ... |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 9 | |
| 10 | |
| 11 | # Options: |
| 12 | # |
| 13 | # -d : print deltas between frames instead of frame times |
| 14 | # -q : quick: don't read the frames |
| 15 | # -s : don't print times (but do count frames and print the total) |
Guido van Rossum | 4df20fa | 1992-09-29 17:07:10 +0000 | [diff] [blame] | 16 | # -t : terse (one line/file, implies -s) |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 17 | # file ... : file(s) to inspect; default film.video |
| 18 | |
| 19 | |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 20 | import sys |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 21 | sys.path.append('/ufs/guido/src/video') |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 22 | import VFile |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 23 | import getopt |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 24 | import string |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 25 | |
| 26 | |
| 27 | # Global options |
| 28 | |
| 29 | short = 0 |
| 30 | quick = 0 |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 31 | delta = 0 |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 32 | terse = 0 |
| 33 | maxwidth = 10 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 34 | |
| 35 | |
| 36 | # Main program -- mostly command line parsing |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 37 | |
| 38 | def main(): |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 39 | global short, quick, delta, terse, maxwidth |
| 40 | try: |
| 41 | opts, args = getopt.getopt(sys.argv[1:], 'dqst') |
| 42 | except getopt.error, msg: |
| 43 | sys.stdout = sys.stderr |
| 44 | print msg |
| 45 | print 'usage: Vinfo [-d] [-q] [-s] [-t] [file] ...' |
| 46 | sys.exit(2) |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 47 | for opt, arg in opts: |
| 48 | if opt == '-q': |
| 49 | quick = 1 |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 50 | if opt == '-d': |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 51 | delta = 1 |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 52 | if opt == '-s': |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 53 | short = 1 |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 54 | if opt == '-t': |
| 55 | terse = short = 1 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 56 | if not args: |
| 57 | args = ['film.video'] |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 58 | for filename in args: |
| 59 | maxwidth = max(maxwidth, len(filename)) |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 60 | sts = 0 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 61 | for filename in args: |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 62 | if process(filename): |
| 63 | sts = 1 |
| 64 | sys.exit(sts) |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 65 | |
| 66 | |
| 67 | # Process one file |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 68 | |
| 69 | def process(filename): |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 70 | try: |
Guido van Rossum | 21a3ff9 | 1993-12-17 15:11:41 +0000 | [diff] [blame] | 71 | vin = VFile.RandomVinFile(filename) |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 72 | except IOError, msg: |
| 73 | sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n') |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 74 | return 1 |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 75 | except VFile.Error, msg: |
| 76 | sys.stderr.write(msg + '\n') |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 77 | return 1 |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 78 | except EOFError: |
| 79 | sys.stderr.write(filename + ': EOF in video file\n') |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 80 | return 1 |
| 81 | |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 82 | if terse: |
| 83 | print string.ljust(filename, maxwidth), |
| 84 | kbytes = (VFile.getfilesize(filename) + 1023) / 1024 |
| 85 | print string.rjust(`kbytes`, 5) + 'K', |
| 86 | print ' ', string.ljust(`vin.version`, 5), |
| 87 | print string.ljust(vin.format, 8), |
| 88 | print string.rjust(`vin.width`, 4), |
| 89 | print string.rjust(`vin.height`, 4), |
Guido van Rossum | 83c8144 | 1993-02-25 00:16:27 +0000 | [diff] [blame] | 90 | if type(vin.packfactor) == type(()): |
| 91 | xpf, ypf = vin.packfactor |
| 92 | s = string.rjust(`xpf`, 2) + ',' + \ |
| 93 | string.rjust(`ypf`, 2) |
Guido van Rossum | 4df20fa | 1992-09-29 17:07:10 +0000 | [diff] [blame] | 94 | else: |
Guido van Rossum | 83c8144 | 1993-02-25 00:16:27 +0000 | [diff] [blame] | 95 | s = string.rjust(`vin.packfactor`, 2) |
| 96 | if type(vin.packfactor) == type(0) and \ |
| 97 | vin.format not in ('rgb', 'jpeg') and \ |
| 98 | (vin.width/vin.packfactor) % 4 <> 0: |
| 99 | s = s + '! ' |
| 100 | else: |
| 101 | s = s + ' ' |
Guido van Rossum | 4df20fa | 1992-09-29 17:07:10 +0000 | [diff] [blame] | 102 | print s, |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 103 | sys.stdout.flush() |
| 104 | else: |
| 105 | vin.printinfo() |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 106 | |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 107 | if quick: |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 108 | if terse: |
| 109 | print |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 110 | vin.close() |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 111 | return 0 |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 112 | |
Guido van Rossum | 269b2a2 | 1992-09-08 15:04:01 +0000 | [diff] [blame] | 113 | try: |
| 114 | vin.readcache() |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 115 | if not terse: |
| 116 | print '[Using cached index]' |
Guido van Rossum | 269b2a2 | 1992-09-08 15:04:01 +0000 | [diff] [blame] | 117 | except VFile.Error: |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 118 | if not terse: |
| 119 | print '[Constructing index on the fly]' |
Guido van Rossum | 269b2a2 | 1992-09-08 15:04:01 +0000 | [diff] [blame] | 120 | |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 121 | if not short: |
Guido van Rossum | 7268c93 | 1992-08-18 21:11:18 +0000 | [diff] [blame] | 122 | if delta: |
| 123 | print 'Frame time deltas:', |
| 124 | else: |
| 125 | print 'Frame times:', |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 126 | |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 127 | n = 0 |
| 128 | t = 0 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 129 | told = 0 |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 130 | datasize = 0 |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 131 | while 1: |
| 132 | try: |
Guido van Rossum | 269b2a2 | 1992-09-08 15:04:01 +0000 | [diff] [blame] | 133 | t, ds, cs = vin.getnextframeheader() |
| 134 | vin.skipnextframedata(ds, cs) |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 135 | except EOFError: |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 136 | break |
Guido van Rossum | 269b2a2 | 1992-09-08 15:04:01 +0000 | [diff] [blame] | 137 | datasize = datasize + ds |
| 138 | if cs: datasize = datasize + cs |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 139 | if not short: |
| 140 | if n%8 == 0: |
| 141 | sys.stdout.write('\n') |
| 142 | if delta: |
| 143 | sys.stdout.write('\t' + `t - told`) |
| 144 | told = t |
| 145 | else: |
| 146 | sys.stdout.write('\t' + `t`) |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 147 | n = n+1 |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 148 | |
| 149 | if not short: print |
| 150 | |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 151 | if terse: |
| 152 | print string.rjust(`n`, 6), |
Guido van Rossum | 83c8144 | 1993-02-25 00:16:27 +0000 | [diff] [blame] | 153 | if t: print string.rjust(`int(n*10000.0/t)*0.1`, 5), |
| 154 | print |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 155 | else: |
| 156 | print 'Total', n, 'frames in', t*0.001, 'sec.', |
| 157 | if t: print '-- average', int(n*10000.0/t)*0.1, 'frames/sec', |
| 158 | print |
| 159 | print 'Total data', 0.1 * int(datasize / 102.4), 'Kbytes', |
| 160 | if t: |
| 161 | print '-- average', |
| 162 | print 0.1 * int(datasize / 0.1024 / t), 'Kbytes/sec', |
| 163 | print |
Guido van Rossum | dfb61fa | 1992-08-20 11:49:58 +0000 | [diff] [blame] | 164 | |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 165 | vin.close() |
Guido van Rossum | 9e3f335 | 1992-09-29 13:40:47 +0000 | [diff] [blame] | 166 | return 0 |
Guido van Rossum | 82534fd | 1992-08-18 17:01:02 +0000 | [diff] [blame] | 167 | |
| 168 | |
| 169 | # Don't forget to call the main program |
Guido van Rossum | 843d153 | 1992-08-18 14:16:12 +0000 | [diff] [blame] | 170 | |
Guido van Rossum | e0be2b3 | 1992-09-01 14:45:57 +0000 | [diff] [blame] | 171 | try: |
| 172 | main() |
| 173 | except KeyboardInterrupt: |
| 174 | print '[Interrupt]' |