Keep finished source data alive until delayed media readers close
This commit is contained in:
1 parent
9781f138ed
commit
541518db81
2 files changed
+7
-1
No files matched your search
+6
-1
@@ -676,6 +676,9 @@ int stream_publish_open(struct UTUN_INSTANCE *inst, uint64_t group_id, const str
|
|||||||
struct STREAM_HANDLE **out) {
|
struct STREAM_HANDLE **out) {
|
||||||
int result = stream_open_check(inst, group_id, out);
|
int result = stream_open_check(inst, group_id, out);
|
||||||
if (result != STREAM_OK) return result;
|
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,
|
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,
|
.n = parameters ? parameters->n : STREAM_DEFAULT_N, .r = parameters ? parameters->r : STREAM_DEFAULT_R,
|
||||||
.block_size = parameters ? parameters->block_size : STREAM_RS_DEFAULT_SIZE};
|
.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;
|
struct stream_session *s = h->session;
|
||||||
if (s) {
|
if (s) {
|
||||||
int was_relay = s->owners == s->relay_owners;
|
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 {
|
else {
|
||||||
s->owners--; s->relay_owners -= h->relay;
|
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)
|
if (was_relay != (s->owners == s->relay_owners)
|
||||||
&& service_publish_options(service, stream_group(service->inst, s->descriptor.group_id)) != STREAM_OK) {
|
&& 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");
|
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "stream owner mode publication failed; closing inconsistent instance");
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ void process(void*) {
|
|||||||
bridge.wantRead = false;
|
bridge.wantRead = false;
|
||||||
stream_media_packet packet{};
|
stream_media_packet packet{};
|
||||||
int result = stream_media_read(bridge.handle, bridge.position, bridge.videoAhead, bridge.audioAhead, &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 (result == STREAM_OK) {
|
||||||
if (packet.kind == STREAM_MEDIA_READ_END) closeViewer(StreamRecordKind::End, 0);
|
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,
|
else mediaFrame(nullptr, &packet.format, packet.kind == STREAM_MEDIA_READ_VIDEO ? &packet.video : nullptr,
|
||||||
|
|||||||
Reference in new issue
Block a user