tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rtcp_transceiver_impl_unittest.cc (69191B)


      1 /*
      2 *  Copyright (c) 2017 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_transceiver_impl.h"
     12 
     13 #include <cstddef>
     14 #include <cstdint>
     15 #include <functional>
     16 #include <memory>
     17 #include <optional>
     18 #include <utility>
     19 #include <vector>
     20 
     21 #include "api/array_view.h"
     22 #include "api/rtp_headers.h"
     23 #include "api/task_queue/task_queue_base.h"
     24 #include "api/task_queue/task_queue_factory.h"
     25 #include "api/test/create_time_controller.h"
     26 #include "api/test/time_controller.h"
     27 #include "api/units/data_rate.h"
     28 #include "api/units/time_delta.h"
     29 #include "api/units/timestamp.h"
     30 #include "api/video/video_bitrate_allocation.h"
     31 #include "api/video/video_codec_constants.h"
     32 #include "modules/rtp_rtcp/include/receive_statistics.h"
     33 #include "modules/rtp_rtcp/include/report_block_data.h"
     34 #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h"
     35 #include "modules/rtp_rtcp/source/ntp_time_util.h"
     36 #include "modules/rtp_rtcp/source/rtcp_packet/app.h"
     37 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
     38 #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
     39 #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h"
     40 #include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
     41 #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
     42 #include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
     43 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
     44 #include "modules/rtp_rtcp/source/rtcp_packet/pli.h"
     45 #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
     46 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
     47 #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
     48 #include "modules/rtp_rtcp/source/rtcp_packet/rrtr.h"
     49 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
     50 #include "modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
     51 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
     52 #include "modules/rtp_rtcp/source/rtcp_transceiver_config.h"
     53 #include "system_wrappers/include/clock.h"
     54 #include "system_wrappers/include/ntp_time.h"
     55 #include "test/gmock.h"
     56 #include "test/gtest.h"
     57 #include "test/rtcp_packet_parser.h"
     58 
     59 namespace webrtc {
     60 namespace {
     61 
     62 using rtcp::Bye;
     63 using rtcp::CompoundPacket;
     64 using rtcp::ReportBlock;
     65 using rtcp::SenderReport;
     66 using test::RtcpPacketParser;
     67 using ::testing::_;
     68 using ::testing::ElementsAre;
     69 using ::testing::ElementsAreArray;
     70 using ::testing::Ge;
     71 using ::testing::MockFunction;
     72 using ::testing::NiceMock;
     73 using ::testing::Property;
     74 using ::testing::Return;
     75 using ::testing::SizeIs;
     76 using ::testing::StrictMock;
     77 using ::testing::UnorderedElementsAre;
     78 using ::testing::WithArg;
     79 
     80 class MockReceiveStatisticsProvider : public ReceiveStatisticsProvider {
     81 public:
     82  MOCK_METHOD(std::vector<ReportBlock>, RtcpReportBlocks, (size_t), (override));
     83 };
     84 
     85 class MockMediaReceiverRtcpObserver : public MediaReceiverRtcpObserver {
     86 public:
     87  MOCK_METHOD(void, OnSenderReport, (uint32_t, NtpTime, uint32_t), (override));
     88  MOCK_METHOD(void, OnBye, (uint32_t), (override));
     89  MOCK_METHOD(void,
     90              OnBitrateAllocation,
     91              (uint32_t, const VideoBitrateAllocation&),
     92              (override));
     93 };
     94 
     95 class MockRtpStreamRtcpHandler : public RtpStreamRtcpHandler {
     96 public:
     97  MockRtpStreamRtcpHandler() {
     98    // With each next call increase number of sent packets and bytes to simulate
     99    // active RTP sender.
    100    ON_CALL(*this, SentStats).WillByDefault([this] {
    101      RtpStats stats;
    102      stats.set_num_sent_packets(++num_calls_);
    103      stats.set_num_sent_bytes(1'000 * num_calls_);
    104      return stats;
    105    });
    106  }
    107 
    108  MOCK_METHOD(RtpStats, SentStats, (), (override));
    109  MOCK_METHOD(void,
    110              OnNack,
    111              (uint32_t, ArrayView<const uint16_t>),
    112              (override));
    113  MOCK_METHOD(void, OnFir, (uint32_t), (override));
    114  MOCK_METHOD(void, OnPli, (uint32_t), (override));
    115  MOCK_METHOD(void, OnReport, (const ReportBlockData&), (override));
    116 
    117 private:
    118  int num_calls_ = 0;
    119 };
    120 
    121 constexpr TimeDelta kReportPeriod = TimeDelta::Seconds(1);
    122 constexpr TimeDelta kAlmostForever = TimeDelta::Seconds(2);
    123 constexpr TimeDelta kTimePrecision = TimeDelta::Millis(1);
    124 
    125 MATCHER_P(Near, value, "") {
    126  return arg > value - kTimePrecision && arg < value + kTimePrecision;
    127 }
    128 
    129 // Helper to wait for an rtcp packet produced on a different thread/task queue.
    130 class FakeRtcpTransport {
    131 public:
    132  explicit FakeRtcpTransport(TimeController& time) : time_(time) {}
    133 
    134  std::function<void(ArrayView<const uint8_t>)> AsStdFunction() {
    135    return [this](ArrayView<const uint8_t>) { sent_rtcp_ = true; };
    136  }
    137 
    138  // Returns true when packet was received by the transport.
    139  bool WaitPacket() {
    140    bool got_packet = time_.Wait([this] { return sent_rtcp_; }, kAlmostForever);
    141    // Clear the 'event' to allow waiting for multiple packets.
    142    sent_rtcp_ = false;
    143    return got_packet;
    144  }
    145 
    146 private:
    147  TimeController& time_;
    148  bool sent_rtcp_ = false;
    149 };
    150 
    151 std::function<void(ArrayView<const uint8_t>)> RtcpParserTransport(
    152    RtcpPacketParser& parser) {
    153  return [&parser](ArrayView<const uint8_t> packet) {
    154    return parser.Parse(packet);
    155  };
    156 }
    157 
    158 class RtcpTransceiverImplTest : public ::testing::Test {
    159 public:
    160  RtcpTransceiverConfig DefaultTestConfig() {
    161    // RtcpTransceiverConfig default constructor sets default values for prod.
    162    // Test doesn't need to support all key features: Default test config
    163    // returns valid config with all features turned off.
    164    RtcpTransceiverConfig config;
    165    config.clock = time_->GetClock();
    166    config.schedule_periodic_compound_packets = false;
    167    config.initial_report_delay = kReportPeriod / 2;
    168    config.report_period = kReportPeriod;
    169    return config;
    170  }
    171 
    172  TimeController& time_controller() { return *time_; }
    173  Timestamp CurrentTime() { return time_->GetClock()->CurrentTime(); }
    174  void AdvanceTime(TimeDelta time) { time_->AdvanceTime(time); }
    175  std::unique_ptr<TaskQueueBase, TaskQueueDeleter> CreateTaskQueue() {
    176    return time_->GetTaskQueueFactory()->CreateTaskQueue(
    177        "rtcp", TaskQueueFactory::Priority::NORMAL);
    178  }
    179 
    180 private:
    181  std::unique_ptr<TimeController> time_ = CreateSimulatedTimeController();
    182 };
    183 
    184 TEST_F(RtcpTransceiverImplTest, NeedToStopPeriodicTaskToDestroyOnTaskQueue) {
    185  FakeRtcpTransport transport(time_controller());
    186  auto queue = CreateTaskQueue();
    187  RtcpTransceiverConfig config = DefaultTestConfig();
    188  config.task_queue = queue.get();
    189  config.schedule_periodic_compound_packets = true;
    190  config.rtcp_transport = transport.AsStdFunction();
    191  auto* rtcp_transceiver = new RtcpTransceiverImpl(config);
    192  // Wait for a periodic packet.
    193  EXPECT_TRUE(transport.WaitPacket());
    194 
    195  bool done = false;
    196  queue->PostTask([rtcp_transceiver, &done] {
    197    rtcp_transceiver->StopPeriodicTask();
    198    delete rtcp_transceiver;
    199    done = true;
    200  });
    201  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    202 }
    203 
    204 TEST_F(RtcpTransceiverImplTest, CanBeDestroyedRightAfterCreation) {
    205  FakeRtcpTransport transport(time_controller());
    206  auto queue = CreateTaskQueue();
    207  RtcpTransceiverConfig config = DefaultTestConfig();
    208  config.task_queue = queue.get();
    209  config.schedule_periodic_compound_packets = true;
    210  config.rtcp_transport = transport.AsStdFunction();
    211 
    212  bool done = false;
    213  queue->PostTask([&] {
    214    RtcpTransceiverImpl rtcp_transceiver(config);
    215    rtcp_transceiver.StopPeriodicTask();
    216    done = true;
    217  });
    218  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    219 }
    220 
    221 TEST_F(RtcpTransceiverImplTest, CanDestroyAfterTaskQueue) {
    222  FakeRtcpTransport transport(time_controller());
    223  auto queue = CreateTaskQueue();
    224 
    225  RtcpTransceiverConfig config = DefaultTestConfig();
    226  config.task_queue = queue.get();
    227  config.schedule_periodic_compound_packets = true;
    228  config.rtcp_transport = transport.AsStdFunction();
    229  auto* rtcp_transceiver = new RtcpTransceiverImpl(config);
    230  // Wait for a periodic packet.
    231  EXPECT_TRUE(transport.WaitPacket());
    232 
    233  queue = nullptr;
    234  delete rtcp_transceiver;
    235 }
    236 
    237 TEST_F(RtcpTransceiverImplTest, DelaysSendingFirstCompondPacket) {
    238  auto queue = CreateTaskQueue();
    239  FakeRtcpTransport transport(time_controller());
    240  RtcpTransceiverConfig config = DefaultTestConfig();
    241  config.schedule_periodic_compound_packets = true;
    242  config.rtcp_transport = transport.AsStdFunction();
    243  config.initial_report_delay = TimeDelta::Millis(10);
    244  config.task_queue = queue.get();
    245  std::optional<RtcpTransceiverImpl> rtcp_transceiver;
    246 
    247  Timestamp started = CurrentTime();
    248  queue->PostTask([&] { rtcp_transceiver.emplace(config); });
    249  EXPECT_TRUE(transport.WaitPacket());
    250 
    251  EXPECT_GE(CurrentTime() - started, config.initial_report_delay);
    252 
    253  // Cleanup.
    254  bool done = false;
    255  queue->PostTask([&] {
    256    rtcp_transceiver->StopPeriodicTask();
    257    rtcp_transceiver.reset();
    258    done = true;
    259  });
    260  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    261 }
    262 
    263 TEST_F(RtcpTransceiverImplTest, PeriodicallySendsPackets) {
    264  auto queue = CreateTaskQueue();
    265  FakeRtcpTransport transport(time_controller());
    266  RtcpTransceiverConfig config = DefaultTestConfig();
    267  config.schedule_periodic_compound_packets = true;
    268  config.rtcp_transport = transport.AsStdFunction();
    269  config.initial_report_delay = TimeDelta::Zero();
    270  config.report_period = kReportPeriod;
    271  config.task_queue = queue.get();
    272  std::optional<RtcpTransceiverImpl> rtcp_transceiver;
    273  Timestamp time_just_before_1st_packet = Timestamp::MinusInfinity();
    274  queue->PostTask([&] {
    275    // Because initial_report_delay_ms is set to 0, time_just_before_the_packet
    276    // should be very close to the time_of_the_packet.
    277    time_just_before_1st_packet = CurrentTime();
    278    rtcp_transceiver.emplace(config);
    279  });
    280 
    281  EXPECT_TRUE(transport.WaitPacket());
    282  EXPECT_TRUE(transport.WaitPacket());
    283  Timestamp time_just_after_2nd_packet = CurrentTime();
    284 
    285  EXPECT_GE(time_just_after_2nd_packet - time_just_before_1st_packet,
    286            config.report_period);
    287 
    288  // Cleanup.
    289  bool done = false;
    290  queue->PostTask([&] {
    291    rtcp_transceiver->StopPeriodicTask();
    292    rtcp_transceiver.reset();
    293    done = true;
    294  });
    295  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    296 }
    297 
    298 TEST_F(RtcpTransceiverImplTest, SendCompoundPacketDelaysPeriodicSendPackets) {
    299  auto queue = CreateTaskQueue();
    300  FakeRtcpTransport transport(time_controller());
    301  RtcpTransceiverConfig config = DefaultTestConfig();
    302  config.schedule_periodic_compound_packets = true;
    303  config.rtcp_transport = transport.AsStdFunction();
    304  config.initial_report_delay = TimeDelta::Zero();
    305  config.report_period = kReportPeriod;
    306  config.task_queue = queue.get();
    307  std::optional<RtcpTransceiverImpl> rtcp_transceiver;
    308  queue->PostTask([&] { rtcp_transceiver.emplace(config); });
    309 
    310  // Wait for the first packet.
    311  EXPECT_TRUE(transport.WaitPacket());
    312  // Send non periodic one after half period.
    313  bool non_periodic = false;
    314  Timestamp time_of_non_periodic_packet = Timestamp::MinusInfinity();
    315  queue->PostDelayedTask(
    316      [&] {
    317        time_of_non_periodic_packet = CurrentTime();
    318        rtcp_transceiver->SendCompoundPacket();
    319        non_periodic = true;
    320      },
    321      config.report_period / 2);
    322  // Though non-periodic packet is scheduled just in between periodic, due to
    323  // small period and task queue flakiness it migth end-up 1ms after next
    324  // periodic packet. To be sure duration after non-periodic packet is tested
    325  // wait for transport after ensuring non-periodic packet was sent.
    326  EXPECT_TRUE(
    327      time_controller().Wait([&] { return non_periodic; }, kAlmostForever));
    328  EXPECT_TRUE(transport.WaitPacket());
    329  // Wait for next periodic packet.
    330  EXPECT_TRUE(transport.WaitPacket());
    331  Timestamp time_of_last_periodic_packet = CurrentTime();
    332  EXPECT_GE(time_of_last_periodic_packet - time_of_non_periodic_packet,
    333            config.report_period);
    334 
    335  // Cleanup.
    336  bool done = false;
    337  queue->PostTask([&] {
    338    rtcp_transceiver->StopPeriodicTask();
    339    rtcp_transceiver.reset();
    340    done = true;
    341  });
    342  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    343 }
    344 
    345 TEST_F(RtcpTransceiverImplTest, SendsNoRtcpWhenNetworkStateIsDown) {
    346  MockFunction<void(ArrayView<const uint8_t>)> mock_transport;
    347  RtcpTransceiverConfig config = DefaultTestConfig();
    348  config.initial_ready_to_send = false;
    349  config.rtcp_transport = mock_transport.AsStdFunction();
    350  RtcpTransceiverImpl rtcp_transceiver(config);
    351 
    352  EXPECT_CALL(mock_transport, Call).Times(0);
    353 
    354  const std::vector<uint16_t> sequence_numbers = {45, 57};
    355  const uint32_t ssrcs[] = {123};
    356  rtcp_transceiver.SendCompoundPacket();
    357  rtcp_transceiver.SendNack(ssrcs[0], sequence_numbers);
    358  rtcp_transceiver.SendPictureLossIndication(ssrcs[0]);
    359  rtcp_transceiver.SendFullIntraRequest(ssrcs, true);
    360 }
    361 
    362 TEST_F(RtcpTransceiverImplTest, SendsRtcpWhenNetworkStateIsUp) {
    363  MockFunction<void(ArrayView<const uint8_t>)> mock_transport;
    364  RtcpTransceiverConfig config = DefaultTestConfig();
    365  config.initial_ready_to_send = false;
    366  config.rtcp_transport = mock_transport.AsStdFunction();
    367  RtcpTransceiverImpl rtcp_transceiver(config);
    368 
    369  rtcp_transceiver.SetReadyToSend(true);
    370 
    371  EXPECT_CALL(mock_transport, Call).Times(4);
    372 
    373  const std::vector<uint16_t> sequence_numbers = {45, 57};
    374  const uint32_t ssrcs[] = {123};
    375  rtcp_transceiver.SendCompoundPacket();
    376  rtcp_transceiver.SendNack(ssrcs[0], sequence_numbers);
    377  rtcp_transceiver.SendPictureLossIndication(ssrcs[0]);
    378  rtcp_transceiver.SendFullIntraRequest(ssrcs, true);
    379 }
    380 
    381 TEST_F(RtcpTransceiverImplTest, SendsPeriodicRtcpWhenNetworkStateIsUp) {
    382  auto queue = CreateTaskQueue();
    383  FakeRtcpTransport transport(time_controller());
    384  RtcpTransceiverConfig config = DefaultTestConfig();
    385  config.schedule_periodic_compound_packets = true;
    386  config.initial_ready_to_send = false;
    387  config.rtcp_transport = transport.AsStdFunction();
    388  config.task_queue = queue.get();
    389  std::optional<RtcpTransceiverImpl> rtcp_transceiver;
    390  rtcp_transceiver.emplace(config);
    391 
    392  queue->PostTask([&] { rtcp_transceiver->SetReadyToSend(true); });
    393 
    394  EXPECT_TRUE(transport.WaitPacket());
    395 
    396  // Cleanup.
    397  bool done = false;
    398  queue->PostTask([&] {
    399    rtcp_transceiver->StopPeriodicTask();
    400    rtcp_transceiver.reset();
    401    done = true;
    402  });
    403  ASSERT_TRUE(time_controller().Wait([&] { return done; }, kAlmostForever));
    404 }
    405 
    406 TEST_F(RtcpTransceiverImplTest, SendsMinimalCompoundPacket) {
    407  const uint32_t kSenderSsrc = 12345;
    408  RtcpTransceiverConfig config = DefaultTestConfig();
    409  config.feedback_ssrc = kSenderSsrc;
    410  config.cname = "cname";
    411  RtcpPacketParser rtcp_parser;
    412  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    413  config.schedule_periodic_compound_packets = false;
    414  RtcpTransceiverImpl rtcp_transceiver(config);
    415 
    416  rtcp_transceiver.SendCompoundPacket();
    417 
    418  // Minimal compound RTCP packet contains sender or receiver report and sdes
    419  // with cname.
    420  ASSERT_GT(rtcp_parser.receiver_report()->num_packets(), 0);
    421  EXPECT_EQ(rtcp_parser.receiver_report()->sender_ssrc(), kSenderSsrc);
    422  ASSERT_GT(rtcp_parser.sdes()->num_packets(), 0);
    423  ASSERT_EQ(rtcp_parser.sdes()->chunks().size(), 1u);
    424  EXPECT_EQ(rtcp_parser.sdes()->chunks()[0].ssrc, kSenderSsrc);
    425  EXPECT_EQ(rtcp_parser.sdes()->chunks()[0].cname, config.cname);
    426 }
    427 
    428 TEST_F(RtcpTransceiverImplTest, AvoidsEmptyPacketsInReducedMode) {
    429  MockFunction<void(ArrayView<const uint8_t>)> transport;
    430  EXPECT_CALL(transport, Call).Times(0);
    431  NiceMock<MockReceiveStatisticsProvider> receive_statistics;
    432 
    433  RtcpTransceiverConfig config = DefaultTestConfig();
    434  config.rtcp_transport = transport.AsStdFunction();
    435  config.rtcp_mode = RtcpMode::kReducedSize;
    436  config.receive_statistics = &receive_statistics;
    437  RtcpTransceiverImpl rtcp_transceiver(config);
    438 
    439  rtcp_transceiver.SendCompoundPacket();
    440 }
    441 
    442 TEST_F(RtcpTransceiverImplTest, AvoidsEmptyReceiverReportsInReducedMode) {
    443  RtcpPacketParser rtcp_parser;
    444  NiceMock<MockReceiveStatisticsProvider> receive_statistics;
    445 
    446  RtcpTransceiverConfig config = DefaultTestConfig();
    447  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    448  config.rtcp_mode = RtcpMode::kReducedSize;
    449  config.receive_statistics = &receive_statistics;
    450  // Set it to produce something (RRTR) in the "periodic" rtcp packets.
    451  config.non_sender_rtt_measurement = true;
    452  RtcpTransceiverImpl rtcp_transceiver(config);
    453 
    454  // Rather than waiting for the right time to produce the periodic packet,
    455  // trigger it manually.
    456  rtcp_transceiver.SendCompoundPacket();
    457 
    458  EXPECT_EQ(rtcp_parser.receiver_report()->num_packets(), 0);
    459  EXPECT_GT(rtcp_parser.xr()->num_packets(), 0);
    460 }
    461 
    462 TEST_F(RtcpTransceiverImplTest, SendsNoRembInitially) {
    463  const uint32_t kSenderSsrc = 12345;
    464  RtcpTransceiverConfig config = DefaultTestConfig();
    465  config.feedback_ssrc = kSenderSsrc;
    466  RtcpPacketParser rtcp_parser;
    467  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    468  config.schedule_periodic_compound_packets = false;
    469  RtcpTransceiverImpl rtcp_transceiver(config);
    470 
    471  rtcp_transceiver.SendCompoundPacket();
    472 
    473  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
    474  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 0);
    475 }
    476 
    477 TEST_F(RtcpTransceiverImplTest, SetRembIncludesRembInNextCompoundPacket) {
    478  const uint32_t kSenderSsrc = 12345;
    479  RtcpTransceiverConfig config = DefaultTestConfig();
    480  config.feedback_ssrc = kSenderSsrc;
    481  RtcpPacketParser rtcp_parser;
    482  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    483  config.schedule_periodic_compound_packets = false;
    484  RtcpTransceiverImpl rtcp_transceiver(config);
    485 
    486  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{54321, 64321});
    487  rtcp_transceiver.SendCompoundPacket();
    488 
    489  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    490  EXPECT_EQ(rtcp_parser.remb()->sender_ssrc(), kSenderSsrc);
    491  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 10000);
    492  EXPECT_THAT(rtcp_parser.remb()->ssrcs(), ElementsAre(54321, 64321));
    493 }
    494 
    495 TEST_F(RtcpTransceiverImplTest, SetRembUpdatesValuesToSend) {
    496  const uint32_t kSenderSsrc = 12345;
    497  RtcpTransceiverConfig config = DefaultTestConfig();
    498  config.feedback_ssrc = kSenderSsrc;
    499  RtcpPacketParser rtcp_parser;
    500  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    501  config.schedule_periodic_compound_packets = false;
    502  RtcpTransceiverImpl rtcp_transceiver(config);
    503 
    504  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{54321, 64321});
    505  rtcp_transceiver.SendCompoundPacket();
    506 
    507  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    508  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 10000);
    509  EXPECT_THAT(rtcp_parser.remb()->ssrcs(), ElementsAre(54321, 64321));
    510 
    511  rtcp_transceiver.SetRemb(/*bitrate_bps=*/70000, /*ssrcs=*/{67321});
    512  rtcp_transceiver.SendCompoundPacket();
    513 
    514  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 2);
    515  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 70000);
    516  EXPECT_THAT(rtcp_parser.remb()->ssrcs(), ElementsAre(67321));
    517 }
    518 
    519 TEST_F(RtcpTransceiverImplTest, SetRembSendsImmediatelyIfSendRembOnChange) {
    520  const uint32_t kSenderSsrc = 12345;
    521  RtcpTransceiverConfig config = DefaultTestConfig();
    522  config.send_remb_on_change = true;
    523  config.feedback_ssrc = kSenderSsrc;
    524  RtcpPacketParser rtcp_parser;
    525  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    526  config.schedule_periodic_compound_packets = false;
    527  RtcpTransceiverImpl rtcp_transceiver(config);
    528 
    529  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{});
    530  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    531  EXPECT_EQ(rtcp_parser.remb()->sender_ssrc(), kSenderSsrc);
    532  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 10000);
    533 
    534  // If there is no change, the packet is not sent immediately.
    535  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{});
    536  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    537 
    538  rtcp_transceiver.SetRemb(/*bitrate_bps=*/20000, /*ssrcs=*/{});
    539  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 2);
    540  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 20000);
    541 }
    542 
    543 TEST_F(RtcpTransceiverImplTest,
    544       SetRembSendsImmediatelyIfSendRembOnChangeReducedSize) {
    545  const uint32_t kSenderSsrc = 12345;
    546  RtcpTransceiverConfig config = DefaultTestConfig();
    547  config.send_remb_on_change = true;
    548  config.rtcp_mode = RtcpMode::kReducedSize;
    549  config.feedback_ssrc = kSenderSsrc;
    550  RtcpPacketParser rtcp_parser;
    551  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    552  config.schedule_periodic_compound_packets = false;
    553  RtcpTransceiverImpl rtcp_transceiver(config);
    554 
    555  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{});
    556  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    557  EXPECT_EQ(rtcp_parser.remb()->sender_ssrc(), kSenderSsrc);
    558  EXPECT_EQ(rtcp_parser.remb()->bitrate_bps(), 10000);
    559 }
    560 
    561 TEST_F(RtcpTransceiverImplTest, SetRembIncludesRembInAllCompoundPackets) {
    562  const uint32_t kSenderSsrc = 12345;
    563  RtcpTransceiverConfig config = DefaultTestConfig();
    564  config.feedback_ssrc = kSenderSsrc;
    565  RtcpPacketParser rtcp_parser;
    566  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    567  config.schedule_periodic_compound_packets = false;
    568  RtcpTransceiverImpl rtcp_transceiver(config);
    569 
    570  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{54321, 64321});
    571  rtcp_transceiver.SendCompoundPacket();
    572  rtcp_transceiver.SendCompoundPacket();
    573 
    574  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{2});
    575  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 2);
    576 }
    577 
    578 TEST_F(RtcpTransceiverImplTest, SendsNoRembAfterUnset) {
    579  const uint32_t kSenderSsrc = 12345;
    580  RtcpTransceiverConfig config = DefaultTestConfig();
    581  config.feedback_ssrc = kSenderSsrc;
    582  RtcpPacketParser rtcp_parser;
    583  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    584  config.schedule_periodic_compound_packets = false;
    585  RtcpTransceiverImpl rtcp_transceiver(config);
    586 
    587  rtcp_transceiver.SetRemb(/*bitrate_bps=*/10000, /*ssrcs=*/{54321, 64321});
    588  rtcp_transceiver.SendCompoundPacket();
    589  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
    590  ASSERT_EQ(rtcp_parser.remb()->num_packets(), 1);
    591 
    592  rtcp_transceiver.UnsetRemb();
    593  rtcp_transceiver.SendCompoundPacket();
    594 
    595  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{2});
    596  EXPECT_EQ(rtcp_parser.remb()->num_packets(), 1);
    597 }
    598 
    599 TEST_F(RtcpTransceiverImplTest, ReceiverReportUsesReceiveStatistics) {
    600  const uint32_t kSenderSsrc = 12345;
    601  const uint32_t kMediaSsrc = 54321;
    602  MockReceiveStatisticsProvider receive_statistics;
    603  std::vector<ReportBlock> report_blocks(1);
    604  report_blocks[0].SetMediaSsrc(kMediaSsrc);
    605  EXPECT_CALL(receive_statistics, RtcpReportBlocks(_))
    606      .WillRepeatedly(Return(report_blocks));
    607 
    608  RtcpTransceiverConfig config = DefaultTestConfig();
    609  config.feedback_ssrc = kSenderSsrc;
    610  RtcpPacketParser rtcp_parser;
    611  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    612  config.receive_statistics = &receive_statistics;
    613  config.schedule_periodic_compound_packets = false;
    614  RtcpTransceiverImpl rtcp_transceiver(config);
    615 
    616  rtcp_transceiver.SendCompoundPacket();
    617 
    618  ASSERT_GT(rtcp_parser.receiver_report()->num_packets(), 0);
    619  EXPECT_EQ(rtcp_parser.receiver_report()->sender_ssrc(), kSenderSsrc);
    620  ASSERT_THAT(rtcp_parser.receiver_report()->report_blocks(),
    621              SizeIs(report_blocks.size()));
    622  EXPECT_EQ(rtcp_parser.receiver_report()->report_blocks()[0].source_ssrc(),
    623            kMediaSsrc);
    624 }
    625 
    626 TEST_F(RtcpTransceiverImplTest, MultipleObserversOnSameSsrc) {
    627  const uint32_t kRemoteSsrc = 12345;
    628  StrictMock<MockMediaReceiverRtcpObserver> observer1;
    629  StrictMock<MockMediaReceiverRtcpObserver> observer2;
    630  RtcpTransceiverConfig config = DefaultTestConfig();
    631  RtcpTransceiverImpl rtcp_transceiver(config);
    632  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer1);
    633  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer2);
    634 
    635  const NtpTime kRemoteNtp(0x9876543211);
    636  const uint32_t kRemoteRtp = 0x444555;
    637  SenderReport sr;
    638  sr.SetSenderSsrc(kRemoteSsrc);
    639  sr.SetNtp(kRemoteNtp);
    640  sr.SetRtpTimestamp(kRemoteRtp);
    641  auto raw_packet = sr.Build();
    642 
    643  EXPECT_CALL(observer1, OnSenderReport(kRemoteSsrc, kRemoteNtp, kRemoteRtp));
    644  EXPECT_CALL(observer2, OnSenderReport(kRemoteSsrc, kRemoteNtp, kRemoteRtp));
    645  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    646 }
    647 
    648 TEST_F(RtcpTransceiverImplTest, DoesntCallsObserverAfterRemoved) {
    649  const uint32_t kRemoteSsrc = 12345;
    650  StrictMock<MockMediaReceiverRtcpObserver> observer1;
    651  StrictMock<MockMediaReceiverRtcpObserver> observer2;
    652  RtcpTransceiverConfig config = DefaultTestConfig();
    653  RtcpTransceiverImpl rtcp_transceiver(config);
    654  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer1);
    655  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer2);
    656 
    657  SenderReport sr;
    658  sr.SetSenderSsrc(kRemoteSsrc);
    659  auto raw_packet = sr.Build();
    660 
    661  rtcp_transceiver.RemoveMediaReceiverRtcpObserver(kRemoteSsrc, &observer1);
    662 
    663  EXPECT_CALL(observer1, OnSenderReport(_, _, _)).Times(0);
    664  EXPECT_CALL(observer2, OnSenderReport(_, _, _));
    665  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    666 }
    667 
    668 TEST_F(RtcpTransceiverImplTest, CallsObserverOnSenderReportBySenderSsrc) {
    669  const uint32_t kRemoteSsrc1 = 12345;
    670  const uint32_t kRemoteSsrc2 = 22345;
    671  StrictMock<MockMediaReceiverRtcpObserver> observer1;
    672  StrictMock<MockMediaReceiverRtcpObserver> observer2;
    673  RtcpTransceiverConfig config = DefaultTestConfig();
    674  RtcpTransceiverImpl rtcp_transceiver(config);
    675  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc1, &observer1);
    676  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc2, &observer2);
    677 
    678  const NtpTime kRemoteNtp(0x9876543211);
    679  const uint32_t kRemoteRtp = 0x444555;
    680  SenderReport sr;
    681  sr.SetSenderSsrc(kRemoteSsrc1);
    682  sr.SetNtp(kRemoteNtp);
    683  sr.SetRtpTimestamp(kRemoteRtp);
    684  auto raw_packet = sr.Build();
    685 
    686  EXPECT_CALL(observer1, OnSenderReport(kRemoteSsrc1, kRemoteNtp, kRemoteRtp));
    687  EXPECT_CALL(observer2, OnSenderReport).Times(0);
    688  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    689 }
    690 
    691 TEST_F(RtcpTransceiverImplTest, CallsObserverOnByeBySenderSsrc) {
    692  const uint32_t kRemoteSsrc1 = 12345;
    693  const uint32_t kRemoteSsrc2 = 22345;
    694  StrictMock<MockMediaReceiverRtcpObserver> observer1;
    695  StrictMock<MockMediaReceiverRtcpObserver> observer2;
    696  RtcpTransceiverConfig config = DefaultTestConfig();
    697  RtcpTransceiverImpl rtcp_transceiver(config);
    698  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc1, &observer1);
    699  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc2, &observer2);
    700 
    701  Bye bye;
    702  bye.SetSenderSsrc(kRemoteSsrc1);
    703  auto raw_packet = bye.Build();
    704 
    705  EXPECT_CALL(observer1, OnBye(kRemoteSsrc1));
    706  EXPECT_CALL(observer2, OnBye(_)).Times(0);
    707  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    708 }
    709 
    710 TEST_F(RtcpTransceiverImplTest, CallsObserverOnTargetBitrateBySenderSsrc) {
    711  const uint32_t kRemoteSsrc1 = 12345;
    712  const uint32_t kRemoteSsrc2 = 22345;
    713  StrictMock<MockMediaReceiverRtcpObserver> observer1;
    714  StrictMock<MockMediaReceiverRtcpObserver> observer2;
    715  RtcpTransceiverConfig config = DefaultTestConfig();
    716  RtcpTransceiverImpl rtcp_transceiver(config);
    717  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc1, &observer1);
    718  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc2, &observer2);
    719 
    720  rtcp::TargetBitrate target_bitrate;
    721  target_bitrate.AddTargetBitrate(0, 0, /*target_bitrate_kbps=*/10);
    722  target_bitrate.AddTargetBitrate(0, 1, /*target_bitrate_kbps=*/20);
    723  target_bitrate.AddTargetBitrate(1, 0, /*target_bitrate_kbps=*/40);
    724  target_bitrate.AddTargetBitrate(1, 1, /*target_bitrate_kbps=*/80);
    725  rtcp::ExtendedReports xr;
    726  xr.SetSenderSsrc(kRemoteSsrc1);
    727  xr.SetTargetBitrate(target_bitrate);
    728  auto raw_packet = xr.Build();
    729 
    730  VideoBitrateAllocation bitrate_allocation;
    731  bitrate_allocation.SetBitrate(0, 0, /*bitrate_bps=*/10000);
    732  bitrate_allocation.SetBitrate(0, 1, /*bitrate_bps=*/20000);
    733  bitrate_allocation.SetBitrate(1, 0, /*bitrate_bps=*/40000);
    734  bitrate_allocation.SetBitrate(1, 1, /*bitrate_bps=*/80000);
    735  EXPECT_CALL(observer1, OnBitrateAllocation(kRemoteSsrc1, bitrate_allocation));
    736  EXPECT_CALL(observer2, OnBitrateAllocation(_, _)).Times(0);
    737  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    738 }
    739 
    740 TEST_F(RtcpTransceiverImplTest, SkipsIncorrectTargetBitrateEntries) {
    741  const uint32_t kRemoteSsrc = 12345;
    742  MockMediaReceiverRtcpObserver observer;
    743  RtcpTransceiverConfig config = DefaultTestConfig();
    744  RtcpTransceiverImpl rtcp_transceiver(config);
    745  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer);
    746 
    747  rtcp::TargetBitrate target_bitrate;
    748  target_bitrate.AddTargetBitrate(0, 0, /*target_bitrate_kbps=*/10);
    749  target_bitrate.AddTargetBitrate(0, kMaxTemporalStreams, 20);
    750  target_bitrate.AddTargetBitrate(kMaxSpatialLayers, 0, 40);
    751 
    752  rtcp::ExtendedReports xr;
    753  xr.SetTargetBitrate(target_bitrate);
    754  xr.SetSenderSsrc(kRemoteSsrc);
    755  auto raw_packet = xr.Build();
    756 
    757  VideoBitrateAllocation expected_allocation;
    758  expected_allocation.SetBitrate(0, 0, /*bitrate_bps=*/10000);
    759  EXPECT_CALL(observer, OnBitrateAllocation(kRemoteSsrc, expected_allocation));
    760  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    761 }
    762 
    763 TEST_F(RtcpTransceiverImplTest, CallsObserverOnByeBehindSenderReport) {
    764  const uint32_t kRemoteSsrc = 12345;
    765  MockMediaReceiverRtcpObserver observer;
    766  RtcpTransceiverConfig config = DefaultTestConfig();
    767  RtcpTransceiverImpl rtcp_transceiver(config);
    768  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer);
    769 
    770  CompoundPacket compound;
    771  auto sr = std::make_unique<SenderReport>();
    772  sr->SetSenderSsrc(kRemoteSsrc);
    773  compound.Append(std::move(sr));
    774  auto bye = std::make_unique<Bye>();
    775  bye->SetSenderSsrc(kRemoteSsrc);
    776  compound.Append(std::move(bye));
    777  auto raw_packet = compound.Build();
    778 
    779  EXPECT_CALL(observer, OnBye(kRemoteSsrc));
    780  EXPECT_CALL(observer, OnSenderReport(kRemoteSsrc, _, _));
    781  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    782 }
    783 
    784 TEST_F(RtcpTransceiverImplTest, CallsObserverOnByeBehindUnknownRtcpPacket) {
    785  const uint32_t kRemoteSsrc = 12345;
    786  MockMediaReceiverRtcpObserver observer;
    787  RtcpTransceiverConfig config = DefaultTestConfig();
    788  RtcpTransceiverImpl rtcp_transceiver(config);
    789  rtcp_transceiver.AddMediaReceiverRtcpObserver(kRemoteSsrc, &observer);
    790 
    791  CompoundPacket compound;
    792  // Use Application-Defined rtcp packet as unknown.
    793  auto app = std::make_unique<rtcp::App>();
    794  compound.Append(std::move(app));
    795  auto bye = std::make_unique<Bye>();
    796  bye->SetSenderSsrc(kRemoteSsrc);
    797  compound.Append(std::move(bye));
    798  auto raw_packet = compound.Build();
    799 
    800  EXPECT_CALL(observer, OnBye(kRemoteSsrc));
    801  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    802 }
    803 
    804 TEST_F(RtcpTransceiverImplTest,
    805       WhenSendsReceiverReportSetsLastSenderReportTimestampPerRemoteSsrc) {
    806  const uint32_t kRemoteSsrc1 = 4321;
    807  const uint32_t kRemoteSsrc2 = 5321;
    808  std::vector<ReportBlock> statistics_report_blocks(2);
    809  statistics_report_blocks[0].SetMediaSsrc(kRemoteSsrc1);
    810  statistics_report_blocks[1].SetMediaSsrc(kRemoteSsrc2);
    811  MockReceiveStatisticsProvider receive_statistics;
    812  EXPECT_CALL(receive_statistics, RtcpReportBlocks(_))
    813      .WillOnce(Return(statistics_report_blocks));
    814 
    815  RtcpTransceiverConfig config = DefaultTestConfig();
    816  config.schedule_periodic_compound_packets = false;
    817  RtcpPacketParser rtcp_parser;
    818  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    819  config.receive_statistics = &receive_statistics;
    820  RtcpTransceiverImpl rtcp_transceiver(config);
    821 
    822  const NtpTime kRemoteNtp(0x9876543211);
    823  // Receive SenderReport for RemoteSsrc1, but no report for RemoteSsrc2.
    824  SenderReport sr;
    825  sr.SetSenderSsrc(kRemoteSsrc1);
    826  sr.SetNtp(kRemoteNtp);
    827  auto raw_packet = sr.Build();
    828  rtcp_transceiver.ReceivePacket(raw_packet, Timestamp::Micros(0));
    829 
    830  // Trigger sending ReceiverReport.
    831  rtcp_transceiver.SendCompoundPacket();
    832 
    833  EXPECT_GT(rtcp_parser.receiver_report()->num_packets(), 0);
    834  const auto& report_blocks = rtcp_parser.receiver_report()->report_blocks();
    835  ASSERT_EQ(report_blocks.size(), 2u);
    836  // RtcpTransceiverImpl doesn't guarantee order of the report blocks
    837  // match result of ReceiveStatisticsProvider::RtcpReportBlocks callback,
    838  // but for simplicity of the test asume it is the same.
    839  ASSERT_EQ(report_blocks[0].source_ssrc(), kRemoteSsrc1);
    840  EXPECT_EQ(report_blocks[0].last_sr(), CompactNtp(kRemoteNtp));
    841 
    842  ASSERT_EQ(report_blocks[1].source_ssrc(), kRemoteSsrc2);
    843  // No matching Sender Report for kRemoteSsrc2, LastSR fields has to be 0.
    844  EXPECT_EQ(report_blocks[1].last_sr(), 0u);
    845 }
    846 
    847 TEST_F(RtcpTransceiverImplTest,
    848       WhenSendsReceiverReportCalculatesDelaySinceLastSenderReport) {
    849  const uint32_t kRemoteSsrc1 = 4321;
    850  const uint32_t kRemoteSsrc2 = 5321;
    851 
    852  std::vector<ReportBlock> statistics_report_blocks(2);
    853  statistics_report_blocks[0].SetMediaSsrc(kRemoteSsrc1);
    854  statistics_report_blocks[1].SetMediaSsrc(kRemoteSsrc2);
    855  MockReceiveStatisticsProvider receive_statistics;
    856  EXPECT_CALL(receive_statistics, RtcpReportBlocks(_))
    857      .WillOnce(Return(statistics_report_blocks));
    858 
    859  RtcpTransceiverConfig config = DefaultTestConfig();
    860  config.schedule_periodic_compound_packets = false;
    861  RtcpPacketParser rtcp_parser;
    862  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    863  config.receive_statistics = &receive_statistics;
    864  RtcpTransceiverImpl rtcp_transceiver(config);
    865 
    866  auto receive_sender_report = [&](uint32_t remote_ssrc) {
    867    SenderReport sr;
    868    sr.SetSenderSsrc(remote_ssrc);
    869    rtcp_transceiver.ReceivePacket(sr.Build(), CurrentTime());
    870  };
    871 
    872  receive_sender_report(kRemoteSsrc1);
    873  time_controller().AdvanceTime(TimeDelta::Millis(100));
    874 
    875  receive_sender_report(kRemoteSsrc2);
    876  time_controller().AdvanceTime(TimeDelta::Millis(100));
    877 
    878  // Trigger ReceiverReport back.
    879  rtcp_transceiver.SendCompoundPacket();
    880 
    881  EXPECT_GT(rtcp_parser.receiver_report()->num_packets(), 0);
    882  const auto& report_blocks = rtcp_parser.receiver_report()->report_blocks();
    883  ASSERT_EQ(report_blocks.size(), 2u);
    884  // RtcpTransceiverImpl doesn't guarantee order of the report blocks
    885  // match result of ReceiveStatisticsProvider::RtcpReportBlocks callback,
    886  // but for simplicity of the test asume it is the same.
    887  ASSERT_EQ(report_blocks[0].source_ssrc(), kRemoteSsrc1);
    888  EXPECT_THAT(CompactNtpRttToTimeDelta(report_blocks[0].delay_since_last_sr()),
    889              Near(TimeDelta::Millis(200)));
    890 
    891  ASSERT_EQ(report_blocks[1].source_ssrc(), kRemoteSsrc2);
    892  EXPECT_THAT(CompactNtpRttToTimeDelta(report_blocks[1].delay_since_last_sr()),
    893              Near(TimeDelta::Millis(100)));
    894 }
    895 
    896 TEST_F(RtcpTransceiverImplTest, MaySendMultipleReceiverReportInSinglePacket) {
    897  std::vector<ReportBlock> statistics_report_blocks(40);
    898  MockReceiveStatisticsProvider receive_statistics;
    899  EXPECT_CALL(receive_statistics, RtcpReportBlocks(/*max_blocks=*/Ge(40u)))
    900      .WillOnce(Return(statistics_report_blocks));
    901 
    902  RtcpTransceiverConfig config = DefaultTestConfig();
    903  RtcpPacketParser rtcp_parser;
    904  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    905  config.receive_statistics = &receive_statistics;
    906  RtcpTransceiverImpl rtcp_transceiver(config);
    907 
    908  // Trigger ReceiverReports.
    909  rtcp_transceiver.SendCompoundPacket();
    910 
    911  // Expect a single RTCP packet with multiple receiver reports in it.
    912  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
    913  // Receiver report may contain up to 31 report blocks, thus 2 reports are
    914  // needed to carry 40 blocks: 31 in the first, 9 in the last.
    915  EXPECT_EQ(rtcp_parser.receiver_report()->num_packets(), 2);
    916  // RtcpParser remembers just the last receiver report, thus can't check number
    917  // of blocks in the first receiver report.
    918  EXPECT_THAT(rtcp_parser.receiver_report()->report_blocks(), SizeIs(9));
    919 }
    920 
    921 TEST_F(RtcpTransceiverImplTest, AttachMaxNumberOfReportBlocksToCompoundPacket) {
    922  MockReceiveStatisticsProvider receive_statistics;
    923  EXPECT_CALL(receive_statistics, RtcpReportBlocks)
    924      .WillOnce([](size_t max_blocks) {
    925        return std::vector<ReportBlock>(max_blocks);
    926      });
    927  RtcpTransceiverConfig config = DefaultTestConfig();
    928  config.rtcp_mode = RtcpMode::kCompound;
    929  RtcpPacketParser rtcp_parser;
    930  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    931  config.receive_statistics = &receive_statistics;
    932  RtcpTransceiverImpl rtcp_transceiver(config);
    933 
    934  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{0});
    935  // Send some fast feedback message. Because of compound mode, report blocks
    936  // should be attached.
    937  rtcp_transceiver.SendPictureLossIndication(/*ssrc=*/123);
    938 
    939  // Expect single RTCP packet with multiple receiver reports and a PLI.
    940  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
    941  EXPECT_GT(rtcp_parser.receiver_report()->num_packets(), 1);
    942  EXPECT_EQ(rtcp_parser.pli()->num_packets(), 1);
    943 }
    944 
    945 TEST_F(RtcpTransceiverImplTest, SendsNack) {
    946  const uint32_t kSenderSsrc = 1234;
    947  const uint32_t kRemoteSsrc = 4321;
    948  std::vector<uint16_t> kMissingSequenceNumbers = {34, 37, 38};
    949  RtcpTransceiverConfig config = DefaultTestConfig();
    950  config.feedback_ssrc = kSenderSsrc;
    951  config.schedule_periodic_compound_packets = false;
    952  RtcpPacketParser rtcp_parser;
    953  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    954  RtcpTransceiverImpl rtcp_transceiver(config);
    955 
    956  rtcp_transceiver.SendNack(kRemoteSsrc, kMissingSequenceNumbers);
    957 
    958  EXPECT_EQ(rtcp_parser.nack()->num_packets(), 1);
    959  EXPECT_EQ(rtcp_parser.nack()->sender_ssrc(), kSenderSsrc);
    960  EXPECT_EQ(rtcp_parser.nack()->media_ssrc(), kRemoteSsrc);
    961  EXPECT_EQ(rtcp_parser.nack()->packet_ids(), kMissingSequenceNumbers);
    962 }
    963 
    964 TEST_F(RtcpTransceiverImplTest, ReceivesNack) {
    965  static constexpr uint32_t kRemoteSsrc = 4321;
    966  static constexpr uint32_t kMediaSsrc1 = 1234;
    967  static constexpr uint32_t kMediaSsrc2 = 1235;
    968  std::vector<uint16_t> kMissingSequenceNumbers = {34, 37, 38};
    969  RtcpTransceiverConfig config = DefaultTestConfig();
    970  RtcpTransceiverImpl rtcp_transceiver(config);
    971 
    972  MockRtpStreamRtcpHandler local_stream1;
    973  MockRtpStreamRtcpHandler local_stream2;
    974  EXPECT_CALL(local_stream1,
    975              OnNack(kRemoteSsrc, ElementsAreArray(kMissingSequenceNumbers)));
    976  EXPECT_CALL(local_stream2, OnNack).Times(0);
    977 
    978  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
    979  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc2, &local_stream2));
    980 
    981  rtcp::Nack nack;
    982  nack.SetSenderSsrc(kRemoteSsrc);
    983  nack.SetMediaSsrc(kMediaSsrc1);
    984  nack.SetPacketIds(kMissingSequenceNumbers);
    985  rtcp_transceiver.ReceivePacket(nack.Build(), config.clock->CurrentTime());
    986 }
    987 
    988 TEST_F(RtcpTransceiverImplTest, RequestKeyFrameWithPictureLossIndication) {
    989  const uint32_t kSenderSsrc = 1234;
    990  const uint32_t kRemoteSsrc = 4321;
    991  RtcpTransceiverConfig config = DefaultTestConfig();
    992  config.feedback_ssrc = kSenderSsrc;
    993  config.schedule_periodic_compound_packets = false;
    994  RtcpPacketParser rtcp_parser;
    995  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
    996  RtcpTransceiverImpl rtcp_transceiver(config);
    997 
    998  rtcp_transceiver.SendPictureLossIndication(kRemoteSsrc);
    999 
   1000  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1001  EXPECT_EQ(rtcp_parser.pli()->num_packets(), 1);
   1002  EXPECT_EQ(rtcp_parser.pli()->sender_ssrc(), kSenderSsrc);
   1003  EXPECT_EQ(rtcp_parser.pli()->media_ssrc(), kRemoteSsrc);
   1004 }
   1005 
   1006 TEST_F(RtcpTransceiverImplTest, ReceivesPictureLossIndication) {
   1007  static constexpr uint32_t kRemoteSsrc = 4321;
   1008  static constexpr uint32_t kMediaSsrc1 = 1234;
   1009  static constexpr uint32_t kMediaSsrc2 = 1235;
   1010  RtcpTransceiverConfig config = DefaultTestConfig();
   1011  RtcpTransceiverImpl rtcp_transceiver(config);
   1012 
   1013  MockRtpStreamRtcpHandler local_stream1;
   1014  MockRtpStreamRtcpHandler local_stream2;
   1015  EXPECT_CALL(local_stream1, OnPli(kRemoteSsrc));
   1016  EXPECT_CALL(local_stream2, OnPli).Times(0);
   1017 
   1018  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
   1019  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc2, &local_stream2));
   1020 
   1021  rtcp::Pli pli;
   1022  pli.SetSenderSsrc(kRemoteSsrc);
   1023  pli.SetMediaSsrc(kMediaSsrc1);
   1024  rtcp_transceiver.ReceivePacket(pli.Build(), config.clock->CurrentTime());
   1025 }
   1026 
   1027 TEST_F(RtcpTransceiverImplTest, RequestKeyFrameWithFullIntraRequest) {
   1028  const uint32_t kSenderSsrc = 1234;
   1029  const uint32_t kRemoteSsrcs[] = {4321, 5321};
   1030  RtcpTransceiverConfig config = DefaultTestConfig();
   1031  config.feedback_ssrc = kSenderSsrc;
   1032  config.schedule_periodic_compound_packets = false;
   1033  RtcpPacketParser rtcp_parser;
   1034  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1035  RtcpTransceiverImpl rtcp_transceiver(config);
   1036 
   1037  rtcp_transceiver.SendFullIntraRequest(kRemoteSsrcs, true);
   1038 
   1039  EXPECT_EQ(rtcp_parser.fir()->num_packets(), 1);
   1040  EXPECT_EQ(rtcp_parser.fir()->sender_ssrc(), kSenderSsrc);
   1041  EXPECT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kRemoteSsrcs[0]);
   1042  EXPECT_EQ(rtcp_parser.fir()->requests()[1].ssrc, kRemoteSsrcs[1]);
   1043 }
   1044 
   1045 TEST_F(RtcpTransceiverImplTest, RequestKeyFrameWithFirIncreaseSeqNoPerSsrc) {
   1046  RtcpTransceiverConfig config = DefaultTestConfig();
   1047  config.schedule_periodic_compound_packets = false;
   1048  RtcpPacketParser rtcp_parser;
   1049  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1050  RtcpTransceiverImpl rtcp_transceiver(config);
   1051 
   1052  const uint32_t kBothRemoteSsrcs[] = {4321, 5321};
   1053  const uint32_t kOneRemoteSsrc[] = {4321};
   1054 
   1055  rtcp_transceiver.SendFullIntraRequest(kBothRemoteSsrcs, true);
   1056  ASSERT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kBothRemoteSsrcs[0]);
   1057  uint8_t fir_sequence_number0 = rtcp_parser.fir()->requests()[0].seq_nr;
   1058  ASSERT_EQ(rtcp_parser.fir()->requests()[1].ssrc, kBothRemoteSsrcs[1]);
   1059  uint8_t fir_sequence_number1 = rtcp_parser.fir()->requests()[1].seq_nr;
   1060 
   1061  rtcp_transceiver.SendFullIntraRequest(kOneRemoteSsrc, true);
   1062  ASSERT_EQ(rtcp_parser.fir()->requests().size(), 1u);
   1063  ASSERT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kBothRemoteSsrcs[0]);
   1064  EXPECT_EQ(rtcp_parser.fir()->requests()[0].seq_nr, fir_sequence_number0 + 1);
   1065 
   1066  rtcp_transceiver.SendFullIntraRequest(kBothRemoteSsrcs, true);
   1067  ASSERT_EQ(rtcp_parser.fir()->requests().size(), 2u);
   1068  ASSERT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kBothRemoteSsrcs[0]);
   1069  EXPECT_EQ(rtcp_parser.fir()->requests()[0].seq_nr, fir_sequence_number0 + 2);
   1070  ASSERT_EQ(rtcp_parser.fir()->requests()[1].ssrc, kBothRemoteSsrcs[1]);
   1071  EXPECT_EQ(rtcp_parser.fir()->requests()[1].seq_nr, fir_sequence_number1 + 1);
   1072 }
   1073 
   1074 TEST_F(RtcpTransceiverImplTest, SendFirDoesNotIncreaseSeqNoIfOldRequest) {
   1075  RtcpTransceiverConfig config = DefaultTestConfig();
   1076  config.schedule_periodic_compound_packets = false;
   1077  RtcpPacketParser rtcp_parser;
   1078  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1079  RtcpTransceiverImpl rtcp_transceiver(config);
   1080 
   1081  const uint32_t kBothRemoteSsrcs[] = {4321, 5321};
   1082 
   1083  rtcp_transceiver.SendFullIntraRequest(kBothRemoteSsrcs, true);
   1084  ASSERT_EQ(rtcp_parser.fir()->requests().size(), 2u);
   1085  ASSERT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kBothRemoteSsrcs[0]);
   1086  uint8_t fir_sequence_number0 = rtcp_parser.fir()->requests()[0].seq_nr;
   1087  ASSERT_EQ(rtcp_parser.fir()->requests()[1].ssrc, kBothRemoteSsrcs[1]);
   1088  uint8_t fir_sequence_number1 = rtcp_parser.fir()->requests()[1].seq_nr;
   1089 
   1090  rtcp_transceiver.SendFullIntraRequest(kBothRemoteSsrcs, false);
   1091  ASSERT_EQ(rtcp_parser.fir()->requests().size(), 2u);
   1092  ASSERT_EQ(rtcp_parser.fir()->requests()[0].ssrc, kBothRemoteSsrcs[0]);
   1093  EXPECT_EQ(rtcp_parser.fir()->requests()[0].seq_nr, fir_sequence_number0);
   1094  ASSERT_EQ(rtcp_parser.fir()->requests()[1].ssrc, kBothRemoteSsrcs[1]);
   1095  EXPECT_EQ(rtcp_parser.fir()->requests()[1].seq_nr, fir_sequence_number1);
   1096 }
   1097 
   1098 TEST_F(RtcpTransceiverImplTest, ReceivesFir) {
   1099  static constexpr uint32_t kRemoteSsrc = 4321;
   1100  static constexpr uint32_t kMediaSsrc1 = 1234;
   1101  static constexpr uint32_t kMediaSsrc2 = 1235;
   1102  RtcpTransceiverConfig config = DefaultTestConfig();
   1103  RtcpTransceiverImpl rtcp_transceiver(config);
   1104 
   1105  MockRtpStreamRtcpHandler local_stream1;
   1106  MockRtpStreamRtcpHandler local_stream2;
   1107  EXPECT_CALL(local_stream1, OnFir(kRemoteSsrc));
   1108  EXPECT_CALL(local_stream2, OnFir).Times(0);
   1109 
   1110  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
   1111  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc2, &local_stream2));
   1112 
   1113  rtcp::Fir fir;
   1114  fir.SetSenderSsrc(kRemoteSsrc);
   1115  fir.AddRequestTo(kMediaSsrc1, /*seq_num=*/13);
   1116 
   1117  rtcp_transceiver.ReceivePacket(fir.Build(), config.clock->CurrentTime());
   1118 }
   1119 
   1120 TEST_F(RtcpTransceiverImplTest, IgnoresReceivedFirWithRepeatedSequenceNumber) {
   1121  static constexpr uint32_t kRemoteSsrc = 4321;
   1122  static constexpr uint32_t kMediaSsrc1 = 1234;
   1123  static constexpr uint32_t kMediaSsrc2 = 1235;
   1124  RtcpTransceiverConfig config = DefaultTestConfig();
   1125  RtcpTransceiverImpl rtcp_transceiver(config);
   1126 
   1127  MockRtpStreamRtcpHandler local_stream1;
   1128  MockRtpStreamRtcpHandler local_stream2;
   1129  EXPECT_CALL(local_stream1, OnFir(kRemoteSsrc)).Times(1);
   1130  EXPECT_CALL(local_stream2, OnFir(kRemoteSsrc)).Times(2);
   1131 
   1132  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
   1133  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc2, &local_stream2));
   1134 
   1135  rtcp::Fir fir1;
   1136  fir1.SetSenderSsrc(kRemoteSsrc);
   1137  fir1.AddRequestTo(kMediaSsrc1, /*seq_num=*/132);
   1138  fir1.AddRequestTo(kMediaSsrc2, /*seq_num=*/10);
   1139  rtcp_transceiver.ReceivePacket(fir1.Build(), config.clock->CurrentTime());
   1140 
   1141  // Repeat request for MediaSsrc1 - expect it to be ignored,
   1142  // Change FIR sequence number for MediaSsrc2 - expect a 2nd callback.
   1143  rtcp::Fir fir2;
   1144  fir2.SetSenderSsrc(kRemoteSsrc);
   1145  fir2.AddRequestTo(kMediaSsrc1, /*seq_num=*/132);
   1146  fir2.AddRequestTo(kMediaSsrc2, /*seq_num=*/13);
   1147  rtcp_transceiver.ReceivePacket(fir2.Build(), config.clock->CurrentTime());
   1148 }
   1149 
   1150 TEST_F(RtcpTransceiverImplTest, ReceivedFirTracksSequenceNumberPerRemoteSsrc) {
   1151  static constexpr uint32_t kRemoteSsrc1 = 4321;
   1152  static constexpr uint32_t kRemoteSsrc2 = 4323;
   1153  static constexpr uint32_t kMediaSsrc = 1234;
   1154  RtcpTransceiverConfig config = DefaultTestConfig();
   1155  RtcpTransceiverImpl rtcp_transceiver(config);
   1156 
   1157  MockRtpStreamRtcpHandler local_stream;
   1158  EXPECT_CALL(local_stream, OnFir(kRemoteSsrc1));
   1159  EXPECT_CALL(local_stream, OnFir(kRemoteSsrc2));
   1160 
   1161  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc, &local_stream));
   1162 
   1163  rtcp::Fir fir1;
   1164  fir1.SetSenderSsrc(kRemoteSsrc1);
   1165  fir1.AddRequestTo(kMediaSsrc, /*seq_num=*/13);
   1166  rtcp_transceiver.ReceivePacket(fir1.Build(), config.clock->CurrentTime());
   1167 
   1168  // Use the same FIR sequence number, but different sender SSRC.
   1169  rtcp::Fir fir2;
   1170  fir2.SetSenderSsrc(kRemoteSsrc2);
   1171  fir2.AddRequestTo(kMediaSsrc, /*seq_num=*/13);
   1172  rtcp_transceiver.ReceivePacket(fir2.Build(), config.clock->CurrentTime());
   1173 }
   1174 
   1175 TEST_F(RtcpTransceiverImplTest, KeyFrameRequestCreatesCompoundPacket) {
   1176  const uint32_t kRemoteSsrcs[] = {4321};
   1177  RtcpTransceiverConfig config = DefaultTestConfig();
   1178  // Turn periodic off to ensure sent rtcp packet is explicitly requested.
   1179  config.schedule_periodic_compound_packets = false;
   1180  RtcpPacketParser rtcp_parser;
   1181  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1182 
   1183  config.rtcp_mode = RtcpMode::kCompound;
   1184 
   1185  RtcpTransceiverImpl rtcp_transceiver(config);
   1186  rtcp_transceiver.SendFullIntraRequest(kRemoteSsrcs, true);
   1187 
   1188  // Test sent packet is compound by expecting presense of receiver report.
   1189  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1190  EXPECT_EQ(rtcp_parser.receiver_report()->num_packets(), 1);
   1191 }
   1192 
   1193 TEST_F(RtcpTransceiverImplTest, KeyFrameRequestCreatesReducedSizePacket) {
   1194  const uint32_t kRemoteSsrcs[] = {4321};
   1195  RtcpTransceiverConfig config = DefaultTestConfig();
   1196  // Turn periodic off to ensure sent rtcp packet is explicitly requested.
   1197  config.schedule_periodic_compound_packets = false;
   1198  RtcpPacketParser rtcp_parser;
   1199  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1200 
   1201  config.rtcp_mode = RtcpMode::kReducedSize;
   1202 
   1203  RtcpTransceiverImpl rtcp_transceiver(config);
   1204  rtcp_transceiver.SendFullIntraRequest(kRemoteSsrcs, true);
   1205 
   1206  // Test sent packet is reduced size by expecting absense of receiver report.
   1207  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1208  EXPECT_EQ(rtcp_parser.receiver_report()->num_packets(), 0);
   1209 }
   1210 
   1211 TEST_F(RtcpTransceiverImplTest, SendsXrRrtrWhenEnabled) {
   1212  const uint32_t kSenderSsrc = 4321;
   1213  RtcpTransceiverConfig config = DefaultTestConfig();
   1214  config.feedback_ssrc = kSenderSsrc;
   1215  config.schedule_periodic_compound_packets = false;
   1216  RtcpPacketParser rtcp_parser;
   1217  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1218  config.non_sender_rtt_measurement = true;
   1219  RtcpTransceiverImpl rtcp_transceiver(config);
   1220 
   1221  rtcp_transceiver.SendCompoundPacket();
   1222  NtpTime ntp_time_now = config.clock->CurrentNtpTime();
   1223 
   1224  EXPECT_EQ(rtcp_parser.xr()->num_packets(), 1);
   1225  EXPECT_EQ(rtcp_parser.xr()->sender_ssrc(), kSenderSsrc);
   1226  ASSERT_TRUE(rtcp_parser.xr()->rrtr());
   1227  EXPECT_EQ(rtcp_parser.xr()->rrtr()->ntp(), ntp_time_now);
   1228 }
   1229 
   1230 TEST_F(RtcpTransceiverImplTest, RepliesToRrtrWhenEnabled) {
   1231  static constexpr uint32_t kSenderSsrc[] = {4321, 9876};
   1232  RtcpTransceiverConfig config = DefaultTestConfig();
   1233  config.reply_to_non_sender_rtt_measurement = true;
   1234  RtcpPacketParser rtcp_parser;
   1235  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1236  RtcpTransceiverImpl rtcp_transceiver(config);
   1237 
   1238  rtcp::ExtendedReports xr;
   1239  rtcp::Rrtr rrtr;
   1240  rrtr.SetNtp(NtpTime(uint64_t{0x1111'2222'3333'4444}));
   1241  xr.SetRrtr(rrtr);
   1242  xr.SetSenderSsrc(kSenderSsrc[0]);
   1243  rtcp_transceiver.ReceivePacket(xr.Build(), CurrentTime());
   1244  AdvanceTime(TimeDelta::Millis(1'500));
   1245 
   1246  rrtr.SetNtp(NtpTime(uint64_t{0x4444'5555'6666'7777}));
   1247  xr.SetRrtr(rrtr);
   1248  xr.SetSenderSsrc(kSenderSsrc[1]);
   1249  rtcp_transceiver.ReceivePacket(xr.Build(), CurrentTime());
   1250  AdvanceTime(TimeDelta::Millis(500));
   1251 
   1252  rtcp_transceiver.SendCompoundPacket();
   1253 
   1254  EXPECT_EQ(rtcp_parser.xr()->num_packets(), 1);
   1255  static constexpr uint32_t kComactNtpOneSecond = 0x0001'0000;
   1256  EXPECT_THAT(rtcp_parser.xr()->dlrr().sub_blocks(),
   1257              UnorderedElementsAre(
   1258                  rtcp::ReceiveTimeInfo(kSenderSsrc[0], 0x2222'3333,
   1259                                        /*delay=*/2 * kComactNtpOneSecond),
   1260                  rtcp::ReceiveTimeInfo(kSenderSsrc[1], 0x5555'6666,
   1261                                        /*delay=*/kComactNtpOneSecond / 2)));
   1262 }
   1263 
   1264 TEST_F(RtcpTransceiverImplTest, CanReplyToRrtrOnceForAllLocalSsrcs) {
   1265  static constexpr uint32_t kRemoteSsrc = 4321;
   1266  static constexpr uint32_t kLocalSsrcs[] = {1234, 5678};
   1267  RtcpTransceiverConfig config = DefaultTestConfig();
   1268  config.reply_to_non_sender_rtt_measurement = true;
   1269  config.reply_to_non_sender_rtt_mesaurments_on_all_ssrcs = false;
   1270  RtcpPacketParser rtcp_parser;
   1271  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1272  RtcpTransceiverImpl rtcp_transceiver(config);
   1273 
   1274  MockRtpStreamRtcpHandler local_sender0;
   1275  MockRtpStreamRtcpHandler local_sender1;
   1276  rtcp_transceiver.AddMediaSender(kLocalSsrcs[0], &local_sender0);
   1277  rtcp_transceiver.AddMediaSender(kLocalSsrcs[1], &local_sender1);
   1278 
   1279  rtcp::ExtendedReports xr;
   1280  rtcp::Rrtr rrtr;
   1281  rrtr.SetNtp(NtpTime(uint64_t{0x1111'2222'3333'4444}));
   1282  xr.SetRrtr(rrtr);
   1283  xr.SetSenderSsrc(kRemoteSsrc);
   1284  rtcp_transceiver.ReceivePacket(xr.Build(), CurrentTime());
   1285  AdvanceTime(TimeDelta::Millis(1'500));
   1286 
   1287  rtcp_transceiver.SendCompoundPacket();
   1288 
   1289  EXPECT_EQ(rtcp_parser.xr()->num_packets(), 1);
   1290 }
   1291 
   1292 TEST_F(RtcpTransceiverImplTest, CanReplyToRrtrForEachLocalSsrc) {
   1293  static constexpr uint32_t kRemoteSsrc = 4321;
   1294  static constexpr uint32_t kLocalSsrc[] = {1234, 5678};
   1295  RtcpTransceiverConfig config = DefaultTestConfig();
   1296  config.reply_to_non_sender_rtt_measurement = true;
   1297  config.reply_to_non_sender_rtt_mesaurments_on_all_ssrcs = true;
   1298  RtcpPacketParser rtcp_parser;
   1299  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1300  RtcpTransceiverImpl rtcp_transceiver(config);
   1301 
   1302  MockRtpStreamRtcpHandler local_sender0;
   1303  MockRtpStreamRtcpHandler local_sender1;
   1304  rtcp_transceiver.AddMediaSender(kLocalSsrc[0], &local_sender0);
   1305  rtcp_transceiver.AddMediaSender(kLocalSsrc[1], &local_sender1);
   1306 
   1307  rtcp::ExtendedReports xr;
   1308  rtcp::Rrtr rrtr;
   1309  rrtr.SetNtp(NtpTime(uint64_t{0x1111'2222'3333'4444}));
   1310  xr.SetRrtr(rrtr);
   1311  xr.SetSenderSsrc(kRemoteSsrc);
   1312  rtcp_transceiver.ReceivePacket(xr.Build(), CurrentTime());
   1313  AdvanceTime(TimeDelta::Millis(1'500));
   1314 
   1315  rtcp_transceiver.SendCompoundPacket();
   1316 
   1317  EXPECT_EQ(rtcp_parser.xr()->num_packets(), 2);
   1318 }
   1319 
   1320 TEST_F(RtcpTransceiverImplTest, SendsNoXrRrtrWhenDisabled) {
   1321  RtcpTransceiverConfig config = DefaultTestConfig();
   1322  config.schedule_periodic_compound_packets = false;
   1323  RtcpPacketParser rtcp_parser;
   1324  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1325  config.non_sender_rtt_measurement = false;
   1326  RtcpTransceiverImpl rtcp_transceiver(config);
   1327 
   1328  rtcp_transceiver.SendCompoundPacket();
   1329 
   1330  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1331  // Extended reports rtcp packet might be included for another reason,
   1332  // but it shouldn't contain rrtr block.
   1333  EXPECT_FALSE(rtcp_parser.xr()->rrtr());
   1334 }
   1335 
   1336 TEST_F(RtcpTransceiverImplTest, PassRttFromDlrrToLinkObserver) {
   1337  const uint32_t kSenderSsrc = 4321;
   1338  MockNetworkLinkRtcpObserver link_observer;
   1339  RtcpTransceiverConfig config = DefaultTestConfig();
   1340  config.feedback_ssrc = kSenderSsrc;
   1341  config.network_link_observer = &link_observer;
   1342  config.non_sender_rtt_measurement = true;
   1343  RtcpTransceiverImpl rtcp_transceiver(config);
   1344 
   1345  Timestamp send_time = Timestamp::Seconds(5678);
   1346  Timestamp receive_time = send_time + TimeDelta::Millis(110);
   1347  rtcp::ReceiveTimeInfo rti;
   1348  rti.ssrc = kSenderSsrc;
   1349  rti.last_rr = CompactNtp(config.clock->ConvertTimestampToNtpTime(send_time));
   1350  rti.delay_since_last_rr = SaturatedToCompactNtp(TimeDelta::Millis(10));
   1351  rtcp::ExtendedReports xr;
   1352  xr.AddDlrrItem(rti);
   1353 
   1354  EXPECT_CALL(link_observer,
   1355              OnRttUpdate(receive_time, Near(TimeDelta::Millis(100))));
   1356  rtcp_transceiver.ReceivePacket(xr.Build(), receive_time);
   1357 }
   1358 
   1359 TEST_F(RtcpTransceiverImplTest, CalculatesRoundTripTimeFromReportBlocks) {
   1360  MockNetworkLinkRtcpObserver link_observer;
   1361  RtcpTransceiverConfig config = DefaultTestConfig();
   1362  config.network_link_observer = &link_observer;
   1363  RtcpTransceiverImpl rtcp_transceiver(config);
   1364 
   1365  TimeDelta rtt = TimeDelta::Millis(100);
   1366  Timestamp send_time = Timestamp::Seconds(5678);
   1367  Timestamp receive_time = send_time + TimeDelta::Millis(110);
   1368  rtcp::ReceiverReport rr;
   1369  rtcp::ReportBlock rb1;
   1370  rb1.SetLastSr(CompactNtp(config.clock->ConvertTimestampToNtpTime(
   1371      receive_time - rtt - TimeDelta::Millis(10))));
   1372  rb1.SetDelayLastSr(SaturatedToCompactNtp(TimeDelta::Millis(10)));
   1373  rr.AddReportBlock(rb1);
   1374  rtcp::ReportBlock rb2;
   1375  rb2.SetLastSr(CompactNtp(config.clock->ConvertTimestampToNtpTime(
   1376      receive_time - rtt - TimeDelta::Millis(20))));
   1377  rb2.SetDelayLastSr(SaturatedToCompactNtp(TimeDelta::Millis(20)));
   1378  rr.AddReportBlock(rb2);
   1379 
   1380  EXPECT_CALL(link_observer, OnRttUpdate(receive_time, Near(rtt)));
   1381  rtcp_transceiver.ReceivePacket(rr.Build(), receive_time);
   1382 }
   1383 
   1384 TEST_F(RtcpTransceiverImplTest, IgnoresUnknownSsrcInDlrr) {
   1385  const uint32_t kSenderSsrc = 4321;
   1386  const uint32_t kUnknownSsrc = 4322;
   1387  MockNetworkLinkRtcpObserver link_observer;
   1388  RtcpTransceiverConfig config = DefaultTestConfig();
   1389  config.feedback_ssrc = kSenderSsrc;
   1390  config.schedule_periodic_compound_packets = false;
   1391  config.non_sender_rtt_measurement = true;
   1392  config.network_link_observer = &link_observer;
   1393  RtcpTransceiverImpl rtcp_transceiver(config);
   1394 
   1395  Timestamp time = Timestamp::Micros(12345678);
   1396  rtcp::ReceiveTimeInfo rti;
   1397  rti.ssrc = kUnknownSsrc;
   1398  rti.last_rr = CompactNtp(config.clock->ConvertTimestampToNtpTime(time));
   1399  rtcp::ExtendedReports xr;
   1400  xr.AddDlrrItem(rti);
   1401  auto raw_packet = xr.Build();
   1402 
   1403  EXPECT_CALL(link_observer, OnRttUpdate).Times(0);
   1404  rtcp_transceiver.ReceivePacket(raw_packet, time + TimeDelta::Millis(100));
   1405 }
   1406 
   1407 TEST_F(RtcpTransceiverImplTest, ParsesTransportFeedback) {
   1408  MockNetworkLinkRtcpObserver link_observer;
   1409  RtcpTransceiverConfig config = DefaultTestConfig();
   1410  config.network_link_observer = &link_observer;
   1411  Timestamp receive_time = Timestamp::Seconds(5678);
   1412  RtcpTransceiverImpl rtcp_transceiver(config);
   1413 
   1414  EXPECT_CALL(link_observer, OnTransportFeedback(receive_time, _))
   1415      .WillOnce(WithArg<1>([](const rtcp::TransportFeedback& message) {
   1416        EXPECT_EQ(message.GetBaseSequence(), 321);
   1417        EXPECT_THAT(message.GetReceivedPackets(), SizeIs(2));
   1418      }));
   1419 
   1420  rtcp::TransportFeedback tb;
   1421  tb.SetBase(/*base_sequence=*/321, Timestamp::Micros(15));
   1422  tb.AddReceivedPacket(/*base_sequence=*/321, Timestamp::Micros(15));
   1423  tb.AddReceivedPacket(/*base_sequence=*/322, Timestamp::Micros(17));
   1424  rtcp_transceiver.ReceivePacket(tb.Build(), receive_time);
   1425 }
   1426 
   1427 TEST_F(RtcpTransceiverImplTest, ParsesCongestionControlFeedback) {
   1428  MockNetworkLinkRtcpObserver link_observer;
   1429  RtcpTransceiverConfig config = DefaultTestConfig();
   1430  config.network_link_observer = &link_observer;
   1431  const uint32_t receive_time_ntp = 5678;
   1432  Timestamp receive_time = Timestamp::Seconds(9843);
   1433  RtcpTransceiverImpl rtcp_transceiver(config);
   1434 
   1435  EXPECT_CALL(link_observer, OnCongestionControlFeedback(receive_time, _))
   1436      .WillOnce(WithArg<1>([](const rtcp::CongestionControlFeedback& message) {
   1437        EXPECT_EQ(message.report_timestamp_compact_ntp(), 5678u);
   1438        EXPECT_THAT(message.packets(), SizeIs(2));
   1439      }));
   1440 
   1441  std::vector<rtcp::CongestionControlFeedback::PacketInfo> packets = {
   1442      {.ssrc = 1,
   1443       .sequence_number = 321,
   1444       .arrival_time_offset = TimeDelta::Millis(15)},
   1445      {.ssrc = 1,
   1446       .sequence_number = 322,
   1447       .arrival_time_offset = TimeDelta::Millis(17)}};
   1448  rtcp::CongestionControlFeedback ccfb(std::move(packets), receive_time_ntp);
   1449  rtcp_transceiver.ReceivePacket(ccfb.Build(), receive_time);
   1450 }
   1451 
   1452 TEST_F(RtcpTransceiverImplTest, ParsesRemb) {
   1453  MockNetworkLinkRtcpObserver link_observer;
   1454  RtcpTransceiverConfig config = DefaultTestConfig();
   1455  config.network_link_observer = &link_observer;
   1456  Timestamp receive_time = Timestamp::Seconds(5678);
   1457  RtcpTransceiverImpl rtcp_transceiver(config);
   1458 
   1459  EXPECT_CALL(link_observer,
   1460              OnReceiverEstimatedMaxBitrate(receive_time,
   1461                                            DataRate::BitsPerSec(1'234'000)));
   1462 
   1463  rtcp::Remb remb;
   1464  remb.SetBitrateBps(1'234'000);
   1465  rtcp_transceiver.ReceivePacket(remb.Build(), receive_time);
   1466 }
   1467 
   1468 TEST_F(RtcpTransceiverImplTest,
   1469       CombinesReportBlocksFromSenderAndRecieverReports) {
   1470  MockNetworkLinkRtcpObserver link_observer;
   1471  RtcpTransceiverConfig config = DefaultTestConfig();
   1472  config.network_link_observer = &link_observer;
   1473  Timestamp receive_time = Timestamp::Seconds(5678);
   1474  RtcpTransceiverImpl rtcp_transceiver(config);
   1475 
   1476  // Assemble compound packet with multiple rtcp packets in it.
   1477  rtcp::CompoundPacket packet;
   1478  auto sr = std::make_unique<rtcp::SenderReport>();
   1479  sr->SetSenderSsrc(1234);
   1480  sr->SetReportBlocks(std::vector<ReportBlock>(31));
   1481  packet.Append(std::move(sr));
   1482  auto rr1 = std::make_unique<rtcp::ReceiverReport>();
   1483  rr1->SetReportBlocks(std::vector<ReportBlock>(31));
   1484  packet.Append(std::move(rr1));
   1485  auto rr2 = std::make_unique<rtcp::ReceiverReport>();
   1486  rr2->SetReportBlocks(std::vector<ReportBlock>(2));
   1487  packet.Append(std::move(rr2));
   1488 
   1489  EXPECT_CALL(link_observer, OnReport(receive_time, SizeIs(64)));
   1490 
   1491  rtcp_transceiver.ReceivePacket(packet.Build(), receive_time);
   1492 }
   1493 
   1494 TEST_F(RtcpTransceiverImplTest,
   1495       CallbackOnReportBlocksFromSenderAndReceiverReports) {
   1496  static constexpr uint32_t kRemoteSsrc = 5678;
   1497  // Has registered sender, report block attached to sender report.
   1498  static constexpr uint32_t kMediaSsrc1 = 1234;
   1499  // No registered sender, report block attached to receiver report.
   1500  // Such report block shouldn't prevent handling following report block.
   1501  static constexpr uint32_t kMediaSsrc2 = 1235;
   1502  // Has registered sender, no report block attached.
   1503  static constexpr uint32_t kMediaSsrc3 = 1236;
   1504  // Has registered sender, report block attached to receiver report.
   1505  static constexpr uint32_t kMediaSsrc4 = 1237;
   1506 
   1507  MockNetworkLinkRtcpObserver link_observer;
   1508  RtcpTransceiverConfig config = DefaultTestConfig();
   1509  Timestamp receive_time = Timestamp::Seconds(5678);
   1510  RtcpTransceiverImpl rtcp_transceiver(config);
   1511 
   1512  MockRtpStreamRtcpHandler local_stream1;
   1513  MockRtpStreamRtcpHandler local_stream3;
   1514  MockRtpStreamRtcpHandler local_stream4;
   1515  EXPECT_CALL(local_stream1,
   1516              OnReport(Property(&ReportBlockData::sender_ssrc, kRemoteSsrc)));
   1517  EXPECT_CALL(local_stream3, OnReport).Times(0);
   1518  EXPECT_CALL(local_stream4,
   1519              OnReport(Property(&ReportBlockData::sender_ssrc, kRemoteSsrc)));
   1520 
   1521  ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
   1522  ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc3, &local_stream3));
   1523  ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc4, &local_stream4));
   1524 
   1525  // Assemble compound packet with multiple RTCP packets in it.
   1526  rtcp::CompoundPacket packet;
   1527  auto sr = std::make_unique<rtcp::SenderReport>();
   1528  sr->SetSenderSsrc(kRemoteSsrc);
   1529  std::vector<ReportBlock> rb(1);
   1530  rb[0].SetMediaSsrc(kMediaSsrc1);
   1531  sr->SetReportBlocks(std::move(rb));
   1532  packet.Append(std::move(sr));
   1533  auto rr = std::make_unique<rtcp::ReceiverReport>();
   1534  rr->SetSenderSsrc(kRemoteSsrc);
   1535  rb = std::vector<ReportBlock>(2);
   1536  rb[0].SetMediaSsrc(kMediaSsrc2);
   1537  rb[1].SetMediaSsrc(kMediaSsrc4);
   1538  rr->SetReportBlocks(std::move(rb));
   1539  packet.Append(std::move(rr));
   1540 
   1541  rtcp_transceiver.ReceivePacket(packet.Build(), receive_time);
   1542 }
   1543 
   1544 TEST_F(RtcpTransceiverImplTest, FailsToRegisterTwoSendersWithTheSameSsrc) {
   1545  RtcpTransceiverImpl rtcp_transceiver(DefaultTestConfig());
   1546  MockRtpStreamRtcpHandler sender1;
   1547  MockRtpStreamRtcpHandler sender2;
   1548 
   1549  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(/*local_ssrc=*/10001, &sender1));
   1550  EXPECT_FALSE(rtcp_transceiver.AddMediaSender(/*local_ssrc=*/10001, &sender2));
   1551  EXPECT_TRUE(rtcp_transceiver.AddMediaSender(/*local_ssrc=*/10002, &sender2));
   1552 
   1553  EXPECT_TRUE(rtcp_transceiver.RemoveMediaSender(/*local_ssrc=*/10001));
   1554  EXPECT_FALSE(rtcp_transceiver.RemoveMediaSender(/*local_ssrc=*/10001));
   1555 }
   1556 
   1557 TEST_F(RtcpTransceiverImplTest, SendsSenderReport) {
   1558  static constexpr uint32_t kFeedbackSsrc = 123;
   1559  static constexpr uint32_t kSenderSsrc = 12345;
   1560  RtcpTransceiverConfig config = DefaultTestConfig();
   1561  config.feedback_ssrc = kFeedbackSsrc;
   1562  RtcpPacketParser rtcp_parser;
   1563  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1564  config.schedule_periodic_compound_packets = false;
   1565  RtcpTransceiverImpl rtcp_transceiver(config);
   1566 
   1567  RtpStreamRtcpHandler::RtpStats sender_stats;
   1568  sender_stats.set_num_sent_packets(10);
   1569  sender_stats.set_num_sent_bytes(1000);
   1570  sender_stats.set_last_rtp_timestamp(0x3333);
   1571  sender_stats.set_last_capture_time(CurrentTime() - TimeDelta::Seconds(2));
   1572  sender_stats.set_last_clock_rate(0x1000);
   1573  MockRtpStreamRtcpHandler sender;
   1574  ON_CALL(sender, SentStats).WillByDefault(Return(sender_stats));
   1575  rtcp_transceiver.AddMediaSender(kSenderSsrc, &sender);
   1576 
   1577  rtcp_transceiver.SendCompoundPacket();
   1578 
   1579  ASSERT_GT(rtcp_parser.sender_report()->num_packets(), 0);
   1580  EXPECT_EQ(rtcp_parser.sender_report()->sender_ssrc(), kSenderSsrc);
   1581  EXPECT_EQ(rtcp_parser.sender_report()->ntp(),
   1582            time_controller().GetClock()->CurrentNtpTime());
   1583  EXPECT_EQ(rtcp_parser.sender_report()->rtp_timestamp(), 0x3333u + 0x2000u);
   1584  EXPECT_EQ(rtcp_parser.sender_report()->sender_packet_count(), 10u);
   1585  EXPECT_EQ(rtcp_parser.sender_report()->sender_octet_count(), 1000u);
   1586 }
   1587 
   1588 TEST_F(RtcpTransceiverImplTest,
   1589       MaySendBothSenderReportAndReceiverReportInTheSamePacket) {
   1590  RtcpPacketParser rtcp_parser;
   1591  std::vector<ReportBlock> statistics_report_blocks(40);
   1592  MockReceiveStatisticsProvider receive_statistics;
   1593  EXPECT_CALL(receive_statistics, RtcpReportBlocks(/*max_blocks=*/Ge(40u)))
   1594      .WillOnce(Return(statistics_report_blocks));
   1595  RtcpTransceiverConfig config = DefaultTestConfig();
   1596  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1597  config.receive_statistics = &receive_statistics;
   1598  RtcpTransceiverImpl rtcp_transceiver(config);
   1599 
   1600  MockRtpStreamRtcpHandler sender;
   1601  rtcp_transceiver.AddMediaSender(/*ssrc=*/12345, &sender);
   1602 
   1603  rtcp_transceiver.SendCompoundPacket();
   1604 
   1605  // Expect a single RTCP packet with a sender and a receiver reports in it.
   1606  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1607  ASSERT_EQ(rtcp_parser.sender_report()->num_packets(), 1);
   1608  ASSERT_EQ(rtcp_parser.receiver_report()->num_packets(), 1);
   1609  // Sender report may contain up to 31 report blocks, thus remaining 9 report
   1610  // block should be attached to the receiver report.
   1611  EXPECT_THAT(rtcp_parser.sender_report()->report_blocks(), SizeIs(31));
   1612  EXPECT_THAT(rtcp_parser.receiver_report()->report_blocks(), SizeIs(9));
   1613 }
   1614 
   1615 TEST_F(RtcpTransceiverImplTest, RotatesSendersWhenAllSenderReportDoNotFit) {
   1616  // Send 6 compound packet, each should contain 5 sender reports,
   1617  // each of 6 senders should be mentioned 5 times.
   1618  static constexpr int kNumSenders = 6;
   1619  static constexpr uint32_t kSenderSsrc[kNumSenders] = {10, 20, 30, 40, 50, 60};
   1620  static constexpr int kSendersPerPacket = 5;
   1621  // RtcpPacketParser remembers only latest block for each type, but this test
   1622  // is about sending multiple sender reports in the same packet, thus need
   1623  // a more advance parser: RtcpTranceiver
   1624  RtcpTransceiverConfig receiver_config = DefaultTestConfig();
   1625  RtcpTransceiverImpl rtcp_receiver(receiver_config);
   1626  // Main expectatation: all senders are spread equally across multiple packets.
   1627  NiceMock<MockMediaReceiverRtcpObserver> receiver[kNumSenders];
   1628  for (int i = 0; i < kNumSenders; ++i) {
   1629    SCOPED_TRACE(i);
   1630    EXPECT_CALL(receiver[i], OnSenderReport(kSenderSsrc[i], _, _))
   1631        .Times(kSendersPerPacket);
   1632    rtcp_receiver.AddMediaReceiverRtcpObserver(kSenderSsrc[i], &receiver[i]);
   1633  }
   1634 
   1635  MockFunction<void(ArrayView<const uint8_t>)> transport;
   1636  EXPECT_CALL(transport, Call)
   1637      .Times(kNumSenders)
   1638      .WillRepeatedly([&](ArrayView<const uint8_t> packet) {
   1639        rtcp_receiver.ReceivePacket(packet, CurrentTime());
   1640        return true;
   1641      });
   1642  RtcpTransceiverConfig config = DefaultTestConfig();
   1643  config.rtcp_transport = transport.AsStdFunction();
   1644  // Limit packet to have space just for kSendersPerPacket sender reports.
   1645  // Sender report without report blocks require 28 bytes.
   1646  config.max_packet_size = kSendersPerPacket * 28;
   1647  RtcpTransceiverImpl rtcp_transceiver(config);
   1648  NiceMock<MockRtpStreamRtcpHandler> sender[kNumSenders];
   1649  for (int i = 0; i < kNumSenders; ++i) {
   1650    rtcp_transceiver.AddMediaSender(kSenderSsrc[i], &sender[i]);
   1651  }
   1652 
   1653  for (int i = 1; i <= kNumSenders; ++i) {
   1654    SCOPED_TRACE(i);
   1655    rtcp_transceiver.SendCompoundPacket();
   1656  }
   1657 }
   1658 
   1659 TEST_F(RtcpTransceiverImplTest, SkipsSenderReportForInactiveSender) {
   1660  static constexpr uint32_t kSenderSsrc[] = {12345, 23456};
   1661  RtcpTransceiverConfig config = DefaultTestConfig();
   1662  RtcpPacketParser rtcp_parser;
   1663  config.rtcp_transport = RtcpParserTransport(rtcp_parser);
   1664  RtcpTransceiverImpl rtcp_transceiver(config);
   1665 
   1666  RtpStreamRtcpHandler::RtpStats sender_stats[2];
   1667  NiceMock<MockRtpStreamRtcpHandler> sender[2];
   1668  ON_CALL(sender[0], SentStats).WillByDefault([&] { return sender_stats[0]; });
   1669  ON_CALL(sender[1], SentStats).WillByDefault([&] { return sender_stats[1]; });
   1670  rtcp_transceiver.AddMediaSender(kSenderSsrc[0], &sender[0]);
   1671  rtcp_transceiver.AddMediaSender(kSenderSsrc[1], &sender[1]);
   1672 
   1673  // Start with both senders beeing active.
   1674  sender_stats[0].set_num_sent_packets(10);
   1675  sender_stats[0].set_num_sent_bytes(1'000);
   1676  sender_stats[1].set_num_sent_packets(5);
   1677  sender_stats[1].set_num_sent_bytes(2'000);
   1678  rtcp_transceiver.SendCompoundPacket();
   1679  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{1});
   1680  EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 2);
   1681 
   1682  // Keep 1st sender active, but make 2nd second look inactive by returning the
   1683  // same RtpStats.
   1684  sender_stats[0].set_num_sent_packets(15);
   1685  sender_stats[0].set_num_sent_bytes(2'000);
   1686  rtcp_transceiver.SendCompoundPacket();
   1687  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{2});
   1688  EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 3);
   1689  EXPECT_EQ(rtcp_parser.sender_report()->sender_ssrc(), kSenderSsrc[0]);
   1690 
   1691  // Swap active sender.
   1692  sender_stats[1].set_num_sent_packets(20);
   1693  sender_stats[1].set_num_sent_bytes(3'000);
   1694  rtcp_transceiver.SendCompoundPacket();
   1695  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{3});
   1696  EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 4);
   1697  EXPECT_EQ(rtcp_parser.sender_report()->sender_ssrc(), kSenderSsrc[1]);
   1698 
   1699  // Activate both senders again.
   1700  sender_stats[0].set_num_sent_packets(20);
   1701  sender_stats[0].set_num_sent_bytes(3'000);
   1702  sender_stats[1].set_num_sent_packets(25);
   1703  sender_stats[1].set_num_sent_bytes(3'500);
   1704  rtcp_transceiver.SendCompoundPacket();
   1705  EXPECT_EQ(rtcp_parser.processed_rtcp_packets(), size_t{4});
   1706  EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 6);
   1707 }
   1708 
   1709 }  // namespace
   1710 }  // namespace webrtc