mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
session: generate reconfigure on collision
When we detect a collision, change the SSRC that we suggest upstream and trigger RECONFIGURE. This should make upstream select a new SSRC.
This commit is contained in:
parent
495d43c089
commit
e0a1ce1291
2 changed files with 27 additions and 12 deletions
|
@ -313,8 +313,20 @@ on_new_ssrc (RTPSession * session, RTPSource * src, GstRtpSession * sess)
|
|||
static void
|
||||
on_ssrc_collision (RTPSession * session, RTPSource * src, GstRtpSession * sess)
|
||||
{
|
||||
GstPad *recv_rtp_sink;
|
||||
|
||||
g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_COLLISION], 0,
|
||||
src->ssrc);
|
||||
|
||||
GST_RTP_SESSION_LOCK (sess);
|
||||
if ((recv_rtp_sink = sess->recv_rtp_sink))
|
||||
gst_object_ref (recv_rtp_sink);
|
||||
GST_RTP_SESSION_UNLOCK (sess);
|
||||
|
||||
if (recv_rtp_sink) {
|
||||
gst_pad_push_event (recv_rtp_sink, gst_event_new_reconfigure ());
|
||||
gst_object_unref (recv_rtp_sink);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1173,10 +1173,14 @@ static gboolean
|
|||
check_collision (RTPSession * sess, RTPSource * source,
|
||||
RTPArrivalStats * arrival, gboolean rtp)
|
||||
{
|
||||
guint32 ssrc;
|
||||
|
||||
/* If we have no arrival address, we can't do collision checking */
|
||||
if (!arrival->address)
|
||||
return FALSE;
|
||||
|
||||
ssrc = rtp_source_get_ssrc (source);
|
||||
|
||||
if (!source->internal) {
|
||||
GSocketAddress *from;
|
||||
|
||||
|
@ -1193,16 +1197,15 @@ check_collision (RTPSession * sess, RTPSource * source,
|
|||
/* Address is the same */
|
||||
return FALSE;
|
||||
} else {
|
||||
GST_LOG ("we have a third-party collision or loop ssrc:%x",
|
||||
rtp_source_get_ssrc (source));
|
||||
GST_LOG ("we have a third-party collision or loop ssrc:%x", ssrc);
|
||||
if (sess->favor_new) {
|
||||
if (rtp_source_find_conflicting_address (source,
|
||||
arrival->address, arrival->current_time)) {
|
||||
gchar *buf1;
|
||||
|
||||
buf1 = __g_socket_address_to_string (arrival->address);
|
||||
GST_LOG ("Known conflict on %x for %s, dropping packet",
|
||||
rtp_source_get_ssrc (source), buf1);
|
||||
GST_LOG ("Known conflict on %x for %s, dropping packet", ssrc,
|
||||
buf1);
|
||||
g_free (buf1);
|
||||
|
||||
return TRUE;
|
||||
|
@ -1219,8 +1222,7 @@ check_collision (RTPSession * sess, RTPSource * source,
|
|||
buf2 = __g_socket_address_to_string (arrival->address);
|
||||
|
||||
GST_DEBUG ("New conflict for ssrc %x, replacing %s with %s,"
|
||||
" saving old as known conflict",
|
||||
rtp_source_get_ssrc (source), buf1, buf2);
|
||||
" saving old as known conflict", ssrc, buf1, buf2);
|
||||
|
||||
if (rtp)
|
||||
rtp_source_set_rtp_from (source, arrival->address);
|
||||
|
@ -1252,7 +1254,6 @@ check_collision (RTPSession * sess, RTPSource * source,
|
|||
*/
|
||||
} else {
|
||||
/* This is sending with our ssrc, is it an address we already know */
|
||||
|
||||
if (rtp_source_find_conflicting_address (source, arrival->address,
|
||||
arrival->current_time)) {
|
||||
/* Its a known conflict, its probably a loop, not a collision
|
||||
|
@ -1261,16 +1262,18 @@ check_collision (RTPSession * sess, RTPSource * source,
|
|||
GST_DEBUG ("Our packets are being looped back to us, dropping");
|
||||
} else {
|
||||
/* Its a new collision, lets change our SSRC */
|
||||
|
||||
rtp_source_add_conflicting_address (source, arrival->address,
|
||||
arrival->current_time);
|
||||
|
||||
GST_DEBUG ("Collision for SSRC %x", rtp_source_get_ssrc (source));
|
||||
GST_DEBUG ("Collision for SSRC %x", ssrc);
|
||||
/* mark the source BYE */
|
||||
rtp_source_mark_bye (source, "SSRC Collision");
|
||||
/* if we were suggesting this SSRC, change to something else */
|
||||
if (sess->suggested_ssrc == ssrc)
|
||||
sess->suggested_ssrc = rtp_session_create_new_ssrc (sess);
|
||||
|
||||
on_ssrc_collision (sess, source);
|
||||
|
||||
sess->change_ssrc = TRUE;
|
||||
|
||||
rtp_source_mark_bye (source, "SSRC Collision");
|
||||
rtp_session_schedule_bye_locked (sess, arrival->current_time);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue