#!/usr/bin/env python3 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  os 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common . basedir  import  BASEDIR 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								os . environ [ ' BASEDIR ' ]  =  BASEDIR 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								SCALE  =  float ( os . getenv ( " SCALE " ,  " 1 " ) ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  argparse 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  pygame   # pylint: disable=import-error 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  cv2   # pylint: disable=import-error 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  sys 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  cereal . messaging  as  messaging 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_BB_OFFSET  =  0 ,  0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_BB_TO_FULL_FRAME  =  np . asarray ( [ [ 1. ,  0. ,  _BB_OFFSET [ 0 ] ] ,  [ 0. ,  1. ,  _BB_OFFSET [ 1 ] ] , 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                [ 0. ,  0. ,  1. ] ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_FULL_FRAME_TO_BB  =  np . linalg . inv ( _BB_TO_FULL_FRAME ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_FULL_FRAME_SIZE  =  1164 ,  874 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  pygame_modules_have_loaded ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  pygame . display . get_init ( )  and  pygame . font . get_init ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  ui_thread ( addr ,  frame_address ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pygame . init ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pygame . font . init ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert  pygame_modules_have_loaded ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  size  =  ( int ( _FULL_FRAME_SIZE [ 0 ]  *  SCALE ) ,  int ( _FULL_FRAME_SIZE [ 1 ]  *  SCALE ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( size ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pygame . display . set_caption ( " comma one debug UI " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  screen  =  pygame . display . set_mode ( size ,  pygame . DOUBLEBUF ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  camera_surface  =  pygame . surface . Surface ( ( _FULL_FRAME_SIZE [ 0 ]  *  SCALE ,  _FULL_FRAME_SIZE [ 1 ]  *  SCALE ) ,  0 ,  24 ) . convert ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  frame  =  messaging . sub_sock ( ' frame ' ,  conflate = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  img  =  np . zeros ( ( _FULL_FRAME_SIZE [ 1 ] ,  _FULL_FRAME_SIZE [ 0 ] ,  3 ) ,  dtype = ' uint8 ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  imgff  =  np . zeros ( ( _FULL_FRAME_SIZE [ 1 ] ,  _FULL_FRAME_SIZE [ 0 ] ,  3 ) ,  dtype = np . uint8 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  1 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    list ( pygame . event . get ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    screen . fill ( ( 64 ,  64 ,  64 ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # ***** frame ***** 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    fpkt  =  messaging . recv_one ( frame ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    yuv_img  =  fpkt . frame . image 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  fpkt . frame . transform : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      yuv_transform  =  np . array ( fpkt . frame . transform ) . reshape ( 3 ,  3 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # assume frame is flipped 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      yuv_transform  =  np . array ( [ [ - 1.0 ,  0.0 ,  _FULL_FRAME_SIZE [ 0 ]  -  1 ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                [ 0.0 ,  - 1.0 ,  _FULL_FRAME_SIZE [ 1 ]  -  1 ] ,  [ 0.0 ,  0.0 ,  1.0 ] ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  yuv_img  and  len ( yuv_img )  ==  _FULL_FRAME_SIZE [ 0 ]  *  _FULL_FRAME_SIZE [ 1 ]  *  3  / /  2 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      yuv_np  =  np . frombuffer ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        yuv_img ,  dtype = np . uint8 ) . reshape ( _FULL_FRAME_SIZE [ 1 ]  *  3  / /  2 ,  - 1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      cv2 . cvtColor ( yuv_np ,  cv2 . COLOR_YUV2RGB_I420 ,  dst = imgff ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      cv2 . warpAffine ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        imgff , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        np . dot ( yuv_transform ,  _BB_TO_FULL_FRAME ) [ : 2 ] ,  ( img . shape [ 1 ] ,  img . shape [ 0 ] ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dst = img , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        flags = cv2 . WARP_INVERSE_MAP ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # actually RGB 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      img  =  np . frombuffer ( yuv_img ,  dtype = np . uint8 ) . reshape ( ( _FULL_FRAME_SIZE [ 1 ] ,  _FULL_FRAME_SIZE [ 0 ] ,  3 ) ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      img  =  img [ : ,  : ,  : : - 1 ]   # Convert BGR to RGB 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    height ,  width  =  img . shape [ : 2 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    img_resized  =  cv2 . resize ( 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      img ,  ( int ( SCALE  *  width ) ,  int ( SCALE  *  height ) ) ,  interpolation = cv2 . INTER_CUBIC ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # *** blits *** 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pygame . surfarray . blit_array ( camera_surface ,  img_resized . swapaxes ( 0 ,  1 ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    screen . blit ( camera_surface ,  ( 0 ,  0 ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # this takes time...vsync or something 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pygame . display . flip ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  get_arg_parser ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser  =  argparse . ArgumentParser ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    description = " Show replay data in a UI. " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    formatter_class = argparse . ArgumentDefaultsHelpFormatter ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    " ip_address " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    nargs = " ? " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    default = " 127.0.0.1 " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    help = " The ip address on which to receive zmq messages. " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    " --frame-address " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    default = None , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    help = " The ip address on which to receive zmq messages. " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  parser 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  " __main__ " : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  args  =  get_arg_parser ( ) . parse_args ( sys . argv [ 1 : ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ui_thread ( args . ip_address ,  args . frame_address )