mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
rtspsrc: Only EOS on timeout if all streams are timed out/EOS
Otherwise a stream that is just temporarily inactive might time out and then can never become active again because the EOS event was sent already. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3238>
This commit is contained in:
parent
a083280a58
commit
e392d9c597
1 changed files with 35 additions and 2 deletions
|
@ -3646,8 +3646,39 @@ on_timeout_common (GObject * session, GObject * source, GstRTSPStream * stream)
|
||||||
GST_WARNING_OBJECT (src, "source %08x, stream %08x in session %u timed out",
|
GST_WARNING_OBJECT (src, "source %08x, stream %08x in session %u timed out",
|
||||||
ssrc, stream->ssrc, stream->id);
|
ssrc, stream->ssrc, stream->id);
|
||||||
|
|
||||||
if (ssrc == stream->ssrc)
|
if (ssrc == stream->ssrc) {
|
||||||
gst_rtspsrc_do_stream_eos (src, stream);
|
GList *walk;
|
||||||
|
gboolean all_eos = TRUE;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (src, "setting stream for session %u to EOS", stream->id);
|
||||||
|
stream->eos = TRUE;
|
||||||
|
|
||||||
|
/* Only EOS all streams at once if they're all EOS. Otherwise it is
|
||||||
|
* possible for timed out streams to reappear at a later time time: they
|
||||||
|
* might just be inactive currently.
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (walk = src->streams; walk; walk = g_list_next (walk)) {
|
||||||
|
GstRTSPStream *stream = (GstRTSPStream *) walk->data;
|
||||||
|
|
||||||
|
/* Skip streams that were not set up at all */
|
||||||
|
if (!stream->setup)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!stream->eos) {
|
||||||
|
all_eos = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (all_eos) {
|
||||||
|
GST_DEBUG_OBJECT (src, "sending EOS on all streams");
|
||||||
|
for (walk = src->streams; walk; walk = g_list_next (walk)) {
|
||||||
|
GstRTSPStream *stream = (GstRTSPStream *) walk->data;
|
||||||
|
gst_rtspsrc_stream_push_event (src, stream, gst_event_new_eos ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -3688,6 +3719,8 @@ on_ssrc_active (GObject * session, GObject * source, GstRTSPStream * stream)
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (stream->parent, "source in session %u is active",
|
GST_DEBUG_OBJECT (stream->parent, "source in session %u is active",
|
||||||
stream->id);
|
stream->id);
|
||||||
|
|
||||||
|
stream->eos = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue