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

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