diff options
Diffstat (limited to 'Demo/sgi/video/statit.py')
-rwxr-xr-x | Demo/sgi/video/statit.py | 115 |
1 files changed, 115 insertions, 0 deletions
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() |