summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/video/statit.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/sgi/video/statit.py')
-rwxr-xr-xDemo/sgi/video/statit.py115
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()