rtcp_receiver_unittest.cc (77876B)
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 #include "modules/rtp_rtcp/source/rtcp_receiver.h" 12 13 #include <cstddef> 14 #include <cstdint> 15 #include <memory> 16 #include <optional> 17 #include <set> 18 #include <string> 19 #include <utility> 20 #include <vector> 21 22 #include "absl/strings/string_view.h" 23 #include "api/array_view.h" 24 #include "api/environment/environment_factory.h" 25 #include "api/transport/network_types.h" 26 #include "api/units/data_rate.h" 27 #include "api/units/time_delta.h" 28 #include "api/units/timestamp.h" 29 #include "api/video/video_bitrate_allocation.h" 30 #include "api/video/video_bitrate_allocator.h" 31 #include "api/video/video_codec_constants.h" 32 #include "modules/rtp_rtcp/include/report_block_data.h" 33 #include "modules/rtp_rtcp/include/rtcp_statistics.h" 34 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 35 #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h" 36 #include "modules/rtp_rtcp/mocks/mock_network_state_estimator_observer.h" 37 #include "modules/rtp_rtcp/source/byte_io.h" 38 #include "modules/rtp_rtcp/source/ntp_time_util.h" 39 #include "modules/rtp_rtcp/source/rtcp_packet/app.h" 40 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h" 41 #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" 42 #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h" 43 #include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h" 44 #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" 45 #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" 46 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h" 47 #include "modules/rtp_rtcp/source/rtcp_packet/pli.h" 48 #include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" 49 #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" 50 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h" 51 #include "modules/rtp_rtcp/source/rtcp_packet/remote_estimate.h" 52 #include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h" 53 #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h" 54 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 55 #include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" 56 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 57 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" 58 #include "rtc_base/buffer.h" 59 #include "rtc_base/random.h" 60 #include "system_wrappers/include/clock.h" 61 #include "system_wrappers/include/ntp_time.h" 62 #include "test/create_test_field_trials.h" 63 #include "test/gmock.h" 64 #include "test/gtest.h" 65 66 namespace webrtc { 67 namespace { 68 69 using rtcp::ReceiveTimeInfo; 70 using ::testing::_; 71 using ::testing::AllOf; 72 using ::testing::ElementsAre; 73 using ::testing::ElementsAreArray; 74 using ::testing::Eq; 75 using ::testing::Field; 76 using ::testing::Gt; 77 using ::testing::InSequence; 78 using ::testing::IsEmpty; 79 using ::testing::NiceMock; 80 using ::testing::Property; 81 using ::testing::SizeIs; 82 using ::testing::StrEq; 83 using ::testing::StrictMock; 84 using ::testing::UnorderedElementsAre; 85 86 class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver { 87 public: 88 MOCK_METHOD(void, 89 RtcpPacketTypesCounterUpdated, 90 (uint32_t, const RtcpPacketTypeCounter&), 91 (override)); 92 }; 93 94 class MockRtcpIntraFrameObserver : public RtcpIntraFrameObserver { 95 public: 96 MOCK_METHOD(void, OnReceivedIntraFrameRequest, (uint32_t), (override)); 97 }; 98 99 class MockRtcpLossNotificationObserver : public RtcpLossNotificationObserver { 100 public: 101 ~MockRtcpLossNotificationObserver() override = default; 102 MOCK_METHOD(void, 103 OnReceivedLossNotification, 104 (uint32_t ssrc, 105 uint16_t seq_num_of_last_decodable, 106 uint16_t seq_num_of_last_received, 107 bool decodability_flag), 108 (override)); 109 }; 110 111 class MockCnameCallbackImpl : public RtcpCnameCallback { 112 public: 113 MOCK_METHOD(void, OnCname, (uint32_t, absl::string_view), (override)); 114 }; 115 116 class MockReportBlockDataObserverImpl : public ReportBlockDataObserver { 117 public: 118 MOCK_METHOD(void, OnReportBlockDataUpdated, (ReportBlockData), (override)); 119 }; 120 121 class MockModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp { 122 public: 123 MOCK_METHOD(void, SetTmmbn, (std::vector<rtcp::TmmbItem>), (override)); 124 MOCK_METHOD(void, OnRequestSendReport, (), (override)); 125 MOCK_METHOD(void, OnReceivedNack, (const std::vector<uint16_t>&), (override)); 126 MOCK_METHOD(void, 127 OnReceivedRtcpReportBlocks, 128 (ArrayView<const ReportBlockData>), 129 (override)); 130 }; 131 132 class MockVideoBitrateAllocationObserver 133 : public VideoBitrateAllocationObserver { 134 public: 135 MOCK_METHOD(void, 136 OnBitrateAllocationUpdated, 137 (const VideoBitrateAllocation& allocation), 138 (override)); 139 }; 140 141 MATCHER_P2(Near, value, margin, "") { 142 return value - margin <= arg && arg <= value + margin; 143 } 144 145 // SSRC of remote peer, that sends rtcp packet to the rtcp receiver under test. 146 constexpr uint32_t kSenderSsrc = 0x10203; 147 // SSRCs of local peer, that rtcp packet addressed to. 148 constexpr uint32_t kReceiverMainSsrc = 0x123456; 149 // RtcpReceiver can accept several ssrc, e.g. regular and rtx streams. 150 constexpr uint32_t kReceiverExtraSsrc = 0x1234567; 151 // SSRCs to ignore (i.e. not configured in RtcpReceiver). 152 constexpr uint32_t kNotToUsSsrc = 0x654321; 153 constexpr uint32_t kUnknownSenderSsrc = 0x54321; 154 155 constexpr int64_t kRtcpIntervalMs = 1000; 156 constexpr TimeDelta kEpsilon = TimeDelta::Millis(1); 157 158 } // namespace 159 160 struct ReceiverMocks { 161 SimulatedClock clock{1335900000}; 162 std::string field_trials; 163 // Callbacks to packet_type_counter_observer are frequent but most of the time 164 // are not interesting. 165 NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer; 166 StrictMock<MockRtcpIntraFrameObserver> intra_frame_observer; 167 StrictMock<MockRtcpLossNotificationObserver> rtcp_loss_notification_observer; 168 StrictMock<MockVideoBitrateAllocationObserver> bitrate_allocation_observer; 169 StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl; 170 NiceMock<MockNetworkLinkRtcpObserver> network_link_rtcp_observer; 171 NiceMock<MockNetworkStateEstimateObserver> network_state_estimate_observer; 172 173 RtpRtcpInterface::Configuration config = { 174 .receiver_only = false, 175 .intra_frame_callback = &intra_frame_observer, 176 .rtcp_loss_notification_observer = &rtcp_loss_notification_observer, 177 .network_link_rtcp_observer = &network_link_rtcp_observer, 178 .network_state_estimate_observer = &network_state_estimate_observer, 179 .bitrate_allocation_observer = &bitrate_allocation_observer, 180 .rtcp_packet_type_counter_observer = &packet_type_counter_observer, 181 .rtcp_report_interval_ms = kRtcpIntervalMs, 182 .local_media_ssrc = kReceiverMainSsrc, 183 .rtx_send_ssrc = kReceiverExtraSsrc}; 184 }; 185 186 RTCPReceiver Create(ReceiverMocks& mocks) { 187 return RTCPReceiver(CreateEnvironment(&mocks.clock, CreateTestFieldTrialsPtr( 188 mocks.field_trials)), 189 mocks.config, &mocks.rtp_rtcp_impl); 190 } 191 192 TEST(RtcpReceiverTest, BrokenPacketIsIgnored) { 193 ReceiverMocks mocks; 194 RTCPReceiver receiver = Create(mocks); 195 196 const uint8_t bad_packet[] = {0, 0, 0, 0}; 197 EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated) 198 .Times(0); 199 receiver.IncomingPacket(bad_packet); 200 } 201 202 TEST(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) { 203 ReceiverMocks mocks; 204 RTCPReceiver receiver = Create(mocks); 205 206 // Too short feedback packet. 207 const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0}; 208 209 EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated) 210 .Times(0); 211 receiver.IncomingPacket(bad_packet); 212 } 213 214 TEST(RtcpReceiverTest, InjectSrPacket) { 215 ReceiverMocks mocks; 216 RTCPReceiver receiver = Create(mocks); 217 receiver.SetRemoteSSRC(kSenderSsrc); 218 219 EXPECT_FALSE(receiver.GetSenderReportStats()); 220 221 rtcp::SenderReport sr; 222 sr.SetSenderSsrc(kSenderSsrc); 223 224 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty())); 225 receiver.IncomingPacket(sr.Build()); 226 227 EXPECT_TRUE(receiver.GetSenderReportStats()); 228 } 229 230 TEST(RtcpReceiverTest, InjectSrPacketFromUnknownSender) { 231 ReceiverMocks mocks; 232 RTCPReceiver receiver = Create(mocks); 233 receiver.SetRemoteSSRC(kSenderSsrc); 234 235 rtcp::SenderReport sr; 236 sr.SetSenderSsrc(kUnknownSenderSsrc); 237 238 // The parser will handle report blocks in Sender Report from other than their 239 // expected peer. 240 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 241 receiver.IncomingPacket(sr.Build()); 242 243 // But will not flag that he's gotten sender information. 244 EXPECT_FALSE(receiver.GetSenderReportStats()); 245 } 246 247 TEST(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { 248 ReceiverMocks mocks; 249 RTCPReceiver receiver = Create(mocks); 250 receiver.SetRemoteSSRC(kSenderSsrc); 251 252 const TimeDelta kRtt = TimeDelta::Millis(123); 253 const uint32_t kDelayNtp = 0x4321; 254 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 255 256 EXPECT_EQ(receiver.LastRtt(), std::nullopt); 257 258 uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime()); 259 mocks.clock.AdvanceTime(kRtt + kDelay); 260 261 rtcp::SenderReport sr; 262 sr.SetSenderSsrc(kSenderSsrc); 263 rtcp::ReportBlock block; 264 block.SetMediaSsrc(kReceiverMainSsrc); 265 block.SetLastSr(sent_ntp); 266 block.SetDelayLastSr(kDelayNtp); 267 sr.AddReportBlock(block); 268 269 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 270 EXPECT_CALL(mocks.network_link_rtcp_observer, OnRttUpdate); 271 receiver.IncomingPacket(sr.Build()); 272 273 EXPECT_THAT(receiver.LastRtt(), Near(kRtt, TimeDelta::Millis(1))); 274 } 275 276 TEST(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOneMs) { 277 ReceiverMocks mocks; 278 RTCPReceiver receiver = Create(mocks); 279 receiver.SetRemoteSSRC(kSenderSsrc); 280 281 const TimeDelta kRtt = TimeDelta::Millis(-13); 282 const uint32_t kDelayNtp = 0x4321; 283 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 284 285 EXPECT_EQ(receiver.LastRtt(), std::nullopt); 286 287 uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime()); 288 mocks.clock.AdvanceTime(kRtt + kDelay); 289 290 rtcp::SenderReport sr; 291 sr.SetSenderSsrc(kSenderSsrc); 292 rtcp::ReportBlock block; 293 block.SetMediaSsrc(kReceiverMainSsrc); 294 block.SetLastSr(sent_ntp); 295 block.SetDelayLastSr(kDelayNtp); 296 sr.AddReportBlock(block); 297 298 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1))); 299 EXPECT_CALL(mocks.network_link_rtcp_observer, 300 OnRttUpdate(_, TimeDelta::Millis(1))); 301 receiver.IncomingPacket(sr.Build()); 302 303 EXPECT_EQ(receiver.LastRtt(), TimeDelta::Millis(1)); 304 } 305 306 TEST(RtcpReceiverTest, TwoReportBlocksWithLastOneWithoutLastSrCalculatesRtt) { 307 ReceiverMocks mocks; 308 RTCPReceiver receiver = Create(mocks); 309 receiver.SetRemoteSSRC(kSenderSsrc); 310 311 const TimeDelta kRtt = TimeDelta::Millis(125); 312 const uint32_t kDelayNtp = 123000; 313 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 314 315 uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime()); 316 mocks.clock.AdvanceTime(kRtt + kDelay); 317 318 rtcp::SenderReport sr; 319 sr.SetSenderSsrc(kSenderSsrc); 320 rtcp::ReportBlock block; 321 block.SetMediaSsrc(kReceiverMainSsrc); 322 block.SetLastSr(sent_ntp); 323 block.SetDelayLastSr(kDelayNtp); 324 sr.AddReportBlock(block); 325 block.SetMediaSsrc(kReceiverExtraSsrc); 326 block.SetLastSr(0); 327 sr.AddReportBlock(block); 328 329 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2))); 330 EXPECT_CALL(mocks.network_link_rtcp_observer, OnRttUpdate(_, kRtt)); 331 receiver.IncomingPacket(sr.Build()); 332 } 333 334 TEST(RtcpReceiverTest, InjectRrPacket) { 335 ReceiverMocks mocks; 336 RTCPReceiver receiver = Create(mocks); 337 receiver.SetRemoteSSRC(kSenderSsrc); 338 339 rtcp::ReceiverReport rr; 340 rr.SetSenderSsrc(kSenderSsrc); 341 342 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty())); 343 receiver.IncomingPacket(rr.Build()); 344 345 EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty()); 346 } 347 348 TEST(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 349 ReceiverMocks mocks; 350 RTCPReceiver receiver = Create(mocks); 351 receiver.SetRemoteSSRC(kSenderSsrc); 352 353 rtcp::ReportBlock rb; 354 rb.SetMediaSsrc(kNotToUsSsrc); 355 rtcp::ReceiverReport rr; 356 rr.SetSenderSsrc(kSenderSsrc); 357 rr.AddReportBlock(rb); 358 359 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty())); 360 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport).Times(0); 361 receiver.IncomingPacket(rr.Build()); 362 363 EXPECT_EQ(0, receiver.LastReceivedReportBlockMs()); 364 EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty()); 365 } 366 367 TEST(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 368 ReceiverMocks mocks; 369 RTCPReceiver receiver = Create(mocks); 370 receiver.SetRemoteSSRC(kSenderSsrc); 371 372 Timestamp now = mocks.clock.CurrentTime(); 373 374 rtcp::ReportBlock rb; 375 rb.SetMediaSsrc(kReceiverMainSsrc); 376 rtcp::ReceiverReport rr; 377 rr.SetSenderSsrc(kSenderSsrc); 378 rr.AddReportBlock(rb); 379 380 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1))); 381 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(1))); 382 receiver.IncomingPacket(rr.Build()); 383 384 EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms()); 385 EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(1)); 386 } 387 388 TEST(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) { 389 ReceiverMocks mocks; 390 RTCPReceiver receiver = Create(mocks); 391 receiver.SetRemoteSSRC(kSenderSsrc); 392 393 Timestamp now = mocks.clock.CurrentTime(); 394 395 rtcp::ReportBlock rb; 396 rb.SetMediaSsrc(kReceiverMainSsrc); 397 rtcp::SenderReport sr; 398 sr.SetSenderSsrc(kSenderSsrc); 399 sr.AddReportBlock(rb); 400 401 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1))); 402 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(1))); 403 receiver.IncomingPacket(sr.Build()); 404 405 EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms()); 406 EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(1)); 407 } 408 409 TEST(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 410 const uint16_t kSequenceNumbers[] = {10, 12423}; 411 const uint32_t kCumLost[] = {13, 555}; 412 const uint8_t kFracLost[] = {20, 11}; 413 ReceiverMocks mocks; 414 RTCPReceiver receiver = Create(mocks); 415 receiver.SetRemoteSSRC(kSenderSsrc); 416 417 Timestamp now = mocks.clock.CurrentTime(); 418 419 rtcp::ReportBlock rb1; 420 rb1.SetMediaSsrc(kReceiverMainSsrc); 421 rb1.SetExtHighestSeqNum(kSequenceNumbers[0]); 422 rb1.SetFractionLost(10); 423 424 rtcp::ReportBlock rb2; 425 rb2.SetMediaSsrc(kReceiverExtraSsrc); 426 rb2.SetExtHighestSeqNum(kSequenceNumbers[1]); 427 rb2.SetFractionLost(0); 428 429 rtcp::ReceiverReport rr1; 430 rr1.SetSenderSsrc(kSenderSsrc); 431 rr1.AddReportBlock(rb1); 432 rr1.AddReportBlock(rb2); 433 434 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2))); 435 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(2))); 436 receiver.IncomingPacket(rr1.Build()); 437 438 EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms()); 439 EXPECT_THAT( 440 receiver.GetLatestReportBlockData(), 441 UnorderedElementsAre(Property(&ReportBlockData::fraction_lost_raw, 0), 442 Property(&ReportBlockData::fraction_lost_raw, 10))); 443 444 // Insert next receiver report with same ssrc but new values. 445 rtcp::ReportBlock rb3; 446 rb3.SetMediaSsrc(kReceiverMainSsrc); 447 rb3.SetExtHighestSeqNum(kSequenceNumbers[0]); 448 rb3.SetFractionLost(kFracLost[0]); 449 rb3.SetCumulativeLost(kCumLost[0]); 450 451 rtcp::ReportBlock rb4; 452 rb4.SetMediaSsrc(kReceiverExtraSsrc); 453 rb4.SetExtHighestSeqNum(kSequenceNumbers[1]); 454 rb4.SetFractionLost(kFracLost[1]); 455 rb4.SetCumulativeLost(kCumLost[1]); 456 457 rtcp::ReceiverReport rr2; 458 rr2.SetSenderSsrc(kSenderSsrc); 459 rr2.AddReportBlock(rb3); 460 rr2.AddReportBlock(rb4); 461 462 // Advance time to make 1st sent time and 2nd sent time different. 463 mocks.clock.AdvanceTimeMilliseconds(500); 464 now = mocks.clock.CurrentTime(); 465 466 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2))); 467 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(2))); 468 receiver.IncomingPacket(rr2.Build()); 469 470 EXPECT_THAT( 471 receiver.GetLatestReportBlockData(), 472 UnorderedElementsAre( 473 AllOf(Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc), 474 Property(&ReportBlockData::fraction_lost_raw, kFracLost[0]), 475 Property(&ReportBlockData::cumulative_lost, kCumLost[0]), 476 Property(&ReportBlockData::extended_highest_sequence_number, 477 kSequenceNumbers[0])), 478 AllOf(Property(&ReportBlockData::source_ssrc, kReceiverExtraSsrc), 479 Property(&ReportBlockData::fraction_lost_raw, kFracLost[1]), 480 Property(&ReportBlockData::cumulative_lost, kCumLost[1]), 481 Property(&ReportBlockData::extended_highest_sequence_number, 482 kSequenceNumbers[1])))); 483 } 484 485 TEST(RtcpReceiverTest, 486 InjectRrPacketsFromTwoRemoteSsrcsReturnsLatestReportBlock) { 487 const uint32_t kSenderSsrc2 = 0x20304; 488 const uint16_t kSequenceNumbers[] = {10, 12423}; 489 const int32_t kCumLost[] = {13, 555}; 490 const uint8_t kFracLost[] = {20, 11}; 491 ReceiverMocks mocks; 492 RTCPReceiver receiver = Create(mocks); 493 receiver.SetRemoteSSRC(kSenderSsrc); 494 495 rtcp::ReportBlock rb1; 496 rb1.SetMediaSsrc(kReceiverMainSsrc); 497 rb1.SetExtHighestSeqNum(kSequenceNumbers[0]); 498 rb1.SetFractionLost(kFracLost[0]); 499 rb1.SetCumulativeLost(kCumLost[0]); 500 rtcp::ReceiverReport rr1; 501 rr1.SetSenderSsrc(kSenderSsrc); 502 rr1.AddReportBlock(rb1); 503 504 Timestamp now = mocks.clock.CurrentTime(); 505 506 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1))); 507 receiver.IncomingPacket(rr1.Build()); 508 509 EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms()); 510 511 EXPECT_THAT(receiver.GetLatestReportBlockData(), 512 ElementsAre(AllOf( 513 Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc), 514 Property(&ReportBlockData::sender_ssrc, kSenderSsrc), 515 Property(&ReportBlockData::fraction_lost_raw, kFracLost[0]), 516 Property(&ReportBlockData::cumulative_lost, kCumLost[0]), 517 Property(&ReportBlockData::extended_highest_sequence_number, 518 kSequenceNumbers[0])))); 519 520 rtcp::ReportBlock rb2; 521 rb2.SetMediaSsrc(kReceiverMainSsrc); 522 rb2.SetExtHighestSeqNum(kSequenceNumbers[1]); 523 rb2.SetFractionLost(kFracLost[1]); 524 rb2.SetCumulativeLost(kCumLost[1]); 525 rtcp::ReceiverReport rr2; 526 rr2.SetSenderSsrc(kSenderSsrc2); 527 rr2.AddReportBlock(rb2); 528 529 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1))); 530 receiver.IncomingPacket(rr2.Build()); 531 532 EXPECT_THAT(receiver.GetLatestReportBlockData(), 533 UnorderedElementsAre(AllOf( 534 Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc), 535 Property(&ReportBlockData::sender_ssrc, kSenderSsrc2), 536 Property(&ReportBlockData::fraction_lost_raw, kFracLost[1]), 537 Property(&ReportBlockData::cumulative_lost, kCumLost[1]), 538 Property(&ReportBlockData::extended_highest_sequence_number, 539 kSequenceNumbers[1])))); 540 } 541 542 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnReportBlocks) { 543 ReceiverMocks mocks; 544 RTCPReceiver receiver = Create(mocks); 545 receiver.SetRemoteSSRC(kSenderSsrc); 546 547 rtcp::ReportBlock rb1; 548 rb1.SetMediaSsrc(kReceiverMainSsrc); 549 rb1.SetFractionLost(10); 550 551 rtcp::ReportBlock rb2; 552 rb2.SetMediaSsrc(kNotToUsSsrc); 553 rb2.SetFractionLost(20); 554 555 rtcp::ReportBlock rb3; 556 rb3.SetMediaSsrc(kReceiverExtraSsrc); 557 rb3.SetFractionLost(0); 558 559 rtcp::ReceiverReport rr; 560 rr.SetSenderSsrc(kSenderSsrc); 561 rr.AddReportBlock(rb1); 562 rr.AddReportBlock(rb2); 563 rr.AddReportBlock(rb3); 564 565 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2))); 566 EXPECT_CALL(mocks.network_link_rtcp_observer, 567 OnReport(mocks.clock.CurrentTime(), 568 UnorderedElementsAre( 569 Property(&ReportBlockData::fraction_lost_raw, 0), 570 Property(&ReportBlockData::fraction_lost_raw, 10)))); 571 receiver.IncomingPacket(rr.Build()); 572 } 573 574 TEST(RtcpReceiverTest, GetRtt) { 575 const uint32_t kSentCompactNtp = 0x1234; 576 const uint32_t kDelayCompactNtp = 0x222; 577 ReceiverMocks mocks; 578 mocks.config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer; 579 RTCPReceiver receiver = Create(mocks); 580 receiver.SetRemoteSSRC(kSenderSsrc); 581 582 // No report block received. 583 EXPECT_EQ(receiver.LastRtt(), std::nullopt); 584 EXPECT_EQ(receiver.AverageRtt(), std::nullopt); 585 586 rtcp::ReportBlock rb; 587 rb.SetMediaSsrc(kReceiverMainSsrc); 588 rb.SetLastSr(kSentCompactNtp); 589 rb.SetDelayLastSr(kDelayCompactNtp); 590 591 rtcp::ReceiverReport rr; 592 rr.SetSenderSsrc(kSenderSsrc); 593 rr.AddReportBlock(rb); 594 595 Timestamp now = mocks.clock.CurrentTime(); 596 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 597 EXPECT_CALL(mocks.network_link_rtcp_observer, 598 OnRttUpdate(now, Gt(TimeDelta::Zero()))); 599 receiver.IncomingPacket(rr.Build()); 600 601 EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms()); 602 EXPECT_NE(receiver.LastRtt(), std::nullopt); 603 EXPECT_NE(receiver.AverageRtt(), std::nullopt); 604 } 605 606 // App packets are ignored. 607 TEST(RtcpReceiverTest, InjectApp) { 608 ReceiverMocks mocks; 609 RTCPReceiver receiver = Create(mocks); 610 receiver.SetRemoteSSRC(kSenderSsrc); 611 612 rtcp::App app; 613 app.SetSubType(30); 614 app.SetName(0x17a177e); 615 const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'}; 616 app.SetData(kData, sizeof(kData)); 617 618 receiver.IncomingPacket(app.Build()); 619 } 620 621 TEST(RtcpReceiverTest, InjectSdesWithOneChunk) { 622 ReceiverMocks mocks; 623 MockCnameCallbackImpl callback; 624 mocks.config.rtcp_cname_callback = &callback; 625 RTCPReceiver receiver = Create(mocks); 626 receiver.SetRemoteSSRC(kSenderSsrc); 627 628 const char kCname[] = "alice@host"; 629 rtcp::Sdes sdes; 630 sdes.AddCName(kSenderSsrc, kCname); 631 632 EXPECT_CALL(callback, OnCname(kSenderSsrc, StrEq(kCname))); 633 receiver.IncomingPacket(sdes.Build()); 634 } 635 636 TEST(RtcpReceiverTest, InjectByePacketRemovesReportBlocks) { 637 ReceiverMocks mocks; 638 RTCPReceiver receiver = Create(mocks); 639 receiver.SetRemoteSSRC(kSenderSsrc); 640 641 rtcp::ReportBlock rb1; 642 rb1.SetMediaSsrc(kReceiverMainSsrc); 643 rtcp::ReportBlock rb2; 644 rb2.SetMediaSsrc(kReceiverExtraSsrc); 645 rtcp::ReceiverReport rr; 646 rr.SetSenderSsrc(kSenderSsrc); 647 rr.AddReportBlock(rb1); 648 rr.AddReportBlock(rb2); 649 650 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 651 receiver.IncomingPacket(rr.Build()); 652 653 EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(2)); 654 655 // Verify that BYE removes the report blocks. 656 rtcp::Bye bye; 657 bye.SetSenderSsrc(kSenderSsrc); 658 659 receiver.IncomingPacket(bye.Build()); 660 661 EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty()); 662 663 // Inject packet again. 664 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 665 receiver.IncomingPacket(rr.Build()); 666 667 EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(2)); 668 } 669 670 TEST(RtcpReceiverTest, InjectByePacketRemovesReferenceTimeInfo) { 671 ReceiverMocks mocks; 672 RTCPReceiver receiver = Create(mocks); 673 receiver.SetRemoteSSRC(kSenderSsrc); 674 675 rtcp::ExtendedReports xr; 676 xr.SetSenderSsrc(kSenderSsrc); 677 rtcp::Rrtr rrtr; 678 rrtr.SetNtp(NtpTime(0x10203, 0x40506)); 679 xr.SetRrtr(rrtr); 680 receiver.IncomingPacket(xr.Build()); 681 682 rtcp::Bye bye; 683 bye.SetSenderSsrc(kSenderSsrc); 684 receiver.IncomingPacket(bye.Build()); 685 686 EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty()); 687 } 688 689 TEST(RtcpReceiverTest, InjectPliPacket) { 690 ReceiverMocks mocks; 691 RTCPReceiver receiver = Create(mocks); 692 receiver.SetRemoteSSRC(kSenderSsrc); 693 694 rtcp::Pli pli; 695 pli.SetMediaSsrc(kReceiverMainSsrc); 696 697 EXPECT_CALL( 698 mocks.packet_type_counter_observer, 699 RtcpPacketTypesCounterUpdated( 700 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1))); 701 EXPECT_CALL(mocks.intra_frame_observer, 702 OnReceivedIntraFrameRequest(kReceiverMainSsrc)); 703 receiver.IncomingPacket(pli.Build()); 704 } 705 706 TEST(RtcpReceiverTest, PliPacketNotToUsIgnored) { 707 ReceiverMocks mocks; 708 RTCPReceiver receiver = Create(mocks); 709 receiver.SetRemoteSSRC(kSenderSsrc); 710 711 rtcp::Pli pli; 712 pli.SetMediaSsrc(kNotToUsSsrc); 713 714 EXPECT_CALL( 715 mocks.packet_type_counter_observer, 716 RtcpPacketTypesCounterUpdated( 717 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0))); 718 EXPECT_CALL(mocks.intra_frame_observer, OnReceivedIntraFrameRequest).Times(0); 719 receiver.IncomingPacket(pli.Build()); 720 } 721 722 TEST(RtcpReceiverTest, InjectFirPacket) { 723 ReceiverMocks mocks; 724 RTCPReceiver receiver = Create(mocks); 725 receiver.SetRemoteSSRC(kSenderSsrc); 726 727 rtcp::Fir fir; 728 fir.AddRequestTo(kReceiverMainSsrc, 13); 729 730 EXPECT_CALL( 731 mocks.packet_type_counter_observer, 732 RtcpPacketTypesCounterUpdated( 733 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1))); 734 EXPECT_CALL(mocks.intra_frame_observer, 735 OnReceivedIntraFrameRequest(kReceiverMainSsrc)); 736 receiver.IncomingPacket(fir.Build()); 737 } 738 739 TEST(RtcpReceiverTest, FirPacketNotToUsIgnored) { 740 ReceiverMocks mocks; 741 RTCPReceiver receiver = Create(mocks); 742 receiver.SetRemoteSSRC(kSenderSsrc); 743 744 rtcp::Fir fir; 745 fir.AddRequestTo(kNotToUsSsrc, 13); 746 747 EXPECT_CALL(mocks.intra_frame_observer, OnReceivedIntraFrameRequest).Times(0); 748 receiver.IncomingPacket(fir.Build()); 749 } 750 751 TEST(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { 752 ReceiverMocks mocks; 753 RTCPReceiver receiver = Create(mocks); 754 receiver.SetRemoteSSRC(kSenderSsrc); 755 756 rtcp::ExtendedReports xr; 757 xr.SetSenderSsrc(kSenderSsrc); 758 759 receiver.IncomingPacket(xr.Build()); 760 } 761 762 TEST(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { 763 ReceiverMocks mocks; 764 RTCPReceiver receiver = Create(mocks); 765 receiver.SetRemoteSSRC(kSenderSsrc); 766 767 const NtpTime kNtp(0x10203, 0x40506); 768 rtcp::Rrtr rrtr; 769 rrtr.SetNtp(kNtp); 770 rtcp::ExtendedReports xr; 771 xr.SetSenderSsrc(kSenderSsrc); 772 xr.SetRrtr(rrtr); 773 774 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 775 receiver.ConsumeReceivedXrReferenceTimeInfo(); 776 EXPECT_THAT(last_xr_rtis, IsEmpty()); 777 778 receiver.IncomingPacket(xr.Build()); 779 780 last_xr_rtis = receiver.ConsumeReceivedXrReferenceTimeInfo(); 781 ASSERT_THAT(last_xr_rtis, SizeIs(1)); 782 EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc); 783 EXPECT_EQ(CompactNtp(kNtp), last_xr_rtis[0].last_rr); 784 EXPECT_EQ(0U, last_xr_rtis[0].delay_since_last_rr); 785 } 786 787 TEST(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { 788 ReceiverMocks mocks; 789 // Allow calculate rtt using dlrr/rrtr, simulating media receiver side. 790 mocks.config.non_sender_rtt_measurement = true; 791 RTCPReceiver receiver = Create(mocks); 792 receiver.SetRemoteSSRC(kSenderSsrc); 793 794 rtcp::ExtendedReports xr; 795 xr.SetSenderSsrc(kSenderSsrc); 796 xr.AddDlrrItem(ReceiveTimeInfo(kNotToUsSsrc, 0x12345, 0x67890)); 797 798 receiver.IncomingPacket(xr.Build()); 799 800 EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); 801 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 802 receiver.GetNonSenderRTT(); 803 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 804 EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 805 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0); 806 } 807 808 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { 809 ReceiverMocks mocks; 810 mocks.config.non_sender_rtt_measurement = true; 811 RTCPReceiver receiver = Create(mocks); 812 receiver.SetRemoteSSRC(kSenderSsrc); 813 814 const uint32_t kLastRR = 0x12345; 815 const uint32_t kDelay = 0x23456; 816 EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); 817 818 rtcp::ExtendedReports xr; 819 xr.SetSenderSsrc(kSenderSsrc); 820 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay)); 821 822 receiver.IncomingPacket(xr.Build()); 823 824 uint32_t compact_ntp_now = CompactNtp(mocks.clock.CurrentNtpTime()); 825 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR; 826 EXPECT_THAT(receiver.GetAndResetXrRrRtt(), 827 Near(CompactNtpRttToTimeDelta(rtt_ntp), kEpsilon)); 828 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 829 receiver.GetNonSenderRTT(); 830 EXPECT_GT(non_sender_rtt_stats.round_trip_time(), TimeDelta::Zero()); 831 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 832 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 833 } 834 835 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { 836 ReceiverMocks mocks; 837 mocks.config.non_sender_rtt_measurement = true; 838 RTCPReceiver receiver = Create(mocks); 839 receiver.SetRemoteSSRC(kSenderSsrc); 840 841 const uint32_t kLastRR = 0x12345; 842 const uint32_t kDelay = 0x56789; 843 844 rtcp::ExtendedReports xr; 845 xr.SetSenderSsrc(kSenderSsrc); 846 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay)); 847 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 1, 0x12345, 0x67890)); 848 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 2, 0x12345, 0x67890)); 849 850 receiver.IncomingPacket(xr.Build()); 851 852 uint32_t compact_ntp_now = CompactNtp(mocks.clock.CurrentNtpTime()); 853 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR; 854 EXPECT_THAT(receiver.GetAndResetXrRrRtt(), 855 Near(CompactNtpRttToTimeDelta(rtt_ntp), kEpsilon)); 856 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 857 receiver.GetNonSenderRTT(); 858 EXPECT_GT(non_sender_rtt_stats.round_trip_time(), TimeDelta::Zero()); 859 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 860 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 861 } 862 863 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { 864 ReceiverMocks mocks; 865 mocks.config.non_sender_rtt_measurement = true; 866 RTCPReceiver receiver = Create(mocks); 867 receiver.SetRemoteSSRC(kSenderSsrc); 868 869 rtcp::Rrtr rrtr; 870 rtcp::ExtendedReports xr; 871 xr.SetSenderSsrc(kSenderSsrc); 872 xr.SetRrtr(rrtr); 873 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890)); 874 875 receiver.IncomingPacket(xr.Build()); 876 877 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 878 receiver.ConsumeReceivedXrReferenceTimeInfo(); 879 EXPECT_THAT(last_xr_rtis, SizeIs(1)); 880 EXPECT_TRUE(receiver.GetAndResetXrRrRtt()); 881 } 882 883 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { 884 ReceiverMocks mocks; 885 mocks.config.non_sender_rtt_measurement = true; 886 RTCPReceiver receiver = Create(mocks); 887 receiver.SetRemoteSSRC(kSenderSsrc); 888 889 rtcp::Rrtr rrtr; 890 rtcp::ExtendedReports xr; 891 xr.SetSenderSsrc(kSenderSsrc); 892 xr.SetRrtr(rrtr); 893 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890)); 894 895 Buffer packet = xr.Build(); 896 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 897 ASSERT_EQ(5, packet.data()[20]); 898 packet.data()[20] = 6; 899 receiver.IncomingPacket(packet); 900 901 // Validate Rrtr was received and processed. 902 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 903 receiver.ConsumeReceivedXrReferenceTimeInfo(); 904 EXPECT_THAT(last_xr_rtis, SizeIs(1)); 905 // Validate Dlrr report wasn't processed. 906 EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); 907 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 908 receiver.GetNonSenderRTT(); 909 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 910 EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 911 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0); 912 } 913 914 TEST(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) { 915 ReceiverMocks mocks; 916 mocks.config.non_sender_rtt_measurement = true; 917 RTCPReceiver receiver = Create(mocks); 918 receiver.SetRemoteSSRC(kSenderSsrc); 919 920 EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); 921 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 922 receiver.GetNonSenderRTT(); 923 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 924 EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 925 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0); 926 } 927 928 TEST(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) { 929 ReceiverMocks mocks; 930 mocks.config.non_sender_rtt_measurement = true; 931 RTCPReceiver receiver = Create(mocks); 932 receiver.SetRemoteSSRC(kSenderSsrc); 933 934 Random rand(0x0123456789abcdef); 935 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 936 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 937 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 938 NtpTime now = mocks.clock.CurrentNtpTime(); 939 uint32_t sent_ntp = CompactNtp(now); 940 mocks.clock.AdvanceTime(kRtt + kDelay); 941 942 rtcp::ExtendedReports xr; 943 xr.SetSenderSsrc(kSenderSsrc); 944 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 945 946 receiver.IncomingPacket(xr.Build()); 947 948 EXPECT_THAT(receiver.GetAndResetXrRrRtt(), Near(kRtt, kEpsilon)); 949 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 950 receiver.GetNonSenderRTT(); 951 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 952 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero()); 953 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 954 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 955 } 956 957 // Same test as above but enables receive-side RTT using the setter instead of 958 // the config struct. 959 TEST(RtcpReceiverTest, SetterEnablesReceiverRtt) { 960 ReceiverMocks mocks; 961 mocks.config.non_sender_rtt_measurement = false; 962 RTCPReceiver receiver = Create(mocks); 963 receiver.SetRemoteSSRC(kSenderSsrc); 964 receiver.SetNonSenderRttMeasurement(true); 965 966 Random rand(0x0123456789abcdef); 967 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 968 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 969 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 970 NtpTime now = mocks.clock.CurrentNtpTime(); 971 uint32_t sent_ntp = CompactNtp(now); 972 mocks.clock.AdvanceTime(kRtt + kDelay); 973 974 rtcp::ExtendedReports xr; 975 xr.SetSenderSsrc(kSenderSsrc); 976 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 977 978 receiver.IncomingPacket(xr.Build()); 979 980 EXPECT_THAT(receiver.GetAndResetXrRrRtt(), Near(kRtt, kEpsilon)); 981 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 982 receiver.GetNonSenderRTT(); 983 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 984 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero()); 985 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 986 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 987 } 988 989 // Same test as above but disables receive-side RTT using the setter instead of 990 // the config struct. 991 TEST(RtcpReceiverTest, DoesntCalculateRttOnReceivedDlrr) { 992 ReceiverMocks mocks; 993 mocks.config.non_sender_rtt_measurement = true; 994 RTCPReceiver receiver = Create(mocks); 995 receiver.SetRemoteSSRC(kSenderSsrc); 996 receiver.SetNonSenderRttMeasurement(false); 997 998 Random rand(0x0123456789abcdef); 999 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1000 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1001 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1002 NtpTime now = mocks.clock.CurrentNtpTime(); 1003 uint32_t sent_ntp = CompactNtp(now); 1004 mocks.clock.AdvanceTime(kRtt + kDelay); 1005 1006 rtcp::ExtendedReports xr; 1007 xr.SetSenderSsrc(kSenderSsrc); 1008 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1009 1010 receiver.IncomingPacket(xr.Build()); 1011 1012 // We expect that no RTT is available (because receive-side RTT was disabled). 1013 EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); 1014 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1015 receiver.GetNonSenderRTT(); 1016 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 1017 EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 1018 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0); 1019 } 1020 1021 TEST(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOneMillisecond) { 1022 ReceiverMocks mocks; 1023 mocks.config.non_sender_rtt_measurement = true; 1024 RTCPReceiver receiver = Create(mocks); 1025 receiver.SetRemoteSSRC(kSenderSsrc); 1026 1027 Random rand(0x0123456789abcdef); 1028 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(-3600 * 1000, -1)); 1029 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1030 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1031 NtpTime now = mocks.clock.CurrentNtpTime(); 1032 uint32_t sent_ntp = CompactNtp(now); 1033 mocks.clock.AdvanceTime(kRtt + kDelay); 1034 1035 rtcp::ExtendedReports xr; 1036 xr.SetSenderSsrc(kSenderSsrc); 1037 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1038 1039 receiver.IncomingPacket(xr.Build()); 1040 1041 EXPECT_EQ(receiver.GetAndResetXrRrRtt(), TimeDelta::Millis(1)); 1042 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1043 receiver.GetNonSenderRTT(); 1044 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1045 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero()); 1046 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 1047 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 1048 } 1049 1050 // Test receiver RTT stats with multiple measurements. 1051 TEST(RtcpReceiverTest, ReceiverRttWithMultipleMeasurements) { 1052 ReceiverMocks mocks; 1053 mocks.config.non_sender_rtt_measurement = true; 1054 RTCPReceiver receiver = Create(mocks); 1055 receiver.SetRemoteSSRC(kSenderSsrc); 1056 1057 Random rand(0x0123456789abcdef); 1058 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1059 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1060 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1061 NtpTime now = mocks.clock.CurrentNtpTime(); 1062 uint32_t sent_ntp = CompactNtp(now); 1063 mocks.clock.AdvanceTime(kRtt + kDelay); 1064 1065 rtcp::ExtendedReports xr; 1066 xr.SetSenderSsrc(kSenderSsrc); 1067 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1068 1069 receiver.IncomingPacket(xr.Build()); 1070 1071 // Check that the non-sender RTT stats are valid and based on a single 1072 // measurement. 1073 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1074 receiver.GetNonSenderRTT(); 1075 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1076 EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1); 1077 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 1); 1078 EXPECT_EQ(non_sender_rtt_stats.total_round_trip_time().ms(), 1079 non_sender_rtt_stats.round_trip_time()->ms()); 1080 1081 // Generate another XR report with the same RTT and delay. 1082 NtpTime now2 = mocks.clock.CurrentNtpTime(); 1083 uint32_t sent_ntp2 = CompactNtp(now2); 1084 mocks.clock.AdvanceTime(kRtt + kDelay); 1085 1086 rtcp::ExtendedReports xr2; 1087 xr2.SetSenderSsrc(kSenderSsrc); 1088 xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp2, kDelayNtp)); 1089 1090 receiver.IncomingPacket(xr2.Build()); 1091 1092 // Check that the non-sender RTT stats are based on 2 measurements, and that 1093 // the values are as expected. 1094 non_sender_rtt_stats = receiver.GetNonSenderRTT(); 1095 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1096 EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1); 1097 EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 2); 1098 EXPECT_NEAR(non_sender_rtt_stats.total_round_trip_time().ms(), 2 * kRtt.ms(), 1099 2); 1100 } 1101 1102 // Test that the receiver RTT stat resets when receiving a SR without XR. This 1103 // behavior is described in the standard, see 1104 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime. 1105 TEST(RtcpReceiverTest, ReceiverRttResetOnSrWithoutXr) { 1106 ReceiverMocks mocks; 1107 mocks.config.non_sender_rtt_measurement = true; 1108 RTCPReceiver receiver = Create(mocks); 1109 receiver.SetRemoteSSRC(kSenderSsrc); 1110 1111 Random rand(0x0123456789abcdef); 1112 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1113 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1114 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1115 NtpTime now = mocks.clock.CurrentNtpTime(); 1116 uint32_t sent_ntp = CompactNtp(now); 1117 mocks.clock.AdvanceTime(kRtt + kDelay); 1118 1119 rtcp::ExtendedReports xr; 1120 xr.SetSenderSsrc(kSenderSsrc); 1121 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1122 1123 receiver.IncomingPacket(xr.Build()); 1124 1125 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1126 receiver.GetNonSenderRTT(); 1127 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1128 EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1); 1129 1130 // Generate a SR without XR. 1131 rtcp::ReportBlock rb; 1132 rb.SetMediaSsrc(kReceiverMainSsrc); 1133 rtcp::SenderReport sr; 1134 sr.SetSenderSsrc(kSenderSsrc); 1135 sr.AddReportBlock(rb); 1136 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1137 1138 receiver.IncomingPacket(sr.Build()); 1139 1140 // Check that the non-sender RTT stat is not set. 1141 non_sender_rtt_stats = receiver.GetNonSenderRTT(); 1142 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 1143 } 1144 1145 // Test that the receiver RTT stat resets when receiving a DLRR with a timestamp 1146 // of zero. This behavior is described in the standard, see 1147 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime. 1148 TEST(RtcpReceiverTest, ReceiverRttResetOnDlrrWithZeroTimestamp) { 1149 ReceiverMocks mocks; 1150 mocks.config.non_sender_rtt_measurement = true; 1151 RTCPReceiver receiver = Create(mocks); 1152 receiver.SetRemoteSSRC(kSenderSsrc); 1153 1154 Random rand(0x0123456789abcdef); 1155 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1156 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1157 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1158 NtpTime now = mocks.clock.CurrentNtpTime(); 1159 uint32_t sent_ntp = CompactNtp(now); 1160 mocks.clock.AdvanceTime(kRtt + kDelay); 1161 1162 rtcp::ExtendedReports xr; 1163 xr.SetSenderSsrc(kSenderSsrc); 1164 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1165 1166 receiver.IncomingPacket(xr.Build()); 1167 1168 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1169 receiver.GetNonSenderRTT(); 1170 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1171 EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1); 1172 1173 // Generate an XR+DLRR with zero timestamp. 1174 rtcp::ExtendedReports xr2; 1175 xr2.SetSenderSsrc(kSenderSsrc); 1176 xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0, kDelayNtp)); 1177 1178 receiver.IncomingPacket(xr2.Build()); 1179 1180 // Check that the non-sender RTT stat is not set. 1181 non_sender_rtt_stats = receiver.GetNonSenderRTT(); 1182 EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value()); 1183 } 1184 1185 // Check that the receiver RTT works correctly when the remote SSRC changes. 1186 TEST(RtcpReceiverTest, ReceiverRttWithMultipleRemoteSsrcs) { 1187 ReceiverMocks mocks; 1188 mocks.config.non_sender_rtt_measurement = false; 1189 RTCPReceiver receiver = Create(mocks); 1190 receiver.SetRemoteSSRC(kSenderSsrc); 1191 receiver.SetNonSenderRttMeasurement(true); 1192 1193 Random rand(0x0123456789abcdef); 1194 const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1195 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 1196 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1197 NtpTime now = mocks.clock.CurrentNtpTime(); 1198 uint32_t sent_ntp = CompactNtp(now); 1199 mocks.clock.AdvanceTime(kRtt + kDelay); 1200 1201 rtcp::ExtendedReports xr; 1202 xr.SetSenderSsrc(kSenderSsrc); 1203 xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp)); 1204 1205 receiver.IncomingPacket(xr.Build()); 1206 1207 // Generate an XR report for another SSRC. 1208 const TimeDelta kRtt2 = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000)); 1209 const uint32_t kDelayNtp2 = rand.Rand(0, 0x7fffffff); 1210 const TimeDelta kDelay2 = CompactNtpRttToTimeDelta(kDelayNtp2); 1211 NtpTime now2 = mocks.clock.CurrentNtpTime(); 1212 uint32_t sent_ntp2 = CompactNtp(now2); 1213 mocks.clock.AdvanceTime(kRtt2 + kDelay2); 1214 1215 rtcp::ExtendedReports xr2; 1216 xr2.SetSenderSsrc(kSenderSsrc + 1); 1217 xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp2, kDelayNtp2)); 1218 1219 receiver.IncomingPacket(xr2.Build()); 1220 1221 // Check that the non-sender RTT stats match the first XR. 1222 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats = 1223 receiver.GetNonSenderRTT(); 1224 EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value()); 1225 EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1); 1226 EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero()); 1227 EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0); 1228 1229 // Change the remote SSRC and check that the stats match the second XR. 1230 receiver.SetRemoteSSRC(kSenderSsrc + 1); 1231 RTCPReceiver::NonSenderRttStats non_sender_rtt_stats2 = 1232 receiver.GetNonSenderRTT(); 1233 EXPECT_TRUE(non_sender_rtt_stats2.round_trip_time().has_value()); 1234 EXPECT_NEAR(non_sender_rtt_stats2.round_trip_time()->ms(), kRtt2.ms(), 1); 1235 EXPECT_FALSE(non_sender_rtt_stats2.total_round_trip_time().IsZero()); 1236 EXPECT_GT(non_sender_rtt_stats2.round_trip_time_measurements(), 0); 1237 } 1238 1239 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfoInitiallyEmpty) { 1240 ReceiverMocks mocks; 1241 RTCPReceiver receiver = Create(mocks); 1242 receiver.SetRemoteSSRC(kSenderSsrc); 1243 1244 EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty()); 1245 } 1246 1247 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfo) { 1248 ReceiverMocks mocks; 1249 RTCPReceiver receiver = Create(mocks); 1250 receiver.SetRemoteSSRC(kSenderSsrc); 1251 1252 const NtpTime kNtp(0x10203, 0x40506); 1253 const uint32_t kNtpMid = CompactNtp(kNtp); 1254 1255 rtcp::Rrtr rrtr; 1256 rrtr.SetNtp(kNtp); 1257 rtcp::ExtendedReports xr; 1258 xr.SetSenderSsrc(kSenderSsrc); 1259 xr.SetRrtr(rrtr); 1260 1261 receiver.IncomingPacket(xr.Build()); 1262 1263 mocks.clock.AdvanceTimeMilliseconds(1000); 1264 1265 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 1266 receiver.ConsumeReceivedXrReferenceTimeInfo(); 1267 ASSERT_THAT(last_xr_rtis, SizeIs(1)); 1268 EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc); 1269 EXPECT_EQ(kNtpMid, last_xr_rtis[0].last_rr); 1270 EXPECT_EQ(65536U, last_xr_rtis[0].delay_since_last_rr); 1271 } 1272 1273 TEST(RtcpReceiverTest, 1274 ReceivedRrtrFromSameSsrcUpdatesReceivedReferenceTimeInfo) { 1275 ReceiverMocks mocks; 1276 RTCPReceiver receiver = Create(mocks); 1277 receiver.SetRemoteSSRC(kSenderSsrc); 1278 1279 const NtpTime kNtp1(0x10203, 0x40506); 1280 const NtpTime kNtp2(0x11223, 0x44556); 1281 const int64_t kDelayMs = 2000; 1282 1283 rtcp::ExtendedReports xr; 1284 xr.SetSenderSsrc(kSenderSsrc); 1285 rtcp::Rrtr rrtr1; 1286 rrtr1.SetNtp(kNtp1); 1287 xr.SetRrtr(rrtr1); 1288 receiver.IncomingPacket(xr.Build()); 1289 mocks.clock.AdvanceTimeMilliseconds(kDelayMs); 1290 rtcp::Rrtr rrtr2; 1291 rrtr2.SetNtp(kNtp2); 1292 xr.SetRrtr(rrtr2); 1293 receiver.IncomingPacket(xr.Build()); 1294 mocks.clock.AdvanceTimeMilliseconds(kDelayMs); 1295 1296 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 1297 receiver.ConsumeReceivedXrReferenceTimeInfo(); 1298 ASSERT_THAT(last_xr_rtis, SizeIs(1)); 1299 EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc); 1300 EXPECT_EQ(CompactNtp(kNtp2), last_xr_rtis[0].last_rr); 1301 EXPECT_EQ(kDelayMs * 65536 / 1000, last_xr_rtis[0].delay_since_last_rr); 1302 } 1303 1304 TEST(RtcpReceiverTest, StoresLastReceivedRrtrPerSsrc) { 1305 ReceiverMocks mocks; 1306 RTCPReceiver receiver = Create(mocks); 1307 receiver.SetRemoteSSRC(kSenderSsrc); 1308 1309 const size_t kNumBufferedReports = 1; 1310 const size_t kNumReports = 1311 rtcp::ExtendedReports::kMaxNumberOfDlrrItems + kNumBufferedReports; 1312 for (size_t i = 0; i < kNumReports; ++i) { 1313 rtcp::ExtendedReports xr; 1314 xr.SetSenderSsrc(i * 100); 1315 rtcp::Rrtr rrtr; 1316 rrtr.SetNtp(NtpTime(i * 200, i * 300)); 1317 xr.SetRrtr(rrtr); 1318 receiver.IncomingPacket(xr.Build()); 1319 mocks.clock.AdvanceTimeMilliseconds(1000); 1320 } 1321 1322 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis = 1323 receiver.ConsumeReceivedXrReferenceTimeInfo(); 1324 ASSERT_THAT(last_xr_rtis, 1325 SizeIs(rtcp::ExtendedReports::kMaxNumberOfDlrrItems)); 1326 for (size_t i = 0; i < rtcp::ExtendedReports::kMaxNumberOfDlrrItems; ++i) { 1327 EXPECT_EQ(i * 100, last_xr_rtis[i].ssrc); 1328 EXPECT_EQ(CompactNtp(NtpTime(i * 200, i * 300)), last_xr_rtis[i].last_rr); 1329 EXPECT_EQ(65536U * (kNumReports - i), last_xr_rtis[i].delay_since_last_rr); 1330 } 1331 1332 last_xr_rtis = receiver.ConsumeReceivedXrReferenceTimeInfo(); 1333 ASSERT_THAT(last_xr_rtis, SizeIs(kNumBufferedReports)); 1334 } 1335 1336 TEST(RtcpReceiverTest, ReceiveReportTimeout) { 1337 ReceiverMocks mocks; 1338 RTCPReceiver receiver = Create(mocks); 1339 receiver.SetRemoteSSRC(kSenderSsrc); 1340 1341 const uint16_t kSequenceNumber = 1234; 1342 mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 1343 1344 // No RR received, shouldn't trigger a timeout. 1345 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1346 EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout()); 1347 1348 // Add a RR and advance the clock just enough to not trigger a timeout. 1349 rtcp::ReportBlock rb1; 1350 rb1.SetMediaSsrc(kReceiverMainSsrc); 1351 rb1.SetExtHighestSeqNum(kSequenceNumber); 1352 rtcp::ReceiverReport rr1; 1353 rr1.SetSenderSsrc(kSenderSsrc); 1354 rr1.AddReportBlock(rb1); 1355 1356 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1357 receiver.IncomingPacket(rr1.Build()); 1358 1359 mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 1360 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1361 EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout()); 1362 1363 // Add a RR with the same extended max as the previous RR to trigger a 1364 // sequence number timeout, but not a RR timeout. 1365 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1366 receiver.IncomingPacket(rr1.Build()); 1367 1368 mocks.clock.AdvanceTimeMilliseconds(2); 1369 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1370 EXPECT_TRUE(receiver.RtcpRrSequenceNumberTimeout()); 1371 1372 // Advance clock enough to trigger an RR timeout too. 1373 mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 1374 EXPECT_TRUE(receiver.RtcpRrTimeout()); 1375 1376 // We should only get one timeout even though we still haven't received a new 1377 // RR. 1378 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1379 EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout()); 1380 1381 // Add a new RR with increase sequence number to reset timers. 1382 rtcp::ReportBlock rb2; 1383 rb2.SetMediaSsrc(kReceiverMainSsrc); 1384 rb2.SetExtHighestSeqNum(kSequenceNumber + 1); 1385 rtcp::ReceiverReport rr2; 1386 rr2.SetSenderSsrc(kSenderSsrc); 1387 rr2.AddReportBlock(rb2); 1388 1389 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1390 receiver.IncomingPacket(rr2.Build()); 1391 1392 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1393 EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout()); 1394 1395 // Verify we can get a timeout again once we've received new RR. 1396 mocks.clock.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 1397 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1398 receiver.IncomingPacket(rr2.Build()); 1399 1400 mocks.clock.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 1401 EXPECT_FALSE(receiver.RtcpRrTimeout()); 1402 EXPECT_TRUE(receiver.RtcpRrSequenceNumberTimeout()); 1403 1404 mocks.clock.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 1405 EXPECT_TRUE(receiver.RtcpRrTimeout()); 1406 } 1407 1408 TEST(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 1409 ReceiverMocks mocks; 1410 RTCPReceiver receiver = Create(mocks); 1411 receiver.SetRemoteSSRC(kSenderSsrc); 1412 1413 EXPECT_THAT(receiver.TmmbrReceived(), IsEmpty()); 1414 } 1415 1416 TEST(RtcpReceiverTest, TmmbrPacketAccepted) { 1417 ReceiverMocks mocks; 1418 RTCPReceiver receiver = Create(mocks); 1419 receiver.SetRemoteSSRC(kSenderSsrc); 1420 1421 const DataRate kBitrate = DataRate::BitsPerSec(30'000); 1422 auto tmmbr = std::make_unique<rtcp::Tmmbr>(); 1423 tmmbr->SetSenderSsrc(kSenderSsrc); 1424 tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, kBitrate.bps(), 0)); 1425 auto sr = std::make_unique<rtcp::SenderReport>(); 1426 sr->SetSenderSsrc(kSenderSsrc); 1427 rtcp::CompoundPacket compound; 1428 compound.Append(std::move(sr)); 1429 compound.Append(std::move(tmmbr)); 1430 1431 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1432 EXPECT_CALL(mocks.rtp_rtcp_impl, SetTmmbn(SizeIs(1))); 1433 EXPECT_CALL(mocks.network_link_rtcp_observer, 1434 OnReceiverEstimatedMaxBitrate(_, kBitrate)); 1435 receiver.IncomingPacket(compound.Build()); 1436 1437 EXPECT_THAT( 1438 receiver.TmmbrReceived(), 1439 ElementsAre(AllOf( 1440 Property(&rtcp::TmmbItem::bitrate_bps, Eq(kBitrate.bps<uint64_t>())), 1441 Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc))))); 1442 } 1443 1444 TEST(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 1445 ReceiverMocks mocks; 1446 RTCPReceiver receiver = Create(mocks); 1447 receiver.SetRemoteSSRC(kSenderSsrc); 1448 1449 const uint32_t kBitrateBps = 30000; 1450 auto tmmbr = std::make_unique<rtcp::Tmmbr>(); 1451 tmmbr->SetSenderSsrc(kSenderSsrc); 1452 tmmbr->AddTmmbr(rtcp::TmmbItem(kNotToUsSsrc, kBitrateBps, 0)); 1453 1454 auto sr = std::make_unique<rtcp::SenderReport>(); 1455 sr->SetSenderSsrc(kSenderSsrc); 1456 rtcp::CompoundPacket compound; 1457 compound.Append(std::move(sr)); 1458 compound.Append(std::move(tmmbr)); 1459 1460 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1461 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReceiverEstimatedMaxBitrate) 1462 .Times(0); 1463 receiver.IncomingPacket(compound.Build()); 1464 1465 EXPECT_EQ(0u, receiver.TmmbrReceived().size()); 1466 } 1467 1468 TEST(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 1469 ReceiverMocks mocks; 1470 RTCPReceiver receiver = Create(mocks); 1471 receiver.SetRemoteSSRC(kSenderSsrc); 1472 1473 auto tmmbr = std::make_unique<rtcp::Tmmbr>(); 1474 tmmbr->SetSenderSsrc(kSenderSsrc); 1475 tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 0, 0)); 1476 auto sr = std::make_unique<rtcp::SenderReport>(); 1477 sr->SetSenderSsrc(kSenderSsrc); 1478 rtcp::CompoundPacket compound; 1479 compound.Append(std::move(sr)); 1480 compound.Append(std::move(tmmbr)); 1481 1482 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1483 EXPECT_CALL(mocks.network_link_rtcp_observer, OnReceiverEstimatedMaxBitrate) 1484 .Times(0); 1485 receiver.IncomingPacket(compound.Build()); 1486 1487 EXPECT_EQ(0u, receiver.TmmbrReceived().size()); 1488 } 1489 1490 TEST(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 1491 ReceiverMocks mocks; 1492 RTCPReceiver receiver = Create(mocks); 1493 receiver.SetRemoteSSRC(kSenderSsrc); 1494 1495 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. 1496 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 1497 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 1498 auto tmmbr = std::make_unique<rtcp::Tmmbr>(); 1499 tmmbr->SetSenderSsrc(ssrc); 1500 tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 30000, 0)); 1501 auto sr = std::make_unique<rtcp::SenderReport>(); 1502 sr->SetSenderSsrc(ssrc); 1503 rtcp::CompoundPacket compound; 1504 compound.Append(std::move(sr)); 1505 compound.Append(std::move(tmmbr)); 1506 1507 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1508 EXPECT_CALL(mocks.rtp_rtcp_impl, SetTmmbn); 1509 EXPECT_CALL(mocks.network_link_rtcp_observer, 1510 OnReceiverEstimatedMaxBitrate); 1511 receiver.IncomingPacket(compound.Build()); 1512 1513 // 5 seconds between each packet. 1514 mocks.clock.AdvanceTimeMilliseconds(5000); 1515 } 1516 // It is now starttime + 15. 1517 EXPECT_THAT(receiver.TmmbrReceived(), 1518 AllOf(SizeIs(3), 1519 Each(Property(&rtcp::TmmbItem::bitrate_bps, Eq(30'000U))))); 1520 1521 // We expect the timeout to be 25 seconds. Advance the clock by 12 1522 // seconds, timing out the first packet. 1523 mocks.clock.AdvanceTimeMilliseconds(12000); 1524 EXPECT_THAT(receiver.TmmbrReceived(), 1525 UnorderedElementsAre( 1526 Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc + 1)), 1527 Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc + 2)))); 1528 } 1529 1530 TEST(RtcpReceiverTest, 1531 VerifyBlockAndTimestampObtainedFromReportBlockDataObserver) { 1532 ReceiverMocks mocks; 1533 MockReportBlockDataObserverImpl observer; 1534 mocks.config.report_block_data_observer = &observer; 1535 RTCPReceiver receiver = Create(mocks); 1536 receiver.SetRemoteSSRC(kSenderSsrc); 1537 1538 const uint8_t kFractionLoss = 3; 1539 const uint32_t kCumulativeLoss = 7; 1540 const uint32_t kJitter = 9; 1541 const uint16_t kSequenceNumber = 1234; 1542 const Timestamp kUtcNow = Clock::NtpToUtc(mocks.clock.CurrentNtpTime()); 1543 1544 rtcp::ReportBlock rtcp_block; 1545 rtcp_block.SetMediaSsrc(kReceiverMainSsrc); 1546 rtcp_block.SetExtHighestSeqNum(kSequenceNumber); 1547 rtcp_block.SetFractionLost(kFractionLoss); 1548 rtcp_block.SetCumulativeLost(kCumulativeLoss); 1549 rtcp_block.SetJitter(kJitter); 1550 1551 rtcp::ReceiverReport rtcp_report; 1552 rtcp_report.SetSenderSsrc(kSenderSsrc); 1553 rtcp_report.AddReportBlock(rtcp_block); 1554 EXPECT_CALL(observer, OnReportBlockDataUpdated) 1555 .WillOnce([&](ReportBlockData report_block) { 1556 EXPECT_EQ(rtcp_block.source_ssrc(), report_block.source_ssrc()); 1557 EXPECT_EQ(kSenderSsrc, report_block.sender_ssrc()); 1558 EXPECT_EQ(rtcp_block.fraction_lost(), report_block.fraction_lost_raw()); 1559 EXPECT_EQ(rtcp_block.cumulative_lost(), report_block.cumulative_lost()); 1560 EXPECT_EQ(rtcp_block.extended_high_seq_num(), 1561 report_block.extended_highest_sequence_number()); 1562 EXPECT_EQ(rtcp_block.jitter(), report_block.jitter()); 1563 EXPECT_EQ(report_block.report_block_timestamp_utc(), kUtcNow); 1564 // No RTT is calculated in this test. 1565 EXPECT_EQ(0u, report_block.num_rtts()); 1566 }); 1567 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1568 receiver.IncomingPacket(rtcp_report.Build()); 1569 } 1570 1571 TEST(RtcpReceiverTest, VerifyRttObtainedFromReportBlockDataObserver) { 1572 ReceiverMocks mocks; 1573 MockReportBlockDataObserverImpl observer; 1574 mocks.config.report_block_data_observer = &observer; 1575 RTCPReceiver receiver = Create(mocks); 1576 receiver.SetRemoteSSRC(kSenderSsrc); 1577 1578 // To avoid issues with rounding due to different way to represent time units, 1579 // use RTT that can be precisly represented both with 1580 // TimeDelta units (i.e. integer number of microseconds), and 1581 // ntp units (i.e. integer number of 2^(-32) seconds) 1582 const TimeDelta kRtt = TimeDelta::Millis(125); 1583 const uint32_t kDelayNtp = 123'000; 1584 const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp); 1585 1586 uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime()); 1587 mocks.clock.AdvanceTime(kRtt + kDelay); 1588 1589 rtcp::SenderReport sr; 1590 sr.SetSenderSsrc(kSenderSsrc); 1591 rtcp::ReportBlock block; 1592 block.SetMediaSsrc(kReceiverMainSsrc); 1593 block.SetLastSr(sent_ntp); 1594 block.SetDelayLastSr(kDelayNtp); 1595 sr.AddReportBlock(block); 1596 block.SetMediaSsrc(kReceiverExtraSsrc); 1597 block.SetLastSr(0); 1598 sr.AddReportBlock(block); 1599 1600 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1601 InSequence sequence; 1602 EXPECT_CALL(observer, OnReportBlockDataUpdated) 1603 .WillOnce([&](ReportBlockData report_block_data) { 1604 EXPECT_EQ(kReceiverMainSsrc, report_block_data.source_ssrc()); 1605 EXPECT_EQ(1u, report_block_data.num_rtts()); 1606 EXPECT_EQ(kRtt, report_block_data.sum_rtts()); 1607 EXPECT_EQ(kRtt, report_block_data.last_rtt()); 1608 }); 1609 EXPECT_CALL(observer, OnReportBlockDataUpdated) 1610 .WillOnce([](ReportBlockData report_block_data) { 1611 EXPECT_EQ(kReceiverExtraSsrc, report_block_data.source_ssrc()); 1612 EXPECT_EQ(0u, report_block_data.num_rtts()); 1613 }); 1614 receiver.IncomingPacket(sr.Build()); 1615 } 1616 1617 TEST(RtcpReceiverTest, GetReportBlockDataAfterOneReportBlock) { 1618 ReceiverMocks mocks; 1619 RTCPReceiver receiver = Create(mocks); 1620 receiver.SetRemoteSSRC(kSenderSsrc); 1621 1622 const uint16_t kSequenceNumber = 1234; 1623 1624 rtcp::ReportBlock rtcp_block; 1625 rtcp_block.SetMediaSsrc(kReceiverMainSsrc); 1626 rtcp_block.SetExtHighestSeqNum(kSequenceNumber); 1627 1628 rtcp::ReceiverReport rtcp_report; 1629 rtcp_report.SetSenderSsrc(kSenderSsrc); 1630 rtcp_report.AddReportBlock(rtcp_block); 1631 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1632 receiver.IncomingPacket(rtcp_report.Build()); 1633 1634 auto report_block_datas = receiver.GetLatestReportBlockData(); 1635 ASSERT_THAT(report_block_datas, SizeIs(1)); 1636 EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc()); 1637 EXPECT_EQ(kSequenceNumber, 1638 report_block_datas[0].extended_highest_sequence_number()); 1639 } 1640 1641 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfSameSsrc) { 1642 ReceiverMocks mocks; 1643 RTCPReceiver receiver = Create(mocks); 1644 receiver.SetRemoteSSRC(kSenderSsrc); 1645 1646 const uint16_t kSequenceNumber1 = 1234; 1647 const uint16_t kSequenceNumber2 = 1235; 1648 1649 rtcp::ReportBlock rtcp_block1; 1650 rtcp_block1.SetMediaSsrc(kReceiverMainSsrc); 1651 rtcp_block1.SetExtHighestSeqNum(kSequenceNumber1); 1652 1653 rtcp::ReceiverReport rtcp_report1; 1654 rtcp_report1.SetSenderSsrc(kSenderSsrc); 1655 rtcp_report1.AddReportBlock(rtcp_block1); 1656 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1657 receiver.IncomingPacket(rtcp_report1.Build()); 1658 1659 // Inject a report block with an increased the sequence number for the same 1660 // source SSRC. 1661 rtcp::ReportBlock rtcp_block2; 1662 rtcp_block2.SetMediaSsrc(kReceiverMainSsrc); 1663 rtcp_block2.SetExtHighestSeqNum(kSequenceNumber2); 1664 1665 rtcp::ReceiverReport rtcp_report2; 1666 rtcp_report2.SetSenderSsrc(kSenderSsrc); 1667 rtcp_report2.AddReportBlock(rtcp_block2); 1668 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1669 receiver.IncomingPacket(rtcp_report2.Build()); 1670 1671 // Only the latest block should be returned. 1672 auto report_block_datas = receiver.GetLatestReportBlockData(); 1673 ASSERT_THAT(report_block_datas, SizeIs(1)); 1674 EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc()); 1675 EXPECT_EQ(kSequenceNumber2, 1676 report_block_datas[0].extended_highest_sequence_number()); 1677 } 1678 1679 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfDifferentSsrcs) { 1680 ReceiverMocks mocks; 1681 RTCPReceiver receiver = Create(mocks); 1682 receiver.SetRemoteSSRC(kSenderSsrc); 1683 1684 const uint16_t kSequenceNumber1 = 1234; 1685 const uint16_t kSequenceNumber2 = 42; 1686 1687 rtcp::ReportBlock rtcp_block1; 1688 rtcp_block1.SetMediaSsrc(kReceiverMainSsrc); 1689 rtcp_block1.SetExtHighestSeqNum(kSequenceNumber1); 1690 1691 rtcp::ReceiverReport rtcp_report1; 1692 rtcp_report1.SetSenderSsrc(kSenderSsrc); 1693 rtcp_report1.AddReportBlock(rtcp_block1); 1694 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1695 receiver.IncomingPacket(rtcp_report1.Build()); 1696 1697 // Inject a report block for a different source SSRC. 1698 rtcp::ReportBlock rtcp_block2; 1699 rtcp_block2.SetMediaSsrc(kReceiverExtraSsrc); 1700 rtcp_block2.SetExtHighestSeqNum(kSequenceNumber2); 1701 1702 rtcp::ReceiverReport rtcp_report2; 1703 rtcp_report2.SetSenderSsrc(kSenderSsrc); 1704 rtcp_report2.AddReportBlock(rtcp_block2); 1705 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks); 1706 receiver.IncomingPacket(rtcp_report2.Build()); 1707 1708 // Both report blocks should be returned. 1709 auto report_block_datas = receiver.GetLatestReportBlockData(); 1710 ASSERT_THAT(report_block_datas, SizeIs(2)); 1711 EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc()); 1712 EXPECT_EQ(kSequenceNumber1, 1713 report_block_datas[0].extended_highest_sequence_number()); 1714 EXPECT_EQ(kReceiverExtraSsrc, report_block_datas[1].source_ssrc()); 1715 EXPECT_EQ(kSequenceNumber2, 1716 report_block_datas[1].extended_highest_sequence_number()); 1717 } 1718 1719 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedback) { 1720 ReceiverMocks mocks; 1721 RTCPReceiver receiver = Create(mocks); 1722 receiver.SetRemoteSSRC(kSenderSsrc); 1723 1724 rtcp::TransportFeedback packet; 1725 packet.SetMediaSsrc(mocks.config.local_media_ssrc); 1726 packet.SetSenderSsrc(kSenderSsrc); 1727 packet.SetBase(123, Timestamp::Millis(1)); 1728 packet.AddReceivedPacket(123, Timestamp::Millis(1)); 1729 1730 EXPECT_CALL( 1731 mocks.network_link_rtcp_observer, 1732 OnTransportFeedback( 1733 mocks.clock.CurrentTime(), 1734 AllOf(Property(&rtcp::TransportFeedback::GetBaseSequence, 123), 1735 Property(&rtcp::TransportFeedback::GetReceivedPackets, 1736 SizeIs(1))))); 1737 1738 receiver.IncomingPacket(packet.Build()); 1739 } 1740 1741 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) { 1742 ReceiverMocks mocks; 1743 mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; 1744 RTCPReceiver receiver = Create(mocks); 1745 1746 rtcp::CongestionControlFeedback packet( 1747 {{ 1748 .ssrc = mocks.config.local_media_ssrc, 1749 .sequence_number = 1, 1750 }}, 1751 /*report_timestamp_compact_ntp=*/324); 1752 packet.SetSenderSsrc(kSenderSsrc); 1753 1754 EXPECT_CALL( 1755 mocks.network_link_rtcp_observer, 1756 OnCongestionControlFeedback( 1757 mocks.clock.CurrentTime(), 1758 Property(&rtcp::CongestionControlFeedback::packets, SizeIs(1)))); 1759 receiver.IncomingPacket(packet.Build()); 1760 } 1761 1762 TEST(RtcpReceiverTest, FiltersCongestionControlFeedbackOnFirstSsrc) { 1763 ReceiverMocks mocks_1; 1764 mocks_1.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; 1765 RTCPReceiver receiver_1 = Create(mocks_1); 1766 1767 ReceiverMocks mocks_2; 1768 mocks_2.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; 1769 mocks_2.config.local_media_ssrc = 789; 1770 mocks_2.config.rtx_send_ssrc = 345; 1771 RTCPReceiver receiver_2 = Create(mocks_2); 1772 1773 rtcp::CongestionControlFeedback packet( 1774 {{ 1775 .ssrc = mocks_2.config.local_media_ssrc, 1776 .sequence_number = 1, 1777 }}, 1778 /*report_timestamp_compact_ntp=*/324); 1779 packet.SetSenderSsrc(kSenderSsrc); 1780 1781 EXPECT_CALL(mocks_1.network_link_rtcp_observer, OnCongestionControlFeedback) 1782 .Times(0); 1783 EXPECT_CALL(mocks_2.network_link_rtcp_observer, OnCongestionControlFeedback) 1784 .Times(1); 1785 receiver_1.IncomingPacket(packet.Build()); 1786 receiver_2.IncomingPacket(packet.Build()); 1787 } 1788 1789 TEST(RtcpReceiverTest, 1790 NotifiesNetworkStateEstimateObserverOnRemoteNetworkEstimate) { 1791 ReceiverMocks mocks; 1792 RTCPReceiver receiver = Create(mocks); 1793 receiver.SetRemoteSSRC(kSenderSsrc); 1794 1795 NetworkStateEstimate estimate; 1796 estimate.link_capacity_lower = DataRate::BitsPerSec(1000); 1797 estimate.link_capacity_upper = DataRate::BitsPerSec(10000); 1798 rtcp::RemoteEstimate remote_estimate; 1799 remote_estimate.SetEstimate(estimate); 1800 1801 EXPECT_CALL(mocks.network_state_estimate_observer, 1802 OnRemoteNetworkEstimate( 1803 AllOf(Field(&NetworkStateEstimate::link_capacity_lower, 1804 DataRate::BitsPerSec(1000)), 1805 Field(&NetworkStateEstimate::link_capacity_upper, 1806 DataRate::BitsPerSec(10000))))); 1807 1808 receiver.IncomingPacket(remote_estimate.Build()); 1809 } 1810 1811 TEST(RtcpReceiverTest, 1812 NotifiesNetworkStateEstimateObserverBeforeNetworkLinkObserver) { 1813 ReceiverMocks mocks; 1814 RTCPReceiver receiver = Create(mocks); 1815 receiver.SetRemoteSSRC(kSenderSsrc); 1816 1817 NetworkStateEstimate estimate; 1818 estimate.link_capacity_lower = DataRate::BitsPerSec(1000); 1819 estimate.link_capacity_upper = DataRate::BitsPerSec(10000); 1820 std::unique_ptr<rtcp::RemoteEstimate> remote_estimate = 1821 std::make_unique<rtcp::RemoteEstimate>(); 1822 remote_estimate->SetEstimate(estimate); 1823 std::unique_ptr<rtcp::TransportFeedback> feedback_packet = 1824 std::make_unique<rtcp::TransportFeedback>(); 1825 feedback_packet->SetMediaSsrc(mocks.config.local_media_ssrc); 1826 feedback_packet->SetSenderSsrc(kSenderSsrc); 1827 feedback_packet->SetBase(123, Timestamp::Millis(1)); 1828 feedback_packet->AddReceivedPacket(123, Timestamp::Millis(1)); 1829 rtcp::CompoundPacket compound; 1830 compound.Append(std::move(remote_estimate)); 1831 compound.Append(std::move(feedback_packet)); 1832 1833 InSequence s; 1834 EXPECT_CALL(mocks.network_state_estimate_observer, OnRemoteNetworkEstimate); 1835 EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback); 1836 receiver.IncomingPacket(compound.Build()); 1837 } 1838 1839 TEST(RtcpReceiverTest, HandlesInvalidCongestionControlFeedback) { 1840 ReceiverMocks mocks; 1841 mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; 1842 RTCPReceiver receiver = Create(mocks); 1843 receiver.SetRemoteSSRC(kSenderSsrc); 1844 1845 rtcp::CongestionControlFeedback packet({{ 1846 .ssrc = 123, 1847 .sequence_number = 1, 1848 }}, 1849 /*report_timestamp_compact_ntp=*/324); 1850 packet.SetSenderSsrc(kSenderSsrc); 1851 Buffer built_packet = packet.Build(); 1852 // Modify the CongestionControlFeedback packet so that it is invalid. 1853 const size_t kNumReportsOffset = 14; 1854 ByteWriter<uint16_t>::WriteBigEndian(&built_packet.data()[kNumReportsOffset], 1855 42); 1856 1857 EXPECT_CALL(mocks.network_link_rtcp_observer, OnCongestionControlFeedback) 1858 .Times(0); 1859 receiver.IncomingPacket(built_packet); 1860 } 1861 1862 TEST(RtcpReceiverTest, 1863 NotifiesNetworkLinkObserverOnTransportFeedbackOnRtxSsrc) { 1864 ReceiverMocks mocks; 1865 RTCPReceiver receiver = Create(mocks); 1866 receiver.SetRemoteSSRC(kSenderSsrc); 1867 1868 rtcp::TransportFeedback packet; 1869 packet.SetMediaSsrc(*mocks.config.rtx_send_ssrc); 1870 packet.SetSenderSsrc(kSenderSsrc); 1871 packet.SetBase(1, Timestamp::Millis(1)); 1872 packet.AddReceivedPacket(1, Timestamp::Millis(1)); 1873 1874 EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback); 1875 receiver.IncomingPacket(packet.Build()); 1876 } 1877 1878 TEST(RtcpReceiverTest, 1879 DoesNotNotifyNetworkLinkObserverOnTransportFeedbackForUnregistedSsrc) { 1880 ReceiverMocks mocks; 1881 RTCPReceiver receiver = Create(mocks); 1882 receiver.SetRemoteSSRC(kSenderSsrc); 1883 1884 rtcp::TransportFeedback packet; 1885 packet.SetMediaSsrc(kNotToUsSsrc); 1886 packet.SetSenderSsrc(kSenderSsrc); 1887 packet.SetBase(1, Timestamp::Millis(1)); 1888 packet.AddReceivedPacket(1, Timestamp::Millis(1)); 1889 1890 EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback).Times(0); 1891 receiver.IncomingPacket(packet.Build()); 1892 } 1893 1894 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnRemb) { 1895 ReceiverMocks mocks; 1896 RTCPReceiver receiver = Create(mocks); 1897 receiver.SetRemoteSSRC(kSenderSsrc); 1898 1899 rtcp::Remb remb; 1900 remb.SetSenderSsrc(kSenderSsrc); 1901 remb.SetBitrateBps(500'000); 1902 1903 EXPECT_CALL(mocks.network_link_rtcp_observer, 1904 OnReceiverEstimatedMaxBitrate(mocks.clock.CurrentTime(), 1905 DataRate::BitsPerSec(500'000))); 1906 receiver.IncomingPacket(remb.Build()); 1907 } 1908 1909 TEST(RtcpReceiverTest, HandlesInvalidTransportFeedback) { 1910 ReceiverMocks mocks; 1911 RTCPReceiver receiver = Create(mocks); 1912 receiver.SetRemoteSSRC(kSenderSsrc); 1913 1914 // Send a compound packet with a TransportFeedback followed by something else. 1915 auto packet = std::make_unique<rtcp::TransportFeedback>(); 1916 packet->SetMediaSsrc(kReceiverMainSsrc); 1917 packet->SetSenderSsrc(kSenderSsrc); 1918 packet->SetBase(1, Timestamp::Millis(1)); 1919 packet->AddReceivedPacket(1, Timestamp::Millis(1)); 1920 1921 static constexpr DataRate kBitrate = DataRate::BitsPerSec(50'000); 1922 auto remb = std::make_unique<rtcp::Remb>(); 1923 remb->SetSenderSsrc(kSenderSsrc); 1924 remb->SetBitrateBps(kBitrate.bps()); 1925 rtcp::CompoundPacket compound; 1926 compound.Append(std::move(packet)); 1927 compound.Append(std::move(remb)); 1928 Buffer built_packet = compound.Build(); 1929 1930 // Modify the TransportFeedback packet so that it is invalid. 1931 const size_t kStatusCountOffset = 14; 1932 ByteWriter<uint16_t>::WriteBigEndian(&built_packet.data()[kStatusCountOffset], 1933 42); 1934 1935 // Stress no transport feedback is expected. 1936 EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback).Times(0); 1937 // But remb should be processed and cause a callback 1938 EXPECT_CALL(mocks.network_link_rtcp_observer, 1939 OnReceiverEstimatedMaxBitrate(_, kBitrate)); 1940 receiver.IncomingPacket(built_packet); 1941 } 1942 1943 TEST(RtcpReceiverTest, Nack) { 1944 ReceiverMocks mocks; 1945 RTCPReceiver receiver = Create(mocks); 1946 receiver.SetRemoteSSRC(kSenderSsrc); 1947 1948 const uint16_t kNackList1[] = {1, 2, 3, 5}; 1949 const uint16_t kNackList23[] = {5, 7, 30, 40, 41, 58, 59, 61, 63}; 1950 const size_t kNackListLength2 = 4; 1951 const size_t kNackListLength3 = std::size(kNackList23) - kNackListLength2; 1952 std::set<uint16_t> nack_set; 1953 nack_set.insert(std::begin(kNackList1), std::end(kNackList1)); 1954 nack_set.insert(std::begin(kNackList23), std::end(kNackList23)); 1955 1956 auto nack1 = std::make_unique<rtcp::Nack>(); 1957 nack1->SetSenderSsrc(kSenderSsrc); 1958 nack1->SetMediaSsrc(kReceiverMainSsrc); 1959 nack1->SetPacketIds(kNackList1, std::size(kNackList1)); 1960 1961 EXPECT_CALL(mocks.rtp_rtcp_impl, 1962 OnReceivedNack(ElementsAreArray(kNackList1))); 1963 EXPECT_CALL(mocks.packet_type_counter_observer, 1964 RtcpPacketTypesCounterUpdated( 1965 kReceiverMainSsrc, 1966 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, 1967 std::size(kNackList1)), 1968 Field(&RtcpPacketTypeCounter::unique_nack_requests, 1969 std::size(kNackList1))))); 1970 receiver.IncomingPacket(nack1->Build()); 1971 1972 auto nack2 = std::make_unique<rtcp::Nack>(); 1973 nack2->SetSenderSsrc(kSenderSsrc); 1974 nack2->SetMediaSsrc(kReceiverMainSsrc); 1975 nack2->SetPacketIds(kNackList23, kNackListLength2); 1976 1977 auto nack3 = std::make_unique<rtcp::Nack>(); 1978 nack3->SetSenderSsrc(kSenderSsrc); 1979 nack3->SetMediaSsrc(kReceiverMainSsrc); 1980 nack3->SetPacketIds(kNackList23 + kNackListLength2, kNackListLength3); 1981 1982 rtcp::CompoundPacket two_nacks; 1983 two_nacks.Append(std::move(nack2)); 1984 two_nacks.Append(std::move(nack3)); 1985 1986 EXPECT_CALL(mocks.rtp_rtcp_impl, 1987 OnReceivedNack(ElementsAreArray(kNackList23))); 1988 EXPECT_CALL(mocks.packet_type_counter_observer, 1989 RtcpPacketTypesCounterUpdated( 1990 kReceiverMainSsrc, 1991 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, 1992 std::size(kNackList1) + std::size(kNackList23)), 1993 Field(&RtcpPacketTypeCounter::unique_nack_requests, 1994 nack_set.size())))); 1995 receiver.IncomingPacket(two_nacks.Build()); 1996 } 1997 1998 TEST(RtcpReceiverTest, NackNotForUsIgnored) { 1999 ReceiverMocks mocks; 2000 RTCPReceiver receiver = Create(mocks); 2001 receiver.SetRemoteSSRC(kSenderSsrc); 2002 2003 const uint16_t kNackList1[] = {1, 2, 3, 5}; 2004 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1); 2005 2006 rtcp::Nack nack; 2007 nack.SetSenderSsrc(kSenderSsrc); 2008 nack.SetMediaSsrc(kNotToUsSsrc); 2009 nack.SetPacketIds(kNackList1, kNackListLength1); 2010 2011 EXPECT_CALL(mocks.packet_type_counter_observer, 2012 RtcpPacketTypesCounterUpdated( 2013 _, Field(&RtcpPacketTypeCounter::nack_requests, 0))); 2014 receiver.IncomingPacket(nack.Build()); 2015 } 2016 2017 TEST(RtcpReceiverTest, ForceSenderReport) { 2018 ReceiverMocks mocks; 2019 RTCPReceiver receiver = Create(mocks); 2020 receiver.SetRemoteSSRC(kSenderSsrc); 2021 2022 rtcp::RapidResyncRequest rr; 2023 rr.SetSenderSsrc(kSenderSsrc); 2024 rr.SetMediaSsrc(kReceiverMainSsrc); 2025 2026 EXPECT_CALL(mocks.rtp_rtcp_impl, OnRequestSendReport()); 2027 receiver.IncomingPacket(rr.Build()); 2028 } 2029 2030 TEST(RtcpReceiverTest, ReceivesTargetBitrate) { 2031 ReceiverMocks mocks; 2032 RTCPReceiver receiver = Create(mocks); 2033 receiver.SetRemoteSSRC(kSenderSsrc); 2034 2035 VideoBitrateAllocation expected_allocation; 2036 expected_allocation.SetBitrate(0, 0, 10000); 2037 expected_allocation.SetBitrate(0, 1, 20000); 2038 expected_allocation.SetBitrate(1, 0, 40000); 2039 expected_allocation.SetBitrate(1, 1, 80000); 2040 2041 rtcp::TargetBitrate bitrate; 2042 bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000); 2043 bitrate.AddTargetBitrate(0, 1, expected_allocation.GetBitrate(0, 1) / 1000); 2044 bitrate.AddTargetBitrate(1, 0, expected_allocation.GetBitrate(1, 0) / 1000); 2045 bitrate.AddTargetBitrate(1, 1, expected_allocation.GetBitrate(1, 1) / 1000); 2046 2047 rtcp::ExtendedReports xr; 2048 xr.SetTargetBitrate(bitrate); 2049 2050 // Wrong sender ssrc, target bitrate should be discarded. 2051 xr.SetSenderSsrc(kSenderSsrc + 1); 2052 EXPECT_CALL(mocks.bitrate_allocation_observer, 2053 OnBitrateAllocationUpdated(expected_allocation)) 2054 .Times(0); 2055 receiver.IncomingPacket(xr.Build()); 2056 2057 // Set correct ssrc, callback should be called once. 2058 xr.SetSenderSsrc(kSenderSsrc); 2059 EXPECT_CALL(mocks.bitrate_allocation_observer, 2060 OnBitrateAllocationUpdated(expected_allocation)); 2061 receiver.IncomingPacket(xr.Build()); 2062 } 2063 2064 TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) { 2065 ReceiverMocks mocks; 2066 RTCPReceiver receiver = Create(mocks); 2067 receiver.SetRemoteSSRC(kSenderSsrc); 2068 2069 VideoBitrateAllocation expected_allocation; 2070 expected_allocation.SetBitrate(0, 0, 10000); 2071 2072 rtcp::TargetBitrate bitrate; 2073 bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000); 2074 bitrate.AddTargetBitrate(0, kMaxTemporalStreams, 20000); 2075 bitrate.AddTargetBitrate(kMaxSpatialLayers, 0, 40000); 2076 2077 rtcp::ExtendedReports xr; 2078 xr.SetTargetBitrate(bitrate); 2079 xr.SetSenderSsrc(kSenderSsrc); 2080 2081 EXPECT_CALL(mocks.bitrate_allocation_observer, 2082 OnBitrateAllocationUpdated(expected_allocation)); 2083 receiver.IncomingPacket(xr.Build()); 2084 } 2085 2086 TEST(RtcpReceiverTest, ChangeLocalMediaSsrc) { 2087 ReceiverMocks mocks; 2088 // Construct a receiver with `kReceiverMainSsrc` (default) local media ssrc. 2089 RTCPReceiver receiver = Create(mocks); 2090 receiver.SetRemoteSSRC(kSenderSsrc); 2091 2092 constexpr uint32_t kSecondarySsrc = kReceiverMainSsrc + 1; 2093 2094 // Expect to only get the `OnReceivedNack()` callback once since we'll 2095 // configure it for the `kReceiverMainSsrc` media ssrc. 2096 EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedNack); 2097 2098 // We'll get two callbacks to RtcpPacketTypesCounterUpdated, one for each 2099 // call to `IncomingPacket`, differentiated by the local media ssrc. 2100 EXPECT_CALL(mocks.packet_type_counter_observer, 2101 RtcpPacketTypesCounterUpdated(kReceiverMainSsrc, _)); 2102 EXPECT_CALL(mocks.packet_type_counter_observer, 2103 RtcpPacketTypesCounterUpdated(kSecondarySsrc, _)); 2104 2105 // Construct a test nack packet with media ssrc set to `kReceiverMainSsrc`. 2106 rtcp::Nack nack; 2107 nack.SetSenderSsrc(kSenderSsrc); 2108 nack.SetMediaSsrc(kReceiverMainSsrc); 2109 const uint16_t kNackList[] = {1, 2, 3, 5}; 2110 nack.SetPacketIds(kNackList, std::size(kNackList)); 2111 2112 // Deliver the first callback. 2113 receiver.IncomingPacket(nack.Build()); 2114 2115 // Change the set local media ssrc. 2116 receiver.set_local_media_ssrc(kSecondarySsrc); 2117 2118 // Deliver another packet - this time there will be no callback to 2119 // OnReceivedNack due to the ssrc not matching. 2120 receiver.IncomingPacket(nack.Build()); 2121 } 2122 2123 } // namespace webrtc