cpython/Demo/sgi/video/video2rgb.py

166 lines
3.2 KiB
Python
Executable File

#! /ufs/guido/bin/sgi/python
# Play CMIF movie files
# Help function
def help():
print 'Usage: Vplay [options] [file] ...'
print
print 'Options:'
print '-q : quiet, no informative messages'
print '-m : create monochrome (greyscale) image files'
print '-f prefix : create image files with names "prefix000.rgb"'
print 'file ... : file(s) to play; default film.video'
# Imported modules
import sys
sys.path.append('/ufs/guido/src/video') # Increase chance of finding VFile
import VFile
import time
import getopt
import string
import imgfile
import imgconv
# Global options
quiet = 0
prefix = 'film'
seqno = 0
mono = 0
# Main program -- mostly command line parsing
def main():
global quiet, prefix, mono
# Parse command line
try:
opts, args = getopt.getopt(sys.argv[1:], 'qmf:')
except getopt.error, msg:
sys.stdout = sys.stderr
print 'Error:', msg, '\n'
help()
sys.exit(2)
# Interpret options
try:
for opt, arg in opts:
if opt == '-q': quiet = 1
if opt == '-f': prefix = arg
if opt == '-m': mono = 1
except string.atoi_error:
sys.stdout = sys.stderr
print 'Option', opt, 'requires integer argument'
sys.exit(2)
# Process all files
if not args: args = ['film.video']
sts = 0
for filename in args:
sts = (process(filename) or sts)
# Exit with proper exit status
sys.exit(sts)
# Process one movie file
def process(filename):
try:
vin = VFile.VinFile().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 header\n')
return 1
if not quiet:
vin.printinfo()
width, height = int(vin.width), int(vin.height)
try:
if mono:
cf = imgconv.getconverter(vin.format, 'grey')
else:
cf = imgconv.getconverter(vin.format, 'rgb')
except imgconv.error:
print 'Sorry, no converter available for type',vin.format
return
if mono:
depth = 1
else:
depth = 3
pf = testpackfactor(vin.packfactor)
if pf == None:
print 'Sorry, packfactor not supported:', vin.packfactor
convert(vin, cf, width, height, depth, pf)
def convert(vin, cf, width, height, depth, pf):
global seqno
while 1:
try:
time, data, cdata = vin.getnextframe()
except EOFError:
return
if cdata:
print 'Film contains chromdata!'
return
if pf:
data = applypackfactor(data, width, height, pf)
s = `seqno`
s = '0'*(4-len(s)) + s
fname = prefix + s + '.rgb'
seqno = seqno + 1
if not quiet:
print 'Writing',fname,'...'
imgfile.write(fname, data, width, height, depth)
def testpackfactor(pf):
if type(pf) == type(()):
xpf, ypf = pf
else:
if pf in (0, 1):
return 0
return None
if xpf <> 1:
return None
return pf
def applypackfactor(image, w, h, pf):
if type(pf) == type(()):
xpf, ypf = pf
else:
xpf = ypf = 1
rows = []
for i in range(0, (w*h+ypf-1)/abs(ypf), w):
rows.append(image[i:i+w])
if ypf < 0:
rows.reverse()
ypf = -ypf
image = ''
for i in range(0, h):
image = image + rows[i/ypf]
return image
# Don't forget to call the main program
try:
main()
except KeyboardInterrupt:
print '[Interrupt]'