diff options
author | Youness Alaoui <kakaroto@kakaroto.homelinux.net> | 2014-07-31 17:03:02 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> | 2014-09-18 13:38:01 -0400 |
commit | b344a73c10cb1a57bbacf55292c0a376f7e43c97 (patch) | |
tree | fea894c0d7d601fa2a396f0decbf841c1de00a8b /gst | |
parent | c8a6bf9f4b72dd3264cc6a80290ee8ef71c7b695 (diff) | |
download | farstream-b344a73c10cb1a57bbacf55292c0a376f7e43c97.tar.gz |
rtpsession: Fix discovery of RTCP ssrc.
SRTCP packets will have SDES encrypted, so we need to check for RR and SR reports.
Also, the code was checking if rtcp_map failed, instead of succeeded.
This also allows us to mix rtp and rtcp on the same component.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/fsrtpconference/fs-rtp-session.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c index f45c93ee..d766ff8d 100644 --- a/gst/fsrtpconference/fs-rtp-session.c +++ b/gst/fsrtpconference/fs-rtp-session.c @@ -1868,24 +1868,20 @@ _stream_known_source_packet_received (FsRtpStream *stream, guint component, guint32 ssrc; FsRtpSession *self = FS_RTP_SESSION_CAST (user_data); gboolean valid = FALSE; + GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT; if (fs_rtp_session_has_disposed_enter (self, NULL)) return; - - if (component == 1) + if (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer)) { - GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT; - if (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer)) - { - ssrc = gst_rtp_buffer_get_ssrc (&rtpbuffer); - gst_rtp_buffer_unmap (&rtpbuffer); + ssrc = gst_rtp_buffer_get_ssrc (&rtpbuffer); + gst_rtp_buffer_unmap (&rtpbuffer); - valid = TRUE; - } + valid = TRUE; } - else if (component == 2) + else { GstRTCPPacket rtcppacket; GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT; @@ -1894,14 +1890,29 @@ _stream_known_source_packet_received (FsRtpStream *stream, guint component, { if (gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &rtcppacket)) { + GstRTCPType type; + do { - if (gst_rtcp_packet_get_type (&rtcppacket) == GST_RTCP_TYPE_SDES) - { - ssrc = gst_rtcp_packet_sdes_get_ssrc (&rtcppacket); - valid = TRUE; - break; + type = gst_rtcp_packet_get_type (&rtcppacket); + switch (type) { + case GST_RTCP_TYPE_RR: + ssrc = gst_rtcp_packet_rr_get_ssrc (&rtcppacket); + valid = TRUE; + break; + case GST_RTCP_TYPE_SR: + gst_rtcp_packet_sr_get_sender_info (&rtcppacket, &ssrc, NULL, + NULL, NULL, NULL); + valid = TRUE; + break; + case GST_RTCP_TYPE_SDES: + ssrc = gst_rtcp_packet_sdes_get_ssrc (&rtcppacket); + valid = TRUE; + break; + default: + break; } - } while (gst_rtcp_packet_move_to_next (&rtcppacket)); + } while (valid == FALSE && type != GST_RTCP_TYPE_INVALID && + gst_rtcp_packet_move_to_next (&rtcppacket)); } gst_rtcp_buffer_unmap (&rtcpbuffer); } |