gst/rtpmanager/gstrtpsession.c: Send EOS when the session object instructs us to.
authorWim Taymans <wim.taymans@gmail.com>
Thu, 28 Aug 2008 15:21:45 +0000 (15:21 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 11 Aug 2009 01:30:37 +0000 (02:30 +0100)
Original commit message from CVS:
* gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp),
(gst_rtp_session_event_send_rtp_sink):
Send EOS when the session object instructs us to.
* gst/rtpmanager/rtpsession.c: (rtp_session_on_timeout):
* gst/rtpmanager/rtpsession.h:
Make it possible for the session manager to instruct us to send EOS. We
currently will EOS when the session is a sender and when the sender part
goes EOS. This is not entirely correct behaviour because the session
could still participate as a receiver.
Fixes #549409.

gst/rtpmanager/gstrtpsession.c
gst/rtpmanager/rtpsession.c
gst/rtpmanager/rtpsession.h

index 7543797..cc794b6 100644 (file)
@@ -259,7 +259,7 @@ static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess,
 static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess,
     RTPSource * src, GstBuffer * buffer, gpointer user_data);
 static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess,
-    RTPSource * src, GstBuffer * buffer, gpointer user_data);
+    RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data);
 static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess,
     RTPSource * src, GstBuffer * buffer, gpointer user_data);
 static gint gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload,
@@ -1098,10 +1098,11 @@ gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src,
 }
 
 /* called when the session manager has an RTCP packet ready for further
- * sending */
+ * sending. The eos flag is set when an EOS event should be sent downstream as
+ * well. */
 static GstFlowReturn
 gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src,
-    GstBuffer * buffer, gpointer user_data)
+    GstBuffer * buffer, gboolean eos, gpointer user_data)
 {
   GstFlowReturn result;
   GstRtpSession *rtpsession;
@@ -1122,6 +1123,12 @@ gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src,
     gst_buffer_set_caps (buffer, caps);
     GST_LOG_OBJECT (rtpsession, "sending RTCP");
     result = gst_pad_push (rtpsession->send_rtcp_src, buffer);
+
+    /* we have to send EOS after this packet */
+    if (eos) {
+      GST_LOG_OBJECT (rtpsession, "sending EOS");
+      gst_pad_push_event (rtpsession->send_rtcp_src, gst_event_new_eos ());
+    }
   } else {
     GST_DEBUG_OBJECT (rtpsession, "not sending RTCP, no output pad");
     gst_buffer_unref (buffer);
@@ -1557,8 +1564,11 @@ gst_rtp_session_event_send_rtp_sink (GstPad * pad, GstEvent * event)
     case GST_EVENT_EOS:{
       GstClockTime current_time;
 
+      /* push downstream FIXME, we are not supposed to leave the session just
+       * because we stop sending. */
       ret = gst_pad_push_event (rtpsession->send_rtp_src, event);
       current_time = gst_clock_get_time (rtpsession->priv->sysclock);
+      GST_DEBUG_OBJECT (rtpsession, "scheduling BYE message");
       rtp_session_send_bye (rtpsession->priv->session, "End of stream",
           current_time);
       break;
index bac851a..947fef7 100644 (file)
@@ -2300,6 +2300,7 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time,
   if (is_rtcp_time (sess, current_time, &data)) {
     if (sess->source->received_bye) {
       /* generate BYE instead */
+      GST_DEBUG ("generating BYE message");
       session_bye (sess, &data);
       sess->sent_bye = TRUE;
     } else {
@@ -2367,11 +2368,14 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time,
     /* close the RTCP packet */
     gst_rtcp_buffer_end (data.rtcp);
 
+    GST_DEBUG ("sending packet");
     if (sess->callbacks.send_rtcp)
       result = sess->callbacks.send_rtcp (sess, sess->source, data.rtcp,
-          sess->send_rtcp_user_data);
-    else
+          sess->sent_bye, sess->send_rtcp_user_data);
+    else {
+      GST_DEBUG ("freeing packet");
       gst_buffer_unref (data.rtcp);
+    }
   }
 
   return result;
index d45a410..a32f911 100644 (file)
@@ -72,6 +72,7 @@ typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, Gs
  * @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
@@ -79,7 +80,8 @@ typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, Gs
  *
  * Returns: a #GstFlowReturn.
  */
-typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data);
+typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, 
+    gboolean eos, gpointer user_data);
 
 /**
  * RTPSessionSyncRTCP: