buffer: if last buffer is discovered restart streaming

This commit is contained in:
Kamil Trzcinski 2023-02-24 19:59:56 +01:00
parent 6c14564e75
commit 49c7d01789
4 changed files with 27 additions and 0 deletions

View File

@ -20,6 +20,7 @@ typedef struct buffer_s {
struct {
bool is_keyframe : 1;
bool is_last : 1;
} flags;
union {

View File

@ -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 ".",

View File

@ -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;

View File

@ -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;