From d73e95abb14f9ff06e12b256cc700921875e0132 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 5 Apr 2022 12:05:21 +0200 Subject: [PATCH] Improve --- hw/buffer.c | 5 ++++ hw/buffer_list.c | 25 ++-------------- hw/buffer_queue.c | 1 - hw/links.c | 73 +++++------------------------------------------ 4 files changed, 14 insertions(+), 90 deletions(-) diff --git a/hw/buffer.c b/hw/buffer.c index ea3cd66..d091414 100644 --- a/hw/buffer.c +++ b/hw/buffer.c @@ -54,6 +54,11 @@ buffer_t *buffer_open(const char *name, buffer_list_t *buf_list, int index) { buf->dma_fd = v4l2_exp.fd; } + if (buf_list->do_capture) { + buf->used = 0; + buffer_consumed(buf); + } + return buf; error: diff --git a/hw/buffer_list.c b/hw/buffer_list.c index 6562c7b..fa00ec6 100644 --- a/hw/buffer_list.c +++ b/hw/buffer_list.c @@ -198,30 +198,9 @@ int buffer_list_stream(buffer_list_t *buf_list, bool do_on) E_XIOCTL(buf_list, buf_list->device->fd, do_on ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, &type, "Cannot set streaming state"); buf_list->streaming = do_on; - for (int i = 0; i < buf_list->nbufs; i++) { - buffer_t *buf = buf_list->bufs[i]; + int enqueued = buffer_list_count_enqueued(buf_list); - // dequeue buffers (when stream off) - // if (buf->enqueued) { - // if (buf->mmap_source) { - // buf->mmap_source->used = 0; - // buffer_consumed(buf->mmap_source); - // buf->mmap_source = NULL; - // } - - // buf->enqueued = false; - // buf->mmap_reflinks = 1; - // } - - // re-enqueue buffers on stream start - if (buf_list->streaming && buf_list->do_capture && !buf->enqueued && buf->mmap_reflinks == 1) { - if (buf_list->do_mmap) { - buffer_consumed(buf); - } - } - } - - E_LOG_DEBUG(buf_list, "Streaming %s...", do_on ? "started" : "stopped"); + E_LOG_DEBUG(buf_list, "Streaming %s... Was %d of %d enqueud", do_on ? "started" : "stopped", enqueued, buf_list->nbufs); return 0; error: diff --git a/hw/buffer_queue.c b/hw/buffer_queue.c index 04a7e54..9b89a99 100644 --- a/hw/buffer_queue.c +++ b/hw/buffer_queue.c @@ -188,4 +188,3 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list) error: return NULL; } - diff --git a/hw/links.c b/hw/links.c index 5d096ea..a0dbc91 100644 --- a/hw/links.c +++ b/hw/links.c @@ -24,6 +24,10 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis bool can_consume = true; + if (link->callbacks.check_streaming) { + can_consume = link->callbacks.check_streaming(); + } + for (int j = 0; link->outputs[j]; j++) { device_t *output = link->outputs[j]; @@ -124,10 +128,6 @@ int links_stream(link_t *all_links, bool do_stream) for (int i = n; --i >= 0; ) { bool streaming = true; link_t *link = &all_links[i]; - - if (link->callbacks.check_streaming) { - streaming = link->callbacks.check_streaming(); - } if (buffer_list_stream(link->capture->capture_list, streaming) < 0) { E_LOG_ERROR(link->capture, "Failed to start streaming"); @@ -146,72 +146,13 @@ error: return -1; } -// int links_open_buffer_list_from(device_t *dev, bool do_capture, buffer_list_t *parent_buffer, unsigned format) -// { -// if (!parent_buffer) { -// return -1; -// } - -// return device_open_buffer_list( -// dev, -// do_capture, -// parent_buffer->fmt_width, -// parent_buffer->fmt_height, -// format ? format : parent_buffer->fmt_format, -// parent_buffer->nbufs -// ); -// } - -// int links_init(link_t *all_links) -// { -// // create all outputs (sinks) -// for (int i = 0; all_links[i].capture; i++) { -// link_t *link = &all_links[i]; - -// if (!link->capture) { -// E_LOG_ERROR(NULL, "Missing link capture."); -// } - -// if (link->capture_format) { -// int ret = links_open_buffer_list_from( -// link->capture, -// true, -// link->capture->upstream_device ? link->capture->upstream_device->output_list : link->capture->output_list, -// link->capture_format -// ); - -// if (ret < 0) { -// E_LOG_ERROR(link->capture, "Failed to create capture_list."); -// } -// } - -// if (!link->capture->capture_list) { -// E_LOG_ERROR(link->capture, "Missing capture device."); -// } - -// for (int j = 0; link->outputs[j]; j++) { -// device_t *output = link->outputs[j]; - -// int ret = links_open_buffer_list_from(output, false, link->capture->capture_list, 0); -// if (ret < 0) { -// E_LOG_ERROR(output, "Failed to create output_list."); -// } -// } -// } - -// return 0; - -// error: -// return -1; -// } - int links_loop(link_t *all_links, bool *running) { *running = true; - if (links_stream(all_links, true) < 0) { - return -1; - } + if (links_stream(all_links, true) < 0) { + return -1; + } while(*running) { if (links_step(all_links, 1000) < 0) {