summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2008-08-28 15:21:45 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-08-11 02:30:37 +0100
commit5c89bb2ab3a15eafcb59581cfc2bf5e477cafc73 (patch)
tree581d4d67cd8d16417614cc2e3f1477439daffff0
parent62ecaee7488a18fb71ef012b0161a227576d1e87 (diff)
gst/rtpmanager/gstrtpsession.c: Send EOS when the session object instructs us to.
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.
-rw-r--r--gst/rtpmanager/gstrtpsession.c16
-rw-r--r--gst/rtpmanager/rtpsession.c8
-rw-r--r--gst/rtpmanager/rtpsession.h4
3 files changed, 22 insertions, 6 deletions
diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c
index 75437977a..cc794b626 100644
--- a/gst/rtpmanager/gstrtpsession.c
+++ b/gst/rtpmanager/gstrtpsession.c
@@ -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;
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index bac851aae..947fef7e3 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -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;
diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h
index d45a4108b..a32f91151 100644
--- a/gst/rtpmanager/rtpsession.h
+++ b/gst/rtpmanager/rtpsession.h
@@ -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: