Initial revision

This commit is contained in:
Guido van Rossum 1991-10-30 11:52:48 +00:00
parent baf0ebf43c
commit e4bddeae23
13 changed files with 1363 additions and 0 deletions

56
Demo/sgi/video/README Normal file
View File

@ -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

129
Demo/sgi/video/cam.py Executable file
View File

@ -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()

197
Demo/sgi/video/camcorder.py Executable file
View File

@ -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()

120
Demo/sgi/video/squash.c Executable file
View File

@ -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);
}

72
Demo/sgi/video/squash2.c Executable file
View File

@ -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);
}

115
Demo/sgi/video/statit.py Executable file
View File

@ -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()

94
Demo/sgi/video/syncaudio.py Executable file
View File

@ -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()

165
Demo/sgi/video/tomono.c Executable file
View File

@ -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;
}

79
Demo/sgi/video/tv.py Executable file
View File

@ -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()

63
Demo/sgi/video/v2i.c Executable file
View File

@ -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);
}

112
Demo/sgi/video/video.py Executable file
View File

@ -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()

55
Demo/sgi/video/vinfo.py Executable file
View File

@ -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()

106
Demo/sgi/video/vtime.py Executable file
View File

@ -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)