PicoDVI/software/scripts/tmdsdump.py
2021-01-21 06:10:49 +00:00

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)