"""What does LOSSLESS (palettised-quality) delta coding actually cost at 12fps? Session 1 measured only a hand-rolled row-span+RLE (3.2:1). The 68000 has ~12x CPU headroom, so a real LZ decoder is affordable -- byte copies are what the 68000 is good at. This measures the achievable floor at zero extra quality loss. """ import sys, zlib, lzma; sys.path.insert(0,'tools/encoder') import vq, numpy as np S=sys.argv[1] RAW=256*192 def rle_delta(a,b,gap=4): """session 1's row-span + RLE, reimplemented for comparison""" t=0 for y in range(a.shape[0]): d=np.nonzero(a[y]!=b[y])[0] if not len(d): continue sp=[];s=d[0];p=d[0] for x in d[1:]: if x-p>gap: sp.append((s,p)); s=x p=x sp.append((s,p)); t+=2 for s0,e0 in sp: seg=b[y][s0:e0+1]; t+=2; i=0 while i=3 else r; i+=r return t print(f'{"scene":8}{"frames":>7}{"raw KB/s":>9}{"rle":>8}{"xor+zl":>8}{"delta+zl":>9}{"lzma":>8}',flush=True) tot={} for s in ['00010','00020','00146','00181']: rgb=vq.load_frames(f'{S}/fr_{s}') ref,pal=vq.scene_palette(rgb) idx=vq.palettise(rgb,ref) n=len(idx)-1 r_rle=sum(rle_delta(idx[i-1],idx[i]) for i in range(1,len(idx)))/n # XOR against previous frame then deflate -- unchanged pixels become 0 runs r_xor=sum(len(zlib.compress((idx[i]^idx[i-1]).tobytes(),9)) for i in range(1,len(idx)))/n # RLE-of-changed-spans payload, then deflate on top def spans(a,b,gap=8): out=bytearray() for y in range(a.shape[0]): d=np.nonzero(a[y]!=b[y])[0] if not len(d): continue sp=[];st=d[0];p=d[0] for x in d[1:]: if x-p>gap: sp.append((st,p)); st=x p=x sp.append((st,p)) for s0,e0 in sp: out += bytes([y,s0,e0-s0]) + b[y][s0:e0+1].tobytes() return bytes(out) r_dz=sum(len(zlib.compress(spans(idx[i-1],idx[i]),9)) for i in range(1,len(idx)))/n r_lz=sum(len(lzma.compress(spans(idx[i-1],idx[i]),preset=9))for i in range(1,len(idx)))/n f=12/1024.0 print(f'{s:8}{len(idx):7}{RAW*f:9.0f}{r_rle*f:8.0f}{r_xor*f:8.0f}{r_dz*f:9.0f}{r_lz*f:8.0f}',flush=True) for k,v in [('rle',r_rle),('xor',r_xor),('dz',r_dz),('lz',r_lz)]: tot.setdefault(k,[]).append(v) print() for k,v in tot.items(): m=np.mean(v) print(f'{k:8} mean {m:7.0f} B/frame {m*12/1024:6.0f} KB/s {m*12*22*60/1048576:5.0f} MB/22min ratio {RAW/m:.1f}:1')