home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Demo / sgi / video / Vedit.py < prev    next >
Text File  |  1996-11-27  |  6KB  |  302 lines

  1. #! /usr/bin/env python
  2.  
  3. # Edit CMIF movies interactively -- copy one or more files to an output file
  4.  
  5.  
  6. # XXX To do:
  7. #
  8. # - convert between formats (grey, rgb, rgb8, ...)
  9. # - change size
  10. # - cut out a given area of the image
  11. # - change time base (a la Vtime)
  12.  
  13.  
  14. import sys
  15. import os
  16. import gl, GL, DEVICE
  17. import fl, FL
  18. import flp
  19. import Viewer
  20. import getopt
  21. import string
  22. import watchcursor
  23.  
  24. ARROW = 0
  25. WATCH = 1
  26. watchcursor.defwatch(WATCH)
  27.  
  28.  
  29. def main():
  30.     qsize = 40
  31.     opts, args = getopt.getopt(sys.argv[1:], 'q:')
  32.     for o, a in opts:
  33.         if o == '-q':
  34.             qsize = string.atoi(a)
  35.     ed = Editor(qsize)
  36.     if args[0:]:
  37.         ed.open_input(args[0])
  38.     if args[1:]:
  39.         ed.open_output(args[1])
  40.     while 1:
  41.         dummy = fl.do_forms()
  42.  
  43.  
  44. class Editor:
  45.  
  46.     def __init__(self, qsize):
  47.         self.qsize = qsize
  48.         self.vin = None
  49.         self.vout = None
  50.         self.ifile = ''
  51.         self.ofile = ''
  52.         formdef = flp.parse_form('VeditForm', 'form')
  53.         flp.create_full_form(self, formdef)
  54.         self.form.show_form(FL.PLACE_SIZE, FL.TRUE, 'Vedit')
  55.         fl.set_event_call_back(self.do_event)
  56.  
  57.     def do_event(self, dev, val):
  58.         if dev == DEVICE.REDRAW:
  59.             if self.vin:
  60.                 self.vin.redraw(val)
  61.             if self.vout:
  62.                 self.vout.redraw(val)
  63.  
  64.     def busy(self):
  65.         gl.winset(self.form.window)
  66.         gl.setcursor(WATCH, 0, 0)
  67.  
  68.     def ready(self):
  69.         gl.winset(self.form.window)
  70.         gl.setcursor(ARROW, 0, 0)
  71.  
  72.  
  73.     def iocheck(self):
  74.         self.msg('')
  75.         if self.vin == None and self.vout == None:
  76.             self.err('Please open input and output files first')
  77.             return 0
  78.         return self.icheck() and self.ocheck()
  79.  
  80.     def icheck(self):
  81.         self.msg('')
  82.         if self.vin == None:
  83.             self.err('Please open an input file first')
  84.             return 0
  85.         return 1
  86.  
  87.     def ocheck(self):
  88.         self.msg('')
  89.         if self.vout == None:
  90.             self.err('Please open an output file first')
  91.             return 0
  92.         return 1
  93.  
  94.  
  95.     def cb_in_new(self, *args):
  96.         self.msg('')
  97.         hd, tl = os.path.split(self.ifile)
  98.         filename = fl.file_selector('Input video file', hd, '', tl)
  99.         if not filename: return
  100.         self.open_input(filename)
  101.  
  102.     def cb_in_close(self, *args):
  103.         self.msg('')
  104.         self.close_input()
  105.  
  106.     def cb_in_skip(self, *args):
  107.         if not self.icheck(): return
  108.         if not self.vin.get(): self.err('End of input file')
  109.         self.ishow()
  110.  
  111.     def cb_in_back(self, *args):
  112.         if not self.icheck(): return
  113.         if not self.vin.backup(): self.err('Begin of input file')
  114.         self.ishow()
  115.  
  116.     def cb_in_slider(self, *args):
  117.         if not self.icheck(): return
  118.         left, pos, right = self.vin.qinfo()
  119.         i = int(self.in_slider.get_slider_value())
  120.         i = max(i, left)
  121.         i = min(i, right)
  122.         if i == pos: return
  123.         if not self.vin.seek(i):
  124.             self.err('Input seek failed')
  125.         self.ishow()
  126.  
  127.     def cb_in_rewind(self, *args):
  128.         if not self.icheck(): return
  129.         self.vin.rewind()
  130.         self.ishow()
  131.  
  132.  
  133.     def cb_copy(self, *args):
  134.         if not self.iocheck(): return
  135.         data = self.vin.get()
  136.         if not data:
  137.             self.err('End of input file')
  138.             self.ishow()
  139.             return
  140.         if self.vout.getinfo() <> self.vin.getinfo():
  141.             print 'Copying info...'
  142.             self.vout.setinfo(self.vin.getinfo())
  143.             if self.vin.format == 'compress':
  144.                 self.vout.setcompressheader(\
  145.                       self.vin.getcompressheader())
  146.         self.vout.put(data)
  147.         self.oshow()
  148.         self.ishow()
  149.  
  150.     def cb_uncopy(self, *args):
  151.         if not self.iocheck(): return
  152.         if not self.vout.backup():
  153.             self.err('Output buffer exhausted')
  154.             return
  155.         self.oshow()
  156.         if not self.vin.backup():
  157.             self.err('Begin of input file')
  158.             return
  159.         self.ishow()
  160.  
  161.  
  162.     def cb_out_new(self, *args):
  163.         self.msg('')
  164.         hd, tl = os.path.split(self.ofile)
  165.         filename = fl.file_selector('Output video file', hd, '', tl)
  166.         if not filename: return
  167.         self.open_output(filename)
  168.  
  169.     def cb_out_close(self, *args):
  170.         self.msg('')
  171.         self.close_output()
  172.  
  173.     def cb_out_skip(self, *args):
  174.         if not self.ocheck(): return
  175.         if not self.vout.forward(): self.err('Output buffer exhausted')
  176.         self.oshow()
  177.         
  178.     def cb_out_back(self, *args):
  179.         if not self.ocheck(): return
  180.         if not self.vout.backup(): self.err('Output buffer exhausted')
  181.         self.oshow()
  182.  
  183.     def cb_out_slider(self, *args):
  184.         if not self.ocheck(): return
  185.         i = int(self.out_slider.get_slider_value())
  186.         left, pos, right = self.vout.qinfo()
  187.         i = int(self.out_slider.get_slider_value())
  188.         i = max(i, left)
  189.         i = min(i, right)
  190.         if i == pos: return
  191.         if not self.vout.seek(i):
  192.             self.err('Output seek failed')
  193.         self.oshow()
  194.  
  195.     def cb_out_trunc(self, *arcs):
  196.         if not self.ocheck(): return
  197.         self.vout.trunc()
  198.         self.oshow()
  199.  
  200.     def cb_out_rewind(self, *args):
  201.         if not self.ocheck(): return
  202.         self.vout.rewind()
  203.         self.oshow()
  204.  
  205.  
  206.     def cb_quit(self, *args):
  207.         self.close_input()
  208.         self.close_output()
  209.         sys.exit(0)
  210.  
  211.  
  212.     def open_input(self, filename):
  213.         self.ifile = filename
  214.         basename = os.path.split(filename)[1]
  215.         title = 'in: ' + basename
  216.         try:
  217.             vin = Viewer.InputViewer(filename, title)
  218.         except:
  219.             self.err('Can\'t open input file', filename)
  220.             return
  221.         self.close_input()
  222.         self.vin = vin
  223.         self.in_file.label = basename
  224.         self.ishow()
  225.  
  226.     def close_input(self):
  227.         if self.vin:
  228.             self.busy()
  229.             self.msg('Closing input file...')
  230.             self.vin.close()
  231.             self.ready()
  232.         self.msg('')
  233.         self.vin = None
  234.         self.in_file.label = '(none)'
  235.         self.format('in')
  236.  
  237.     def ishow(self):
  238.         self.vin.show()
  239.         self.format('in')
  240.  
  241.     def open_output(self, filename):
  242.         self.ofile = filename
  243.         basename = os.path.split(filename)[1]
  244.         title = 'out: ' + basename
  245.         try:
  246.             vout = Viewer.OutputViewer(filename, \
  247.                 title, self.qsize)
  248.         except:
  249.             self.err('Can\'t open output file', filename)
  250.             return
  251.         self.close_output()
  252.         self.vout = vout
  253.         self.out_file.label = basename
  254.         if self.vin:
  255.             self.vout.setinfo(self.vin.getinfo())
  256.             self.oshow()
  257.  
  258.     def close_output(self):
  259.         if self.vout:
  260.             self.busy()
  261.             self.msg('Closing output file...')
  262.             self.vout.close()
  263.             self.ready()
  264.         self.msg('')
  265.         self.vout = None
  266.         self.out_file.label = '(none)'
  267.         self.format('out')
  268.  
  269.     def oshow(self):
  270.         self.vout.show()
  271.         self.format('out')
  272.  
  273.  
  274.     def msg(self, *args):
  275.         str = string.strip(string.join(args))
  276.         self.msg_area.label = str
  277.  
  278.     def err(self, *args):
  279.         gl.ringbell()
  280.         apply(self.msg, args)
  281.  
  282.     def format(self, io):
  283.         v = getattr(self, 'v' + io)
  284.         if v == None:
  285.             left = right = pos = 0
  286.         else:
  287.             left, pos, right = v.qinfo()
  288.         getattr(self, io + '_info1').label = `left`
  289.         getattr(self, io + '_info2').label = `pos`
  290.         getattr(self, io + '_info3').label = `right`
  291.         sl = getattr(self, io + '_slider')
  292.         self.form.freeze_form()
  293.         sl.set_slider_bounds(left, right)
  294.         sl.set_slider_value(pos)
  295.         self.form.unfreeze_form()
  296.  
  297.  
  298. try:
  299.     main()
  300. except KeyboardInterrupt:
  301.     print '[Interrupt]'
  302.