From 6218cd30207477b4a66b7250b0fb145e62f2793d Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 6 Apr 2022 09:53:48 +0200 Subject: [PATCH] Fix buffer reference counts --- http/http_h264.c | 2 +- http/http_jpeg.c | 4 ++-- hw/buffer.c | 2 +- hw/buffer.h | 2 +- hw/buffer_list.c | 2 +- hw/buffer_lock.c | 6 +++--- hw/buffer_queue.c | 16 ++++++++++------ hw/links.c | 19 ++++++++++--------- opts/opts.c | 5 ++++- 9 files changed, 33 insertions(+), 25 deletions(-) diff --git a/http/http_h264.c b/http/http_h264.c index 2b5911c..315e038 100644 --- a/http/http_h264.c +++ b/http/http_h264.c @@ -53,7 +53,7 @@ void http_video(http_worker_t *worker, FILE *stream) device_video_force_key(buf->buf_list->device); requested_key_frame = true; } - buffer_consumed(buf); + buffer_consumed(buf, "h264-stream"); } error: diff --git a/http/http_jpeg.c b/http/http_jpeg.c index 3654d16..b5c1cb2 100644 --- a/http/http_jpeg.c +++ b/http/http_jpeg.c @@ -56,7 +56,7 @@ void http_snapshot(http_worker_t *worker, FILE *stream) fprintf(stream, "Content-Length: %d\r\n", buf->used); fprintf(stream, "\r\n"); fwrite(buf->start, buf->used, 1, stream); - buffer_consumed(buf); + buffer_consumed(buf, "jpeg-snapshot"); error: buffer_lock_use(&http_jpeg, -1); } @@ -85,7 +85,7 @@ void http_stream(http_worker_t *worker, FILE *stream) goto error; } - buffer_consumed(buf); + buffer_consumed(buf, "jpeg-stream"); } error: diff --git a/hw/buffer.c b/hw/buffer.c index 2340194..5b71193 100644 --- a/hw/buffer.c +++ b/hw/buffer.c @@ -56,7 +56,7 @@ buffer_t *buffer_open(const char *name, buffer_list_t *buf_list, int index) { if (buf_list->do_capture && buf_list->do_mmap) { buf->used = 0; - buffer_consumed(buf); + buffer_consumed(buf, "capture-enqueue"); } return buf; diff --git a/hw/buffer.h b/hw/buffer.h index 7567446..482a346 100644 --- a/hw/buffer.h +++ b/hw/buffer.h @@ -24,4 +24,4 @@ buffer_t *buffer_open(const char *name, struct buffer_list_s *buf_list, int buff void buffer_close(buffer_t *buf); bool buffer_use(buffer_t *buf); -bool buffer_consumed(buffer_t *buf); +bool buffer_consumed(buffer_t *buf, const char *who); diff --git a/hw/buffer_list.c b/hw/buffer_list.c index d8cc4f4..31884a7 100644 --- a/hw/buffer_list.c +++ b/hw/buffer_list.c @@ -113,7 +113,7 @@ retry: //fmt->fmt.pix.sizeimage = bytesperline * orig_height; } - E_LOG_DEBUG(buf_list, "Configuring format ..."); + E_LOG_DEBUG(buf_list, "Configuring format (%s)...", fourcc_to_string(format).buf); E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_S_FMT, fmt, "Can't set format"); if (buf_list->do_mplanes) { diff --git a/hw/buffer_lock.c b/hw/buffer_lock.c index a100c03..2744e79 100644 --- a/hw/buffer_lock.c +++ b/hw/buffer_lock.c @@ -26,7 +26,7 @@ bool buffer_lock_needs_buffer(buffer_lock_t *buf_lock) pthread_mutex_lock(&buf_lock->lock); if (now.tv_sec - buf_lock->buf_time.tv_sec > 1) { - buffer_consumed(buf_lock->buf); + buffer_consumed(buf_lock->buf, buf_lock->name); buf_lock->buf = NULL; needs_buffer = true; } @@ -41,12 +41,12 @@ bool buffer_lock_needs_buffer(buffer_lock_t *buf_lock) void buffer_lock_capture(buffer_lock_t *buf_lock, buffer_t *buf) { pthread_mutex_lock(&buf_lock->lock); - buffer_consumed(buf_lock->buf); + buffer_consumed(buf_lock->buf, buf_lock->name); buffer_use(buf); buf_lock->buf = buf; buf_lock->counter++; gettimeofday(&buf_lock->buf_time, NULL); - E_LOG_DEBUG(buf_lock, "Captured buffer %s, frame=%d", dev_name(buf), buf_lock->counter); + E_LOG_DEBUG(buf_lock, "Captured buffer %s (refs=%d), frame=%d", dev_name(buf), buf ? buf->mmap_reflinks : 0, buf_lock->counter); pthread_cond_broadcast(&buf_lock->cond_wait); pthread_mutex_unlock(&buf_lock->lock); } diff --git a/hw/buffer_queue.c b/hw/buffer_queue.c index f46e0cd..7e21b50 100644 --- a/hw/buffer_queue.c +++ b/hw/buffer_queue.c @@ -13,7 +13,7 @@ bool buffer_use(buffer_t *buf) } pthread_mutex_lock(&buffer_lock); - if (!buf->enqueued) { + if (buf->enqueued) { pthread_mutex_unlock(&buffer_lock); return false; } @@ -23,7 +23,7 @@ bool buffer_use(buffer_t *buf) return true; } -bool buffer_consumed(buffer_t *buf) +bool buffer_consumed(buffer_t *buf, const char *who) { if (!buf) { return false; @@ -44,7 +44,11 @@ bool buffer_consumed(buffer_t *buf) buf->v4l2_buffer.bytesused = buf->used; } - E_LOG_DEBUG(buf, "Queuing buffer... used=%zu length=%zu (linked=%s)", buf->used, buf->length, buf->mmap_source ? buf->mmap_source->name : NULL); + E_LOG_DEBUG(buf, "Queuing buffer... used=%zu length=%zu (linked=%s) by %s", + buf->used, + buf->length, + buf->mmap_source ? buf->mmap_source->name : NULL, + who); buf->enqueued_time_us = get_monotonic_time_us(NULL, &buf->v4l2_buffer.timestamp); E_XIOCTL(buf, buf->buf_list->device->fd, VIDIOC_QBUF, &buf->v4l2_buffer, "Can't queue buffer."); buf->enqueued = true; @@ -61,7 +65,7 @@ error: pthread_mutex_unlock(&buffer_lock); if (mmap_source) { - buffer_consumed(mmap_source); + buffer_consumed(mmap_source, who); } } @@ -138,7 +142,7 @@ int buffer_list_enqueue(buffer_list_t *buf_list, buffer_t *dma_buf) } buf->used = dma_buf->used; - buffer_consumed(buf); + buffer_consumed(buf, "copy-data"); return 1; error: return -1; @@ -181,7 +185,7 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list) if (buf->mmap_source) { buf->mmap_source->used = 0; - buffer_consumed(buf->mmap_source); + buffer_consumed(buf->mmap_source, "mmap-dequeued"); buf->mmap_source = NULL; } diff --git a/hw/links.c b/hw/links.c index 39dda73..c4dc194 100644 --- a/hw/links.c +++ b/hw/links.c @@ -96,7 +96,7 @@ int links_enqueue_from_source(buffer_list_t *buf_list, link_t *link) link->callbacks.on_buffer(buf); } - buffer_consumed(buf); + buffer_consumed(buf, "link-from-source"); return 0; error: @@ -133,11 +133,17 @@ int links_step(link_t *all_links, int timeout) buffer_list_t *buf_list = buf_lists[i]; link_t *link = links[i]; - E_LOG_DEBUG(buf_list, "pool i=%d revents=%08x streaming=%d enqueued=%d/%d", i, fds[i].revents, buf_list->streaming, - buffer_list_count_enqueued(buf_list), buf_list->nbufs); + E_LOG_DEBUG(buf_list, "pool event=%s%s%s%s/%08x streaming=%d enqueued=%d/%d", + !fds[i].revents ? "NONE" : "", + fds[i].revents & POLLIN ? "IN" : "", + fds[i].revents & POLLOUT ? "OUT" : "", + fds[i].revents & POLLERR ? "ERR" : "", + fds[i].revents, + buf_list->streaming, + buffer_list_count_enqueued(buf_list), + buf_list->nbufs); if (fds[i].revents & POLLIN) { - E_LOG_DEBUG(buf_list, "POLLIN"); if (links_enqueue_from_source(buf_list, link) < 0) { return -1; } @@ -145,7 +151,6 @@ int links_step(link_t *all_links, int timeout) // Dequeue buffers that were processed if (fds[i].revents & POLLOUT) { - E_LOG_DEBUG(buf_list, "POLLOUT"); if (links_dequeue_from_sink(buf_list) < 0) { return -1; } @@ -155,10 +160,6 @@ int links_step(link_t *all_links, int timeout) E_LOG_INFO(buf_list, "Got an error"); return -1; } - - if (fds[i].revents & ~(POLLIN|POLLOUT|POLLERR)) { - E_LOG_VERBOSE(buf_list, "POLL%08x", fds[i].revents); - } } return 0; } diff --git a/opts/opts.c b/opts/opts.c index bde0f58..4711c26 100644 --- a/opts/opts.c +++ b/opts/opts.c @@ -50,6 +50,9 @@ static int parse_opt(option_t *options, const char *key) } } } + + E_LOG_DEBUG(NULL, "Parsing '%s'. Got value='%s', and option='%s'", key, value, option ? option->name : NULL); + if (!option || !value) { return -EINVAL; } @@ -76,7 +79,7 @@ int parse_opts(option_t *options, int argc, char *argv[]) { int arg; - for (arg = 1; arg < argc; arg += 2) { + for (arg = 1; arg < argc; arg++) { const char *key = argv[arg]; if (key[0] == '-') {