diff options
author | Alejandro G. Castro <alex@igalia.com> | 2016-10-26 13:21:29 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-11-01 20:16:18 +0200 |
commit | eeea2a7fe88a17b15318d5b6ae6e190b2f777030 (patch) | |
tree | 07a5d04e3dedf889c29daa8397c5d5700b19628a | |
parent | cd71e3a8e86440a3d9e6b69e1ec529d89e6a13b4 (diff) |
rtpbin: pipeline gets an EOS when any rtpsources byes
Instead of sending EOS when a source byes we have to wait for
all the sources to be gone, which means they already sent BYE and
were removed from the session. We now handle the EOS in the rtcp
loop checking the amount of sources in the session.
https://bugzilla.gnome.org/show_bug.cgi?id=773218
-rw-r--r-- | gst/rtpmanager/gstrtpsession.c | 29 | ||||
-rw-r--r-- | gst/rtpmanager/rtpsession.c | 6 | ||||
-rw-r--r-- | gst/rtpmanager/rtpsession.h | 3 |
3 files changed, 21 insertions, 17 deletions
diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index 3688e857d..fd1f2b1ac 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -293,7 +293,7 @@ static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, gpointer data, gpointer user_data); static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, - RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data); + RTPSource * src, GstBuffer * buffer, gpointer user_data); static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess, GstBuffer * buffer, gpointer user_data); static gint gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, @@ -1156,6 +1156,22 @@ rtcp_thread (GstRtpSession * rtpsession) GST_RTP_SESSION_UNLOCK (rtpsession); rtp_session_on_timeout (session, current_time, ntpnstime, running_time); GST_RTP_SESSION_LOCK (rtpsession); + + if (!rtp_session_get_num_sources (session)) { + /* when no sources left in the session, all of the them have went + * BYE at some point and removed, we can send EOS to the + * pipeline. */ + GstPad *rtcp_src = rtpsession->send_rtcp_src; + + if (rtcp_src) { + gst_object_ref (rtcp_src); + GST_LOG_OBJECT (rtpsession, "sending EOS"); + GST_RTP_SESSION_UNLOCK (rtpsession); + gst_pad_push_event (rtpsession->send_rtcp_src, gst_event_new_eos ()); + GST_RTP_SESSION_LOCK (rtpsession); + gst_object_unref (rtcp_src); + } + } } /* mark the thread as stopped now */ rtpsession->priv->thread_stopped = TRUE; @@ -1413,11 +1429,10 @@ do_rtcp_events (GstRtpSession * rtpsession, GstPad * srcpad) } /* called when the session manager has an RTCP packet ready for further - * sending. The eos flag is set when an EOS event should be sent downstream as - * well. */ + * sending. */ static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, - GstBuffer * buffer, gboolean eos, gpointer user_data) + GstBuffer * buffer, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; @@ -1440,11 +1455,6 @@ gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, GST_LOG_OBJECT (rtpsession, "sending RTCP"); result = gst_pad_push (rtcp_src, buffer); - /* we have to send EOS after this packet */ - if (eos) { - GST_LOG_OBJECT (rtpsession, "sending EOS"); - gst_pad_push_event (rtcp_src, gst_event_new_eos ()); - } gst_object_unref (rtcp_src); } else { GST_RTP_SESSION_UNLOCK (rtpsession); @@ -2056,7 +2066,6 @@ gst_rtp_session_event_send_rtcp_src (GstPad * pad, GstObject * parent, return ret; } - static gboolean gst_rtp_session_event_send_rtp_sink (GstPad * pad, GstObject * parent, GstEvent * event) diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index 8b33b6bd9..aa8b40b4f 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -3263,7 +3263,6 @@ early_exit: typedef struct { RTPSource *source; - gboolean is_bye; GstBuffer *buffer; } ReportOutput; @@ -3874,7 +3873,6 @@ static void generate_rtcp (const gchar * key, RTPSource * source, ReportData * data) { RTPSession *sess = data->sess; - gboolean is_bye = FALSE; ReportOutput *output; /* only generate RTCP for active internal sources */ @@ -3893,7 +3891,6 @@ generate_rtcp (const gchar * key, RTPSource * source, ReportData * data) if (source->marked_bye) { /* send BYE */ make_source_bye (sess, source, data); - is_bye = TRUE; } else if (!data->is_early) { /* loop over all known sources and add report blocks. If we are early, we * just make a minimal RTCP packet and skip this step */ @@ -3918,7 +3915,6 @@ generate_rtcp (const gchar * key, RTPSource * source, ReportData * data) output = g_slice_new (ReportOutput); output->source = g_object_ref (source); - output->is_bye = is_bye; output->buffer = data->rtcp; /* queue the RTCP packet to push later */ g_queue_push_tail (&data->output, output); @@ -4098,7 +4094,7 @@ done: GST_DEBUG ("%p, sending RTCP packet, avg size %u, %u", &sess->stats, sess->stats.avg_rtcp_packet_size, packet_size); result = - sess->callbacks.send_rtcp (sess, source, buffer, output->is_bye, + sess->callbacks.send_rtcp (sess, source, buffer, sess->send_rtcp_user_data); RTP_SESSION_LOCK (sess); diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h index 9fa9327c7..c25981adb 100644 --- a/gst/rtpmanager/rtpsession.h +++ b/gst/rtpmanager/rtpsession.h @@ -71,7 +71,6 @@ typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, gp * @sess: an #RTPSession * @src: the #RTPSource * @buffer: the RTCP buffer ready for sending - * @eos: if an EOS event should be pushed * @user_data: user data specified when registering * * This callback will be called when @sess has @buffer ready for sending to @@ -80,7 +79,7 @@ typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, gp * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, - gboolean eos, gpointer user_data); + gpointer user_data); /** * RTPSessionSyncRTCP: |