diff --git a/buffer_list.c b/buffer_list.c index 76b9adc..2fd01c9 100644 --- a/buffer_list.c +++ b/buffer_list.c @@ -157,6 +157,7 @@ int buffer_list_stream(buffer_list_t *buf_list, bool do_on) enum v4l2_buf_type type = buf_list->type; E_XIOCTL(buf_list, buf_list->device->fd, do_on ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, &type, "Cannot set streaming state"); + buf_list->streaming = do_on; return 0; diff --git a/buffer_list.h b/buffer_list.h index 335a160..4faba0b 100644 --- a/buffer_list.h +++ b/buffer_list.h @@ -17,6 +17,7 @@ typedef struct buffer_list_s { unsigned fmt_width, fmt_height, fmt_format; + bool streaming; int frames; } buffer_list_t; diff --git a/links.c b/links.c index 4431830..01e12fc 100644 --- a/links.c +++ b/links.c @@ -7,7 +7,7 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_list_t **buf_lists, int max_n) { - int n; + int n = 0; for (int i = 0; all_links[i].capture; i++) { link_t *link = &all_links[i]; @@ -18,6 +18,9 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis if (!link->capture->capture_list->do_mmap) { continue; } + if (!link->capture->capture_list->streaming) { + continue; + } struct pollfd fd = {link->capture->fd, POLLIN}; fds[n] = fd; @@ -34,6 +37,9 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis if (output->output_list->do_mmap) { continue; } + if (!output->output_list->streaming) { + continue; + } struct pollfd fd = {output->fd, POLLOUT}; fds[n] = fd; @@ -92,6 +98,12 @@ int links_stream(link_t *all_links, bool do_stream) if (device_stream(all_links[i].capture, true) < 0) { E_LOG_ERROR(all_links[i].capture, "Failed to start streaming"); } + + for (int j = 0; all_links[i].outputs[j]; j++) { + if (device_stream(all_links[i].outputs[j], true) < 0) { + E_LOG_ERROR(all_links[i].outputs[j], "Failed to start streaming"); + } + } } return 0;