69 lines
1.8 KiB
Python
Executable file
69 lines
1.8 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
from PIL import Image
|
|
|
|
dumpfiles = ("lane0.csv", "lane1.csv", "lane2.csv")
|
|
|
|
def loadcsv(csvfiles):
|
|
records = []
|
|
lines = tuple(list(open(f).readlines()) for f in csvfiles)
|
|
for record in zip(*lines):
|
|
records.append(tuple(int(lane.split(",")[1], 0) for lane in record))
|
|
return records
|
|
|
|
ctrl_syms = {
|
|
0b1101010100: 0, # 0x354
|
|
0b0010101011: 1, # 0x0ab
|
|
0b0101010100: 2, # 0x154
|
|
0b1010101011: 3 # 0x2ab
|
|
}
|
|
|
|
def is_ctrl_sym(x):
|
|
return x in ctrl_syms
|
|
|
|
def decode_data_sym(x):
|
|
if x & 0x200:
|
|
x ^= 0x2ff
|
|
decode_trans = x & 0xff ^ (x << 1 & 0xff)
|
|
return decode_trans & 0xff if (x & 0x100) else ~decode_trans & 0xff
|
|
|
|
def print_stream(stream):
|
|
for t in stream:
|
|
if any(is_ctrl_sym(s) for s in t):
|
|
assert(all(is_ctrl_sym(s) for s in t))
|
|
decode = ctrl_syms[t[2]]
|
|
vsync = decode >> 1 & 1
|
|
hsync = decode & 1
|
|
print("VSYNC = {}, HSYNC = {}".format(vsync, hsync))
|
|
else:
|
|
print("Data: {:02x}, {:02x}, {:02x}".format(
|
|
decode_data_sym(t[0]) >> 3, decode_data_sym(t[1]) >> 2, decode_data_sym(t[2]) >> 3))
|
|
|
|
def dump_frames(stream):
|
|
current_line = []
|
|
current_frame = []
|
|
frame_ctr = 0
|
|
last_ctrl = 0
|
|
for t in stream:
|
|
if is_ctrl_sym(t[2]):
|
|
ctrl = ctrl_syms[t[2]]
|
|
if (ctrl ^ last_ctrl) & 0x2 and len(current_frame) > 0:
|
|
w, h = len(current_frame[0]), len(current_frame)
|
|
print("Found frame {}. Size {} (w) x {} (h)".format(frame_ctr, w, h))
|
|
img = Image.new('RGB', (w, h))
|
|
for x in range(w):
|
|
for y in range(h):
|
|
img.putpixel((x, y), current_frame[y][x])
|
|
img.save("frame{:02d}.png".format(frame_ctr))
|
|
current_frame = []
|
|
frame_ctr += 1
|
|
elif len(current_line) > 0:
|
|
current_frame.append(current_line)
|
|
current_line = []
|
|
last_ctrl = ctrl
|
|
else:
|
|
current_line.append(tuple(decode_data_sym(x) for x in t))
|
|
|
|
|
|
data = loadcsv(dumpfiles)
|
|
dump_frames(data)
|