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 {
|
struct {
|
||||||
bool is_keyframe : 1;
|
bool is_keyframe : 1;
|
||||||
|
bool is_last : 1;
|
||||||
} flags;
|
} flags;
|
||||||
|
|
||||||
union {
|
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?");
|
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);
|
uint64_t now_us = get_monotonic_time_us(NULL, NULL);
|
||||||
if ((now_us - buf->captured_time_us) > CAPTURE_TIMEOUT_US) {
|
if ((now_us - buf->captured_time_us) > CAPTURE_TIMEOUT_US) {
|
||||||
LOG_INFO(buf, "Capture image is outdated. Skipped. Now: %" PRIu64 ", vs %" PRIu64 ".",
|
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->v4l2->flags = v4l2_buf.flags;
|
||||||
buf->flags.is_keyframe = (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME) != 0;
|
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);
|
buf->captured_time_us = get_time_us(CLOCK_FROM_PARAMS, NULL, &v4l2_buf.timestamp, 0);
|
||||||
return 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;
|
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");
|
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;
|
return 0;
|
||||||
error:
|
error:
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user