Add sending sdes to RtcpTransceiver.

Bug: webrtc:8239
Change-Id: Icff1528e177e0bb39dd82bd4f8533e1ed2736c40
Reviewed-on: https://webrtc-review.googlesource.com/15540
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20447}
This commit is contained in:
Danil Chapovalov
2017-10-26 12:09:41 +02:00
committed by Commit Bot
parent 4556f3c3f4
commit 78161ca59d
4 changed files with 28 additions and 10 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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();
}

View File

@ -36,19 +36,28 @@ class MockReceiveStatisticsProvider : public webrtc::ReceiveStatisticsProvider {
MOCK_METHOD1(RtcpReportBlocks, std::vector<ReportBlock>(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) {