|
|
|
@ -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, |
|
|
|
@ -1759,13 +1732,11 @@ void cameras_run(MultiCameraState *s) { |
|
|
|
|
.lens_true_pos = c->lens_true_pos, |
|
|
|
|
.gain_frac = c->cur_gain_frac, |
|
|
|
|
}; |
|
|
|
|
c->frame_metadata_idx = (c->frame_metadata_idx+1)%METADATA_BUF_COUNT; |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|