rtpsession: relax third-party collision detection
authorHavard Graff <havard.graff@tandberg.com>
Mon, 31 Aug 2009 16:37:40 +0000 (18:37 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 24 Sep 2010 11:56:56 +0000 (13:56 +0200)
If the source has been inactive for some time, we assume that it has
simply changed its transport source address. Hence, there is no true
third-party collision - only a simulated one.

Fixes #630447

gst/rtpmanager/rtpsession.c

index 3f0bd3b6cfaf3f21162ceae93439c753f50e2d9b..c637005ecb25cf01ba2c6c1da280dd3c30f7ca51 100644 (file)
@@ -1096,6 +1096,25 @@ check_collision (RTPSession * sess, RTPSource * source,
      * Maybe should be done in upper layer, only the SDES can tell us
      * if its a collision or a loop
      */
+
+    /* If the source has been inactive for some time, we assume that it has
+     * simply changed its transport source address. Hence, there is no true
+     * third-party collision - only a simulated one. */
+    if (arrival->time > source->last_activity) {
+      GstClockTime inactivity_period = arrival->time - source->last_activity;
+      if (inactivity_period > 1*GST_SECOND) {
+        /* Use new network address */
+        if (rtp) {
+          g_assert (source->have_rtp_from);
+          rtp_source_set_rtp_from (source, &arrival->address);
+        }
+        else {
+          g_assert (source->have_rtcp_from);
+          rtp_source_set_rtcp_from (source, &arrival->address);
+        }
+        return FALSE;
+      }
+    }
   } else {
     /* This is sending with our ssrc, is it an address we already know */