from gl import * from GL import * from DEVICE import * import time import sys import getopt import socket import posix import vtime # Preallocation parameter PREALLOC = 4 # Megabyte # Sync audio parameters SYNCPORT = 10000 CTLPORT = 10001 from vpregs import * class Struct(): pass epoch = Struct() def getvideosize(): w = getvideo(VP_WIDTH) h = getvideo(VP_HEIGHT) print 'WIDTH,HEIGHT:', w, h print 'GB{X,Y}ORG:', getvideo(VP_GBXORG), getvideo(VP_GBYORG) print 'FB{X,Y}ORG:', getvideo(VP_FBXORG), getvideo(VP_FBYORG) x = 0 y = 0 return x,y,w,h framelist = [] def prealloc(w, h): nbytes = w*h*4 limit = PREALLOC*1024*1024 total = 0 list = [] print 'Prealloc to', PREALLOC, 'Megabytes...' while total+nbytes <= limit: list.append('x'*nbytes) total = total + nbytes print 'Done.' def grabframe(f,x,y,w,h,pf): readsource(SRC_FRONT) if pf: w = w/pf*pf h = h/pf*pf data = lrectread(x,y,x+w-1,y+h-1) t = time.millitimer()-epoch.epoch framelist.append(data, t) readsource(SRC_FRAMEGRABBER) def saveframes(f, w, h, pf): for data, t in framelist: if pf: w = w/pf*pf h = h/pf*pf data = packrect(w,h,pf,data) f.write(`t` + ',' + `len(data)` + '\n') f.write(data) framelist[:] = [] def saveframe(f,x,y,w,h,pf, notime): readsource(SRC_FRONT) if pf: w = w/pf*pf h = h/pf*pf data = lrectread(x,y,x+w-1,y+h-1) if pf: data = packrect(w,h,pf,data) if notime: t = 0 else: t = time.millitimer()-epoch.epoch f.write(`t` + ',' + `len(data)` + '\n') f.write(data) readsource(SRC_FRAMEGRABBER) def drawframe(x,y,w,h,col): drawmode(OVERDRAW) color(col) bgnline() v2i(x-1,y-1) ; v2i(x+w,y-1); v2i(x+w,y+h); v2i(x-1,y+h); v2i(x-1,y-1) endline() drawmode(NORMALDRAW) def usage(): sys.stderr.write('Usage: camcorder ' + \ '[-c] [-p packfactor] [-a audiomachine [-s]] [outputfile]\n') sys.exit(2) def wrheader(f, w, h, pf): f.write('CMIF video 1.0\n') f.write(`w,h,pf` + '\n') print 'width,height,pf:', w, h, pf, if pf == 0: pf = 4 print '(i.e.,', w*h*pf, 'bytes/frame)' def main(): foreground() pf = 2 ausync = 0 austart = 0 optlist, args = getopt.getopt(sys.argv[1:],'ca:sp:') for opt, arg in optlist: if opt == '-c': pf = 0 elif opt == '-a': ausync = 1 aumachine = arg elif opt == '-s': austart = 1 elif opt == '-p': pf = int(eval(arg)) else: usage() if args: if len(args) > 1: print 'Too many arguments' usage() filename = args[0] else: filename = 'film.video' if austart: if not ausync: print 'Cannot use -s without -a' usage() print 'Starting audio recorder...' posix.system('rsh '+aumachine+' syncrecord '+socket.gethostname()+' &') if ausync: print 'Syncing to audio recorder...' globtime = vtime.VTime().init(1,aumachine,SYNCPORT) ctl = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ctl.bind((socket.gethostname(),CTLPORT)) aua = (socket.gethostbyname(aumachine), CTLPORT) print 'Done.' vidx, vidy, w, h = getvideosize() #prefsize(w,h) winx, winy = 1280-w-10, 1024-h-30 prefposition(winx,winx+w-1,winy,winy+h-1) win = winopen(filename) f = open(filename, 'w') w, h = getsize() realw, realh = w, h ####doublebuffer() RGBmode() gconfig() qdevice(LEFTMOUSE) qdevice(RKEY) qdevice(SKEY) qdevice(CKEY) qdevice(PKEY) qdevice(ESCKEY) qdevice(WINQUIT) qdevice(WINSHUT) inrunning = 1 outrunning = 0 stop = 'stop' readsource(SRC_FRAMEGRABBER) mousing = 0 epoch.epoch = time.millitimer() stoptime = epoch.epoch sizewritten = 0 x, y = realw/4, realh/4 w, h = w/2, h/2 prealloc(w, h) try: drawframe(x,y,w,h,1) nframe = 0 num = 0 while 1: insingle = 0 outsingle = 0 if mousing: drawframe(x,y,w,h,0) ox, oy = getorigin() if sizewritten: x = getvaluator(MOUSEX)-ox y = getvaluator(MOUSEY)-oy else: w = getvaluator(MOUSEX)-x-ox h = getvaluator(MOUSEY)-y-oy drawframe(x,y,w,h,1) if qtest() or \ not (mousing or inrunning or insingle or outrunning or outsingle): ev, val = qread() if ev == LEFTMOUSE and val == 1: drawframe(x,y,w,h,0) mousing = 1 ox, oy = getorigin() x = getvaluator(MOUSEX)-ox y = getvaluator(MOUSEY)-oy elif ev == LEFTMOUSE and val == 0: if h < 0: y, h = y+h, -h if w < 0: x, w = x+w, -w mousing = 0 if not sizewritten: wrheader(f, w, h, pf) sizewritten = 1 prealloc(w, h) elif ev == RKEY and val == 1: if not inrunning: ringbell() else: outrunning = 1 wasstopped = time.millitimer() - stoptime epoch.epoch = epoch.epoch + wasstopped nframe = 0 starttime = time.millitimer() if ausync: ctl.sendto(`(1,starttime)`, aua) elif ev == PKEY and val == 1 and outrunning: outrunning = 0 stoptime = time.millitimer() if ausync: ctl.sendto(`(0,stoptime)`, aua) fps = nframe * 1000.0 / (time.millitimer()-starttime) print 'Recorded', nframe, print 'frames at', 0.1*int(fps*10),'frames/sec' print 'Saving...' saveframes(f, w, h, pf) print 'Done.' elif ev == PKEY and val == 1 and not outrunning: outsingle = 1 elif ev == CKEY and val == 1: inrunning = 1 elif ev == SKEY and val == 1: if outrunning: ringbell() elif inrunning: inrunning = 0 else: insingle = 1 elif ev in (ESCKEY, WINQUIT, WINSHUT): if ausync: ctl.sendto(`(2,time.millitimer())`, aua) raise stop elif ev == REDRAW: drawframe(x,y,w,h,0) reshapeviewport() drawframe(x,y,w,h,1) if inrunning or insingle: if outrunning: rectcopy(vidx+x,vidy+y,vidx+x+w-1,vidy+y+h-1,x,y) else: rectcopy(vidx,vidy,vidx+realw-1,vidx+realh-1,0,0) ####swapbuffers() if outrunning or outsingle: nframe = nframe + 1 if not sizewritten: wrheader(f, w, h, pf) sizewritten = 1 if outrunning: grabframe(f, x, y, w, h, pf) else: saveframe(f, x, y, w, h, pf, outsingle) except stop: pass finally: drawmode(OVERDRAW) color(0) clear() main()