#!/usr/bin/env python # pylint: skip-file import os import sys import zmq import cv2 import numpy as np import struct # sudo pip install git+git://github.com/mikeboers/PyAV.git import av import cereal.messaging as messaging from cereal.services import service_list PYGAME = os.getenv("PYGAME") is not None if PYGAME: import pygame imgff = np.zeros((874, 1164, 3), dtype=np.uint8) # first 74 bytes in any stream start = "0000000140010c01ffff016000000300b0000003000003005dac5900000001420101016000000300b0000003000003005da0025080381c5c665aee4c92ec80000000014401c0f1800420" def receiver_thread(): if PYGAME: pygame.init() pygame.display.set_caption("vnet debug UI") screen = pygame.display.set_mode((1164, 874), pygame.DOUBLEBUF) camera_surface = pygame.surface.Surface((1164, 874), 0, 24).convert() addr = "192.168.5.11" if len(sys.argv) >= 2: addr = sys.argv[1] context = zmq.Context() s = messaging.sub_sock(context, 9002, addr=addr) frame_sock = messaging.pub_sock(context, service_list['frame'].port) ctx = av.codec.codec.Codec('hevc', 'r').create() ctx.decode(av.packet.Packet(start.decode("hex"))) # import time while 1: # t1 = time.time() ts, raw = s.recv_multipart() ts = struct.unpack('q', ts)[0] * 1000 # t1, t2 = time.time(), t1 #print 'ms to get frame:', (t1-t2)*1000 pkt = av.packet.Packet(raw) f = ctx.decode(pkt) if not f: continue f = f[0] # t1, t2 = time.time(), t1 #print 'ms to decode:', (t1-t2)*1000 y_plane = np.frombuffer(f.planes[0], np.uint8).reshape((874, 1216))[:, 0:1164] u_plane = np.frombuffer(f.planes[1], np.uint8).reshape((437, 608))[:, 0:582] v_plane = np.frombuffer(f.planes[2], np.uint8).reshape((437, 608))[:, 0:582] yuv_img = y_plane.tobytes() + u_plane.tobytes() + v_plane.tobytes() # t1, t2 = time.time(), t1 #print 'ms to make yuv:', (t1-t2)*1000 #print 'tsEof:', ts dat = messaging.new_message('frame') dat.frame.image = yuv_img dat.frame.timestampEof = ts dat.frame.transform = map(float, list(np.eye(3).flatten())) frame_sock.send(dat.to_bytes()) if PYGAME: yuv_np = np.frombuffer(yuv_img, dtype=np.uint8).reshape(874 * 3 // 2, -1) cv2.cvtColor(yuv_np, cv2.COLOR_YUV2RGB_I420, dst=imgff) #print yuv_np.shape, imgff.shape #scipy.misc.imsave("tmp.png", imgff) pygame.surfarray.blit_array(camera_surface, imgff.swapaxes(0, 1)) screen.blit(camera_surface, (0, 0)) pygame.display.flip() def main(gctx=None): receiver_thread() if __name__ == "__main__": main()