rtpsession: avoid timing out source too quickly
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 25 Aug 2011 10:40:52 +0000 (12:40 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Mon, 19 Sep 2011 09:56:44 +0000 (11:56 +0200)
... following a PAUSE/PLAY cycle, particularly applicable when operating
with a short RTCP interval (possibly forced so server-side).

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

index ebeb3fd..030a9e4 100644 (file)
@@ -837,6 +837,10 @@ rtcp_thread (GstRtpSession * rtpsession)
 
   session = rtpsession->priv->session;
 
+  GST_DEBUG_OBJECT (rtpsession, "starting at %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (current_time));
+  session->start_time = current_time;
+
   while (!rtpsession->priv->stop_thread) {
     GstClockReturn res;
 
index 757fefe..d5b7f13 100644 (file)
@@ -2748,6 +2748,7 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
   gboolean is_sender, is_active;
   RTPSession *sess = data->sess;
   GstClockTime interval;
+  GstClockTime btime;
 
   is_sender = RTP_SOURCE_IS_SENDER (source);
   is_active = RTP_SOURCE_IS_ACTIVE (source);
@@ -2766,11 +2767,13 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
     }
     /* sources that were inactive for more than 5 times the deterministic reporting
      * interval get timed out. the min timeout is 5 seconds. */
-    if (data->current_time > source->last_activity) {
+    /* mind old time that might pre-date last time going to PLAYING */
+    btime = MAX (source->last_activity, sess->start_time);
+    if (data->current_time > btime) {
       interval = MAX (data->interval * 5, 5 * GST_SECOND);
-      if (data->current_time - source->last_activity > interval) {
+      if (data->current_time - btime > interval) {
         GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT,
-            source->ssrc, GST_TIME_ARGS (source->last_activity));
+            source->ssrc, GST_TIME_ARGS (btime));
         remove = TRUE;
       }
     }
@@ -2779,12 +2782,13 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
   /* senders that did not send for a long time become a receiver, this also
    * holds for our own source. */
   if (is_sender) {
-    if (data->current_time > source->last_rtp_activity) {
+    /* mind old time that might pre-date last time going to PLAYING */
+    btime = MAX (source->last_rtp_activity, sess->start_time);
+    if (data->current_time > btime) {
       interval = MAX (data->interval * 2, 5 * GST_SECOND);
-      if (data->current_time - source->last_rtp_activity > interval) {
+      if (data->current_time - btime > interval) {
         GST_DEBUG ("sender source %08x timed out and became receiver, last %"
-            GST_TIME_FORMAT, source->ssrc,
-            GST_TIME_ARGS (source->last_rtp_activity));
+            GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime));
         source->is_sender = FALSE;
         sess->stats.sender_sources--;
         sendertimeout = TRUE;
index 30b74bb..6b827f6 100644 (file)
@@ -209,6 +209,7 @@ struct _RTPSession {
 
   GstClockTime  next_rtcp_check_time;
   GstClockTime  last_rtcp_send_time;
+  GstClockTime  start_time;
   gboolean      first_rtcp;
   gboolean      allow_early;