From c3060dfb647fbde116918eda3adee183fb7d35b7 Mon Sep 17 00:00:00 2001 From: Olivier Crete Date: Fri, 2 Jan 2009 17:40:06 +0000 Subject: [PATCH] gst/rtpmanager/: When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_setcaps_send_rtp), (create_send_rtp_sink): * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. --- ChangeLog | 10 ++++++++++ gst/rtpmanager/gstrtpsession.c | 23 +++++++++++++++++++++++ gst/rtpmanager/rtpsession.c | 5 +++++ 3 files changed, 38 insertions(+) diff --git a/ChangeLog b/ChangeLog index 127850ad98..83d64d7e68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-01-02 Wim Taymans + + Patch by: Olivier Crete + + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_setcaps_send_rtp), (create_send_rtp_sink): + * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): + When an SSRC is found on the caps of the sender RTP, use this as the + internal SSRC. Fixes #565910. + 2009-01-02 Wim Taymans * gst/rtpmanager/gstrtpsession.c: diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index c1ca0ebb31..615dc15a15 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -1675,6 +1675,27 @@ gst_rtp_session_getcaps_send_rtp (GstPad * pad) return result; } +static gboolean +gst_rtp_session_setcaps_send_rtp (GstPad * pad, GstCaps * caps) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstStructure *s = gst_caps_get_structure (caps, 0); + guint ssrc; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + if (gst_structure_get_uint (s, "ssrc", &ssrc)) { + GST_DEBUG_OBJECT (rtpsession, "setting internal SSRC to %08x", ssrc); + rtp_session_set_internal_ssrc (priv->session, ssrc); + } + + gst_object_unref (rtpsession); + + return TRUE; +} + /* Recieve an RTP packet to be send to the receivers, send to RTP session * manager and forward to send_rtp_src. */ @@ -1852,6 +1873,8 @@ create_send_rtp_sink (GstRtpSession * rtpsession) gst_rtp_session_chain_send_rtp); gst_pad_set_getcaps_function (rtpsession->send_rtp_sink, gst_rtp_session_getcaps_send_rtp); + gst_pad_set_setcaps_function (rtpsession->send_rtp_sink, + gst_rtp_session_setcaps_send_rtp); gst_pad_set_event_function (rtpsession->send_rtp_sink, (GstPadEventFunction) gst_rtp_session_event_send_rtp_sink); gst_pad_set_internal_link_function (rtpsession->send_rtp_sink, diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index c57c996607..bd72ed9854 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -1209,9 +1209,14 @@ rtp_session_set_internal_ssrc (RTPSession * sess, guint32 ssrc) g_hash_table_steal (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sess->source->ssrc)); + GST_DEBUG ("setting internal SSRC to %08x", ssrc); + /* After this call, any receiver of the old SSRC either in RTP or RTCP + * packets will timeout on the old SSRC, we could potentially schedule a + * BYE RTCP for the old SSRC... */ sess->source->ssrc = ssrc; rtp_source_reset (sess->source); + /* rehash with the new SSRC */ g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sess->source->ssrc), sess->source); }