From e3d83b4b13b0290ef9a635d4277433598305c805 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 31 Jan 2025 19:14:58 -0600 Subject: [PATCH] camerad: fix tearing when hitting frame timeout (#34514) * this works * todo --- system/camerad/cameras/spectra.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/camerad/cameras/spectra.cc b/system/camerad/cameras/spectra.cc index 267159107e..17bcc7a200 100644 --- a/system/camerad/cameras/spectra.cc +++ b/system/camerad/cameras/spectra.cc @@ -680,16 +680,16 @@ void SpectraCamera::enqueue_buffer(int i, bool dp) { // SOF has come in, wait until readout is complete struct cam_sync_wait sync_wait = {0}; sync_wait.sync_obj = sync_objs[i]; + // TODO: write a test to stress test w/ a low timeout and check camera frame ids match sync_wait.timeout_ms = 100; ret = do_sync_control(m->cam_sync_fd, CAM_SYNC_WAIT, &sync_wait, sizeof(sync_wait)); if (ret != 0) { - // TODO: handle frame drop cleanly - // when this happens, it messes up future frames + clear_req_queue(); LOGE("failed to wait for sync: %d %d", ret, sync_wait.sync_obj); } buf.frame_metadata[i].timestamp_end_of_isp = (uint64_t)nanos_since_boot(); buf.frame_metadata[i].timestamp_eof = buf.frame_metadata[i].timestamp_sof + sensor->readout_time_ns; - if (dp) { + if (dp && ret == 0) { buf.queue(i); }