blob: 0d9d29423c768ce15f41a89685ba5ddf844bfda5 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossum82534fd1992-08-18 17:01:02 +00002
3# Print some info about a CMIF movie file
4
5
6# Usage:
7#
Guido van Rossum4df20fa1992-09-29 17:07:10 +00008# Vinfo [-d] [-q] [-s] [-t] [file] ...
Guido van Rossum82534fd1992-08-18 17:01:02 +00009
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 Rossum4df20fa1992-09-29 17:07:10 +000016# -t : terse (one line/file, implies -s)
Guido van Rossum82534fd1992-08-18 17:01:02 +000017# file ... : file(s) to inspect; default film.video
18
19
Guido van Rossum843d1531992-08-18 14:16:12 +000020import sys
Guido van Rossum82534fd1992-08-18 17:01:02 +000021sys.path.append('/ufs/guido/src/video')
Guido van Rossum843d1531992-08-18 14:16:12 +000022import VFile
Guido van Rossum82534fd1992-08-18 17:01:02 +000023import getopt
Guido van Rossum9e3f3351992-09-29 13:40:47 +000024import string
Guido van Rossum82534fd1992-08-18 17:01:02 +000025
26
27# Global options
28
29short = 0
30quick = 0
Guido van Rossum7268c931992-08-18 21:11:18 +000031delta = 0
Guido van Rossum9e3f3351992-09-29 13:40:47 +000032terse = 0
33maxwidth = 10
Guido van Rossum82534fd1992-08-18 17:01:02 +000034
35
36# Main program -- mostly command line parsing
Guido van Rossum843d1531992-08-18 14:16:12 +000037
38def main():
Guido van Rossum9e3f3351992-09-29 13:40:47 +000039 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 Rossum82534fd1992-08-18 17:01:02 +000047 for opt, arg in opts:
48 if opt == '-q':
49 quick = 1
Guido van Rossum9e3f3351992-09-29 13:40:47 +000050 if opt == '-d':
Guido van Rossum7268c931992-08-18 21:11:18 +000051 delta = 1
Guido van Rossum9e3f3351992-09-29 13:40:47 +000052 if opt == '-s':
Guido van Rossum82534fd1992-08-18 17:01:02 +000053 short = 1
Guido van Rossum9e3f3351992-09-29 13:40:47 +000054 if opt == '-t':
55 terse = short = 1
Guido van Rossum82534fd1992-08-18 17:01:02 +000056 if not args:
57 args = ['film.video']
Guido van Rossum9e3f3351992-09-29 13:40:47 +000058 for filename in args:
59 maxwidth = max(maxwidth, len(filename))
Guido van Rossumdfb61fa1992-08-20 11:49:58 +000060 sts = 0
Guido van Rossum82534fd1992-08-18 17:01:02 +000061 for filename in args:
Guido van Rossumdfb61fa1992-08-20 11:49:58 +000062 if process(filename):
63 sts = 1
64 sys.exit(sts)
Guido van Rossum82534fd1992-08-18 17:01:02 +000065
66
67# Process one file
Guido van Rossum843d1531992-08-18 14:16:12 +000068
69def process(filename):
Guido van Rossum7268c931992-08-18 21:11:18 +000070 try:
Guido van Rossum21a3ff91993-12-17 15:11:41 +000071 vin = VFile.RandomVinFile(filename)
Guido van Rossum7268c931992-08-18 21:11:18 +000072 except IOError, msg:
73 sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n')
Guido van Rossumdfb61fa1992-08-20 11:49:58 +000074 return 1
Guido van Rossum7268c931992-08-18 21:11:18 +000075 except VFile.Error, msg:
76 sys.stderr.write(msg + '\n')
Guido van Rossumdfb61fa1992-08-20 11:49:58 +000077 return 1
Guido van Rossum7268c931992-08-18 21:11:18 +000078 except EOFError:
79 sys.stderr.write(filename + ': EOF in video file\n')
Guido van Rossumdfb61fa1992-08-20 11:49:58 +000080 return 1
81
Guido van Rossum9e3f3351992-09-29 13:40:47 +000082 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 Rossum83c81441993-02-25 00:16:27 +000090 if type(vin.packfactor) == type(()):
91 xpf, ypf = vin.packfactor
92 s = string.rjust(`xpf`, 2) + ',' + \
93 string.rjust(`ypf`, 2)
Guido van Rossum4df20fa1992-09-29 17:07:10 +000094 else:
Guido van Rossum83c81441993-02-25 00:16:27 +000095 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 Rossum4df20fa1992-09-29 17:07:10 +0000102 print s,
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000103 sys.stdout.flush()
104 else:
105 vin.printinfo()
Guido van Rossumdfb61fa1992-08-20 11:49:58 +0000106
Guido van Rossum82534fd1992-08-18 17:01:02 +0000107 if quick:
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000108 if terse:
109 print
Guido van Rossum82534fd1992-08-18 17:01:02 +0000110 vin.close()
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000111 return 0
Guido van Rossumdfb61fa1992-08-20 11:49:58 +0000112
Guido van Rossum269b2a21992-09-08 15:04:01 +0000113 try:
114 vin.readcache()
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000115 if not terse:
116 print '[Using cached index]'
Guido van Rossum269b2a21992-09-08 15:04:01 +0000117 except VFile.Error:
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000118 if not terse:
119 print '[Constructing index on the fly]'
Guido van Rossum269b2a21992-09-08 15:04:01 +0000120
Guido van Rossum82534fd1992-08-18 17:01:02 +0000121 if not short:
Guido van Rossum7268c931992-08-18 21:11:18 +0000122 if delta:
123 print 'Frame time deltas:',
124 else:
125 print 'Frame times:',
Guido van Rossumdfb61fa1992-08-20 11:49:58 +0000126
Guido van Rossum843d1531992-08-18 14:16:12 +0000127 n = 0
128 t = 0
Guido van Rossum82534fd1992-08-18 17:01:02 +0000129 told = 0
Guido van Rossumdfb61fa1992-08-20 11:49:58 +0000130 datasize = 0
Guido van Rossum843d1531992-08-18 14:16:12 +0000131 while 1:
132 try:
Guido van Rossum269b2a21992-09-08 15:04:01 +0000133 t, ds, cs = vin.getnextframeheader()
134 vin.skipnextframedata(ds, cs)
Guido van Rossum843d1531992-08-18 14:16:12 +0000135 except EOFError:
Guido van Rossum843d1531992-08-18 14:16:12 +0000136 break
Guido van Rossum269b2a21992-09-08 15:04:01 +0000137 datasize = datasize + ds
138 if cs: datasize = datasize + cs
Guido van Rossum82534fd1992-08-18 17:01:02 +0000139 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 Rossum843d1531992-08-18 14:16:12 +0000147 n = n+1
Guido van Rossumdfb61fa1992-08-20 11:49:58 +0000148
149 if not short: print
150
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000151 if terse:
152 print string.rjust(`n`, 6),
Guido van Rossum83c81441993-02-25 00:16:27 +0000153 if t: print string.rjust(`int(n*10000.0/t)*0.1`, 5),
154 print
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000155 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 Rossumdfb61fa1992-08-20 11:49:58 +0000164
Guido van Rossum82534fd1992-08-18 17:01:02 +0000165 vin.close()
Guido van Rossum9e3f3351992-09-29 13:40:47 +0000166 return 0
Guido van Rossum82534fd1992-08-18 17:01:02 +0000167
168
169# Don't forget to call the main program
Guido van Rossum843d1531992-08-18 14:16:12 +0000170
Guido van Rossume0be2b31992-09-01 14:45:57 +0000171try:
172 main()
173except KeyboardInterrupt:
174 print '[Interrupt]'