diff --git a/device/libcamera/buffer.cc b/device/libcamera/buffer.cc index de4918e..af48547 100644 --- a/device/libcamera/buffer.cc +++ b/device/libcamera/buffer.cc @@ -143,6 +143,15 @@ int libcamera_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp) *bufp = buf_list->bufs[index]; + std::optional sensor_timestamp((*bufp)->libcamera->request->metadata(). + get(libcamera::controls::SensorTimestamp)); + uint64_t sensor_timestamp_us = sensor_timestamp.value_or(0) / 1000; + uint64_t boot_time_us = get_time_us(CLOCK_BOOTTIME, NULL, NULL, 0); + + uint64_t now_us = get_monotonic_time_us(NULL, NULL); + + (*bufp)->captured_time_us = now_us - (boot_time_us - sensor_timestamp_us); + if (index == 0) { libcamera_buffer_dump_metadata(*bufp); } diff --git a/device/links.c b/device/links.c index 563870f..54ee9d3 100644 --- a/device/links.c +++ b/device/links.c @@ -6,6 +6,9 @@ #include "util/opts/log.h" #include "util/opts/fourcc.h" +#include + +#define CAPTURE_TIMEOUT_US (1000*1000) #define N_FDS 50 #define QUEUE_ON_CAPTURE // seems to provide better latency // #define LIMIT_CAPTURE_BUFFERS @@ -148,6 +151,13 @@ static int links_enqueue_from_capture_list(buffer_list_t *capture_list, link_t * LOG_ERROR(capture_list, "No buffer dequeued from capture_list?"); } + uint64_t now_us = get_monotonic_time_us(NULL, NULL); + if ((now_us - buf->captured_time_us) > CAPTURE_TIMEOUT_US) { + LOG_INFO(buf, "Capture image is outdated. Skipped. Now: %" PRIu64 ", vs %" PRIu64 ".", + now_us, buf->captured_time_us); + return 0; + } + bool dropped = false; for (int j = 0; j < link->n_output_lists; j++) {