summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Demo/sgi/video/README56
-rwxr-xr-xDemo/sgi/video/cam.py129
-rwxr-xr-xDemo/sgi/video/camcorder.py197
-rwxr-xr-xDemo/sgi/video/squash.c120
-rwxr-xr-xDemo/sgi/video/squash2.c72
-rwxr-xr-xDemo/sgi/video/statit.py115
-rwxr-xr-xDemo/sgi/video/syncaudio.py94
-rwxr-xr-xDemo/sgi/video/tomono.c165
-rwxr-xr-xDemo/sgi/video/tv.py79
-rwxr-xr-xDemo/sgi/video/v2i.c63
-rwxr-xr-xDemo/sgi/video/video.py112
-rwxr-xr-xDemo/sgi/video/vinfo.py55
-rwxr-xr-xDemo/sgi/video/vtime.py106
13 files changed, 1363 insertions, 0 deletions
diff --git a/Demo/sgi/video/README b/Demo/sgi/video/README
new file mode 100644
index 0000000..8b87582
--- /dev/null
+++ b/Demo/sgi/video/README
@@ -0,0 +1,56 @@
+This directory contains Python and C code we wrote while we had a
+framegrabber board on loan from SGI.
+
+ --Guido and Jack
+
+cam.py network real-time tv broadcast; see tv.py
+ usage: cam [packfactor [host]]
+ specifying 'all' for host broadcasts
+
+camcorder.py record video movies or make snapshots (in movie format)
+ usage: camcorder [-c] [-a audiohost [-s]] [moviefile]
+ -c color (default b/w, packfactor = 2)
+ -a audiohost syncaudio is running on audiohost
+ -s start syncaudio (on audiohost)
+ moviefile (default film.video)
+ keyboard commands:
+ s stop grabbing (single step if already stopped)
+ c continuous grabbing
+ r start recording
+ p pause recording (record single frame if paused)
+ ESC quit
+
+statit.py various statistics operations on movie files
+
+syncaudio.py record audio synchronized with camcorder -a
+ usage: syncaudio videohost soundfile
+ soundfile format: 16 bits, 16khz, mono
+
+tv.py receiver for transmissions from cam.py
+
+video.py player for movies recorded by camcorder.py
+ usage: video [moviefile [soundfile]]
+ default moviefile is film.video
+ default sound is no sound
+
+vinfo.py print a summary of a movie file
+
+vtime.py virtual time module imported by syncaudio.py and camcorder.py
+
+
+These are C programs, either for efficiency or because they need to
+link with a C library.
+
+squash.c make a movie smaller by averaging pixels
+ usage: squash factor [bits] <moviefile >newmoviefile
+ factor x and y compression factor
+ bits #bits left per sample in result (default 8)
+
+squash2.c make a movie smaller by dropping pixels
+ usage: squash2 factor <moviefile >newmoviefile
+ factor x and y compression factor
+
+tomono.c like squash2 but outputs a monochrome movie
+
+v2i.c convert the first image of a movie file to SGI .rgb format
+ link with -limage
diff --git a/Demo/sgi/video/cam.py b/Demo/sgi/video/cam.py
new file mode 100755
index 0000000..f30e1e0
--- /dev/null
+++ b/Demo/sgi/video/cam.py
@@ -0,0 +1,129 @@
+import sys
+from socket import *
+from gl import *
+from GL import *
+from DEVICE import *
+from time import millitimer
+
+HS = 40 # Header size (must be same as in tv.py)
+
+# Rely on UDP packet (de)fragmentation for smoother images
+# (Changed for broadcast)
+MAX = 16000
+
+PF = 2 # Default packfactor
+
+# Default receiver station is voorn.
+# Kwik has no yellow pages, so...
+HOST = '192.16.201.121'
+PORT = 5555
+
+if sys.argv[1:]:
+ PF = eval(sys.argv[1])
+
+if sys.argv[2:]:
+ HOST = sys.argv[2]
+ if HOST = 'all':
+ HOST = '<broadcast>'
+ MAX = 1400
+
+PF2 = PF*PF
+
+def main():
+ centerx, centery = 400, 300
+
+ foreground()
+ wid = winopen('cam')
+ RGBmode()
+ doublebuffer()
+ gconfig()
+ qdevice(ESCKEY)
+
+ w, h = getsize()
+ ortho2(0, w, 0, h)
+ w = w/PF*PF
+ h = h/PF*PF
+
+ readsource(SRC_FRAMEGRABBER)
+
+ s = socket(AF_INET, SOCK_DGRAM)
+ if HOST = '<broadcast>':
+ s.allowbroadcast(1)
+ addr = HOST, PORT
+
+ bytesperline = w/PF2
+ linesperchunk = MAX/bytesperline
+ linesperchunk = linesperchunk/PF*PF
+ nchunks = (h+linesperchunk-1)/linesperchunk
+
+ print 'MAX=', MAX,
+ print 'linesperchunk=', linesperchunk,
+ print 'nchunks=', nchunks,
+ print 'w=', w, 'h=', h
+
+ x1, x2 = 0, w-1
+
+ t1 = millitimer()
+ nframes = 0
+ fps = 0
+
+ msg = ''
+
+ while 1:
+ while qtest():
+ dev, val = qread()
+ if dev = REDRAW:
+ reshapeviewport()
+ w, h = getsize()
+ ortho2(0, w, 0, h)
+ w = w/PF*PF
+ h = h/PF*PF
+
+ bytesperline = w/PF2
+ linesperchunk = MAX/bytesperline
+ linesperchunk = linesperchunk/PF*PF
+ nchunks = (h+linesperchunk-1)/linesperchunk
+
+ print 'MAX=', MAX,
+ print 'linesperchunk=', linesperchunk,
+ print 'nchunks=', nchunks,
+ print 'w=', w, 'h=', h
+
+ x1, x2 = 0, w-1
+
+ fps = 0
+
+ elif dev = ESCKEY:
+ winclose(wid)
+ return
+
+ readsource(SRC_FRAMEGRABBER)
+
+ nframes = nframes+1
+ if nframes >= fps:
+ t2 = millitimer()
+ if t2 <> t1:
+ fps = int(10000.0*nframes/(t2-t1)) * 0.1
+ msg = `fps` + ' frames/sec'
+ t1 = t2
+ nframes = 0
+
+ RGBcolor(255,255,255)
+ cmov2i(9,9)
+ charstr(msg)
+
+ swapbuffers()
+ rectcopy(centerx-w/2, centery-w/2, centerx+w/2, centery+w/2, 0, 0)
+
+ for i in range(nchunks):
+ y1 = i*linesperchunk
+ y2 = y1 + linesperchunk-1
+ if y2 >= h: y2 = h-1
+ data = lrectread(x1, y1, x2, y2)
+ data2 = packrect(x2-x1+1, y2-y1+1, PF, data)
+ prefix = `w, h, PF, x1, y1, x2, y2`
+ prefix = prefix + ' ' * (HS-len(prefix))
+ data3 = prefix + data2
+ s.sendto(data3, addr)
+
+main()
diff --git a/Demo/sgi/video/camcorder.py b/Demo/sgi/video/camcorder.py
new file mode 100755
index 0000000..a6b7f4a
--- /dev/null
+++ b/Demo/sgi/video/camcorder.py
@@ -0,0 +1,197 @@
+#!/ufs/guido/bin/sgi/python3.3
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+import getopt
+import socket
+import posix
+import vtime
+
+SYNCPORT = 10000
+CTLPORT = 10001
+
+VP_GBXORG = 0x1000001
+VP_GBYORG = 0x1000002
+VP_FBXORG = 0x1000003
+VP_FBYORG = 0x1000004
+VP_WIDTH = 0x1000005
+VP_HEIGHT = 0x1000006
+
+class Struct(): pass
+epoch = Struct()
+
+def getvideosize():
+ w = getvideo(VP_WIDTH)
+ h = getvideo(VP_HEIGHT)
+ print getvideo(VP_GBXORG), getvideo(VP_GBYORG)
+ print getvideo(VP_FBXORG), getvideo(VP_FBYORG)
+ x = 0
+ y = 0
+ return x,y,w,h
+def saveframe(f,x,y,w,h,pf, notime):
+ readsource(SRC_FRONT)
+ if pf:
+ w = w/pf*pf
+ h = h/pf*pf
+ data = None
+ 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 main():
+ foreground()
+ pf = 2
+ ausync = 0
+ austart = 0
+ optlist, args = getopt.getopt(sys.argv[1:],'ca:s')
+ for opt, arg in optlist:
+ if opt = '-c':
+ pf = 0
+ elif opt = '-a':
+ ausync = 1
+ aumachine = arg
+ elif opt = '-s':
+ austart = 1
+ else:
+ print 'Usage: camcorder [-c] [-a audiomachine [-s]]'
+ sys.exit(1)
+ if austart:
+ if not ausync:
+ print 'Cannot use -s without -a'
+ sys.exit(1)
+ 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)
+ win = winopen('Camcorder')
+ if len(args) > 1:
+ f = open(args, 'w')
+ else:
+ f = open('film.video', 'w')
+ w, h = getsize()
+ realw, realh = w, h
+ doublebuffer()
+ RGBmode()
+ gconfig()
+ qdevice(LEFTMOUSE)
+ qdevice(RKEY)
+ qdevice(SKEY)
+ qdevice(CKEY)
+ qdevice(PKEY)
+ qdevice(ESCKEY)
+ 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
+ drawframe(x,y,w,h,1)
+ nframe = 0
+ try:
+ 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():
+ 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:
+ mousing = 0
+ if not sizewritten:
+ f.write('CMIF video 1.0\n')
+ f.write(`w,h,pf` + '\n')
+ sizewritten = 1
+ if 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)
+ nf = nframe * 1000.0 / (time.millitimer()-starttime)
+ drawmode(OVERDRAW)
+ color(0)
+ clear()
+ color(1)
+ cmov2i(5,5)
+ charstr('Recorded ' + `nf` + ' frames/sec')
+ drawmode(NORMALDRAW)
+ 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 = ESCKEY:
+ if ausync:
+ ctl.sendto(`(2,time.millitimer())`, aua)
+ raise stop
+ if inrunning or insingle:
+ rectcopy(vidx,vidy,realw,realh,0,0)
+ swapbuffers()
+ if outrunning or outsingle:
+ nframe = nframe + 1
+ if not sizewritten:
+ f.write('CMIF video 1.0\n')
+ f.write(`w,h,pf` + '\n')
+ sizewritten = 1
+ saveframe(f, x, y, w, h, pf, outsingle)
+ except stop:
+ pass
+ drawmode(OVERDRAW)
+ color(0)
+ clear()
+#
+main()
diff --git a/Demo/sgi/video/squash.c b/Demo/sgi/video/squash.c
new file mode 100755
index 0000000..c045084
--- /dev/null
+++ b/Demo/sgi/video/squash.c
@@ -0,0 +1,120 @@
+#include <stdio.h>
+
+long *bm;
+long h, w;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+ char **argv;
+{
+ char lbuf[100];
+ int nh, nw;
+ int x, y, xi, yi;
+ int num;
+ int r, g, b;
+ long data;
+ long *nbm, *nbmp;
+ int i;
+ int bits, mask, roundbit, addbit;
+ int pf;
+ int newfmt = 0;
+
+ if( argc != 2 && argc != 3) {
+ fprintf(stderr, "Usage: squash factor [bits]\n");
+ exit(1);
+ }
+ factor = atoi(argv[1]);
+ if ( argc > 2 ) {
+ bits = atoi(argv[2]);
+ mask = (1 << bits) - 1;
+ mask <<= (8-bits);
+ roundbit = 1 << (7-bits);
+ addbit = 1 << (8-bits);
+ fprintf(stderr, "%x %x %x\n", mask, roundbit, addbit);
+ } else {
+ mask = 0xff;
+ roundbit = 0;
+ addbit = 0;
+ }
+ gets(lbuf);
+ if ( strncmp( lbuf, "CMIF", 4) == 0 ) {
+ newfmt = 1;
+ gets(lbuf);
+ if( sscanf(lbuf, "(%d,%d,%d)", &w, &h, &pf) != 3) {
+ fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+ exit(1);
+ }
+ if ( pf != 0 ) {
+ fprintf(stderr, "%s: packed file\n", argv[0]);
+ exit(1);
+ }
+ } else {
+ if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+ fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+ exit(1);
+ }
+ }
+ nh = h / factor;
+ nw = w / factor;
+ if ( newfmt )
+ printf("CMIF video 1.0\n(%d,%d,%d)\n", nw, nh, 0);
+ else
+ printf("(%d,%d)\n", nw, nh);
+ if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ while( !feof(stdin) ) {
+ gets(lbuf);
+ if ( feof(stdin) ) break;
+ puts(lbuf);
+ fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+ if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+ fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+ i, h*w*sizeof(long));
+ exit(1);
+ }
+ nbmp = nbm;
+ for( y=0; y<nh; y++) {
+ for ( x=0; x<nw; x++) {
+ r = g = b = 0;
+ num = 0;
+ for( xi=0; xi<factor; xi++ ) {
+ for(yi=0; yi<factor; yi++) {
+ if ( y*factor+yi < h && x*factor+xi < w ) {
+ num++;
+ data = BM(x,xi,y,yi);
+ r += R(data);
+ g += G(data);
+ b += B(data);
+ }
+ else fprintf(stderr, "skip %d %d %d %d\n", x, xi, y, yi);
+ }
+ }
+ r = r/num; g = g/num; b = b/num;
+ if ( (r & mask) != mask && ( r & roundbit) ) r += addbit;
+ if ( (g & mask) != mask && ( g & roundbit) ) g += addbit;
+ if ( (b & mask) != mask && ( b & roundbit) ) b += addbit;
+ data = COMP(r, g, b);
+ *nbmp++ = data;
+ }
+ }
+ if (nbmp - nbm != nh * nw ) fprintf(stderr, "%d %d\n", nbmp-nbm, nh*nw);
+ fprintf(stderr, "Writing %d\n", (nbmp-nbm)*sizeof(long));
+ fwrite(nbm, 1, (nbmp-nbm)*sizeof(long), stdout);
+ }
+ exit(0);
+}
diff --git a/Demo/sgi/video/squash2.c b/Demo/sgi/video/squash2.c
new file mode 100755
index 0000000..c4d03e9
--- /dev/null
+++ b/Demo/sgi/video/squash2.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+
+long *bm;
+long h, w;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+ char **argv;
+{
+ char lbuf[100];
+ int nh, nw;
+ int x, y, xi, yi;
+ int num;
+ int r, g, b;
+ long data;
+ long *nbm, *nbmp;
+ int i;
+
+ if( argc != 2) {
+ fprintf(stderr, "Usage: squash factor\n");
+ exit(1);
+ }
+ factor = atoi(argv[1]);
+ gets(lbuf);
+ if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+ fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+ exit(1);
+ }
+ nh = h / factor;
+ nw = w / factor;
+ printf("(%d,%d)\n", nw, nh);
+ if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ while( !feof(stdin) ) {
+ gets(lbuf);
+ if ( feof(stdin) ) break;
+ puts(lbuf);
+ fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+ if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+ fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+ i, h*w*sizeof(long));
+ exit(1);
+ }
+ nbmp = nbm;
+ for( y=0; y<nh; y++) {
+ for ( x=0; x<nw; x++) {
+ r = g = b = 0;
+ num = 0;
+ *nbmp++ = BM(x,0,y,0);
+ }
+ }
+ if (nbmp - nbm != nh * nw ) fprintf(stderr, "%d %d\n", nbmp-nbm, nh*nw);
+ fprintf(stderr, "Writing %d\n", (nbmp-nbm)*sizeof(long));
+ fwrite(nbm, 1, (nbmp-nbm)*sizeof(long), stdout);
+ }
+ exit(0);
+}
diff --git a/Demo/sgi/video/statit.py b/Demo/sgi/video/statit.py
new file mode 100755
index 0000000..360e49e
--- /dev/null
+++ b/Demo/sgi/video/statit.py
@@ -0,0 +1,115 @@
+import sys
+from time import millitimer
+
+def main():
+ filename = 'film2.video'
+ if sys.argv[1:]: filename = sys.argv[1]
+ f = open(filename, 'r')
+
+ line = f.readline()
+ w, h = eval(line[:-1])
+ w2, h2 = w/2, h/2
+ size = w2 * h2
+
+ data = data2 = t = t0 = t1 = None
+ nframes = 0
+ t0 = millitimer()
+ while 1:
+ line = f.readline()
+ if not line: break
+ t = eval(line[:-1])
+ data = None
+ data = f.read(size)
+ if len(data) <> size:
+ raise EOFError
+ dostat(w2, h2, data)
+ nframes = nframes+1
+ t1 = millitimer()
+
+ t = 0.001 * (t1-t0)
+ fps = 0.1 * int(10*nframes/t)
+ print nframes, 'frames in', t, 'sec. =', fps, 'frames/sec.'
+
+def dostat(w, h, data):
+ print
+ stat3(w, h, data)
+
+# Statistic op 1: frequencies of byte values
+def stat1(w, h, data):
+ bins = [0]*256
+ for c in data:
+ i = ord(c)
+ bins[i] = bins[i]+1
+ prbins(bins)
+
+def prbins(bins):
+ import string
+ s = ''
+ tot = 0
+ for i in range(256):
+ tot = tot + bins[i]
+ s = s + string.rjust(`bins[i]`, 4)
+ if len(s) >= 4*16:
+ print s, string.rjust(`tot`, 7)
+ s = ''
+ tot = 0
+
+# Statistic op 2: run lengths
+def stat2(w, h, data):
+ runs = []
+ for y in range(h):
+ count, value = 0, ord(data[y*w])
+ for c in data[y*w : y*w+w]:
+ i = ord(c)
+ if i <> value:
+ runs.append(count, value)
+ count, value = 0, i
+ count = count+1
+ runs.append(count, value)
+ print len(runs), 'runs =', 0.1 * (10*w*h/len(runs)), 'bytes/run'
+
+# Statistic op 3: frequencies of byte differences
+def stat3(w, h, data):
+ bins = [0]*256
+ prev = 0
+ for c in data:
+ i = ord(c)
+ delta = divmod(i-prev, 256)[1]
+ prev = i
+ bins[delta] = bins[delta]+1
+ prbins(bins)
+
+# Try packing
+def packblock(w, h, data):
+ res = ''
+ for y in range(h):
+ res = res + packline(data[y*w : y*w+w])
+ return res
+
+def packline(line):
+ bytes = []
+ for c in line:
+ bytes.append(ord(c))
+ prev = bytes[0]
+ i, n = 1, len(bytes)
+ while i < n:
+ for pack in (0, 2, 4, 8):
+ if pack = 0:
+ lo, hi = 0, 0
+ else:
+ hi = pow(2, pack-1)-1
+ lo = -hi-1
+ p = prev
+ j = i
+ count = 0
+ while j < n:
+ x = bytes[j]
+ delta = byte(x-p)
+ if not lo <= delta <= hi:
+ break
+ p = x
+ j = j+1
+
+def byte(x): return divmod(x, 256)[1]
+
+main()
diff --git a/Demo/sgi/video/syncaudio.py b/Demo/sgi/video/syncaudio.py
new file mode 100755
index 0000000..742a433
--- /dev/null
+++ b/Demo/sgi/video/syncaudio.py
@@ -0,0 +1,94 @@
+import AL
+import al
+import sys
+import vtime
+import socket
+import time
+
+
+SLEEPTIME = 500 # 500 ms sleeps
+SAMPLEFREQ = 16000 # 16Khz samples
+SAMPLERATE = AL.RATE_16000
+NEEDBUFFERED = SAMPLEFREQ # Buffer 1 second of sound
+BUFFERSIZE = NEEDBUFFERED*4 # setqueuesize() par for 2 second sound
+
+AVSYNCPORT = 10000 # Port for time syncing
+AVCTLPORT = 10001 # Port for record start/stop
+
+def main():
+ if len(sys.argv) <> 3:
+ print 'Usage: ', sys.argv[0], 'videohostname soundfile'
+ sys.exit(1)
+ #
+ ofile = open(sys.argv[2], 'w')
+ #
+ globaltime = vtime.VTime().init(0,sys.argv[1],AVSYNCPORT)
+ #
+ ctl = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
+ ctl.bind((socket.gethostname(),AVCTLPORT))
+ #
+ inp = openmic()
+ #
+ out = 0 # Open aiff file
+ #
+ while 1:
+ if mainloop(None, ctl, inp, out, globaltime):
+ break
+ if mainloop(ofile, ctl, inp, out, globaltime):
+ break
+ pass # Close aiff file
+ sys.exit(0)
+#
+def openmic():
+ conf = al.newconfig()
+ conf.setqueuesize(BUFFERSIZE)
+ conf.setwidth(AL.SAMPLE_16)
+ conf.setchannels(AL.MONO)
+ return al.openport('micr','r',conf)
+#
+def mainloop(ofile, ctl, inp, out, globaltime):
+ #
+ # Wait for sync packet, keeping 1-2 seconds of sound in the
+ # buffer
+ #
+ totsamps = 0
+ totbytes = 0
+ starttime = time.millitimer()
+ while 1:
+ time.millisleep(SLEEPTIME)
+ if ctl.avail():
+ break
+ nsamples = inp.getfilled()-NEEDBUFFERED
+ if nsamples>0:
+ data = inp.readsamps(nsamples)
+ totsamps = totsamps + nsamples
+ totbytes = totbytes + len(data)
+ if ofile <> None:
+ ofile.write(data)
+ #
+ # Compute his starttime and the timestamp of the first byte in the
+ # buffer. Discard all buffered data upto his starttime
+ #
+ startstop,histime = eval(ctl.recv(100))
+ if (ofile = None and startstop = 0) or \
+ (ofile <> None and startstop = 1):
+ print 'Sync error: saving=',save,' request=',startstop
+ sys.exit(1)
+ filllevel = inp.getfilled()
+ filltime = time.millitimer()
+ filltime = filltime - filllevel / (SAMPLEFREQ/1000)
+ starttime = globaltime.his2mine(histime)
+ nsamples = starttime - filltime
+ if nsamples < 0:
+ print 'Start/stop signal came too late'
+ sys.exit(1)
+ nsamples = nsamples * (SAMPLEFREQ / 1000)
+ data = inp.readsamps(nsamples)
+ totsamps = totsamps + nsamples
+ totbytes = totbytes + len(data)
+ print 'Time: ', time.millitimer()-starttime, ', Bytes: ', totbytes, ', Samples: ', totsamps
+ if ofile <> None:
+ ofile.write(data)
+ return (startstop = 2)
+
+main()
diff --git a/Demo/sgi/video/tomono.c b/Demo/sgi/video/tomono.c
new file mode 100755
index 0000000..546af68
--- /dev/null
+++ b/Demo/sgi/video/tomono.c
@@ -0,0 +1,165 @@
+#include <stdio.h>
+
+long *bm;
+long *nbm;
+long h, w;
+int nh, nw;
+long factor;
+
+#define OC(x,xi) ((x)*factor+(xi))
+#define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
+
+#define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+#define CHOICEFUNC(np1, np2) ( random() & 1 )
+
+int inlevels = 3*255;
+int outlevels = 1;
+
+main(argc, argv)
+ char **argv;
+{
+ char lbuf[100];
+ int x, y, xi, yi;
+ int num;
+ int r, g, b;
+ long data;
+ int i;
+ double greyness;
+ int inpixels, outpixels;
+ int resid;
+
+ setvbuf(stdout, 0, _IOFBF, 1024*128);
+ if( argc != 2) {
+ fprintf(stderr, "Usage: tomono factor\n");
+ exit(1);
+ }
+ factor = atoi(argv[1]);
+ gets(lbuf);
+ if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+ fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+ exit(1);
+ }
+ nh = h / factor;
+ nw = w / factor;
+ printf("(%d,%d)\n", nw, nh);
+ if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
+ fprintf(stderr, "%s: No memory\n", argv[0]);
+ exit(1);
+ }
+ while( !feof(stdin) ) {
+ gets(lbuf);
+ if ( feof(stdin) ) break;
+ puts(lbuf);
+ fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
+ if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
+ fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
+ i, h*w*sizeof(long));
+ exit(1);
+ }
+ /*
+ ** Compute picture blackness.
+ */
+ inpixels = 0;
+ inpixels = countpixels(0,0,w,h);
+ greyness = (double)inpixels/(h*w*inlevels);
+ fprintf(stderr, "%3.1f%% grey\n", 100.0*greyness);
+ outpixels = (int)(greyness*outlevels*nh*nw);
+ fprintf(stderr, "Inpixels: %d (%d) Outpixels %d\n", inpixels, inpixels/inlevels, outpixels);
+ resid = fillpixels(0,0,nw,nh,0,0,w,h,outpixels);
+ if ( resid > 1 ) fprintf(stderr, "Residue: %d pixels\n", resid);
+ fprintf(stderr, "Writing %d\n", (nh*nw)*sizeof(long));
+ fwrite(nbm, 1, (nh*nw)*sizeof(long), stdout);
+ }
+ exit(0);
+}
+
+countpixels(x0,y0,x1,y1)
+{
+ int x, y, tot, data;
+
+ tot = 0;
+ for( y=y0; y<y1; y++)
+ for(x=x0; x<x1; x++) {
+ data = bm[y*w+x];
+ tot += R(data);
+ tot += G(data);
+ tot += B(data);
+ }
+ return tot;
+}
+
+fillpixels(x0,y0,x1,y1,ox0,oy0,ox1,oy1,npixels)
+{
+ int m, om, p1, p2, np1, np2, rp, resid;
+
+ if ( npixels == 0 ) return 0;
+ if ( x0+1 >= x1 && y0+1 >= y1 ) {
+ if ( npixels ) {
+ nbm[y0*nw+x0] = 0xffffff;
+/* fprintf(stderr, "->%d,%d\n", x0,y0); */
+ return npixels - 1;
+ }
+ return 0;
+ }
+ if ( x1-x0 < y1-y0 ) {
+ if ( y1 - y0 <= 2 )
+ m = y0 + 1;
+ else
+ m = y0+1+(random()%(y1-y0-1));
+/* fprintf(stderr,"%d,%d %d,%d Y %d\n", x0, x1, y0, y1, m); */
+ /* om = (oy0+oy1)/2; */ om = m;
+ p1 = countpixels(ox0,oy0,ox1,om);
+ p2 = countpixels(ox0,om,ox1,oy1);
+ np1 = (int)(((float)p1/(p1+p2))*npixels);
+ np2 = (int)(((float)p2/(p1+p2))*npixels);
+ rp = npixels - np1 - np2;
+ if ( rp ) {
+ np1 += rp/2;
+ rp = rp - rp/2;
+ np2 += rp;
+ }
+ resid = 0;
+ if ( CHOICEFUNC(np1, np2) ) {
+ resid = fillpixels(x0,y0,x1,m,ox0,oy0,ox1,om,np1+resid);
+ resid = fillpixels(x0,m,x1,y1,ox0,om,ox1,oy1,np2+resid);
+ } else {
+ resid = fillpixels(x0,m,x1,y1,ox0,om,ox1,oy1,np2+resid);
+ resid = fillpixels(x0,y0,x1,m,ox0,oy0,ox1,om,np1+resid);
+ }
+ } else {
+ if ( x1 - x0 <= 2 )
+ m = x0 + 1;
+ else
+ m = x0+1+(random()%(x1-x0-1));
+/* fprintf(stderr,"%d,%d %d,%d X %d\n", x0, x1, y0, y1, m); */
+ /* om = (ox0+ox1)/2; */ om = m;
+ p1 = countpixels(ox0,oy0,om,oy1);
+ p2 = countpixels(om,oy0,ox1,oy1);
+ np1 = (int)(((float)p1/(p1+p2))*npixels);
+ np2 = (int)(((float)p2/(p1+p2))*npixels);
+ rp = npixels - np1 - np2;
+ if ( rp ) {
+ np1 += rp/2;
+ rp = rp - rp/2;
+ np2 += rp;
+ }
+ resid = 0;
+ if ( CHOICEFUNC(np1, np2) ) {
+ resid = fillpixels(x0,y0,m,y1,ox0,oy0,om,oy1,np1+resid);
+ resid = fillpixels(m,y0,x1,y1,om,oy0,ox1,oy1,np2+resid);
+ } else {
+ resid = fillpixels(m,y0,x1,y1,om,oy0,ox1,oy1,np2+resid);
+ resid = fillpixels(x0,y0,m,y1,ox0,oy0,om,oy1,np1+resid);
+ }
+ }
+ return resid;
+}
diff --git a/Demo/sgi/video/tv.py b/Demo/sgi/video/tv.py
new file mode 100755
index 0000000..621740c
--- /dev/null
+++ b/Demo/sgi/video/tv.py
@@ -0,0 +1,79 @@
+import string
+
+from socket import *
+from gl import *
+from GL import *
+from DEVICE import *
+from time import millisleep, millitimer
+
+PORT = 5555
+
+PF = 2 # packfactor
+HS = 40 # Header size
+
+def testimage():
+ RGBcolor(0, 0, 0)
+ clear()
+ RGBcolor(0, 255, 0)
+ cmov2i(10, 10)
+ charstr('Waiting...')
+
+def reshape():
+ reshapeviewport()
+ w, h = getsize()
+ ortho2(0, w, 0, h)
+ testimage()
+ return w, h
+
+def main():
+ s = socket(AF_INET, SOCK_DGRAM)
+ s.bind('', PORT)
+
+ foreground()
+ wid = winopen('tv')
+ RGBmode()
+ gconfig()
+ qdevice(ESCKEY)
+
+ oldw, oldh = getsize()
+ ortho2(0, oldw, 0, oldh)
+ testimage()
+
+ t1 = millitimer()
+
+ while 1:
+ if qtest():
+ dev, val = qread()
+ if dev = ESCKEY:
+ winclose(wid)
+ return
+ elif dev = REDRAW:
+ oldw, oldh = reshape()
+ elif s.avail():
+ data = s.recv(17000)
+ header = string.strip(data[:HS])
+ w, h, pf, x1, y1, x2, y2 = eval(header)
+ if (w, h) <> (oldw, oldh):
+ x, y = getorigin()
+ x, y = x-1, y+21 # TWM correction
+ winposition(x, x+w-1, y+oldh-h, y+oldh-1)
+ oldw, oldh = reshape()
+ data2 = data[HS:]
+ dx = (x2-x1+1)/pf
+ dy = (y2-y1+1)/pf
+ data3 = unpackrect(dx, dy, 1, data2)
+ rectzoom(pf, pf)
+ lrectwrite(x1, y1, x1+dx-1, y1+dy-1, data3)
+ t1 = millitimer()
+ else:
+ t2 = millitimer()
+ if t2-t1 >= 5000:
+ testimage()
+ t1 = t2
+ else:
+ millisleep(10)
+
+ winclose(wid)
+ return data
+
+main()
diff --git a/Demo/sgi/video/v2i.c b/Demo/sgi/video/v2i.c
new file mode 100755
index 0000000..41589d4
--- /dev/null
+++ b/Demo/sgi/video/v2i.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <gl/image.h>
+
+long bm[1280];
+short rb[1280], gb[1280], bb[1280];
+long h, w;
+
+#define R(comp) ((comp) & 0xff)
+#define G(comp) (((comp)>>8) & 0xff)
+#define B(comp) (((comp)>>16) & 0xff)
+
+main(argc, argv)
+ char **argv;
+{
+ char lbuf[100];
+ int x, y;
+ int i;
+ IMAGE * of;
+ int pmask;
+
+ if( argc != 3 && argc != 4) {
+ fprintf(stderr, "Usage: v2i videofile imgfile [planemask]\n");
+ exit(1);
+ }
+ if ( argc == 4)
+ pmask = atoi(argv[3]);
+ else
+ pmask = 7;
+ if ( freopen(argv[1], "r", stdin) == NULL ) {
+ perror(argv[1]);
+ exit(1);
+ }
+ gets(lbuf);
+ if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
+ fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
+ exit(1);
+ }
+ gets(lbuf); /* Skip time info */
+ if ( w > 1280 ) {
+ fprintf(stderr, "%s: Sorry, too wide\n", argv[0]);
+ exit(1);
+ }
+ if ( (of=iopen(argv[2], "w", RLE(1), 3, w, h, 3)) == 0) {
+ perror(argv[2]);
+ exit(1);
+ }
+ for( y=0; y<h; y++) {
+ if( fread(bm, sizeof(long), w, stdin) != w) {
+ fprintf(stderr, "%s: short read\n", argv[0]);
+ exit(1);
+ }
+ for( x=0; x<w; x++) {
+ if ( pmask & 1) rb[x] = R(bm[x]);
+ if ( pmask & 2) gb[x] = G(bm[x]);
+ if ( pmask & 4) bb[x] = B(bm[x]);
+ }
+ putrow(of, rb, y, 0);
+ putrow(of, gb, y, 1);
+ putrow(of, bb, y, 2);
+ }
+ iclose(of);
+ exit(0);
+}
diff --git a/Demo/sgi/video/video.py b/Demo/sgi/video/video.py
new file mode 100755
index 0000000..05c6794
--- /dev/null
+++ b/Demo/sgi/video/video.py
@@ -0,0 +1,112 @@
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+import al
+import AL
+
+BUFFERSIZE = 32000
+
+class Struct(): pass
+epoch = Struct()
+EndOfFile = 'End of file'
+bye = 'bye'
+
+def openspkr():
+ conf = al.newconfig()
+ conf.setqueuesize(BUFFERSIZE)
+ conf.setwidth(AL.SAMPLE_16)
+ conf.setchannels(AL.MONO)
+ return al.openport('spkr','w',conf)
+def openvideo(name):
+ f = open(name, 'r')
+ line = f.readline()
+ if not line: raise EndOfFile
+ if line[:4] = 'CMIF': line = f.readline()
+ x = eval(line[:-1])
+ if len(x) = 3: w, h, pf = x
+ else: w, h = x; pf = 2
+ return f, w, h, pf
+def loadframe(f,w,h,pf,af,spkr):
+ line = f.readline()
+ if line = '':
+ raise EndOfFile
+ x = eval(line[:-1])
+ if type(x) = type(0) or type(x) = type(0.0):
+ tijd = x
+ if pf = 0:
+ size = w*h*4
+ else:
+ size = (w/pf) * (h/pf)
+ else:
+ tijd, size = x
+ data = f.read(size)
+ if len(data) <> size:
+ raise EndOfFile
+ if pf:
+ rectzoom(pf, pf)
+ w = w/pf
+ h = h/pf
+ data = unpackrect(w, h, 1, data)
+ lrectwrite(0,0,w-1,h-1,data)
+ # This is ugly here, but the only way to get the two
+ # channels started in sync
+ #if af <> None:
+ # playsound(af,spkr)
+ ct = time.millitimer() - epoch.epoch
+ if tijd > 0 and ct < tijd:
+ time.millisleep(tijd-ct)
+ swapbuffers()
+ return tijd
+def playsound(af, spkr):
+ nsamp = spkr.getfillable()
+ data = af.read(nsamp*2)
+ spkr.writesamps(data)
+def main():
+ if len(sys.argv) > 1:
+ f, w, h, pf = openvideo(sys.argv[1])
+ else:
+ f, w, h, pf = openvideo('film.video')
+ af = None
+ spkr = None
+ if len(sys.argv) > 2:
+ af = open(sys.argv[2], 'r')
+ spkr = openspkr()
+ if len(sys.argv) > 3:
+ data = af.read(eval(sys.argv[3]))
+ del data
+ foreground()
+ prefsize(w,h)
+ win = winopen('Video player')
+ RGBmode()
+ doublebuffer()
+ gconfig()
+ qdevice(ESCKEY)
+ running = 1
+ epoch.epoch = time.millitimer()
+ nframe = 0
+ tijd = 1
+ try:
+ while 1:
+ if running:
+ try:
+ tijd = loadframe(f, w, h, pf, af, spkr)
+ nframe = nframe + 1
+ except EndOfFile:
+ running = 0
+ t = time.millitimer()
+ if tijd > 0:
+ print 'Recorded at ', nframe * 1000.0 / tijd,
+ print 'frames/second (', tijd, 'ms total)'
+ print 'Played at', nframe * 1000.0 / (t-epoch.epoch),
+ print 'frames/second'
+ if af <> None:
+ playsound(af,spkr)
+ if qtest():
+ if qread() = (ESCKEY,1):
+ raise bye
+ except bye:
+ pass
+
+main()
diff --git a/Demo/sgi/video/vinfo.py b/Demo/sgi/video/vinfo.py
new file mode 100755
index 0000000..98b29fa
--- /dev/null
+++ b/Demo/sgi/video/vinfo.py
@@ -0,0 +1,55 @@
+#!/ufs/guido/bin/sgi/python3.3
+from gl import *
+from GL import *
+from DEVICE import *
+import time
+import sys
+
+class Struct(): pass
+epoch = Struct()
+EndOfFile = 'End of file'
+bye = 'bye'
+
+def openvideo(name):
+ f = open(name, 'r')
+ w, h = eval(f.readline()[:-1])
+ return f, w, h
+def loadframe(f, w, h):
+ tijd = f.readline()
+ if tijd = '':
+ raise EndOfFile
+ tijd = eval(tijd[:-1])
+ f.seek(w*h*4,1)
+ return tijd
+def saveframe(name, w, h, tijd, data):
+ f = open(name, 'w')
+ f.write(`w,h` + '\n')
+ f.write(`tijd` + '\n')
+ f.write(data)
+ f.close()
+def main():
+ if len(sys.argv) > 1:
+ names = sys.argv[1:]
+ else:
+ names = ['film.video']
+ for name in names:
+ f, w, h = openvideo(name)
+ print name+': '+`w`+'x'+`h`
+ num = 0
+ try:
+ while 1:
+ try:
+ tijd = loadframe(f, w, h)
+ print '\t', tijd,
+ num = num + 1
+ if num % 8 = 0:
+ print
+ except EndOfFile:
+ raise bye
+ except bye:
+ pass
+ if num % 8 <> 0:
+ print
+ f.close()
+
+main()
diff --git a/Demo/sgi/video/vtime.py b/Demo/sgi/video/vtime.py
new file mode 100755
index 0000000..00d821e
--- /dev/null
+++ b/Demo/sgi/video/vtime.py
@@ -0,0 +1,106 @@
+#
+# Module vtime - Keep virtual time between two nodes.
+#
+# We try for synchronised clocks by sending a packet of the for
+# (1,mytime,0) to the other side, and waiting (at most) a second for
+# a reply. This reply has the form (2,mytime,histime), and we can
+# estimate the time difference by defining histime to be exactly half-way
+# between the time we sent our message and got our reply. We send a
+# final (3,mynewtime,histime) message to allow the other side to do the
+# same computations.
+#
+# Note that the protocol suffers heavily from the 2-army problem.
+# It'll have to do until I can read up on time-sync protocols, though.
+#
+from socket import *
+import time
+
+MSGSIZE = 100
+MSGTIMEOUT = 1000
+
+recv_timeout = 'receive timeout'
+bad_connect = 'Bad connection'
+
+def timeavg(a,b):
+ return int((long(a)+b)/2L)
+def tryrecv(s):
+ cnt = 0
+ while 1:
+ if s.avail():
+ return s.recvfrom(MSGSIZE)
+ time.millisleep(100)
+ cnt = cnt + 100
+ if cnt > MSGTIMEOUT:
+ raise recv_timeout
+
+class VTime():
+ def init(self,(client,host,port)):
+ s = socket(AF_INET, SOCK_DGRAM)
+ host = gethostbyname(host)
+ localhost = gethostbyname(gethostname())
+ raddr = (host,port)
+ s.bind((localhost,port))
+ if client:
+ #
+ # We loop here because we want the *second* measurement
+ # for accuracy
+ for loopct in (0,2):
+ curtijd = time.millitimer()
+ check = `(loopct,curtijd,0)`
+ s.sendto(check,raddr)
+ while 1:
+ try:
+ if loopct:
+ data, other = s.recvfrom(MSGSIZE)
+ else:
+ data, other = tryrecv(s)
+ newtijd = time.millitimer()
+ if other <> raddr:
+ print 'Someone else syncing to us: ', other
+ raise bad_connect
+ data = eval(data)
+ if data[:2] = (loopct+1,curtijd):
+ break
+ if data[0] <> 2:
+ print 'Illegal sync reply: ', data
+ raise bad_connect
+ except recv_timeout:
+ curtijd = time.millitimer()
+ check = `(loopct,curtijd,0)`
+ s.sendto(check,raddr)
+ histime = data[2]
+ s.sendto(`(4,newtijd,histime)`,raddr)
+ mytime = timeavg(curtijd,newtijd)
+ #mytime = curtijd
+ self.timediff = histime - mytime
+ else:
+ while 1:
+ data,other = s.recvfrom(MSGSIZE)
+ if other <> raddr:
+ print 'Someone else syncing to us: ', other, ' Wanted ', raddr
+ raise bad_connect
+ data = eval(data)
+ if data[0] in (0,2):
+ curtijd = time.millitimer()
+ s.sendto(`(data[0]+1,data[1],curtijd)`,raddr)
+ elif data[0] = 4:
+ newtijd = time.millitimer()
+ histime = data[1]
+ mytime = timeavg(curtijd,newtijd)
+ #mytime = curtijd
+ self.timediff = histime-mytime
+ break
+ else:
+ print 'Funny data: ', data
+ raise bad_connect
+ return self
+ #
+ def his2mine(self,tijd):
+ return tijd - self.timediff
+ #
+ def mine2his(self, tijd):
+ return tijd + self.timediff
+
+def test(clt, host, port):
+ xx = VTime().init(clt,host,port)
+ print 'Time diff: ', xx.his2mine(0)