From 49c7d0178984ddac9cb8c935b65729448e87679c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 24 Feb 2023 19:59:56 +0100 Subject: [PATCH] buffer: if last buffer is discovered restart streaming --- device/buffer.h | 1 + device/links.c | 7 +++++++ device/v4l2/buffer.c | 1 + device/v4l2/buffer_list.c | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/device/buffer.h b/device/buffer.h index e93e716..85418f2 100644 --- a/device/buffer.h +++ b/device/buffer.h @@ -20,6 +20,7 @@ typedef struct buffer_s { struct { bool is_keyframe : 1; + bool is_last : 1; } flags; union { diff --git a/device/links.c b/device/links.c index 54ee9d3..4f44ba7 100644 --- a/device/links.c +++ b/device/links.c @@ -151,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?"); } + if (buf->flags.is_last) { + LOG_INFO(buf, "Received last buffer. Restarting streaming..."); + buffer_list_set_stream(capture_list, false); + buffer_list_set_stream(capture_list, true); + return 0; + } + 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 ".", diff --git a/device/v4l2/buffer.c b/device/v4l2/buffer.c index 8cbb130..e05ff03 100644 --- a/device/v4l2/buffer.c +++ b/device/v4l2/buffer.c @@ -151,6 +151,7 @@ int v4l2_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp) buf->v4l2->flags = v4l2_buf.flags; buf->flags.is_keyframe = (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME) != 0; + buf->flags.is_last = (v4l2_buf.flags & V4L2_BUF_FLAG_LAST) != 0; buf->captured_time_us = get_time_us(CLOCK_FROM_PARAMS, NULL, &v4l2_buf.timestamp, 0); return 0; diff --git a/device/v4l2/buffer_list.c b/device/v4l2/buffer_list.c index 50944ce..62423a2 100644 --- a/device/v4l2/buffer_list.c +++ b/device/v4l2/buffer_list.c @@ -181,6 +181,24 @@ int v4l2_buffer_list_set_stream(buffer_list_t *buf_list, bool do_on) enum v4l2_buf_type type = buf_list->v4l2->type; ERR_IOCTL(buf_list, buf_list->v4l2->dev_fd, do_on ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, &type, "Cannot set streaming state"); + if (!do_on) { + // forcefully dequeue all buffers + for (int i = 0; i < buf_list->nbufs; i++) { + buffer_t *buf = buf_list->bufs[i]; + if (!buf->enqueued) + continue; + + if (buf->dma_source) { + buf->dma_source->used = 0; + buffer_consumed(buf->dma_source, "stream-off"); + buf->dma_source = NULL; + } + + buf->enqueued = false; + buf->mmap_reflinks = 1; + } + } + return 0; error: return -1;