Save the tested release workflows, RAM media processing, program discovery, FLIRT library, and shared-object maintenance. Add Git exclusions, file attributes, and instructions for a later push using a forwarded SSH agent.
71 lines
3.3 KiB
Python
71 lines
3.3 KiB
Python
"""Bounded indexed DMD bitmap decoding, including keyframe-dependent delta frames.
|
|
|
|
Grammar recovered from named GOT 1.37 functions (binary SHA-256 637acf6d...):
|
|
image_alloc_and_decompress_{column,row}_whitespace, row_16, and
|
|
image_get_keyframe_and_decompress_{column,row}_delta. See docs/decoder-evidence.md.
|
|
Returns exact indices; palette/application compositing is separate.
|
|
"""
|
|
import struct
|
|
|
|
FORMATS={0:'raw-indexed8',1:'column-whitespace',3:'column-delta',7:'row-whitespace',9:'row-delta',12:'row-indexed4'}
|
|
|
|
def decode(record, keyframes):
|
|
if len(record)<13:raise ValueError('truncated DMD record')
|
|
identity,flags,width,height=struct.unpack_from('<IIHH',record)
|
|
size=width*height;mode=record[12];pos=13
|
|
if not 0<width<=4096 or not 0<height<=4096 or size>16777216:raise ValueError('DMD dimensions exceed bound')
|
|
if mode not in FORMATS:raise ValueError(f'unsupported DMD encoding {mode}')
|
|
base=None
|
|
if mode in (3,9):
|
|
base=next((keyframes[k] for k in ((identity-1)&0xffff,identity&0xffff) if k in keyframes and keyframes[k][0:2]==(width,height)),None)
|
|
if base is None:raise ValueError('DMD delta lacks matching preceding keyframe')
|
|
pixels=bytearray(base[2])
|
|
else:pixels=bytearray(size)
|
|
cursor=0
|
|
def take(n):
|
|
nonlocal pos
|
|
if n<0 or pos+n>len(record):raise ValueError('truncated DMD packet')
|
|
data=record[pos:pos+n];pos+=n;return data
|
|
def write(values):
|
|
nonlocal cursor
|
|
if cursor+len(values)>size:raise ValueError('DMD packet exceeds pixel bounds')
|
|
if mode not in (1,3):
|
|
pixels[cursor:cursor+len(values)]=values;cursor+=len(values)
|
|
else:
|
|
start=0
|
|
while start<len(values):
|
|
count=min(height-cursor%height,len(values)-start)
|
|
offset=(cursor%height)*width+cursor//height
|
|
pixels[offset:offset+count*width:width]=values[start:start+count]
|
|
cursor+=count;start+=count
|
|
if mode==0:
|
|
pixels[:]=take(size);cursor=size
|
|
elif mode==12:
|
|
packed=bytes(take((size+1)//2))
|
|
pixels[0::2]=packed.translate(bytes(value&15 for value in range(256)))
|
|
pixels[1::2]=packed[:size//2].translate(bytes(value>>4 for value in range(256)))
|
|
cursor=size
|
|
else:
|
|
while True:
|
|
token=take(1)[0]
|
|
if token==0:break
|
|
if mode in (3,9):
|
|
if token>=128:
|
|
cursor+=256-token
|
|
if cursor>size:raise ValueError('DMD delta skip exceeds bounds')
|
|
else:write(take(token))
|
|
else:
|
|
count=token>>2;kind=token&3
|
|
if not count:raise ValueError('empty DMD whitespace packet')
|
|
if kind==0:write(take(count))
|
|
elif kind in (1,2):write(bytes([0 if kind==1 else 15])*count)
|
|
else:write(bytes(take(1))*count)
|
|
if cursor!=size:raise ValueError('DMD packet did not cover complete frame')
|
|
result=bytes(pixels)
|
|
if mode in (3,9):
|
|
keyframes.pop((identity-1)&0xffff,None)
|
|
keyframes[identity&0xffff]=(width,height,result)
|
|
elif flags&4:
|
|
keyframes[identity&0xffff]=(width,height,result)
|
|
return {'pixels':result,'consumed':pos,'format':FORMATS[mode],'mode':mode,'width':width,'height':height,'record_id':identity,'flags':flags,'base_record':(identity-1)&0xffff if base else None}
|