@ -550,10 +550,6 @@ void enqueue_req_multi(struct CameraState *s, int start, int n) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// ******************* camera *******************
  
					 
					 
					 
					// ******************* camera *******************
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  camera_release_buffer ( void *  cookie ,  int  i )  {  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  return ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  camera_init ( CameraState  * s ,  int  camera_id ,  int  camera_num ,  unsigned  int  fps )  {  
					 
					 
					 
					static  void  camera_init ( CameraState  * s ,  int  camera_id ,  int  camera_num ,  unsigned  int  fps )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  LOGD ( " camera init %d " ,  camera_num ) ;   
					 
					 
					 
					  LOGD ( " camera init %d " ,  camera_num ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -564,7 +560,7 @@ static void camera_init(CameraState *s, int camera_id, int camera_num, unsigned 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  s - > camera_num  =  camera_num ;   
					 
					 
					 
					  s - > camera_num  =  camera_num ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  s - > frame_size  =  s - > ci . frame_height  *  s - > ci . frame_stride ;   
					 
					 
					 
					  s - > frame_size  =  s - > ci . frame_height  *  s - > ci . frame_stride ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  tbuffer_init2 ( & s - > camera_tb ,  FRAME_BUF_COUNT ,  " frame " ,  camera_release_buffer ,  s ) ;   
					 
					 
					 
					  tbuffer_init2 ( & s - > camera_tb ,  FRAME_BUF_COUNT ,  " frame " ,  NULL ,  s ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  s - > transform  =  ( mat3 ) { {   
					 
					 
					 
					  s - > transform  =  ( mat3 ) { {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    1.0 ,  0.0 ,  0.0 ,   
					 
					 
					 
					    1.0 ,  0.0 ,  0.0 ,   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -1025,23 +1021,28 @@ void camera_autoexposure(CameraState *s, float grey_frac) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  const  int  exposure_time_max  =  1066 ;  //1416; // no slower than 1/25 sec. calculated from 0x300C and clock freq
   
					 
					 
					 
					  const  int  exposure_time_max  =  1066 ;  //1416; // no slower than 1/25 sec. calculated from 0x300C and clock freq
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  float  exposure_factor  =  pow ( 1.05 ,  ( target_grey  -  grey_frac )  /  0.16  ) ;   
					 
					 
					 
					  float  exposure_factor  =  pow ( 1.05 ,  ( target_grey  -  grey_frac )  /  0.16  ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  if  ( s - > analog_gain_frac  >  1  & &  exposure_factor  >  1  & &  ! s - > dc_gain_enabled  & &  s - > dc_opstate  ! =  1 )  {  // iso 800
   
					 
					 
					 
					  if  ( s - > analog_gain_frac  >  1  & &  exposure_factor  >  0.98  & &  exposure_factor  <  1.02 )  {  // high analog gains are coarse
   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    return ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  >  1  & &  exposure_factor  >  1  & &  ! s - > dc_gain_enabled  & &  s - > dc_opstate  ! =  1 )  {  // switch to HCG at iso 800
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_gain_enabled  =  true ;   
					 
					 
					 
					    s - > dc_gain_enabled  =  true ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > analog_gain_frac  * =  0.5 ;   
					 
					 
					 
					    s - > analog_gain_frac  * =  0.5 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_opstate  =  1 ;   
					 
					 
					 
					    s - > dc_opstate  =  1 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  <  0.5  & &  exposure_factor  <  1  & &  s - > dc_gain_enabled  & &  s - > dc_opstate  ! =  1 )  {  // iso 400
   
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  <  0.5  & &  exposure_factor  <  1  & &  s - > dc_gain_enabled  & &  s - > dc_opstate  ! =  1 )  {  // switch back to LCG at  iso 400
   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_gain_enabled  =  false ;   
					 
					 
					 
					    s - > dc_gain_enabled  =  false ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > analog_gain_frac  * =  2 ;   
					 
					 
					 
					    s - > analog_gain_frac  * =  2.0 ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_opstate  =  1 ;   
					 
					 
					 
					    s - > dc_opstate  =  1 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  >  0.5  & &  exposure_factor  <  0.9 )  {   
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  >  1  & &  exposure_factor  <  1 )  {  // force gain down first
   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > analog_gain_frac  * =  sqrt ( exposure_factor ) ;   
					 
					 
					 
					    s - > analog_gain_frac  / =  2.0 ;   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > exposure_time  =  max ( min ( s - > exposure_time  *  sqrt ( exposure_factor ) ,  exposure_time_max ) , exposure_time_min ) ;   
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }  else  if  ( s - > analog_gain_frac  >  0.5  & &  exposure_factor  <  0.9 )  {  // smoother transistion on large stepdowns
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    s - > analog_gain_frac  =  max ( min ( s - > analog_gain_frac  *  sqrt ( exposure_factor ) ,  analog_gain_frac_max ) ,  analog_gain_frac_min ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    s - > exposure_time  =  max ( min ( s - > exposure_time  *  sqrt ( exposure_factor ) ,  exposure_time_max ) ,  exposure_time_min ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( ( s - > exposure_time  <  exposure_time_max  | |  exposure_factor  <  1 )  & &  ( s - > exposure_time  >  exposure_time_min  | |  exposure_factor  >  1 ) )  {   
					 
					 
					 
					  }  else  if  ( ( s - > exposure_time  <  exposure_time_max  | |  exposure_factor  <  1 )  & &  ( s - > exposure_time  >  exposure_time_min  | |  exposure_factor  >  1 ) )  {  // ramp up shutter time before gain
    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > exposure_time  =  max ( min ( s - > exposure_time  *  exposure_factor ,  exposure_time_max ) , exposure_time_min ) ;   
					 
					 
					 
					    s - > exposure_time  =  max ( min ( s - > exposure_time  *  exposure_factor ,  exposure_time_max ) ,   exposure_time_min ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  {   
					 
					 
					 
					  }  else  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    s - > analog_gain_frac  =  max ( min ( s - > analog_gain_frac  *  exposure_factor ,  analog_gain_frac_max ) , analog_gain_frac_min ) ;   
					 
					 
					 
					    s - > analog_gain_frac  =  max ( min ( s - > analog_gain_frac  *  exposure_factor ,  analog_gain_frac_max ) ,   analog_gain_frac_min ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
					 
					 
					 
					    s - > dc_opstate  =  0 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }   
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // set up config
   
					 
					 
					 
					  // set up config
   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -1061,8 +1062,8 @@ void camera_autoexposure(CameraState *s, float grey_frac) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  struct  i2c_random_wr_payload  exp_reg_array [ ]  =  { { 0x3366 ,  AG } ,  // analog gain
   
					 
					 
					 
					  struct  i2c_random_wr_payload  exp_reg_array [ ]  =  { { 0x3366 ,  AG } ,  // analog gain
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x3362 ,  s - > dc_gain_enabled ? 0x1 : 0x0 } ,  // DC_GAIN
   
					 
					 
					 
					                                                  { 0x3362 ,  s - > dc_gain_enabled ? 0x1 : 0x0 } ,  // DC_GAIN
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x305A ,  0x00C4  } ,  // red gain
   
					 
					 
					 
					                                                  { 0x305A ,  0x00D1  } ,  // red gain
   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x3058 ,  0x00B 1 } ,  // blue gain
   
					 
					 
					 
					                                                  { 0x3058 ,  0x0118  } ,  // blue gain
   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x3056 ,  0x009A } ,  // g1 gain
   
					 
					 
					 
					                                                  { 0x3056 ,  0x009A } ,  // g1 gain
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x305C ,  0x009A } ,  // g2 gain
   
					 
					 
					 
					                                                  { 0x305C ,  0x009A } ,  // g2 gain
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                  { 0x3012 ,  s - > exposure_time } } ;  // integ time
   
					 
					 
					 
					                                                  { 0x3012 ,  s - > exposure_time } } ;  // integ time
   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -1077,15 +1078,22 @@ void sendrgb(MultiCameraState *s, uint8_t* dat, int len, uint8_t cam_id) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  err ,  err2 ;   
					 
					 
					 
					  int  err ,  err2 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  scale  =  6 ;   
					 
					 
					 
					  int  scale  =  6 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  old_width  =  FRAME_WIDTH ;   
					 
					 
					 
					  int  old_width  =  FRAME_WIDTH ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // int old_height = FRAME_HEIGHT;
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  new_width  =  FRAME_WIDTH  /  scale ;   
					 
					 
					 
					  int  new_width  =  FRAME_WIDTH  /  scale ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  new_height  =  FRAME_HEIGHT  /  scale ;   
					 
					 
					 
					  int  new_height  =  FRAME_HEIGHT  /  scale ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  uint8_t  resized_dat [ new_width * new_height * 3 ] ;   
					 
					 
					 
					  uint8_t  resized_dat [ new_width * new_height * 3 ] ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // int goff, loff;
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // goff = ((old_width*(scale-1)*old_height/scale)/2);
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  memset ( & resized_dat ,  cam_id ,  3 ) ;   
					 
					 
					 
					  memset ( & resized_dat ,  cam_id ,  3 ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  for  ( uint32_t  r = 1 ; r < new_height ; r + + )  {   
					 
					 
					 
					  for  ( uint32_t  r = 1 ; r < new_height ; r + + )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  ( uint32_t  c = 1 ; c < new_width ; c + + )  {   
					 
					 
					 
					    for  ( uint32_t  c = 1 ; c < new_width ; c + + )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale ] ;   
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale ] ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 + 1 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale + 1 ] ;   
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 + 1 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale + 1 ] ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 + 2 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale + 2 ] ;   
					 
					 
					 
					      resized_dat [ ( r * new_width + c ) * 3 + 2 ]  =  dat [ ( r * old_width  +  c ) * 3 * scale + 2 ] ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      // loff = r*old_width + c;
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      // resized_dat[(r*new_width+c)*3] = dat[(goff+loff)*3];
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      // resized_dat[(r*new_width+c)*3+1] = dat[(goff+loff)*3+1];
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      // resized_dat[(r*new_width+c)*3+2] = dat[(goff+loff)*3+2];
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    }   
					 
					 
					 
					    }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }   
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  err  =  zmq_send ( zsock_resolve ( s - > rgb_sock ) ,  & resized_dat ,  new_width * new_height * 3 ,  0 ) ;   
					 
					 
					 
					  err  =  zmq_send ( zsock_resolve ( s - > rgb_sock ) ,  & resized_dat ,  new_width * new_height * 3 ,  0 ) ;