rtcp_receiver_unittest.cc revision b8b6fbb7a5d2f5a14f7f6f81c253747aa28e4c7f
1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12/* 13 * This file includes unit tests for the RTCPReceiver. 14 */ 15#include "testing/gmock/include/gmock/gmock.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18#include "webrtc/common_types.h" 19#include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_observer.h" 20#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h" 21#include "webrtc/modules/rtp_rtcp/source/byte_io.h" 22#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 23#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" 24#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" 25#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" 26#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" 27#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" 28#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 29#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" 30#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" 31#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" 32#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 33 34namespace webrtc { 35 36namespace { // Anonymous namespace; hide utility functions and classes. 37 38// This test transport verifies that no functions get called. 39class TestTransport : public Transport, 40 public NullRtpData { 41 public: 42 explicit TestTransport() : rtcp_receiver_(nullptr) {} 43 void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) { 44 rtcp_receiver_ = rtcp_receiver; 45 } 46 bool SendRtp(const uint8_t* /*data*/, 47 size_t /*len*/, 48 const PacketOptions& options) override { 49 ADD_FAILURE(); // FAIL() gives a compile error. 50 return false; 51 } 52 53 bool SendRtcp(const uint8_t* packet, size_t packet_len) override { 54 ADD_FAILURE(); 55 return true; 56 } 57 58 int OnReceivedPayloadData(const uint8_t* payloadData, 59 const size_t payloadSize, 60 const WebRtcRTPHeader* rtpHeader) override { 61 ADD_FAILURE(); 62 return 0; 63 } 64 RTCPReceiver* rtcp_receiver_; 65}; 66 67class RtcpReceiverTest : public ::testing::Test { 68 protected: 69 RtcpReceiverTest() 70 : over_use_detector_options_(), 71 system_clock_(1335900000), 72 remote_bitrate_observer_(), 73 remote_bitrate_estimator_( 74 new RemoteBitrateEstimatorSingleStream(&remote_bitrate_observer_, 75 &system_clock_)) { 76 test_transport_ = new TestTransport(); 77 78 RtpRtcp::Configuration configuration; 79 configuration.audio = false; 80 configuration.clock = &system_clock_; 81 configuration.outgoing_transport = test_transport_; 82 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); 83 rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration); 84 rtcp_receiver_ = new RTCPReceiver(&system_clock_, false, nullptr, nullptr, 85 nullptr, nullptr, rtp_rtcp_impl_); 86 test_transport_->SetRTCPReceiver(rtcp_receiver_); 87 } 88 ~RtcpReceiverTest() { 89 delete rtcp_receiver_; 90 delete rtp_rtcp_impl_; 91 delete test_transport_; 92 } 93 94 // Injects an RTCP packet into the receiver. 95 // Returns 0 for OK, non-0 for failure. 96 int InjectRtcpPacket(const uint8_t* packet, 97 uint16_t packet_len) { 98 RTCPUtility::RTCPParserV2 rtcpParser(packet, 99 packet_len, 100 true); // Allow non-compound RTCP 101 102 RTCPHelp::RTCPPacketInformation rtcpPacketInformation; 103 EXPECT_EQ(0, rtcp_receiver_->IncomingRTCPPacket(rtcpPacketInformation, 104 &rtcpParser)); 105 rtcp_receiver_->TriggerCallbacksFromRTCPPacket(rtcpPacketInformation); 106 // The NACK list is on purpose not copied below as it isn't needed by the 107 // test. 108 rtcp_packet_info_.rtcpPacketTypeFlags = 109 rtcpPacketInformation.rtcpPacketTypeFlags; 110 rtcp_packet_info_.remoteSSRC = rtcpPacketInformation.remoteSSRC; 111 rtcp_packet_info_.applicationSubType = 112 rtcpPacketInformation.applicationSubType; 113 rtcp_packet_info_.applicationName = rtcpPacketInformation.applicationName; 114 rtcp_packet_info_.applicationLength = 115 rtcpPacketInformation.applicationLength; 116 rtcp_packet_info_.report_blocks = rtcpPacketInformation.report_blocks; 117 rtcp_packet_info_.rtt = rtcpPacketInformation.rtt; 118 rtcp_packet_info_.interArrivalJitter = 119 rtcpPacketInformation.interArrivalJitter; 120 rtcp_packet_info_.sliPictureId = rtcpPacketInformation.sliPictureId; 121 rtcp_packet_info_.rpsiPictureId = rtcpPacketInformation.rpsiPictureId; 122 rtcp_packet_info_.receiverEstimatedMaxBitrate = 123 rtcpPacketInformation.receiverEstimatedMaxBitrate; 124 rtcp_packet_info_.ntp_secs = rtcpPacketInformation.ntp_secs; 125 rtcp_packet_info_.ntp_frac = rtcpPacketInformation.ntp_frac; 126 rtcp_packet_info_.rtp_timestamp = rtcpPacketInformation.rtp_timestamp; 127 rtcp_packet_info_.xr_dlrr_item = rtcpPacketInformation.xr_dlrr_item; 128 if (rtcpPacketInformation.VoIPMetric) 129 rtcp_packet_info_.AddVoIPMetric(rtcpPacketInformation.VoIPMetric); 130 rtcp_packet_info_.transport_feedback_.reset( 131 rtcpPacketInformation.transport_feedback_.release()); 132 return 0; 133 } 134 135 OverUseDetectorOptions over_use_detector_options_; 136 SimulatedClock system_clock_; 137 ModuleRtpRtcpImpl* rtp_rtcp_impl_; 138 RTCPReceiver* rtcp_receiver_; 139 TestTransport* test_transport_; 140 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; 141 MockRemoteBitrateObserver remote_bitrate_observer_; 142 rtc::scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; 143}; 144 145 146TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) { 147 const uint8_t bad_packet[] = {0, 0, 0, 0}; 148 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 149 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 150} 151 152TEST_F(RtcpReceiverTest, InjectSrPacket) { 153 const uint32_t kSenderSsrc = 0x10203; 154 rtcp::SenderReport sr; 155 sr.From(kSenderSsrc); 156 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 157 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 158 // The parser will note the remote SSRC on a SR from other than his 159 // expected peer, but will not flag that he's gotten a packet. 160 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 161 EXPECT_EQ(0U, 162 kRtcpSr & rtcp_packet_info_.rtcpPacketTypeFlags); 163} 164 165TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) { 166 const uint32_t kSenderSsrc = 0x10203; 167 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 168 rtcp::SenderReport sr; 169 sr.From(kSenderSsrc); 170 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 171 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 172 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 173 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); 174} 175 176TEST_F(RtcpReceiverTest, InjectRrPacket) { 177 const uint32_t kSenderSsrc = 0x10203; 178 rtcp::ReceiverReport rr; 179 rr.From(kSenderSsrc); 180 rtc::scoped_ptr<rtcp::RawPacket> packet(rr.Build()); 181 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 182 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 183 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 184 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 185} 186 187TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 188 const uint32_t kSenderSsrc = 0x10203; 189 const uint32_t kSourceSsrc = 0x123456; 190 std::set<uint32_t> ssrcs; 191 ssrcs.insert(kSourceSsrc); 192 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 193 194 rtcp::ReportBlock rb; 195 rb.To(kSourceSsrc + 1); 196 rtcp::ReceiverReport rr; 197 rr.From(kSenderSsrc); 198 rr.WithReportBlock(rb); 199 rtc::scoped_ptr<rtcp::RawPacket> packet(rr.Build()); 200 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 201 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 202 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 203 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 204 205 std::vector<RTCPReportBlock> received_blocks; 206 rtcp_receiver_->StatisticsReceived(&received_blocks); 207 EXPECT_TRUE(received_blocks.empty()); 208} 209 210TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 211 const uint32_t kSenderSsrc = 0x10203; 212 const uint32_t kSourceSsrc = 0x123456; 213 std::set<uint32_t> ssrcs; 214 ssrcs.insert(kSourceSsrc); 215 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 216 217 rtcp::ReportBlock rb; 218 rb.To(kSourceSsrc); 219 rtcp::ReceiverReport rr; 220 rr.From(kSenderSsrc); 221 rr.WithReportBlock(rb); 222 rtc::scoped_ptr<rtcp::RawPacket> packet(rr.Build()); 223 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 224 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 225 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 226 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 227 228 std::vector<RTCPReportBlock> received_blocks; 229 rtcp_receiver_->StatisticsReceived(&received_blocks); 230 EXPECT_EQ(1u, received_blocks.size()); 231} 232 233TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 234 const uint32_t kSenderSsrc = 0x10203; 235 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607}; 236 const uint16_t kSequenceNumbers[] = {10, 12423}; 237 const uint32_t kCumLost[] = {13, 555}; 238 const uint8_t kFracLost[] = {20, 11}; 239 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 240 241 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs); 242 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs); 243 244 rtcp::ReportBlock rb1; 245 rb1.To(kSourceSsrcs[0]); 246 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 247 rb1.WithFractionLost(10); 248 rb1.WithCumulativeLost(5); 249 250 rtcp::ReportBlock rb2; 251 rb2.To(kSourceSsrcs[1]); 252 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 253 254 rtcp::ReceiverReport rr1; 255 rr1.From(kSenderSsrc); 256 rr1.WithReportBlock(rb1); 257 rr1.WithReportBlock(rb2); 258 259 rtc::scoped_ptr<rtcp::RawPacket> p1(rr1.Build()); 260 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 261 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 262 EXPECT_EQ(10, rtcp_packet_info_.report_blocks.front().fractionLost); 263 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.back().fractionLost); 264 265 rtcp::ReportBlock rb3; 266 rb3.To(kSourceSsrcs[0]); 267 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]); 268 rb3.WithFractionLost(kFracLost[0]); 269 rb3.WithCumulativeLost(kCumLost[0]); 270 271 rtcp::ReportBlock rb4; 272 rb4.To(kSourceSsrcs[1]); 273 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]); 274 rb4.WithFractionLost(kFracLost[1]); 275 rb4.WithCumulativeLost(kCumLost[1]); 276 277 rtcp::ReceiverReport rr2; 278 rr2.From(kSenderSsrc); 279 rr2.WithReportBlock(rb3); 280 rr2.WithReportBlock(rb4); 281 282 rtc::scoped_ptr<rtcp::RawPacket> p2(rr2.Build()); 283 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 284 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 285 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 286 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.back().fractionLost); 287 288 std::vector<RTCPReportBlock> received_blocks; 289 rtcp_receiver_->StatisticsReceived(&received_blocks); 290 EXPECT_EQ(2u, received_blocks.size()); 291 for (size_t i = 0; i < received_blocks.size(); ++i) { 292 EXPECT_EQ(kSenderSsrc, received_blocks[i].remoteSSRC); 293 EXPECT_EQ(kSourceSsrcs[i], received_blocks[i].sourceSSRC); 294 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 295 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 296 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 297 } 298} 299 300TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) { 301 const uint32_t kSenderSsrc1 = 0x10203; 302 const uint32_t kSenderSsrc2 = 0x20304; 303 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607}; 304 const uint16_t kSequenceNumbers[] = {10, 12423}; 305 const uint32_t kCumLost[] = {13, 555}; 306 const uint8_t kFracLost[] = {20, 11}; 307 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 308 309 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs); 310 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs); 311 312 rtcp::ReportBlock rb1; 313 rb1.To(kSourceSsrcs[0]); 314 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 315 rb1.WithFractionLost(kFracLost[0]); 316 rb1.WithCumulativeLost(kCumLost[0]); 317 rtcp::ReceiverReport rr1; 318 rr1.From(kSenderSsrc1); 319 rr1.WithReportBlock(rb1); 320 321 rtc::scoped_ptr<rtcp::RawPacket> p1(rr1.Build()); 322 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 323 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 324 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 325 326 std::vector<RTCPReportBlock> received_blocks; 327 rtcp_receiver_->StatisticsReceived(&received_blocks); 328 EXPECT_EQ(1u, received_blocks.size()); 329 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 330 EXPECT_EQ(kSourceSsrcs[0], received_blocks[0].sourceSSRC); 331 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost); 332 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost); 333 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum); 334 335 rtcp::ReportBlock rb2; 336 rb2.To(kSourceSsrcs[0]); 337 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 338 rb2.WithFractionLost(kFracLost[1]); 339 rb2.WithCumulativeLost(kCumLost[1]); 340 rtcp::ReceiverReport rr2; 341 rr2.From(kSenderSsrc2); 342 rr2.WithReportBlock(rb2); 343 rtc::scoped_ptr<rtcp::RawPacket> p2(rr2.Build()); 344 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 345 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 346 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.front().fractionLost); 347 348 received_blocks.clear(); 349 rtcp_receiver_->StatisticsReceived(&received_blocks); 350 ASSERT_EQ(2u, received_blocks.size()); 351 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 352 EXPECT_EQ(kSenderSsrc2, received_blocks[1].remoteSSRC); 353 for (size_t i = 0; i < received_blocks.size(); ++i) { 354 EXPECT_EQ(kSourceSsrcs[0], received_blocks[i].sourceSSRC); 355 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 356 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 357 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 358 } 359} 360 361TEST_F(RtcpReceiverTest, GetRtt) { 362 const uint32_t kSenderSsrc = 0x10203; 363 const uint32_t kSourceSsrc = 0x123456; 364 std::set<uint32_t> ssrcs; 365 ssrcs.insert(kSourceSsrc); 366 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 367 368 // No report block received. 369 EXPECT_EQ( 370 -1, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 371 372 rtcp::ReportBlock rb; 373 rb.To(kSourceSsrc); 374 rtcp::ReceiverReport rr; 375 rr.From(kSenderSsrc); 376 rr.WithReportBlock(rb); 377 rtc::scoped_ptr<rtcp::RawPacket> packet(rr.Build()); 378 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 379 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 380 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 381 EXPECT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 382 EXPECT_EQ( 383 0, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 384 385 // Report block not received. 386 EXPECT_EQ(-1, rtcp_receiver_->RTT(kSenderSsrc + 1, nullptr, nullptr, nullptr, 387 nullptr)); 388} 389 390TEST_F(RtcpReceiverTest, InjectIjWithNoItem) { 391 rtcp::ExtendedJitterReport ij; 392 rtc::scoped_ptr<rtcp::RawPacket> packet(ij.Build()); 393 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 394 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 395} 396 397TEST_F(RtcpReceiverTest, InjectIjWithOneItem) { 398 rtcp::ExtendedJitterReport ij; 399 ij.WithJitter(0x11213141); 400 401 rtc::scoped_ptr<rtcp::RawPacket> packet(ij.Build()); 402 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 403 EXPECT_EQ(kRtcpTransmissionTimeOffset, rtcp_packet_info_.rtcpPacketTypeFlags); 404 EXPECT_EQ(0x11213141U, rtcp_packet_info_.interArrivalJitter); 405} 406 407TEST_F(RtcpReceiverTest, InjectAppWithNoData) { 408 rtcp::App app; 409 app.WithSubType(30); 410 uint32_t name = 'n' << 24; 411 name += 'a' << 16; 412 name += 'm' << 8; 413 name += 'e'; 414 app.WithName(name); 415 416 rtc::scoped_ptr<rtcp::RawPacket> packet(app.Build()); 417 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 418 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags); 419 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType); 420 EXPECT_EQ(name, rtcp_packet_info_.applicationName); 421 EXPECT_EQ(0, rtcp_packet_info_.applicationLength); 422} 423 424TEST_F(RtcpReceiverTest, InjectAppWithData) { 425 rtcp::App app; 426 app.WithSubType(30); 427 uint32_t name = 'n' << 24; 428 name += 'a' << 16; 429 name += 'm' << 8; 430 name += 'e'; 431 app.WithName(name); 432 const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'}; 433 const size_t kDataLength = sizeof(kData) / sizeof(kData[0]); 434 app.WithData((const uint8_t*)kData, kDataLength); 435 436 rtc::scoped_ptr<rtcp::RawPacket> packet(app.Build()); 437 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 438 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags); 439 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType); 440 EXPECT_EQ(name, rtcp_packet_info_.applicationName); 441 EXPECT_EQ(kDataLength, rtcp_packet_info_.applicationLength); 442} 443 444TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) { 445 const uint32_t kSenderSsrc = 0x123456; 446 rtcp::Sdes sdes; 447 sdes.WithCName(kSenderSsrc, "alice@host"); 448 449 rtc::scoped_ptr<rtcp::RawPacket> packet(sdes.Build()); 450 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 451 char cName[RTCP_CNAME_SIZE]; 452 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 453 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE)); 454} 455 456TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) { 457 const uint32_t kSenderSsrc = 0x123456; 458 rtcp::Sdes sdes; 459 sdes.WithCName(kSenderSsrc, "alice@host"); 460 461 rtc::scoped_ptr<rtcp::RawPacket> packet(sdes.Build()); 462 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 463 char cName[RTCP_CNAME_SIZE]; 464 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 465 466 // Verify that BYE removes the CNAME. 467 rtcp::Bye bye; 468 bye.From(kSenderSsrc); 469 rtc::scoped_ptr<rtcp::RawPacket> p2(bye.Build()); 470 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 471 EXPECT_EQ(-1, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 472} 473 474TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) { 475 const uint32_t kSenderSsrc = 0x10203; 476 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607}; 477 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 478 479 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs); 480 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs); 481 482 rtcp::ReportBlock rb1; 483 rb1.To(kSourceSsrcs[0]); 484 rtcp::ReportBlock rb2; 485 rb2.To(kSourceSsrcs[1]); 486 rtcp::ReceiverReport rr; 487 rr.From(kSenderSsrc); 488 rr.WithReportBlock(rb1); 489 rr.WithReportBlock(rb2); 490 491 rtc::scoped_ptr<rtcp::RawPacket> p1(rr.Build()); 492 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 493 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 494 std::vector<RTCPReportBlock> received_blocks; 495 rtcp_receiver_->StatisticsReceived(&received_blocks); 496 EXPECT_EQ(2u, received_blocks.size()); 497 498 // Verify that BYE removes the report blocks. 499 rtcp::Bye bye; 500 bye.From(kSenderSsrc); 501 rtc::scoped_ptr<rtcp::RawPacket> p2(bye.Build()); 502 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 503 received_blocks.clear(); 504 rtcp_receiver_->StatisticsReceived(&received_blocks); 505 EXPECT_TRUE(received_blocks.empty()); 506 507 // Inject packet. 508 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 509 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 510 received_blocks.clear(); 511 rtcp_receiver_->StatisticsReceived(&received_blocks); 512 EXPECT_EQ(2u, received_blocks.size()); 513} 514 515TEST_F(RtcpReceiverTest, InjectPliPacket) { 516 const uint32_t kSourceSsrc = 0x123456; 517 std::set<uint32_t> ssrcs; 518 ssrcs.insert(kSourceSsrc); 519 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 520 521 rtcp::Pli pli; 522 pli.To(kSourceSsrc); 523 rtc::scoped_ptr<rtcp::RawPacket> packet(pli.Build()); 524 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 525 EXPECT_EQ(kRtcpPli, rtcp_packet_info_.rtcpPacketTypeFlags); 526} 527 528TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) { 529 const uint32_t kSourceSsrc = 0x123456; 530 std::set<uint32_t> ssrcs; 531 ssrcs.insert(kSourceSsrc); 532 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 533 534 rtcp::Pli pli; 535 pli.To(kSourceSsrc + 1); 536 rtc::scoped_ptr<rtcp::RawPacket> packet(pli.Build()); 537 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 538 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 539} 540 541TEST_F(RtcpReceiverTest, InjectFirPacket) { 542 const uint32_t kSourceSsrc = 0x123456; 543 std::set<uint32_t> ssrcs; 544 ssrcs.insert(kSourceSsrc); 545 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 546 547 rtcp::Fir fir; 548 fir.To(kSourceSsrc); 549 rtc::scoped_ptr<rtcp::RawPacket> packet(fir.Build()); 550 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 551 EXPECT_EQ(kRtcpFir, rtcp_packet_info_.rtcpPacketTypeFlags); 552} 553 554TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) { 555 const uint32_t kSourceSsrc = 0x123456; 556 std::set<uint32_t> ssrcs; 557 ssrcs.insert(kSourceSsrc); 558 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 559 560 rtcp::Fir fir; 561 fir.To(kSourceSsrc + 1); 562 rtc::scoped_ptr<rtcp::RawPacket> packet(fir.Build()); 563 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 564 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 565} 566 567TEST_F(RtcpReceiverTest, InjectSliPacket) { 568 rtcp::Sli sli; 569 sli.WithPictureId(40); 570 rtc::scoped_ptr<rtcp::RawPacket> packet(sli.Build()); 571 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 572 EXPECT_EQ(kRtcpSli, rtcp_packet_info_.rtcpPacketTypeFlags); 573 EXPECT_EQ(40, rtcp_packet_info_.sliPictureId); 574} 575 576TEST_F(RtcpReceiverTest, XrPacketWithZeroReportBlocksIgnored) { 577 rtcp::Xr xr; 578 xr.From(0x2345); 579 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 580 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 581 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 582} 583 584TEST_F(RtcpReceiverTest, InjectXrVoipPacket) { 585 const uint32_t kSourceSsrc = 0x123456; 586 std::set<uint32_t> ssrcs; 587 ssrcs.insert(kSourceSsrc); 588 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 589 590 const uint8_t kLossRate = 123; 591 rtcp::VoipMetric voip_metric; 592 voip_metric.To(kSourceSsrc); 593 voip_metric.LossRate(kLossRate); 594 rtcp::Xr xr; 595 xr.From(0x2345); 596 xr.WithVoipMetric(&voip_metric); 597 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 598 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 599 ASSERT_TRUE(rtcp_packet_info_.VoIPMetric != nullptr); 600 EXPECT_EQ(kLossRate, rtcp_packet_info_.VoIPMetric->lossRate); 601 EXPECT_EQ(kRtcpXrVoipMetric, rtcp_packet_info_.rtcpPacketTypeFlags); 602} 603 604TEST_F(RtcpReceiverTest, XrVoipPacketNotToUsIgnored) { 605 const uint32_t kSourceSsrc = 0x123456; 606 std::set<uint32_t> ssrcs; 607 ssrcs.insert(kSourceSsrc); 608 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 609 610 rtcp::VoipMetric voip_metric; 611 voip_metric.To(kSourceSsrc + 1); 612 rtcp::Xr xr; 613 xr.From(0x2345); 614 xr.WithVoipMetric(&voip_metric); 615 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 616 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 617 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 618} 619 620TEST_F(RtcpReceiverTest, InjectXrReceiverReferenceTimePacket) { 621 rtcp::Rrtr rrtr; 622 rrtr.WithNtp(NtpTime(0x10203, 0x40506)); 623 rtcp::Xr xr; 624 xr.From(0x2345); 625 xr.WithRrtr(&rrtr); 626 627 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 628 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 629 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 630 rtcp_packet_info_.rtcpPacketTypeFlags); 631} 632 633TEST_F(RtcpReceiverTest, XrDlrrPacketNotToUsIgnored) { 634 const uint32_t kSourceSsrc = 0x123456; 635 std::set<uint32_t> ssrcs; 636 ssrcs.insert(kSourceSsrc); 637 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 638 639 rtcp::Dlrr dlrr; 640 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 641 rtcp::Xr xr; 642 xr.From(0x2345); 643 xr.WithDlrr(&dlrr); 644 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 645 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 646 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 647 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 648} 649 650TEST_F(RtcpReceiverTest, InjectXrDlrrPacketWithSubBlock) { 651 const uint32_t kSourceSsrc = 0x123456; 652 std::set<uint32_t> ssrcs; 653 ssrcs.insert(kSourceSsrc); 654 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 655 656 rtcp::Dlrr dlrr; 657 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 658 rtcp::Xr xr; 659 xr.From(0x2345); 660 xr.WithDlrr(&dlrr); 661 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 662 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 663 // The parser should note the DLRR report block item, but not flag the packet 664 // since the RTT is not estimated. 665 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 666} 667 668TEST_F(RtcpReceiverTest, InjectXrDlrrPacketWithMultipleSubBlocks) { 669 const uint32_t kSourceSsrc = 0x123456; 670 std::set<uint32_t> ssrcs; 671 ssrcs.insert(kSourceSsrc); 672 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 673 674 rtcp::Dlrr dlrr; 675 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 676 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); 677 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 678 rtcp::Xr xr; 679 xr.From(0x2345); 680 xr.WithDlrr(&dlrr); 681 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 682 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 683 // The parser should note the DLRR report block item, but not flag the packet 684 // since the RTT is not estimated. 685 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 686} 687 688TEST_F(RtcpReceiverTest, InjectXrPacketWithMultipleReportBlocks) { 689 const uint32_t kSourceSsrc = 0x123456; 690 std::set<uint32_t> ssrcs; 691 ssrcs.insert(kSourceSsrc); 692 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 693 694 rtcp::Rrtr rrtr; 695 rtcp::Dlrr dlrr; 696 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 697 rtcp::VoipMetric metric; 698 metric.To(kSourceSsrc); 699 rtcp::Xr xr; 700 xr.From(0x2345); 701 xr.WithRrtr(&rrtr); 702 xr.WithDlrr(&dlrr); 703 xr.WithVoipMetric(&metric); 704 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 705 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 706 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 707 kRtcpXrVoipMetric), 708 rtcp_packet_info_.rtcpPacketTypeFlags); 709 // The parser should note the DLRR report block item, but not flag the packet 710 // since the RTT is not estimated. 711 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 712} 713 714TEST_F(RtcpReceiverTest, InjectXrPacketWithUnknownReportBlock) { 715 const uint32_t kSourceSsrc = 0x123456; 716 std::set<uint32_t> ssrcs; 717 ssrcs.insert(kSourceSsrc); 718 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 719 std::vector<uint32_t> remote_ssrcs; 720 remote_ssrcs.push_back(kSourceSsrc); 721 722 rtcp::Rrtr rrtr; 723 rtcp::Dlrr dlrr; 724 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 725 rtcp::VoipMetric metric; 726 metric.To(kSourceSsrc); 727 rtcp::Xr xr; 728 xr.From(0x2345); 729 xr.WithRrtr(&rrtr); 730 xr.WithDlrr(&dlrr); 731 xr.WithVoipMetric(&metric); 732 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 733 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 734 uint8_t* buffer = const_cast<uint8_t*>(packet->Buffer()); 735 EXPECT_EQ(5, buffer[20]); 736 buffer[20] = 6; 737 738 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 739 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 740 kRtcpXrVoipMetric), 741 rtcp_packet_info_.rtcpPacketTypeFlags); 742 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 743} 744 745TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { 746 int64_t rtt_ms; 747 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 748} 749 750TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { 751 RtcpReceiveTimeInfo info; 752 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 753} 754 755TEST_F(RtcpReceiverTest, GetLastReceivedXrReferenceTimeInfo) { 756 const uint32_t kSenderSsrc = 0x123456; 757 const NtpTime kNtp(0x10203, 0x40506); 758 const uint32_t kNtpMid = 759 RTCPUtility::MidNtp(kNtp.seconds(), kNtp.fractions()); 760 761 rtcp::Rrtr rrtr; 762 rrtr.WithNtp(kNtp); 763 rtcp::Xr xr; 764 xr.From(kSenderSsrc); 765 xr.WithRrtr(&rrtr); 766 rtc::scoped_ptr<rtcp::RawPacket> packet(xr.Build()); 767 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 768 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 769 rtcp_packet_info_.rtcpPacketTypeFlags); 770 771 RtcpReceiveTimeInfo info; 772 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 773 EXPECT_EQ(kSenderSsrc, info.sourceSSRC); 774 EXPECT_EQ(kNtpMid, info.lastRR); 775 EXPECT_EQ(0U, info.delaySinceLastRR); 776 777 system_clock_.AdvanceTimeMilliseconds(1000); 778 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 779 EXPECT_EQ(65536U, info.delaySinceLastRR); 780} 781 782TEST_F(RtcpReceiverTest, ReceiveReportTimeout) { 783 const uint32_t kSenderSsrc = 0x10203; 784 const uint32_t kSourceSsrc = 0x40506; 785 const int64_t kRtcpIntervalMs = 1000; 786 787 std::set<uint32_t> ssrcs; 788 ssrcs.insert(kSourceSsrc); 789 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 790 791 const uint16_t kSequenceNumber = 1234; 792 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 793 794 // No RR received, shouldn't trigger a timeout. 795 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 796 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 797 798 // Add a RR and advance the clock just enough to not trigger a timeout. 799 rtcp::ReportBlock rb1; 800 rb1.To(kSourceSsrc); 801 rb1.WithExtHighestSeqNum(kSequenceNumber); 802 rtcp::ReceiverReport rr1; 803 rr1.From(kSenderSsrc); 804 rr1.WithReportBlock(rb1); 805 rtc::scoped_ptr<rtcp::RawPacket> p1(rr1.Build()); 806 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 807 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 808 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 809 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 810 811 // Add a RR with the same extended max as the previous RR to trigger a 812 // sequence number timeout, but not a RR timeout. 813 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 814 system_clock_.AdvanceTimeMilliseconds(2); 815 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 816 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 817 818 // Advance clock enough to trigger an RR timeout too. 819 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 820 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 821 822 // We should only get one timeout even though we still haven't received a new 823 // RR. 824 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 825 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 826 827 // Add a new RR with increase sequence number to reset timers. 828 rtcp::ReportBlock rb2; 829 rb2.To(kSourceSsrc); 830 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 831 rtcp::ReceiverReport rr2; 832 rr2.From(kSenderSsrc); 833 rr2.WithReportBlock(rb2); 834 rtc::scoped_ptr<rtcp::RawPacket> p2(rr2.Build()); 835 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 836 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 837 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 838 839 // Verify we can get a timeout again once we've received new RR. 840 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 841 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 842 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 843 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 844 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 845 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 846 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 847} 848 849TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 850 // This call is expected to fail because no data has arrived. 851 EXPECT_EQ(-1, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 852} 853 854TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) { 855 const uint32_t kMediaFlowSsrc = 0x2040608; 856 const uint32_t kSenderSsrc = 0x10203; 857 std::set<uint32_t> ssrcs; 858 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 859 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 860 861 rtcp::Tmmbr tmmbr; 862 tmmbr.From(kSenderSsrc); 863 tmmbr.To(kMediaFlowSsrc); 864 tmmbr.WithBitrateKbps(30); 865 866 rtcp::SenderReport sr; 867 sr.From(kSenderSsrc); 868 sr.Append(&tmmbr); 869 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 870 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 871 872 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 873 TMMBRSet candidate_set; 874 candidate_set.VerifyAndAllocateSet(1); 875 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(1, 0, &candidate_set)); 876 EXPECT_LT(0U, candidate_set.Tmmbr(0)); 877 EXPECT_EQ(kSenderSsrc, candidate_set.Ssrc(0)); 878} 879 880TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 881 const uint32_t kMediaFlowSsrc = 0x2040608; 882 const uint32_t kSenderSsrc = 0x10203; 883 884 rtcp::Tmmbr tmmbr; 885 tmmbr.From(kSenderSsrc); 886 tmmbr.To(kMediaFlowSsrc + 1); // This SSRC is not what we are sending. 887 tmmbr.WithBitrateKbps(30); 888 889 rtcp::SenderReport sr; 890 sr.From(kSenderSsrc); 891 sr.Append(&tmmbr); 892 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 893 894 std::set<uint32_t> ssrcs; 895 ssrcs.insert(kMediaFlowSsrc); 896 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 897 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 898 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 899} 900 901TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 902 const uint32_t kMediaFlowSsrc = 0x2040608; 903 const uint32_t kSenderSsrc = 0x10203; 904 std::set<uint32_t> ssrcs; 905 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 906 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 907 908 rtcp::Tmmbr tmmbr; 909 tmmbr.From(kSenderSsrc); 910 tmmbr.To(kMediaFlowSsrc); 911 tmmbr.WithBitrateKbps(0); 912 913 rtcp::SenderReport sr; 914 sr.From(kSenderSsrc); 915 sr.Append(&tmmbr); 916 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 917 918 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 919 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 920} 921 922TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 923 const uint32_t kMediaFlowSsrc = 0x2040608; 924 const uint32_t kSenderSsrc = 0x10203; 925 std::set<uint32_t> ssrcs; 926 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 927 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 928 929 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. 930 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 931 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 932 rtcp::Tmmbr tmmbr; 933 tmmbr.From(ssrc); 934 tmmbr.To(kMediaFlowSsrc); 935 tmmbr.WithBitrateKbps(30); 936 937 rtcp::SenderReport sr; 938 sr.From(ssrc); 939 sr.Append(&tmmbr); 940 rtc::scoped_ptr<rtcp::RawPacket> packet(sr.Build()); 941 EXPECT_EQ(0, InjectRtcpPacket(packet->Buffer(), packet->Length())); 942 // 5 seconds between each packet. 943 system_clock_.AdvanceTimeMilliseconds(5000); 944 } 945 // It is now starttime + 15. 946 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 947 TMMBRSet candidate_set; 948 candidate_set.VerifyAndAllocateSet(3); 949 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); 950 EXPECT_LT(0U, candidate_set.Tmmbr(0)); 951 // We expect the timeout to be 25 seconds. Advance the clock by 12 952 // seconds, timing out the first packet. 953 system_clock_.AdvanceTimeMilliseconds(12000); 954 // Odd behaviour: Just counting them does not trigger the timeout. 955 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); 956 EXPECT_EQ(2, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); 957 EXPECT_EQ(kSenderSsrc + 1, candidate_set.Ssrc(0)); 958} 959 960TEST_F(RtcpReceiverTest, Callbacks) { 961 class RtcpCallbackImpl : public RtcpStatisticsCallback { 962 public: 963 RtcpCallbackImpl() : RtcpStatisticsCallback(), ssrc_(0) {} 964 virtual ~RtcpCallbackImpl() {} 965 966 void StatisticsUpdated(const RtcpStatistics& statistics, 967 uint32_t ssrc) override { 968 stats_ = statistics; 969 ssrc_ = ssrc; 970 } 971 972 void CNameChanged(const char* cname, uint32_t ssrc) override {} 973 974 bool Matches(uint32_t ssrc, uint32_t extended_max, uint8_t fraction_loss, 975 uint32_t cumulative_loss, uint32_t jitter) { 976 return ssrc_ == ssrc && 977 stats_.fraction_lost == fraction_loss && 978 stats_.cumulative_lost == cumulative_loss && 979 stats_.extended_max_sequence_number == extended_max && 980 stats_.jitter == jitter; 981 } 982 983 RtcpStatistics stats_; 984 uint32_t ssrc_; 985 } callback; 986 987 rtcp_receiver_->RegisterRtcpStatisticsCallback(&callback); 988 989 const uint32_t kSenderSsrc = 0x10203; 990 const uint32_t kSourceSsrc = 0x123456; 991 const uint8_t kFractionLoss = 3; 992 const uint32_t kCumulativeLoss = 7; 993 const uint32_t kJitter = 9; 994 const uint16_t kSequenceNumber = 1234; 995 996 std::set<uint32_t> ssrcs; 997 ssrcs.insert(kSourceSsrc); 998 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 999 1000 // First packet, all numbers should just propagate. 1001 rtcp::ReportBlock rb1; 1002 rb1.To(kSourceSsrc); 1003 rb1.WithExtHighestSeqNum(kSequenceNumber); 1004 rb1.WithFractionLost(kFractionLoss); 1005 rb1.WithCumulativeLost(kCumulativeLoss); 1006 rb1.WithJitter(kJitter); 1007 1008 rtcp::ReceiverReport rr1; 1009 rr1.From(kSenderSsrc); 1010 rr1.WithReportBlock(rb1); 1011 rtc::scoped_ptr<rtcp::RawPacket> p1(rr1.Build()); 1012 EXPECT_EQ(0, InjectRtcpPacket(p1->Buffer(), p1->Length())); 1013 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1014 kCumulativeLoss, kJitter)); 1015 1016 rtcp_receiver_->RegisterRtcpStatisticsCallback(nullptr); 1017 1018 // Add arbitrary numbers, callback should not be called (retain old values). 1019 rtcp::ReportBlock rb2; 1020 rb2.To(kSourceSsrc); 1021 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 1022 rb2.WithFractionLost(42); 1023 rb2.WithCumulativeLost(137); 1024 rb2.WithJitter(4711); 1025 1026 rtcp::ReceiverReport rr2; 1027 rr2.From(kSenderSsrc); 1028 rr2.WithReportBlock(rb2); 1029 rtc::scoped_ptr<rtcp::RawPacket> p2(rr2.Build()); 1030 EXPECT_EQ(0, InjectRtcpPacket(p2->Buffer(), p2->Length())); 1031 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1032 kCumulativeLoss, kJitter)); 1033} 1034 1035TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) { 1036 const uint32_t kSenderSsrc = 0x10203; 1037 const uint32_t kSourceSsrc = 0x123456; 1038 1039 std::set<uint32_t> ssrcs; 1040 ssrcs.insert(kSourceSsrc); 1041 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 1042 1043 rtcp::TransportFeedback packet; 1044 packet.WithMediaSourceSsrc(kSourceSsrc); 1045 packet.WithPacketSenderSsrc(kSenderSsrc); 1046 packet.WithBase(1, 1000); 1047 packet.WithReceivedPacket(1, 1000); 1048 1049 rtc::scoped_ptr<rtcp::RawPacket> built_packet = packet.Build(); 1050 ASSERT_TRUE(built_packet.get() != nullptr); 1051 1052 EXPECT_EQ(0, 1053 InjectRtcpPacket(built_packet->Buffer(), built_packet->Length())); 1054 1055 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1056 EXPECT_TRUE(rtcp_packet_info_.transport_feedback_.get() != nullptr); 1057} 1058 1059TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) { 1060 const uint32_t kSenderSsrc = 0x10203; 1061 const uint32_t kSourceSsrc = 0x123456; 1062 1063 std::set<uint32_t> ssrcs; 1064 ssrcs.insert(kSourceSsrc); 1065 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 1066 1067 // Send a compound packet with a TransportFeedback followed by something else. 1068 rtcp::TransportFeedback packet; 1069 packet.WithMediaSourceSsrc(kSourceSsrc); 1070 packet.WithPacketSenderSsrc(kSenderSsrc); 1071 packet.WithBase(1, 1000); 1072 packet.WithReceivedPacket(1, 1000); 1073 1074 static uint32_t kBitrateBps = 50000; 1075 rtcp::Remb remb; 1076 remb.From(kSourceSsrc); 1077 remb.WithBitrateBps(kBitrateBps); 1078 packet.Append(&remb); 1079 1080 rtc::scoped_ptr<rtcp::RawPacket> built_packet = packet.Build(); 1081 ASSERT_TRUE(built_packet.get() != nullptr); 1082 1083 // Modify the TransportFeedback packet so that it is invalid. 1084 const size_t kStatusCountOffset = 14; 1085 ByteWriter<uint16_t>::WriteBigEndian( 1086 &built_packet->MutableBuffer()[kStatusCountOffset], 42); 1087 1088 EXPECT_EQ(0, 1089 InjectRtcpPacket(built_packet->Buffer(), built_packet->Length())); 1090 1091 // Transport feedback should be ignored, but next packet should work. 1092 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1093 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); 1094 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate); 1095} 1096 1097} // Anonymous namespace 1098 1099} // namespace webrtc 1100