| Index: webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
|
| index 482a7418bbdbb70542d9e6fab5c82ff4208651ff..f74ebba0c0e12b09f96a57cc67795fd4054d1de6 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
|
| @@ -100,6 +100,7 @@
|
| this),
|
| clock_(configuration.clock),
|
| audio_(configuration.audio),
|
| + collision_detected_(false),
|
| last_process_time_(configuration.clock->TimeInMilliseconds()),
|
| last_bitrate_process_time_(configuration.clock->TimeInMilliseconds()),
|
| last_rtt_process_time_(configuration.clock->TimeInMilliseconds()),
|
| @@ -111,6 +112,11 @@
|
| remote_bitrate_(configuration.remote_bitrate_estimator),
|
| rtt_stats_(configuration.rtt_stats),
|
| rtt_ms_(0) {
|
| + // Make sure that RTCP objects are aware of our SSRC.
|
| + uint32_t SSRC = rtp_sender_.SSRC();
|
| + rtcp_sender_.SetSSRC(SSRC);
|
| + SetRtcpReceiverSsrcs(SSRC);
|
| +
|
| // Make sure rtcp sender use same timestamp offset as rtp sender.
|
| rtcp_sender_.SetTimestampOffset(rtp_sender_.TimestampOffset());
|
|
|
| @@ -349,6 +355,19 @@
|
| if (rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending) != 0) {
|
| LOG(LS_WARNING) << "Failed to send RTCP BYE";
|
| }
|
| +
|
| + collision_detected_ = false;
|
| +
|
| + // Generate a new SSRC for the next "call" if false
|
| + rtp_sender_.SetSendingStatus(sending);
|
| +
|
| + // Make sure that RTCP objects are aware of our SSRC (it could have changed
|
| + // Due to collision)
|
| + uint32_t SSRC = rtp_sender_.SSRC();
|
| + rtcp_sender_.SetSSRC(SSRC);
|
| + SetRtcpReceiverSsrcs(SSRC);
|
| +
|
| + return 0;
|
| }
|
| return 0;
|
| }
|
| @@ -775,6 +794,24 @@
|
| // Inform about the incoming SSRC.
|
| rtcp_sender_.SetRemoteSSRC(ssrc);
|
| rtcp_receiver_.SetRemoteSSRC(ssrc);
|
| +
|
| + // Check for a SSRC collision.
|
| + if (rtp_sender_.SSRC() == ssrc && !collision_detected_) {
|
| + // If we detect a collision change the SSRC but only once.
|
| + collision_detected_ = true;
|
| + uint32_t new_ssrc = rtp_sender_.GenerateNewSSRC();
|
| + if (new_ssrc == 0) {
|
| + // Configured via API ignore.
|
| + return;
|
| + }
|
| + if (RtcpMode::kOff != rtcp_sender_.Status()) {
|
| + // Send RTCP bye on the current SSRC.
|
| + SendRTCP(kRtcpBye);
|
| + }
|
| + // Change local SSRC and inform all objects about the new SSRC.
|
| + rtcp_sender_.SetSSRC(new_ssrc);
|
| + SetRtcpReceiverSsrcs(new_ssrc);
|
| + }
|
| }
|
|
|
| void ModuleRtpRtcpImpl::BitrateSent(uint32_t* total_rate,
|
|
|