#!/usr/bin/env python 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								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 ( )