@ -550,10 +550,6 @@ void enqueue_req_multi(struct CameraState *s, int start, int n) {
// ******************* 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 ) {
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 - > 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 ) { {
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
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 - > analog_gain_frac * = 0.5 ;
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 - > analog_gain_frac * = 2 ;
s - > analog_gain_frac * = 2.0 ;
s - > dc_opstate = 1 ;
} else if ( s - > analog_gain_frac > 0.5 & & exposure_factor < 0.9 ) {
s - > analog_gain_frac * = sqrt ( exposure_factor ) ;
s - > exposure_time = max ( min ( s - > exposure_time * sqrt ( exposure_factor ) , exposure_time_max ) , exposure_time_min ) ;
} else if ( s - > analog_gain_frac > 1 & & exposure_factor < 1 ) { // force gain down first
s - > analog_gain_frac / = 2.0 ;
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 ;
} else if ( ( s - > exposure_time < exposure_time_max | | exposure_factor < 1 ) & & ( s - > exposure_time > exposure_time_min | | exposure_factor > 1 ) ) {
s - > exposure_time = max ( min ( s - > exposure_time * exposure_factor , exposure_time_max ) , exposure_time_min ) ;
} 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 - > dc_opstate = 0 ;
} 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 ;
}
// 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
{ 0x3362 , s - > dc_gain_enabled ? 0x1 : 0x0 } , // DC_GAIN
{ 0x305A , 0x00C4 } , // red gain
{ 0x3058 , 0x00B 1 } , // blue gain
{ 0x305A , 0x00D1 } , // red gain
{ 0x3058 , 0x0118 } , // blue gain
{ 0x3056 , 0x009A } , // g1 gain
{ 0x305C , 0x009A } , // g2 gain
{ 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 scale = 6 ;
int old_width = FRAME_WIDTH ;
// int old_height = FRAME_HEIGHT;
int new_width = FRAME_WIDTH / scale ;
int new_height = FRAME_HEIGHT / scale ;
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 ) ;
for ( uint32_t r = 1 ; r < new_height ; r + + ) {
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 + 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 ] ;
// 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 ) ;