| # Copy a video file, interactively, frame-by-frame. |
| |
| import sys |
| import getopt |
| from gl import * |
| from DEVICE import * |
| |
| def loadframe(f, w, h, pf): |
| line = f.readline() |
| if not line or line = '\n': |
| raise EOFError |
| x = eval(line[:-1]) |
| if type(x) = type(0): |
| if pf: size = w*h*4 |
| else: size = w*h*pf |
| else: |
| time, size = x |
| data = f.read(size) |
| if len(data) <> size: |
| raise EOFError |
| if pf: |
| windata = unpackrect(w/pf, h/pf, 1, data) |
| rectzoom(pf, pf) |
| lrectwrite(0, 0, w/pf-1, h/pf-1, windata) |
| else: |
| lrectwrite(0, 0, w-1, h-1, data) |
| return time, data |
| |
| def report(time, iframe): |
| print 'Frame', iframe, ': t =', time |
| |
| def usage(): |
| sys.write('usage: vcopy infile outfile\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(): |
| opts, args = getopt.getopt(sys.argv[1:], '') |
| if len(args) <> 2: |
| usage() |
| [ifile, ofile] = args |
| ifp = open(ifile, 'r') |
| ofp = open(ofile, 'w') |
| # |
| line = ifp.readline() |
| if line[:4] = 'CMIF': |
| line = ifp.readline() |
| x = eval(line[:-1]) |
| if len(x) = 3: |
| w, h, pf = x |
| else: |
| w, h = x |
| pf = 2 |
| if pf: |
| w = (w/pf)*pf |
| h = (h/pf)*pf |
| # |
| ofp.write('CMIF video 1.0\n') |
| ofp.write(`w, h, pf` + '\n') |
| # |
| foreground() |
| prefsize(w, h) |
| wid = winopen(ifile + ' -> ' + ofile) |
| RGBmode() |
| gconfig() |
| qdevice(KEYBD) |
| qdevice(ESCKEY) |
| qdevice(WINQUIT) |
| qdevice(WINSHUT) |
| # |
| help() |
| # |
| time, data = loadframe(ifp, w, h, pf) |
| iframe = 1 |
| report(time, iframe) |
| # |
| while 1: |
| dev, val = qread() |
| if dev in (ESCKEY, WINQUIT, WINSHUT): |
| break |
| if dev = REDRAW: |
| reshapeviewport() |
| elif dev = KEYBD: |
| c = chr(val) |
| if c = 'n': |
| try: |
| time, data = loadframe(ifp, w, h, pf) |
| iframe = iframe+1 |
| report(time, iframe) |
| except EOFError: |
| print 'EOF' |
| ringbell() |
| elif c = 'w': |
| ofp.write(`time, len(data)` + '\n') |
| ofp.write(data) |
| print 'Frame', iframe, 'written.' |
| else: |
| print 'Character', `c`, 'ignored' |
| elif dev = INPUTCHANGE: |
| pass |
| else: |
| print '(dev, val) =', (dev, val) |
| |
| main() |