mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			266 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			266 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
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()
 |