diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_config.cc b/modules/rtp_rtcp/source/rtcp_transceiver_config.cc index ab0842916c..c129d171ee 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_config.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_config.cc @@ -27,6 +27,8 @@ bool RtcpTransceiverConfig::Validate() const { LOG(LS_WARNING) << debug_id << "Ssrc 0 may be treated by some implementation as invalid."; + if (cname.empty()) + LOG(LS_WARNING) << debug_id << "missing cname for ssrc " << feedback_ssrc; if (cname.size() > 255) { LOG(LS_ERROR) << debug_id << "cname can be maximum 255 characters."; return false; diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_config.h b/modules/rtp_rtcp/source/rtcp_transceiver_config.h index 81b925d580..187ad189d5 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_config.h +++ b/modules/rtp_rtcp/source/rtcp_transceiver_config.h @@ -33,7 +33,8 @@ struct RtcpTransceiverConfig { // Ssrc to use as default sender ssrc, e.g. for transport-wide feedbacks. uint32_t feedback_ssrc = 1; - // Cname of the local particiapnt. + // Canonical End-Point Identifier of the local particiapnt. + // Defined in rfc3550 section 6 note 2 and section 6.5.1. std::string cname; // Maximum packet size outgoing transport accepts. diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc index 6feb55da57..c8db3c858b 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc @@ -19,6 +19,7 @@ #include "modules/rtp_rtcp/source/rtcp_packet.h" #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h" +#include "modules/rtp_rtcp/source/rtcp_packet/sdes.h" #include "rtc_base/checks.h" namespace webrtc { @@ -87,8 +88,13 @@ void RtcpTransceiverImpl::SendCompoundPacket() { rr.SetReportBlocks(std::move(report_blocks)); } sender.AppendPacket(rr); - // TODO(danilchap): Append SDES to conform to the requirements on minimal - // compound RTCP packet. + if (!config_.cname.empty()) { + rtcp::Sdes sdes; + bool added = sdes.AddCName(config_.feedback_ssrc, config_.cname); + RTC_DCHECK(added) << "Failed to add cname " << config_.cname + << " to rtcp sdes packet."; + sender.AppendPacket(sdes); + } sender.Send(); } diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc index 9d0b4c0fab..ca335ec438 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc @@ -36,19 +36,28 @@ class MockReceiveStatisticsProvider : public webrtc::ReceiveStatisticsProvider { MOCK_METHOD1(RtcpReportBlocks, std::vector(size_t)); }; -TEST(RtcpTransceiverImplTest, ForceSendReportEmitsRtcpPacket) { +TEST(RtcpTransceiverImplTest, SendsMinimalCompoundPacket) { + const uint32_t kSenderSsrc = 12345; MockTransport outgoing_transport; - RtcpPacketParser rtcp_parser; - EXPECT_CALL(outgoing_transport, SendRtcp(_, _)) - .WillOnce(Invoke(&rtcp_parser, &RtcpPacketParser::Parse)); - RtcpTransceiverConfig config; + config.feedback_ssrc = kSenderSsrc; + config.cname = "cname"; config.outgoing_transport = &outgoing_transport; RtcpTransceiverImpl rtcp_transceiver(config); - ASSERT_EQ(rtcp_parser.receiver_report()->num_packets(), 0); + RtcpPacketParser rtcp_parser; + EXPECT_CALL(outgoing_transport, SendRtcp(_, _)) + .WillOnce(Invoke(&rtcp_parser, &RtcpPacketParser::Parse)); rtcp_transceiver.SendCompoundPacket(); - EXPECT_GT(rtcp_parser.receiver_report()->num_packets(), 0); + + // Minimal compound RTCP packet contains sender or receiver report and sdes + // with cname. + ASSERT_GT(rtcp_parser.receiver_report()->num_packets(), 0); + EXPECT_EQ(rtcp_parser.receiver_report()->sender_ssrc(), kSenderSsrc); + ASSERT_GT(rtcp_parser.sdes()->num_packets(), 0); + ASSERT_EQ(rtcp_parser.sdes()->chunks().size(), 1u); + EXPECT_EQ(rtcp_parser.sdes()->chunks()[0].ssrc, kSenderSsrc); + EXPECT_EQ(rtcp_parser.sdes()->chunks()[0].cname, config.cname); } TEST(RtcpTransceiverImplTest, ReceiverReportUsesReceiveStatistics) {