#! /ufs/guido/bin/sgi/python # Print some info about a CMIF movie file # Usage: # # Vinfo [-d] [-q] [-s] [-t] [file] ... # Options: # # -d : print deltas between frames instead of frame times # -q : quick: don't read the frames # -s : don't print times (but do count frames and print the total) # -t : terse (one line/file, implies -s) # file ... : file(s) to inspect; default film.video import sys sys.path.append('/ufs/guido/src/video') import VFile import getopt import string # Global options short = 0 quick = 0 delta = 0 terse = 0 maxwidth = 10 # Main program -- mostly command line parsing def main(): global short, quick, delta, terse, maxwidth try: opts, args = getopt.getopt(sys.argv[1:], 'dqst') except getopt.error, msg: sys.stdout = sys.stderr print msg print 'usage: Vinfo [-d] [-q] [-s] [-t] [file] ...' sys.exit(2) for opt, arg in opts: if opt == '-q': quick = 1 if opt == '-d': delta = 1 if opt == '-s': short = 1 if opt == '-t': terse = short = 1 if not args: args = ['film.video'] for filename in args: maxwidth = max(maxwidth, len(filename)) sts = 0 for filename in args: if process(filename): sts = 1 sys.exit(sts) # Process one file def process(filename): try: vin = VFile.RandomVinFile().init(filename) except IOError, msg: sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n') return 1 except VFile.Error, msg: sys.stderr.write(msg + '\n') return 1 except EOFError: sys.stderr.write(filename + ': EOF in video file\n') return 1 if terse: print string.ljust(filename, maxwidth), kbytes = (VFile.getfilesize(filename) + 1023) / 1024 print string.rjust(`kbytes`, 5) + 'K', print ' ', string.ljust(`vin.version`, 5), print string.ljust(vin.format, 8), print string.rjust(`vin.width`, 4), print string.rjust(`vin.height`, 4), if type(vin.packfactor) == type(()): xpf, ypf = vin.packfactor s = string.rjust(`xpf`, 2) + ',' + \ string.rjust(`ypf`, 2) else: s = string.rjust(`vin.packfactor`, 2) if type(vin.packfactor) == type(0) and \ vin.format not in ('rgb', 'jpeg') and \ (vin.width/vin.packfactor) % 4 <> 0: s = s + '! ' else: s = s + ' ' print s, sys.stdout.flush() else: vin.printinfo() if quick: if terse: print vin.close() return 0 try: vin.readcache() if not terse: print '[Using cached index]' except VFile.Error: if not terse: print '[Constructing index on the fly]' if not short: if delta: print 'Frame time deltas:', else: print 'Frame times:', n = 0 t = 0 told = 0 datasize = 0 while 1: try: t, ds, cs = vin.getnextframeheader() vin.skipnextframedata(ds, cs) except EOFError: break datasize = datasize + ds if cs: datasize = datasize + cs if not short: if n%8 == 0: sys.stdout.write('\n') if delta: sys.stdout.write('\t' + `t - told`) told = t else: sys.stdout.write('\t' + `t`) n = n+1 if not short: print if terse: print string.rjust(`n`, 6), if t: print string.rjust(`int(n*10000.0/t)*0.1`, 5), print else: print 'Total', n, 'frames in', t*0.001, 'sec.', if t: print '-- average', int(n*10000.0/t)*0.1, 'frames/sec', print print 'Total data', 0.1 * int(datasize / 102.4), 'Kbytes', if t: print '-- average', print 0.1 * int(datasize / 0.1024 / t), 'Kbytes/sec', print vin.close() return 0 # Don't forget to call the main program try: main() except KeyboardInterrupt: print '[Interrupt]'