mirror of
https://github.com/KrisKennaway/ii-vision.git
synced 2024-08-31 14:29:14 +00:00
metric though, because it doesn't penalize artifacts like colour fringing, or diffs that persist across many frames.
78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
from PIL import Image
|
|
import numpy as np
|
|
|
|
import frame_sequence
|
|
import opcodes
|
|
import screen
|
|
import video
|
|
|
|
MAX_OUT = 10 * 1024 * 1024
|
|
VIDEO_FPS = 30
|
|
APPLE_FPS = 15
|
|
|
|
|
|
def main():
|
|
frames = frame_sequence.frame_sequence(
|
|
"Computer Chronicles - 06x05 - The Apple II.mp4")
|
|
|
|
bytes_out = 0
|
|
sims = []
|
|
out_frames = 0
|
|
|
|
s = video.Video(APPLE_FPS)
|
|
screen_cls = screen.HGR140Bitmap
|
|
|
|
# Assert that the opcode stream reconstructs the same screen
|
|
ds = video.Video()
|
|
decoder = opcodes.Decoder(s.state)
|
|
|
|
with open("out.bin", "wb") as out:
|
|
for idx, frame in enumerate(frames):
|
|
if idx % (VIDEO_FPS // APPLE_FPS):
|
|
continue
|
|
|
|
im = Image.fromarray(frame)
|
|
im = im.resize((screen_cls.XMAX, screen_cls.YMAX))
|
|
im = im.convert("1")
|
|
im = np.array(im)
|
|
# im.show()
|
|
|
|
f = screen_cls(im)
|
|
|
|
stream = bytes(s.emit_stream(s.encode_frame(f)))
|
|
|
|
# assert that the screen decodes to the original bitmap
|
|
bm = screen_cls.from_bytemap(s.screen).bitmap
|
|
|
|
# print("Comparing bitmaps")
|
|
# print(np.array(im))
|
|
# print(bm)
|
|
# print(s.screen)
|
|
#np.set_printoptions(threshold=100000000)
|
|
|
|
#assert np.array_equal(bm, im), np.ma.masked_array(
|
|
# bm, np.logical_not(np.logical_xor(bm, im)))
|
|
|
|
# d = Image.fromarray(s.screen)
|
|
# d.show()
|
|
|
|
bytes_out += len(stream)
|
|
bytes_left = MAX_OUT - bytes_out
|
|
|
|
sim = screen.bitmap_similarity(im, bm)
|
|
sims.append(sim)
|
|
out_frames += 1
|
|
print("Frame %d, %d bytes, similarity = %f" % (
|
|
idx, len(stream), sim))
|
|
out.write(stream[:bytes_left])
|
|
|
|
if bytes_left <= 0:
|
|
out.write(bytes(s.done()))
|
|
break
|
|
|
|
print("Median similarity: %f" % sorted(sims)[out_frames//2])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|