cpython/Demo/sgi/video/Vinfo.py

175 lines
3.4 KiB
Python
Raw Normal View History

#! /ufs/guido/bin/sgi/python
1992-08-18 14:01:02 -03:00
# Print some info about a CMIF movie file
# Usage:
#
# Vinfo [-d] [-q] [-s] [-t] [file] ...
1992-08-18 14:01:02 -03:00
# 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)
1992-08-18 14:01:02 -03:00
# file ... : file(s) to inspect; default film.video
1992-08-18 11:16:12 -03:00
import sys
1992-08-18 14:01:02 -03:00
sys.path.append('/ufs/guido/src/video')
1992-08-18 11:16:12 -03:00
import VFile
1992-08-18 14:01:02 -03:00
import getopt
import string
1992-08-18 14:01:02 -03:00
# Global options
short = 0
quick = 0
delta = 0
terse = 0
maxwidth = 10
1992-08-18 14:01:02 -03:00
# Main program -- mostly command line parsing
1992-08-18 11:16:12 -03:00
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)
1992-08-18 14:01:02 -03:00
for opt, arg in opts:
if opt == '-q':
quick = 1
if opt == '-d':
delta = 1
if opt == '-s':
1992-08-18 14:01:02 -03:00
short = 1
if opt == '-t':
terse = short = 1
1992-08-18 14:01:02 -03:00
if not args:
args = ['film.video']
for filename in args:
maxwidth = max(maxwidth, len(filename))
sts = 0
1992-08-18 14:01:02 -03:00
for filename in args:
if process(filename):
sts = 1
sys.exit(sts)
1992-08-18 14:01:02 -03:00
# Process one file
1992-08-18 11:16:12 -03:00
def process(filename):
try:
vin = VFile.RandomVinFile(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()
1992-08-18 14:01:02 -03:00
if quick:
if terse:
print
1992-08-18 14:01:02 -03:00
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]'
1992-08-18 14:01:02 -03:00
if not short:
if delta:
print 'Frame time deltas:',
else:
print 'Frame times:',
1992-08-18 11:16:12 -03:00
n = 0
t = 0
1992-08-18 14:01:02 -03:00
told = 0
datasize = 0
1992-08-18 11:16:12 -03:00
while 1:
try:
t, ds, cs = vin.getnextframeheader()
vin.skipnextframedata(ds, cs)
1992-08-18 11:16:12 -03:00
except EOFError:
break
datasize = datasize + ds
if cs: datasize = datasize + cs
1992-08-18 14:01:02 -03:00
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`)
1992-08-18 11:16:12 -03:00
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
1992-08-18 14:01:02 -03:00
vin.close()
return 0
1992-08-18 14:01:02 -03:00
# Don't forget to call the main program
1992-08-18 11:16:12 -03:00
try:
main()
except KeyboardInterrupt:
print '[Interrupt]'