Fix buffer reference counts
This commit is contained in:
parent
57b6e2a94c
commit
6218cd3020
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
19
hw/links.c
19
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;
|
||||
}
|
||||
|
@ -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] == '-') {
|
||||
|
Loading…
x
Reference in New Issue
Block a user