]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Companion to rgb2video: convert cmif film file to rgb files
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 17 Feb 1993 15:52:56 +0000 (15:52 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 17 Feb 1993 15:52:56 +0000 (15:52 +0000)
Demo/sgi/video/video2rgb.py [new file with mode: 0755]

diff --git a/Demo/sgi/video/video2rgb.py b/Demo/sgi/video/video2rgb.py
new file mode 100755 (executable)
index 0000000..ab90484
--- /dev/null
@@ -0,0 +1,165 @@
+#! /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]'