diff options
Diffstat (limited to 'pxf.py')
-rw-r--r-- | pxf.py | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -0,0 +1,50 @@ +import numpy as np +import ctypes +import time + +from misc import resize_image + +class Pixelflut: + def __init__(self, host, port, x, y, w, h, reps): + self.host, self.port = host.encode(), port + self.x, self.y = x, y + self.w, self.h = w, h + self.reps = reps + self.dbuf = np.zeros(w*h*4, dtype=np.uint8) + self.so = ctypes.CDLL('./pixelflut.so') + self.sock = None + + def reset_images(self): + self.so.reset_images() + + def sendframe(self, idx): + for _ in range(self.reps): + if self.sock is None: + while self.sock is None or self.sock < 0: + time.sleep(1) + self.sock = self.so.cct(self.host, self.port) + if self.so.sendframe(self.sock, idx, self.w, self.h, self.x, self.y): + self.so.discct(self.sock) + self.sock = None + + def encode_image(self, img, idx=None): + frame = np.array(resize_image(img, (self.w, self.h), blackbg=False)).reshape(self.w*self.h*4) + np.copyto(self.dbuf, frame) + cptr = self.dbuf.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)) + if idx is None: + return self.so.store_image(cptr, self.w, self.h) + else: + self.so.store_image_idx(cptr, self.w, self.h, idx) + return None + +class Getch: + def __call__(self): + fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(sys.stdin.fileno()) + ch = sys.stdin.read(1) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + return ch + |