|  |  |  | @ -113,8 +113,6 @@ static void camera_init(VisionIpcServer *v, CameraState *s, int camera_id, int c | 
			
		
	
		
			
				
					|  |  |  |  |   s->self_recover = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type, camera_release_buffer); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   pthread_mutex_init(&s->frame_info_lock, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, msm_camera_i2c_data_type data_type) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -317,19 +315,17 @@ static void set_exposure(CameraState *s, float exposure_frac, float gain_frac) { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (err == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |       pthread_mutex_lock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |       std::lock_guard lk(s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |       s->cur_gain = gain; | 
			
		
	
		
			
				
					|  |  |  |  |       s->cur_integ_lines = integ_lines; | 
			
		
	
		
			
				
					|  |  |  |  |       s->cur_frame_length = frame_length; | 
			
		
	
		
			
				
					|  |  |  |  |       pthread_mutex_unlock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (err == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |     s->cur_exposure_frac = exposure_frac; | 
			
		
	
		
			
				
					|  |  |  |  |     pthread_mutex_lock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |     std::lock_guard lk(s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |     s->cur_gain_frac = gain_frac; | 
			
		
	
		
			
				
					|  |  |  |  |     pthread_mutex_unlock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   //LOGD("set exposure: %f %f - %d", exposure_frac, gain_frac, err);
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -355,9 +351,9 @@ static void do_autoexposure(CameraState *s, float grey_frac) { | 
			
		
	
		
			
				
					|  |  |  |  |     } else if (cur_gain_frac * exposure_factor <= gain_frac_max && cur_gain_frac * exposure_factor >= gain_frac_min) { | 
			
		
	
		
			
				
					|  |  |  |  |       cur_gain_frac *= exposure_factor; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     pthread_mutex_lock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |     s->frame_info_lock.lock(); | 
			
		
	
		
			
				
					|  |  |  |  |     s->cur_gain_frac = cur_gain_frac; | 
			
		
	
		
			
				
					|  |  |  |  |     pthread_mutex_unlock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |     s->frame_info_lock.unlock(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     set_exposure(s, s->cur_exposure_frac, cur_gain_frac); | 
			
		
	
		
			
				
					|  |  |  |  |   } else { // keep the old for others
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1180,15 +1176,12 @@ const char* get_isp_event_name(unsigned int type) { | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static FrameMetadata get_frame_metadata(CameraState *s, uint32_t frame_id) { | 
			
		
	
		
			
				
					|  |  |  |  |   pthread_mutex_lock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |   std::lock_guard lk(s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |   for (auto &i : s->frame_metadata) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (i.frame_id == frame_id) { | 
			
		
	
		
			
				
					|  |  |  |  |       pthread_mutex_unlock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |       return i; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   pthread_mutex_unlock(&s->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // should never happen
 | 
			
		
	
		
			
				
					|  |  |  |  |   return (FrameMetadata){ | 
			
		
	
		
			
				
					|  |  |  |  |     .frame_id = (uint32_t)-1, | 
			
		
	
	
		
			
				
					|  |  |  | @ -1357,7 +1350,7 @@ void cameras_run(MultiCameraState *s) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       } else if (ev.type == ISP_EVENT_EOF) { | 
			
		
	
		
			
				
					|  |  |  |  |         const uint64_t timestamp = (isp_event_data->mono_timestamp.tv_sec * 1000000000ULL + isp_event_data->mono_timestamp.tv_usec * 1000); | 
			
		
	
		
			
				
					|  |  |  |  |         pthread_mutex_lock(&c->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |         std::lock_guard lk(c->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  |         c->frame_metadata[c->frame_metadata_idx] = (FrameMetadata){ | 
			
		
	
		
			
				
					|  |  |  |  |             .frame_id = isp_event_data->frame_id, | 
			
		
	
		
			
				
					|  |  |  |  |             .timestamp_eof = timestamp, | 
			
		
	
	
		
			
				
					|  |  |  | @ -1371,7 +1364,6 @@ void cameras_run(MultiCameraState *s) { | 
			
		
	
		
			
				
					|  |  |  |  |             .gain_frac = c->cur_gain_frac, | 
			
		
	
		
			
				
					|  |  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  |  |         c->frame_metadata_idx = (c->frame_metadata_idx + 1) % METADATA_BUF_COUNT; | 
			
		
	
		
			
				
					|  |  |  |  |         pthread_mutex_unlock(&c->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       } else if (ev.type == ISP_EVENT_ERROR) { | 
			
		
	
		
			
				
					|  |  |  |  |         LOGE("ISP_EVENT_ERROR! err type: 0x%08x", isp_event_data->u.error_info.err_type); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |