# pragma once 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <cstdint> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cstdio> 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <vector> 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <thread> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <OMX_Component.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/common/queue.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/loggerd/encoder.h" 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "selfdrive/loggerd/video_writer.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  OmxBuffer  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  OMX_BUFFERHEADERTYPE  header ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  OMX_U8  data [ ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// OmxEncoder, lossey codec using hardware hevc
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  OmxEncoder  :  public  VideoEncoder  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  OmxEncoder ( const  char *  filename ,  CameraType  type ,  int  width ,  int  height ,  int  fps ,  int  bitrate ,  bool  h265 ,  int  out_width ,  int  out_height ,  bool  write  =  true ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ~ OmxEncoder ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  encode_frame ( const  uint8_t  * y_ptr ,  const  uint8_t  * u_ptr ,  const  uint8_t  * v_ptr , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								                   int  in_width ,  int  in_height ,  uint64_t  ts ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  encoder_open ( const  char *  path ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  encoder_close ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // OMX callbacks
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  static  OMX_ERRORTYPE  event_handler ( OMX_HANDLETYPE  component ,  OMX_PTR  app_data ,  OMX_EVENTTYPE  event , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                     OMX_U32  data1 ,  OMX_U32  data2 ,  OMX_PTR  event_data ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  static  OMX_ERRORTYPE  empty_buffer_done ( OMX_HANDLETYPE  component ,  OMX_PTR  app_data , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                         OMX_BUFFERHEADERTYPE  * buffer ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  static  OMX_ERRORTYPE  fill_buffer_done ( OMX_HANDLETYPE  component ,  OMX_PTR  app_data , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        OMX_BUFFERHEADERTYPE  * buffer ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								private : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  void  wait_for_state ( OMX_STATETYPE  state ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  static  void  callback_handler ( OmxEncoder  * e ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  static  void  write_and_broadcast_handler ( OmxEncoder  * e ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  static  void  handle_out_buf ( OmxEncoder  * e ,  OmxBuffer  * out_buf ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  int  in_width_ ,  in_height_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  width ,  height ,  fps ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  is_open  =  false ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  dirty  =  false ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  bool  write  =  false ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  counter  =  0 ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : thread  callback_handler_thread ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : thread  write_handler_thread ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  int  segment_num  =  - 1 ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : unique_ptr < PubMaster >  pm ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  const  char  * service_name ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  const  char *  filename ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  CameraType  type ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : mutex  state_lock ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : condition_variable  state_cv ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  OMX_STATETYPE  state  =  OMX_StateLoaded ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  OMX_HANDLETYPE  handle ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : vector < OMX_BUFFERHEADERTYPE  * >  in_buf_headers ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : vector < OMX_BUFFERHEADERTYPE  * >  out_buf_headers ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint64_t  last_t ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  SafeQueue < OMX_BUFFERHEADERTYPE  * >  free_in ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  SafeQueue < OMX_BUFFERHEADERTYPE  * >  done_out ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  SafeQueue < OmxBuffer  * >  to_write ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  remuxing ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  std : : unique_ptr < VideoWriter >  writer ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  downscale ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint8_t  * y_ptr2 ,  * u_ptr2 ,  * v_ptr2 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;