summaryrefslogtreecommitdiff
path: root/gst/sdp
diff options
context:
space:
mode:
authorMichael Olbrich <m.olbrich@pengutronix.de>2020-04-06 10:25:37 +0200
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-04-08 13:24:34 +0000
commit01628fa8470f959d889bb3721abb4d7ede99c8ab (patch)
treec10f2361575613f65b711b8f6dce1a77bc6bd6a8 /gst/sdp
parentb9e0ccd8b7b2c19cb24a786cd4150cc6ef46d08c (diff)
downloadgstreamer-plugins-bad-01628fa8470f959d889bb3721abb4d7ede99c8ab.tar.gz
sdpdemux: don't send EOS for unknown SSRC
The rtpbin sends signals for all SSRCs. Don't send an EOS when the SSRC does not match the stream SSRC. This avoids problems when an SSRC from another receiver times out.
Diffstat (limited to 'gst/sdp')
-rw-r--r--gst/sdp/gstsdpdemux.c16
-rw-r--r--gst/sdp/gstsdpdemux.h1
2 files changed, 14 insertions, 3 deletions
diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c
index 98aebdf83..cb3647b20 100644
--- a/gst/sdp/gstsdpdemux.c
+++ b/gst/sdp/gstsdpdemux.c
@@ -516,6 +516,8 @@ new_session_pad (GstElement * session, GstPad * pad, GstSDPDemux * demux)
if (stream == NULL)
goto unknown_stream;
+ stream->ssrc = ssrc;
+
/* no need for a timeout anymore now */
g_object_set (G_OBJECT (stream->udpsrc[0]), "timeout", (guint64) 0, NULL);
@@ -618,7 +620,7 @@ unknown_stream:
}
static void
-gst_sdp_demux_do_stream_eos (GstSDPDemux * demux, guint session)
+gst_sdp_demux_do_stream_eos (GstSDPDemux * demux, guint session, guint32 ssrc)
{
GstSDPStream *stream;
@@ -634,6 +636,9 @@ gst_sdp_demux_do_stream_eos (GstSDPDemux * demux, guint session)
if (stream->eos)
goto was_eos;
+ if (stream->ssrc != ssrc)
+ goto wrong_ssrc;
+
stream->eos = TRUE;
gst_sdp_demux_stream_push_event (demux, stream, gst_event_new_eos ());
return;
@@ -649,6 +654,11 @@ was_eos:
GST_DEBUG_OBJECT (demux, "stream for session %u was already EOS", session);
return;
}
+wrong_ssrc:
+ {
+ GST_DEBUG_OBJECT (demux, "unkown SSRC %08x for session %u", ssrc, session);
+ return;
+ }
}
static void
@@ -658,7 +668,7 @@ on_bye_ssrc (GstElement * manager, guint session, guint32 ssrc,
GST_DEBUG_OBJECT (demux, "SSRC %08x in session %u received BYE", ssrc,
session);
- gst_sdp_demux_do_stream_eos (demux, session);
+ gst_sdp_demux_do_stream_eos (demux, session, ssrc);
}
static void
@@ -667,7 +677,7 @@ on_timeout (GstElement * manager, guint session, guint32 ssrc,
{
GST_DEBUG_OBJECT (demux, "SSRC %08x in session %u timed out", ssrc, session);
- gst_sdp_demux_do_stream_eos (demux, session);
+ gst_sdp_demux_do_stream_eos (demux, session, ssrc);
}
/* try to get and configure a manager */
diff --git a/gst/sdp/gstsdpdemux.h b/gst/sdp/gstsdpdemux.h
index 7862b3e70..908ac5baf 100644
--- a/gst/sdp/gstsdpdemux.h
+++ b/gst/sdp/gstsdpdemux.h
@@ -50,6 +50,7 @@ typedef struct _GstSDPStream GstSDPStream;
struct _GstSDPStream {
gint id;
+ guint32 ssrc;
GstSDPDemux *parent; /* parent, no extra ref to parent is taken */