summaryrefslogtreecommitdiff
path: root/gst/rtpmanager/gstrtpssrcdemux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/rtpmanager/gstrtpssrcdemux.c')
-rw-r--r--gst/rtpmanager/gstrtpssrcdemux.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/gst/rtpmanager/gstrtpssrcdemux.c b/gst/rtpmanager/gstrtpssrcdemux.c
index 7b8d0960d..132c52d10 100644
--- a/gst/rtpmanager/gstrtpssrcdemux.c
+++ b/gst/rtpmanager/gstrtpssrcdemux.c
@@ -83,6 +83,10 @@ GST_STATIC_PAD_TEMPLATE ("rtcp_src_%u",
#define INTERNAL_STREAM_LOCK(obj) (g_rec_mutex_lock (&(obj)->padlock))
#define INTERNAL_STREAM_UNLOCK(obj) (g_rec_mutex_unlock (&(obj)->padlock))
+#define GST_PAD_FLAG_STICKIES_SENT (GST_PAD_FLAG_LAST << 0)
+#define GST_PAD_STICKIES_SENT(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLAG_STICKIES_SENT))
+#define GST_PAD_SET_STICKIES_SENT(pad) (GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_STICKIES_SENT))
+
typedef enum
{
RTP_PAD,
@@ -244,13 +248,11 @@ forward_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data)
GstEvent *newevent;
newevent = add_ssrc_and_ref (*event, data->ssrc);
-
gst_pad_push_event (data->pad, newevent);
return TRUE;
}
-/* With internal stream lock held */
static void
forward_initial_events (GstRtpSsrcDemux * demux, guint32 ssrc, GstPad * pad,
PadType padtype)
@@ -318,9 +320,6 @@ find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
dpads->rtp_pad = rtp_pad;
dpads->rtcp_pad = rtcp_pad;
- gst_pad_set_element_private (rtp_pad, dpads);
- gst_pad_set_element_private (rtcp_pad, dpads);
-
GST_OBJECT_LOCK (demux);
demux->srcpads = g_slist_prepend (demux->srcpads, dpads);
GST_OBJECT_UNLOCK (demux);
@@ -338,9 +337,6 @@ find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
gst_pad_use_fixed_caps (rtcp_pad);
gst_pad_set_active (rtcp_pad, TRUE);
- forward_initial_events (demux, ssrc, rtp_pad, RTP_PAD);
- forward_initial_events (demux, ssrc, rtcp_pad, RTCP_PAD);
-
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtp_pad);
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtcp_pad);
@@ -606,6 +602,13 @@ forward_event (GstPad * pad, gpointer user_data)
GSList *walk = NULL;
GstEvent *newevent = NULL;
+ /* special case for EOS */
+ if (GST_EVENT_TYPE (fdata->event) == GST_EVENT_EOS)
+ GST_PAD_SET_STICKIES_SENT (pad);
+
+ if (GST_EVENT_IS_STICKY (fdata->event) && !GST_PAD_STICKIES_SENT (pad))
+ return FALSE;
+
GST_OBJECT_LOCK (fdata->demux);
for (walk = fdata->demux->srcpads; walk; walk = walk->next) {
GstRtpSsrcDemuxPads *dpads = (GstRtpSsrcDemuxPads *) walk->data;
@@ -668,6 +671,11 @@ gst_rtp_ssrc_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
if (srcpad == NULL)
goto create_failed;
+ if (!GST_PAD_STICKIES_SENT (srcpad)) {
+ forward_initial_events (demux, ssrc, srcpad, RTP_PAD);
+ GST_PAD_SET_STICKIES_SENT (srcpad);
+ }
+
/* push to srcpad */
ret = gst_pad_push (srcpad, buf);
@@ -758,6 +766,11 @@ gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstObject * parent,
if (srcpad == NULL)
goto create_failed;
+ if (!GST_PAD_STICKIES_SENT (srcpad)) {
+ forward_initial_events (demux, ssrc, srcpad, RTCP_PAD);
+ GST_PAD_SET_STICKIES_SENT (srcpad);
+ }
+
/* push to srcpad */
ret = gst_pad_push (srcpad, buf);
@@ -944,17 +957,12 @@ gst_rtp_ssrc_demux_src_query (GstPad * pad, GstObject * parent,
if ((res = gst_pad_peer_query (demux->rtp_sink, query))) {
gboolean live;
GstClockTime min_latency, max_latency;
- GstRtpSsrcDemuxPads *dpads;
-
- dpads = gst_pad_get_element_private (pad);
gst_query_parse_latency (query, &live, &min_latency, &max_latency);
- GST_DEBUG_OBJECT (demux, "peer min latency %" GST_TIME_FORMAT,
+ GST_DEBUG_OBJECT (pad, "peer min latency %" GST_TIME_FORMAT,
GST_TIME_ARGS (min_latency));
- GST_DEBUG_OBJECT (demux, "latency for SSRC %08x", dpads->ssrc);
-
gst_query_set_latency (query, live, min_latency, max_latency);
}
break;