device: ensure that sink has capture that can process output - otherwise skip

It appears that if output is enqueued, but there's no capture for longer period
this results EPIPE from mmal.
This commit is contained in:
Kamil Trzcinski 2023-02-21 22:54:00 +01:00
parent 45c4d69332
commit fc8255ed90

View File

@ -85,6 +85,32 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis
return n; return n;
} }
bool links_sink_can_enqueue(buffer_list_t *buf_list)
{
int current = buffer_list_count_enqueued(buf_list);
if (buf_list->do_capture) {
perror("should not happen");
}
int capture_max = 0;
for (int i = 0; i < buf_list->dev->n_capture_list; i++) {
int capture_count = buffer_list_count_enqueued(buf_list->dev->capture_lists[i]);
if (capture_max < capture_count)
capture_max = capture_count;
}
// only enqueue on output, if there are already captures (and there's more of them)
if (capture_max <= current) {
LOG_DEBUG(buf_list, "Skipping enqueue of output (output_enqueued=%d, capture_enqueued=%d)",
current, capture_max);
return false;
}
return true;
}
int links_enqueue_from_source(buffer_list_t *buf_list, link_t *link) int links_enqueue_from_source(buffer_list_t *buf_list, link_t *link)
{ {
if (!link) { if (!link) {
@ -105,6 +131,9 @@ int links_enqueue_from_source(buffer_list_t *buf_list, link_t *link)
if (link->sinks[j]->dev->paused) { if (link->sinks[j]->dev->paused) {
continue; continue;
} }
if (!links_sink_can_enqueue(link->sinks[j])) {
continue;
}
buffer_list_enqueue(link->sinks[j], buf); buffer_list_enqueue(link->sinks[j], buf);
} }