| # Copy a video file, interactively, frame-by-frame. |
| |
| import sys |
| import getopt |
| from gl import * |
| from DEVICE import * |
| import VFile |
| import string |
| import imageop |
| |
| def report(time, iframe): |
| print 'Frame', iframe, ': t =', time |
| |
| def usage(): |
| sys.stderr.write('usage: Vcopy [-t type] [-m treshold] [-a] infile outfile\n') |
| sys.stderr.write('-t Convert to other type\n') |
| sys.stderr.write('-a Automatic\n') |
| sys.stderr.write('-m Convert grey to mono with treshold\n') |
| sys.stderr.write('-d Convert grey to mono with dithering\n') |
| sys.exit(2) |
| |
| def help(): |
| print 'Command summary:' |
| print 'n get next image from input' |
| print 'w write current image to output' |
| |
| def main(): |
| foreground() |
| opts, args = getopt.getopt(sys.argv[1:], 't:am:d') |
| if len(args) <> 2: |
| usage() |
| [ifile, ofile] = args |
| print 'open film ', ifile |
| ifilm = VFile.VinFile().init(ifile) |
| print 'open output ', ofile |
| ofilm = VFile.VoutFile().init(ofile) |
| |
| ofilm.setinfo(ifilm.getinfo()) |
| |
| use_grabber = 0 |
| continuous = 0 |
| tomono = 0 |
| tomonodither = 0 |
| for o, a in opts: |
| if o == '-t': |
| ofilm.format = a |
| use_grabber = 1 |
| if o == '-a': |
| continuous = 1 |
| if o == '-m': |
| if ifilm.format <> 'grey': |
| print '-m only supported for greyscale' |
| sys.exit(1) |
| tomono = 1 |
| treshold = string.atoi(a) |
| ofilm.format = 'mono' |
| if o == '-d': |
| if ifilm.format <> 'grey': |
| print '-m only supported for greyscale' |
| sys.exit(1) |
| tomonodither = 1 |
| ofilm.format = 'mono' |
| |
| ofilm.writeheader() |
| # |
| prefsize(ifilm.width, ifilm.height) |
| w = winopen(ifile) |
| qdevice(KEYBD) |
| qdevice(ESCKEY) |
| qdevice(WINQUIT) |
| qdevice(WINSHUT) |
| print 'qdevice calls done' |
| # |
| help() |
| # |
| time, data, cdata = ifilm.getnextframe() |
| ifilm.showframe(data, cdata) |
| iframe = 1 |
| report(time, iframe) |
| # |
| while 1: |
| if continuous: |
| dev = KEYBD |
| else: |
| dev, val = qread() |
| if dev in (ESCKEY, WINQUIT, WINSHUT): |
| break |
| if dev == REDRAW: |
| reshapeviewport() |
| elif dev == KEYBD: |
| if continuous: |
| c = '0' |
| else: |
| c = chr(val) |
| #XXX Debug |
| if c == 'R': |
| c3i(255,0,0) |
| clear() |
| if c == 'G': |
| c3i(0,255,0) |
| clear() |
| if c == 'B': |
| c3i(0,0,255) |
| clear() |
| if c == 'w' or continuous: |
| if use_grabber: |
| data, cdata = ofilm.grabframe() |
| if tomono: |
| data = imageop.grey2mono(data, \ |
| ifilm.width, ifilm.height, \ |
| treshold) |
| if tomonodither: |
| data = imageop.dither2mono(data, \ |
| ifilm.width, ifilm.height) |
| ofilm.writeframe(time, data, cdata) |
| print 'Frame', iframe, 'written.' |
| if c == 'n' or continuous: |
| try: |
| time,data,cdata = ifilm.getnextframe() |
| ifilm.showframe(data, cdata) |
| iframe = iframe+1 |
| report(time, iframe) |
| except EOFError: |
| print 'EOF' |
| if continuous: |
| break |
| ringbell() |
| elif dev == INPUTCHANGE: |
| pass |
| else: |
| print '(dev, val) =', (dev, val) |
| ofilm.close() |
| |
| main() |