From 541518db817149b50bdeb6a6600e2cd1228234fe Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 13 Oct 2026 22:53:38 +0200 Subject: [PATCH] Keep finished source data alive until delayed media readers close --- src/stream/stream.c | 7 ++++++- tools/chatgui/transport/stream_bridge.cpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/stream/stream.c b/src/stream/stream.c index 4b389d97..07c90f1c 100644 --- a/src/stream/stream.c +++ b/src/stream/stream.c @@ -676,6 +676,9 @@ int stream_publish_open(struct UTUN_INSTANCE *inst, uint64_t group_id, const str struct STREAM_HANDLE **out) { int result = stream_open_check(inst, group_id, out); if (result != STREAM_OK) return result; + struct stream_session *previous = session_find(inst->stream, group_id, inst->node_id); + if (previous && previous->source && previous->end_valid) + session_close(previous, STREAM_CLOSE_SOURCE_CHANGED, 0, 1); struct stream_descriptor d = {.group_id = group_id, .source_node_id = inst->node_id, .n = parameters ? parameters->n : STREAM_DEFAULT_N, .r = parameters ? parameters->r : STREAM_DEFAULT_R, .block_size = parameters ? parameters->block_size : STREAM_RS_DEFAULT_SIZE}; @@ -756,9 +759,11 @@ void stream_close(struct STREAM_HANDLE *h) { struct stream_session *s = h->session; if (s) { int was_relay = s->owners == s->relay_owners; - if (h->publisher || s->owners == 1) session_close(s, STREAM_CLOSE_STOPPED, 1, !h->relay); + if ((h->publisher && !s->end_valid) || s->owners == 1) session_close(s, STREAM_CLOSE_STOPPED, 1, !h->relay); else { s->owners--; s->relay_owners -= h->relay; + if (h->publisher) DEBUG_INFO(DEBUG_CATEGORY_STREAM, "finished publisher released; retained media readers source=%llx owners=%u", + (unsigned long long)s->descriptor.source_node_id, s->owners); if (was_relay != (s->owners == s->relay_owners) && service_publish_options(service, stream_group(service->inst, s->descriptor.group_id)) != STREAM_OK) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "stream owner mode publication failed; closing inconsistent instance"); diff --git a/tools/chatgui/transport/stream_bridge.cpp b/tools/chatgui/transport/stream_bridge.cpp index b1e50641..17850e1f 100644 --- a/tools/chatgui/transport/stream_bridge.cpp +++ b/tools/chatgui/transport/stream_bridge.cpp @@ -148,6 +148,7 @@ void process(void*) { bridge.wantRead = false; stream_media_packet packet{}; int result = stream_media_read(bridge.handle, bridge.position, bridge.videoAhead, bridge.audioAhead, &packet); + if (stream_media_get_status(bridge.handle, &bridge.status) < 0) result = STREAM_ERR_FORMAT; if (result == STREAM_OK) { if (packet.kind == STREAM_MEDIA_READ_END) closeViewer(StreamRecordKind::End, 0); else mediaFrame(nullptr, &packet.format, packet.kind == STREAM_MEDIA_READ_VIDEO ? &packet.video : nullptr,