|  |  |  | @ -1685,7 +1685,6 @@ void cameras_run(MultiCameraState *s) { | 
			
		
	
		
			
				
					|  |  |  |  |   while (!do_exit) { | 
			
		
	
		
			
				
					|  |  |  |  |     struct pollfd fds[2] = {{.fd = cameras[0]->isp_fd, .events = POLLPRI}, | 
			
		
	
		
			
				
					|  |  |  |  |                             {.fd = cameras[1]->isp_fd, .events = POLLPRI}}; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     int ret = poll(fds, ARRAYSIZE(fds), 1000); | 
			
		
	
		
			
				
					|  |  |  |  |     if (ret < 0) { | 
			
		
	
		
			
				
					|  |  |  |  |       if (errno == EINTR || errno == EAGAIN) continue; | 
			
		
	
	
		
			
				
					|  |  |  | @ -1701,51 +1700,25 @@ void cameras_run(MultiCameraState *s) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       struct v4l2_event ev = {}; | 
			
		
	
		
			
				
					|  |  |  |  |       ret = ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev); | 
			
		
	
		
			
				
					|  |  |  |  |       struct msm_isp_event_data *isp_event_data = (struct msm_isp_event_data *)ev.u.data; | 
			
		
	
		
			
				
					|  |  |  |  |       unsigned int event_type = ev.type; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       uint64_t timestamp = (isp_event_data->mono_timestamp.tv_sec*1000000000ULL | 
			
		
	
		
			
				
					|  |  |  |  |                             + isp_event_data->mono_timestamp.tv_usec*1000); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       int buf_idx = isp_event_data->u.buf_done.buf_idx; | 
			
		
	
		
			
				
					|  |  |  |  |       int stream_id = isp_event_data->u.buf_done.stream_id; | 
			
		
	
		
			
				
					|  |  |  |  |       int buffer = (stream_id&0xFFFF) - 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       uint64_t t = nanos_since_boot(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       /*if (i == 1) {
 | 
			
		
	
		
			
				
					|  |  |  |  |         printf("%10.2f: VIDIOC_DQEVENT: %d  type:%X (%s)\n", t*1.0/1e6, ret, event_type, get_isp_event_name(event_type)); | 
			
		
	
		
			
				
					|  |  |  |  |       }*/ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // printf("%d: %s\n", i, get_isp_event_name(event_type));
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       switch (event_type) { | 
			
		
	
		
			
				
					|  |  |  |  |       case ISP_EVENT_BUF_DIVERT: | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /*if (c->is_samsung) {
 | 
			
		
	
		
			
				
					|  |  |  |  |           printf("write %d\n", c->frame_size); | 
			
		
	
		
			
				
					|  |  |  |  |           FILE *f = fopen("/tmp/test", "wb"); | 
			
		
	
		
			
				
					|  |  |  |  |           fwrite((void*)c->camera_bufs[i].addr, 1, c->frame_size, f); | 
			
		
	
		
			
				
					|  |  |  |  |           fclose(f); | 
			
		
	
		
			
				
					|  |  |  |  |         }*/ | 
			
		
	
		
			
				
					|  |  |  |  |         //printf("divert: %d %d %d\n", i, buffer, buf_idx);
 | 
			
		
	
		
			
				
					|  |  |  |  |       const msm_isp_event_data *isp_event_data = (const msm_isp_event_data *)ev.u.data; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if (ev.type == ISP_EVENT_BUF_DIVERT) { | 
			
		
	
		
			
				
					|  |  |  |  |         const int buf_idx = isp_event_data->u.buf_done.buf_idx; | 
			
		
	
		
			
				
					|  |  |  |  |         const int buffer = (isp_event_data->u.buf_done.stream_id & 0xFFFF) - 1; | 
			
		
	
		
			
				
					|  |  |  |  |         if (buffer == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |           c->buf.camera_bufs_metadata[buf_idx] = get_frame_metadata(c, isp_event_data->frame_id); | 
			
		
	
		
			
				
					|  |  |  |  |           c->buf.queue(buf_idx); | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |           uint8_t *d = (uint8_t*)(c->ss[buffer].bufs[buf_idx].addr); | 
			
		
	
		
			
				
					|  |  |  |  |           auto &ss = c->ss[buffer]; | 
			
		
	
		
			
				
					|  |  |  |  |           if (buffer == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |             parse_autofocus(c, d); | 
			
		
	
		
			
				
					|  |  |  |  |             parse_autofocus(c, (uint8_t *)(ss.bufs[buf_idx].addr)); | 
			
		
	
		
			
				
					|  |  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |  |           c->ss[buffer].qbuf_info[buf_idx].dirty_buf = 1; | 
			
		
	
		
			
				
					|  |  |  |  |           ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &c->ss[buffer].qbuf_info[buf_idx]); | 
			
		
	
		
			
				
					|  |  |  |  |           ss.qbuf_info[buf_idx].dirty_buf = 1; | 
			
		
	
		
			
				
					|  |  |  |  |           ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       case ISP_EVENT_EOF: | 
			
		
	
		
			
				
					|  |  |  |  |         // printf("ISP_EVENT_EOF delta %f\n", (t-last_t)/1e6);
 | 
			
		
	
		
			
				
					|  |  |  |  |         c->last_t = t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       } 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); | 
			
		
	
		
			
				
					|  |  |  |  |         c->frame_metadata[c->frame_metadata_idx] = (FrameMetadata){ | 
			
		
	
		
			
				
					|  |  |  |  |             .frame_id = isp_event_data->frame_id, | 
			
		
	
	
		
			
				
					|  |  |  | @ -1762,10 +1735,8 @@ void cameras_run(MultiCameraState *s) { | 
			
		
	
		
			
				
					|  |  |  |  |         c->frame_metadata_idx = (c->frame_metadata_idx + 1) % METADATA_BUF_COUNT; | 
			
		
	
		
			
				
					|  |  |  |  |         pthread_mutex_unlock(&c->frame_info_lock); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       case ISP_EVENT_ERROR: | 
			
		
	
		
			
				
					|  |  |  |  |       } else if (ev.type == ISP_EVENT_ERROR) { | 
			
		
	
		
			
				
					|  |  |  |  |         LOGE("ISP_EVENT_ERROR! err type: 0x%08x", isp_event_data->u.error_info.err_type); | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |