buffer: if last buffer is discovered restart streaming
This commit is contained in:
parent
6c14564e75
commit
49c7d01789
@ -20,6 +20,7 @@ typedef struct buffer_s {
|
||||
|
||||
struct {
|
||||
bool is_keyframe : 1;
|
||||
bool is_last : 1;
|
||||
} flags;
|
||||
|
||||
union {
|
||||
|
@ -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 ".",
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user