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_sender.h"
12
13 #include <memory>
14 #include <utility>
15
16 #include "absl/base/macros.h"
17 #include "api/units/time_delta.h"
18 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
20 #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
21 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
22 #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
23 #include "rtc_base/rate_limiter.h"
24 #include "rtc_base/thread.h"
25 #include "test/gmock.h"
26 #include "test/gtest.h"
27 #include "test/mock_transport.h"
28 #include "test/rtcp_packet_parser.h"
29
30 using ::testing::_;
31 using ::testing::ElementsAre;
32 using ::testing::Eq;
33 using ::testing::Invoke;
34 using ::testing::Property;
35 using ::testing::SizeIs;
36
37 namespace webrtc {
38
39 class RtcpPacketTypeCounterObserverImpl : public RtcpPacketTypeCounterObserver {
40 public:
RtcpPacketTypeCounterObserverImpl()41 RtcpPacketTypeCounterObserverImpl() : ssrc_(0) {}
42 ~RtcpPacketTypeCounterObserverImpl() override = default;
RtcpPacketTypesCounterUpdated(uint32_t ssrc,const RtcpPacketTypeCounter & packet_counter)43 void RtcpPacketTypesCounterUpdated(
44 uint32_t ssrc,
45 const RtcpPacketTypeCounter& packet_counter) override {
46 ssrc_ = ssrc;
47 counter_ = packet_counter;
48 }
49 uint32_t ssrc_;
50 RtcpPacketTypeCounter counter_;
51 };
52
53 class TestTransport : public Transport {
54 public:
TestTransport()55 TestTransport() {}
56
SendRtp(const uint8_t *,size_t,const PacketOptions & options)57 bool SendRtp(const uint8_t* /*data*/,
58 size_t /*len*/,
59 const PacketOptions& options) override {
60 return false;
61 }
SendRtcp(const uint8_t * data,size_t len)62 bool SendRtcp(const uint8_t* data, size_t len) override {
63 parser_.Parse(data, len);
64 return true;
65 }
66 test::RtcpPacketParser parser_;
67 };
68
69 namespace {
70 static const uint32_t kSenderSsrc = 0x11111111;
71 static const uint32_t kRemoteSsrc = 0x22222222;
72 static const uint32_t kStartRtpTimestamp = 0x34567;
73 static const uint32_t kRtpTimestamp = 0x45678;
74
CreateRtcpSender(const RTCPSender::Configuration & config,bool init_timestamps=true)75 std::unique_ptr<RTCPSender> CreateRtcpSender(
76 const RTCPSender::Configuration& config,
77 bool init_timestamps = true) {
78 auto rtcp_sender = std::make_unique<RTCPSender>(config);
79 rtcp_sender->SetRemoteSSRC(kRemoteSsrc);
80 if (init_timestamps) {
81 rtcp_sender->SetTimestampOffset(kStartRtpTimestamp);
82 rtcp_sender->SetLastRtpTime(kRtpTimestamp, config.clock->CurrentTime(),
83 /*payload_type=*/0);
84 }
85 return rtcp_sender;
86 }
87 } // namespace
88
89 class RtcpSenderTest : public ::testing::Test {
90 protected:
RtcpSenderTest()91 RtcpSenderTest()
92 : clock_(1335900000),
93 receive_statistics_(ReceiveStatistics::Create(&clock_)) {
94 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl2(GetDefaultRtpRtcpConfig()));
95 }
96
GetDefaultConfig()97 RTCPSender::Configuration GetDefaultConfig() {
98 RTCPSender::Configuration configuration;
99 configuration.audio = false;
100 configuration.clock = &clock_;
101 configuration.outgoing_transport = &test_transport_;
102 configuration.rtcp_report_interval = TimeDelta::Millis(1000);
103 configuration.receive_statistics = receive_statistics_.get();
104 configuration.local_media_ssrc = kSenderSsrc;
105 return configuration;
106 }
107
GetDefaultRtpRtcpConfig()108 RtpRtcpInterface::Configuration GetDefaultRtpRtcpConfig() {
109 RTCPSender::Configuration config = GetDefaultConfig();
110 RtpRtcpInterface::Configuration result;
111 result.audio = config.audio;
112 result.clock = config.clock;
113 result.outgoing_transport = config.outgoing_transport;
114 result.rtcp_report_interval_ms = config.rtcp_report_interval->ms();
115 result.receive_statistics = config.receive_statistics;
116 result.local_media_ssrc = config.local_media_ssrc;
117 return result;
118 }
119
InsertIncomingPacket(uint32_t remote_ssrc,uint16_t seq_num)120 void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) {
121 RtpPacketReceived packet;
122 packet.SetSsrc(remote_ssrc);
123 packet.SetSequenceNumber(seq_num);
124 packet.SetTimestamp(12345);
125 packet.SetPayloadSize(100 - 12);
126 receive_statistics_->OnRtpPacket(packet);
127 }
128
parser()129 test::RtcpPacketParser* parser() { return &test_transport_.parser_; }
130
feedback_state()131 RTCPSender::FeedbackState feedback_state() {
132 return rtp_rtcp_impl_->GetFeedbackState();
133 }
134
135 rtc::AutoThread main_thread_;
136 SimulatedClock clock_;
137 TestTransport test_transport_;
138 std::unique_ptr<ReceiveStatistics> receive_statistics_;
139 std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_impl_;
140 };
141
TEST_F(RtcpSenderTest,SetRtcpStatus)142 TEST_F(RtcpSenderTest, SetRtcpStatus) {
143 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
144 EXPECT_EQ(RtcpMode::kOff, rtcp_sender->Status());
145 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
146 EXPECT_EQ(RtcpMode::kReducedSize, rtcp_sender->Status());
147 }
148
TEST_F(RtcpSenderTest,SetSendingStatus)149 TEST_F(RtcpSenderTest, SetSendingStatus) {
150 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
151 EXPECT_FALSE(rtcp_sender->Sending());
152 rtcp_sender->SetSendingStatus(feedback_state(), true);
153 EXPECT_TRUE(rtcp_sender->Sending());
154 }
155
TEST_F(RtcpSenderTest,NoPacketSentIfOff)156 TEST_F(RtcpSenderTest, NoPacketSentIfOff) {
157 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
158 rtcp_sender->SetRTCPStatus(RtcpMode::kOff);
159 EXPECT_EQ(-1, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
160 }
161
TEST_F(RtcpSenderTest,SendSr)162 TEST_F(RtcpSenderTest, SendSr) {
163 const uint32_t kPacketCount = 0x12345;
164 const uint32_t kOctetCount = 0x23456;
165 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
166 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
167 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
168 rtcp_sender->SetSendingStatus(feedback_state, true);
169 feedback_state.packets_sent = kPacketCount;
170 feedback_state.media_bytes_sent = kOctetCount;
171 NtpTime ntp = clock_.CurrentNtpTime();
172 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
173 EXPECT_EQ(1, parser()->sender_report()->num_packets());
174 EXPECT_EQ(kSenderSsrc, parser()->sender_report()->sender_ssrc());
175 EXPECT_EQ(ntp, parser()->sender_report()->ntp());
176 EXPECT_EQ(kPacketCount, parser()->sender_report()->sender_packet_count());
177 EXPECT_EQ(kOctetCount, parser()->sender_report()->sender_octet_count());
178 EXPECT_EQ(kStartRtpTimestamp + kRtpTimestamp,
179 parser()->sender_report()->rtp_timestamp());
180 EXPECT_EQ(0U, parser()->sender_report()->report_blocks().size());
181 }
182
TEST_F(RtcpSenderTest,SendConsecutiveSrWithExactSlope)183 TEST_F(RtcpSenderTest, SendConsecutiveSrWithExactSlope) {
184 const uint32_t kPacketCount = 0x12345;
185 const uint32_t kOctetCount = 0x23456;
186 const int kTimeBetweenSRsUs = 10043; // Not exact value in milliseconds.
187 const int kExtraPackets = 30;
188 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
189 // Make sure clock is not exactly at some milliseconds point.
190 clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
191 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
192 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
193 rtcp_sender->SetSendingStatus(feedback_state, true);
194 feedback_state.packets_sent = kPacketCount;
195 feedback_state.media_bytes_sent = kOctetCount;
196
197 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
198 EXPECT_EQ(1, parser()->sender_report()->num_packets());
199 NtpTime ntp1 = parser()->sender_report()->ntp();
200 uint32_t rtp1 = parser()->sender_report()->rtp_timestamp();
201
202 // Send more SRs to ensure slope is always exact for different offsets
203 for (int packets = 1; packets <= kExtraPackets; ++packets) {
204 clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
205 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
206 EXPECT_EQ(packets + 1, parser()->sender_report()->num_packets());
207
208 NtpTime ntp2 = parser()->sender_report()->ntp();
209 uint32_t rtp2 = parser()->sender_report()->rtp_timestamp();
210
211 uint32_t ntp_diff_in_rtp_units =
212 (ntp2.ToMs() - ntp1.ToMs()) * (kVideoPayloadTypeFrequency / 1000);
213 EXPECT_EQ(rtp2 - rtp1, ntp_diff_in_rtp_units);
214 }
215 }
216
TEST_F(RtcpSenderTest,DoNotSendSrBeforeRtp)217 TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) {
218 RTCPSender::Configuration config;
219 config.clock = &clock_;
220 config.receive_statistics = receive_statistics_.get();
221 config.outgoing_transport = &test_transport_;
222 config.rtcp_report_interval = TimeDelta::Millis(1000);
223 config.local_media_ssrc = kSenderSsrc;
224 auto rtcp_sender = CreateRtcpSender(config, /*init_timestamps=*/false);
225 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
226 rtcp_sender->SetSendingStatus(feedback_state(), true);
227
228 // Sender Report shouldn't be send as an SR nor as a Report.
229 rtcp_sender->SendRTCP(feedback_state(), kRtcpSr);
230 EXPECT_EQ(0, parser()->sender_report()->num_packets());
231 rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
232 EXPECT_EQ(0, parser()->sender_report()->num_packets());
233 // Other packets (e.g. Pli) are allowed, even if useless.
234 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
235 EXPECT_EQ(1, parser()->pli()->num_packets());
236 }
237
TEST_F(RtcpSenderTest,DoNotSendCompundBeforeRtp)238 TEST_F(RtcpSenderTest, DoNotSendCompundBeforeRtp) {
239 RTCPSender::Configuration config;
240 config.clock = &clock_;
241 config.receive_statistics = receive_statistics_.get();
242 config.outgoing_transport = &test_transport_;
243 config.rtcp_report_interval = TimeDelta::Millis(1000);
244 config.local_media_ssrc = kSenderSsrc;
245 auto rtcp_sender = CreateRtcpSender(config, /*init_timestamps=*/false);
246 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
247 rtcp_sender->SetSendingStatus(feedback_state(), true);
248
249 // In compound mode no packets are allowed (e.g. Pli) because compound mode
250 // should start with Sender Report.
251 EXPECT_EQ(-1, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
252 EXPECT_EQ(0, parser()->pli()->num_packets());
253 }
254
TEST_F(RtcpSenderTest,SendRr)255 TEST_F(RtcpSenderTest, SendRr) {
256 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
257 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
258 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
259 EXPECT_EQ(1, parser()->receiver_report()->num_packets());
260 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
261 EXPECT_EQ(0U, parser()->receiver_report()->report_blocks().size());
262 }
263
TEST_F(RtcpSenderTest,DoesntSendEmptyRrInReducedSizeMode)264 TEST_F(RtcpSenderTest, DoesntSendEmptyRrInReducedSizeMode) {
265 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
266 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
267 rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
268 EXPECT_EQ(parser()->receiver_report()->num_packets(), 0);
269 }
270
TEST_F(RtcpSenderTest,SendRrWithOneReportBlock)271 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) {
272 const uint16_t kSeqNum = 11111;
273 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
274 InsertIncomingPacket(kRemoteSsrc, kSeqNum);
275 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
276 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
277 EXPECT_EQ(1, parser()->receiver_report()->num_packets());
278 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
279 ASSERT_EQ(1U, parser()->receiver_report()->report_blocks().size());
280 const rtcp::ReportBlock& rb = parser()->receiver_report()->report_blocks()[0];
281 EXPECT_EQ(kRemoteSsrc, rb.source_ssrc());
282 EXPECT_EQ(0U, rb.fraction_lost());
283 EXPECT_EQ(0, rb.cumulative_lost_signed());
284 EXPECT_EQ(kSeqNum, rb.extended_high_seq_num());
285 }
286
TEST_F(RtcpSenderTest,SendRrWithTwoReportBlocks)287 TEST_F(RtcpSenderTest, SendRrWithTwoReportBlocks) {
288 const uint16_t kSeqNum = 11111;
289 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
290 InsertIncomingPacket(kRemoteSsrc, kSeqNum);
291 InsertIncomingPacket(kRemoteSsrc + 1, kSeqNum + 1);
292 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
293 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
294 EXPECT_EQ(1, parser()->receiver_report()->num_packets());
295 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
296 EXPECT_THAT(
297 parser()->receiver_report()->report_blocks(),
298 UnorderedElementsAre(
299 Property(&rtcp::ReportBlock::source_ssrc, Eq(kRemoteSsrc)),
300 Property(&rtcp::ReportBlock::source_ssrc, Eq(kRemoteSsrc + 1))));
301 }
302
TEST_F(RtcpSenderTest,SendSdes)303 TEST_F(RtcpSenderTest, SendSdes) {
304 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
305 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
306 EXPECT_EQ(0, rtcp_sender->SetCNAME("alice@host"));
307 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSdes));
308 EXPECT_EQ(1, parser()->sdes()->num_packets());
309 EXPECT_EQ(1U, parser()->sdes()->chunks().size());
310 EXPECT_EQ(kSenderSsrc, parser()->sdes()->chunks()[0].ssrc);
311 EXPECT_EQ("alice@host", parser()->sdes()->chunks()[0].cname);
312 }
313
TEST_F(RtcpSenderTest,SdesIncludedInCompoundPacket)314 TEST_F(RtcpSenderTest, SdesIncludedInCompoundPacket) {
315 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
316 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
317 EXPECT_EQ(0, rtcp_sender->SetCNAME("alice@host"));
318 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
319 EXPECT_EQ(1, parser()->receiver_report()->num_packets());
320 EXPECT_EQ(1, parser()->sdes()->num_packets());
321 EXPECT_EQ(1U, parser()->sdes()->chunks().size());
322 }
323
TEST_F(RtcpSenderTest,SendBye)324 TEST_F(RtcpSenderTest, SendBye) {
325 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
326 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
327 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpBye));
328 EXPECT_EQ(1, parser()->bye()->num_packets());
329 EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
330 }
331
TEST_F(RtcpSenderTest,StopSendingTriggersBye)332 TEST_F(RtcpSenderTest, StopSendingTriggersBye) {
333 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
334 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
335 rtcp_sender->SetSendingStatus(feedback_state(), true);
336 rtcp_sender->SetSendingStatus(feedback_state(), false);
337 EXPECT_EQ(1, parser()->bye()->num_packets());
338 EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
339 }
340
TEST_F(RtcpSenderTest,SendFir)341 TEST_F(RtcpSenderTest, SendFir) {
342 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
343 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
344 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpFir));
345 EXPECT_EQ(1, parser()->fir()->num_packets());
346 EXPECT_EQ(kSenderSsrc, parser()->fir()->sender_ssrc());
347 EXPECT_EQ(1U, parser()->fir()->requests().size());
348 EXPECT_EQ(kRemoteSsrc, parser()->fir()->requests()[0].ssrc);
349 uint8_t seq = parser()->fir()->requests()[0].seq_nr;
350 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpFir));
351 EXPECT_EQ(2, parser()->fir()->num_packets());
352 EXPECT_EQ(seq + 1, parser()->fir()->requests()[0].seq_nr);
353 }
354
TEST_F(RtcpSenderTest,SendPli)355 TEST_F(RtcpSenderTest, SendPli) {
356 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
357 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
358 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
359 EXPECT_EQ(1, parser()->pli()->num_packets());
360 EXPECT_EQ(kSenderSsrc, parser()->pli()->sender_ssrc());
361 EXPECT_EQ(kRemoteSsrc, parser()->pli()->media_ssrc());
362 }
363
TEST_F(RtcpSenderTest,SendNack)364 TEST_F(RtcpSenderTest, SendNack) {
365 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
366 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
367 const uint16_t kList[] = {0, 1, 16};
368 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpNack,
369 ABSL_ARRAYSIZE(kList), kList));
370 EXPECT_EQ(1, parser()->nack()->num_packets());
371 EXPECT_EQ(kSenderSsrc, parser()->nack()->sender_ssrc());
372 EXPECT_EQ(kRemoteSsrc, parser()->nack()->media_ssrc());
373 EXPECT_THAT(parser()->nack()->packet_ids(), ElementsAre(0, 1, 16));
374 }
375
TEST_F(RtcpSenderTest,SendLossNotificationBufferingNotAllowed)376 TEST_F(RtcpSenderTest, SendLossNotificationBufferingNotAllowed) {
377 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
378 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
379 constexpr uint16_t kLastDecoded = 0x1234;
380 constexpr uint16_t kLastReceived = 0x4321;
381 constexpr bool kDecodabilityFlag = true;
382 constexpr bool kBufferingAllowed = false;
383 EXPECT_EQ(rtcp_sender->SendLossNotification(feedback_state(), kLastDecoded,
384 kLastReceived, kDecodabilityFlag,
385 kBufferingAllowed),
386 0);
387 EXPECT_EQ(parser()->processed_rtcp_packets(), 1u);
388 EXPECT_EQ(parser()->loss_notification()->num_packets(), 1);
389 EXPECT_EQ(kSenderSsrc, parser()->loss_notification()->sender_ssrc());
390 EXPECT_EQ(kRemoteSsrc, parser()->loss_notification()->media_ssrc());
391 }
392
TEST_F(RtcpSenderTest,SendLossNotificationBufferingAllowed)393 TEST_F(RtcpSenderTest, SendLossNotificationBufferingAllowed) {
394 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
395 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
396 constexpr uint16_t kLastDecoded = 0x1234;
397 constexpr uint16_t kLastReceived = 0x4321;
398 constexpr bool kDecodabilityFlag = true;
399 constexpr bool kBufferingAllowed = true;
400 EXPECT_EQ(rtcp_sender->SendLossNotification(feedback_state(), kLastDecoded,
401 kLastReceived, kDecodabilityFlag,
402 kBufferingAllowed),
403 0);
404
405 // No RTCP messages sent yet.
406 ASSERT_EQ(parser()->processed_rtcp_packets(), 0u);
407
408 // Sending another messages triggers sending the LNTF messages as well.
409 const uint16_t kList[] = {0, 1, 16};
410 EXPECT_EQ(rtcp_sender->SendRTCP(feedback_state(), kRtcpNack,
411 ABSL_ARRAYSIZE(kList), kList),
412 0);
413
414 // Exactly one packet was produced, and it contained both the buffered LNTF
415 // as well as the message that had triggered the packet.
416 EXPECT_EQ(parser()->processed_rtcp_packets(), 1u);
417 EXPECT_EQ(parser()->loss_notification()->num_packets(), 1);
418 EXPECT_EQ(parser()->loss_notification()->sender_ssrc(), kSenderSsrc);
419 EXPECT_EQ(parser()->loss_notification()->media_ssrc(), kRemoteSsrc);
420 EXPECT_EQ(parser()->nack()->num_packets(), 1);
421 EXPECT_EQ(parser()->nack()->sender_ssrc(), kSenderSsrc);
422 EXPECT_EQ(parser()->nack()->media_ssrc(), kRemoteSsrc);
423 }
424
TEST_F(RtcpSenderTest,RembNotIncludedBeforeSet)425 TEST_F(RtcpSenderTest, RembNotIncludedBeforeSet) {
426 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
427 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
428
429 rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
430
431 ASSERT_EQ(1, parser()->receiver_report()->num_packets());
432 EXPECT_EQ(0, parser()->remb()->num_packets());
433 }
434
TEST_F(RtcpSenderTest,RembNotIncludedAfterUnset)435 TEST_F(RtcpSenderTest, RembNotIncludedAfterUnset) {
436 const int64_t kBitrate = 261011;
437 const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
438 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
439 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
440 rtcp_sender->SetRemb(kBitrate, kSsrcs);
441 rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
442 ASSERT_EQ(1, parser()->receiver_report()->num_packets());
443 EXPECT_EQ(1, parser()->remb()->num_packets());
444
445 // Turn off REMB. rtcp_sender no longer should send it.
446 rtcp_sender->UnsetRemb();
447 rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
448 ASSERT_EQ(2, parser()->receiver_report()->num_packets());
449 EXPECT_EQ(1, parser()->remb()->num_packets());
450 }
451
TEST_F(RtcpSenderTest,SendRemb)452 TEST_F(RtcpSenderTest, SendRemb) {
453 const int64_t kBitrate = 261011;
454 const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
455 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
456 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
457 rtcp_sender->SetRemb(kBitrate, kSsrcs);
458
459 rtcp_sender->SendRTCP(feedback_state(), kRtcpRemb);
460
461 EXPECT_EQ(1, parser()->remb()->num_packets());
462 EXPECT_EQ(kSenderSsrc, parser()->remb()->sender_ssrc());
463 EXPECT_EQ(kBitrate, parser()->remb()->bitrate_bps());
464 EXPECT_THAT(parser()->remb()->ssrcs(),
465 ElementsAre(kRemoteSsrc, kRemoteSsrc + 1));
466 }
467
TEST_F(RtcpSenderTest,RembIncludedInEachCompoundPacketAfterSet)468 TEST_F(RtcpSenderTest, RembIncludedInEachCompoundPacketAfterSet) {
469 const int kBitrate = 261011;
470 const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
471 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
472 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
473 rtcp_sender->SetRemb(kBitrate, kSsrcs);
474
475 rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
476 EXPECT_EQ(1, parser()->remb()->num_packets());
477 // REMB should be included in each compound packet.
478 rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
479 EXPECT_EQ(2, parser()->remb()->num_packets());
480 }
481
TEST_F(RtcpSenderTest,SendXrWithDlrr)482 TEST_F(RtcpSenderTest, SendXrWithDlrr) {
483 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
484 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
485 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
486 rtcp::ReceiveTimeInfo last_xr_rr;
487 last_xr_rr.ssrc = 0x11111111;
488 last_xr_rr.last_rr = 0x22222222;
489 last_xr_rr.delay_since_last_rr = 0x33333333;
490 feedback_state.last_xr_rtis.push_back(last_xr_rr);
491 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpReport));
492 EXPECT_EQ(1, parser()->xr()->num_packets());
493 EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
494 ASSERT_THAT(parser()->xr()->dlrr().sub_blocks(), SizeIs(1));
495 EXPECT_EQ(last_xr_rr.ssrc, parser()->xr()->dlrr().sub_blocks()[0].ssrc);
496 EXPECT_EQ(last_xr_rr.last_rr, parser()->xr()->dlrr().sub_blocks()[0].last_rr);
497 EXPECT_EQ(last_xr_rr.delay_since_last_rr,
498 parser()->xr()->dlrr().sub_blocks()[0].delay_since_last_rr);
499 }
500
TEST_F(RtcpSenderTest,SendXrWithMultipleDlrrSubBlocks)501 TEST_F(RtcpSenderTest, SendXrWithMultipleDlrrSubBlocks) {
502 const size_t kNumReceivers = 2;
503 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
504 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
505 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
506 for (size_t i = 0; i < kNumReceivers; ++i) {
507 rtcp::ReceiveTimeInfo last_xr_rr;
508 last_xr_rr.ssrc = i;
509 last_xr_rr.last_rr = (i + 1) * 100;
510 last_xr_rr.delay_since_last_rr = (i + 2) * 200;
511 feedback_state.last_xr_rtis.push_back(last_xr_rr);
512 }
513
514 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpReport));
515 EXPECT_EQ(1, parser()->xr()->num_packets());
516 EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
517 ASSERT_THAT(parser()->xr()->dlrr().sub_blocks(), SizeIs(kNumReceivers));
518 for (size_t i = 0; i < kNumReceivers; ++i) {
519 EXPECT_EQ(feedback_state.last_xr_rtis[i].ssrc,
520 parser()->xr()->dlrr().sub_blocks()[i].ssrc);
521 EXPECT_EQ(feedback_state.last_xr_rtis[i].last_rr,
522 parser()->xr()->dlrr().sub_blocks()[i].last_rr);
523 EXPECT_EQ(feedback_state.last_xr_rtis[i].delay_since_last_rr,
524 parser()->xr()->dlrr().sub_blocks()[i].delay_since_last_rr);
525 }
526 }
527
TEST_F(RtcpSenderTest,SendXrWithRrtr)528 TEST_F(RtcpSenderTest, SendXrWithRrtr) {
529 RTCPSender::Configuration config = GetDefaultConfig();
530 config.non_sender_rtt_measurement = true;
531 auto rtcp_sender = CreateRtcpSender(config);
532 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
533 rtcp_sender->SetSendingStatus(feedback_state(), false);
534 NtpTime ntp = clock_.CurrentNtpTime();
535 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
536 EXPECT_EQ(1, parser()->xr()->num_packets());
537 EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
538 EXPECT_FALSE(parser()->xr()->dlrr());
539 ASSERT_TRUE(parser()->xr()->rrtr());
540 EXPECT_EQ(ntp, parser()->xr()->rrtr()->ntp());
541 }
542
543 // Same test as above, but enable Rrtr with the setter.
TEST_F(RtcpSenderTest,SendXrWithRrtrUsingSetter)544 TEST_F(RtcpSenderTest, SendXrWithRrtrUsingSetter) {
545 RTCPSender::Configuration config = GetDefaultConfig();
546 config.non_sender_rtt_measurement = false;
547 auto rtcp_sender = CreateRtcpSender(config);
548 rtcp_sender->SetNonSenderRttMeasurement(true);
549 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
550 rtcp_sender->SetSendingStatus(feedback_state(), false);
551 NtpTime ntp = clock_.CurrentNtpTime();
552 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
553 EXPECT_EQ(1, parser()->xr()->num_packets());
554 EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
555 EXPECT_FALSE(parser()->xr()->dlrr());
556 ASSERT_TRUE(parser()->xr()->rrtr());
557 EXPECT_EQ(ntp, parser()->xr()->rrtr()->ntp());
558 }
559
560 // Same test as above, but disable Rrtr with the setter.
TEST_F(RtcpSenderTest,SendsNoRrtrUsingSetter)561 TEST_F(RtcpSenderTest, SendsNoRrtrUsingSetter) {
562 RTCPSender::Configuration config = GetDefaultConfig();
563 config.non_sender_rtt_measurement = true;
564 auto rtcp_sender = CreateRtcpSender(config);
565 rtcp_sender->SetNonSenderRttMeasurement(false);
566 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
567 rtcp_sender->SetSendingStatus(feedback_state(), false);
568 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
569 EXPECT_EQ(0, parser()->xr()->num_packets());
570 }
571
TEST_F(RtcpSenderTest,TestNoXrRrtrSentIfSending)572 TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfSending) {
573 RTCPSender::Configuration config = GetDefaultConfig();
574 config.non_sender_rtt_measurement = true;
575 auto rtcp_sender = CreateRtcpSender(config);
576 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
577 rtcp_sender->SetSendingStatus(feedback_state(), true);
578 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
579 EXPECT_EQ(0, parser()->xr()->num_packets());
580 }
581
TEST_F(RtcpSenderTest,TestNoXrRrtrSentIfNotEnabled)582 TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfNotEnabled) {
583 RTCPSender::Configuration config = GetDefaultConfig();
584 config.non_sender_rtt_measurement = false;
585 auto rtcp_sender = CreateRtcpSender(config);
586 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
587 rtcp_sender->SetSendingStatus(feedback_state(), false);
588 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
589 EXPECT_EQ(0, parser()->xr()->num_packets());
590 }
591
TEST_F(RtcpSenderTest,TestRegisterRtcpPacketTypeObserver)592 TEST_F(RtcpSenderTest, TestRegisterRtcpPacketTypeObserver) {
593 RtcpPacketTypeCounterObserverImpl observer;
594 RTCPSender::Configuration config;
595 config.clock = &clock_;
596 config.receive_statistics = receive_statistics_.get();
597 config.outgoing_transport = &test_transport_;
598 config.rtcp_packet_type_counter_observer = &observer;
599 config.rtcp_report_interval = TimeDelta::Millis(1000);
600 auto rtcp_sender = CreateRtcpSender(config);
601 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
602 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
603 EXPECT_EQ(1, parser()->pli()->num_packets());
604 EXPECT_EQ(kRemoteSsrc, observer.ssrc_);
605 EXPECT_EQ(1U, observer.counter_.pli_packets);
606 }
607
TEST_F(RtcpSenderTest,SendTmmbr)608 TEST_F(RtcpSenderTest, SendTmmbr) {
609 const unsigned int kBitrateBps = 312000;
610 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
611 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
612 rtcp_sender->SetTargetBitrate(kBitrateBps);
613 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpTmmbr));
614 EXPECT_EQ(1, parser()->tmmbr()->num_packets());
615 EXPECT_EQ(kSenderSsrc, parser()->tmmbr()->sender_ssrc());
616 EXPECT_EQ(1U, parser()->tmmbr()->requests().size());
617 EXPECT_EQ(kBitrateBps, parser()->tmmbr()->requests()[0].bitrate_bps());
618 // TODO(asapersson): tmmbr_item()->Overhead() looks broken, always zero.
619 }
620
TEST_F(RtcpSenderTest,SendTmmbn)621 TEST_F(RtcpSenderTest, SendTmmbn) {
622 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
623 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
624 rtcp_sender->SetSendingStatus(feedback_state(), true);
625 std::vector<rtcp::TmmbItem> bounding_set;
626 const uint32_t kBitrateBps = 32768000;
627 const uint32_t kPacketOh = 40;
628 const uint32_t kSourceSsrc = 12345;
629 const rtcp::TmmbItem tmmbn(kSourceSsrc, kBitrateBps, kPacketOh);
630 bounding_set.push_back(tmmbn);
631 rtcp_sender->SetTmmbn(bounding_set);
632
633 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
634 EXPECT_EQ(1, parser()->sender_report()->num_packets());
635 EXPECT_EQ(1, parser()->tmmbn()->num_packets());
636 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
637 EXPECT_EQ(1U, parser()->tmmbn()->items().size());
638 EXPECT_EQ(kBitrateBps, parser()->tmmbn()->items()[0].bitrate_bps());
639 EXPECT_EQ(kPacketOh, parser()->tmmbn()->items()[0].packet_overhead());
640 EXPECT_EQ(kSourceSsrc, parser()->tmmbn()->items()[0].ssrc());
641 }
642
643 // This test is written to verify actual behaviour. It does not seem
644 // to make much sense to send an empty TMMBN, since there is no place
645 // to put an actual limit here. It's just information that no limit
646 // is set, which is kind of the starting assumption.
647 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one
648 // situation where this caused confusion.
TEST_F(RtcpSenderTest,SendsTmmbnIfSetAndEmpty)649 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) {
650 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
651 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
652 rtcp_sender->SetSendingStatus(feedback_state(), true);
653 std::vector<rtcp::TmmbItem> bounding_set;
654 rtcp_sender->SetTmmbn(bounding_set);
655 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
656 EXPECT_EQ(1, parser()->sender_report()->num_packets());
657 EXPECT_EQ(1, parser()->tmmbn()->num_packets());
658 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
659 EXPECT_EQ(0U, parser()->tmmbn()->items().size());
660 }
661
662 // This test is written to verify that BYE is always the last packet
663 // type in a RTCP compoud packet. The rtcp_sender is recreated with
664 // mock_transport, which is used to check for whether BYE at the end
665 // of a RTCP compound packet.
TEST_F(RtcpSenderTest,ByeMustBeLast)666 TEST_F(RtcpSenderTest, ByeMustBeLast) {
667 MockTransport mock_transport;
668 EXPECT_CALL(mock_transport, SendRtcp(_, _))
669 .WillOnce(Invoke([](const uint8_t* data, size_t len) {
670 const uint8_t* next_packet = data;
671 const uint8_t* const packet_end = data + len;
672 rtcp::CommonHeader packet;
673 while (next_packet < packet_end) {
674 EXPECT_TRUE(packet.Parse(next_packet, packet_end - next_packet));
675 next_packet = packet.NextPacket();
676 if (packet.type() ==
677 rtcp::Bye::kPacketType) // Main test expectation.
678 EXPECT_EQ(0, packet_end - next_packet)
679 << "Bye packet should be last in a compound RTCP packet.";
680 if (next_packet == packet_end) // Validate test was set correctly.
681 EXPECT_EQ(packet.type(), rtcp::Bye::kPacketType)
682 << "Last packet in this test expected to be Bye.";
683 }
684
685 return true;
686 }));
687
688 // Re-configure rtcp_sender with mock_transport_
689 RTCPSender::Configuration config;
690 config.clock = &clock_;
691 config.receive_statistics = receive_statistics_.get();
692 config.outgoing_transport = &mock_transport;
693 config.rtcp_report_interval = TimeDelta::Millis(1000);
694 config.local_media_ssrc = kSenderSsrc;
695 auto rtcp_sender = CreateRtcpSender(config);
696
697 rtcp_sender->SetTimestampOffset(kStartRtpTimestamp);
698 rtcp_sender->SetLastRtpTime(kRtpTimestamp, clock_.CurrentTime(),
699 /*payload_type=*/0);
700
701 // Set up REMB info to be included with BYE.
702 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
703 rtcp_sender->SetRemb(1234, {});
704 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpBye));
705 }
706
TEST_F(RtcpSenderTest,SendXrWithTargetBitrate)707 TEST_F(RtcpSenderTest, SendXrWithTargetBitrate) {
708 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
709 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
710 const size_t kNumSpatialLayers = 2;
711 const size_t kNumTemporalLayers = 2;
712 VideoBitrateAllocation allocation;
713 for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
714 uint32_t start_bitrate_bps = (sl + 1) * 100000;
715 for (size_t tl = 0; tl < kNumTemporalLayers; ++tl)
716 allocation.SetBitrate(sl, tl, start_bitrate_bps + (tl * 20000));
717 }
718 rtcp_sender->SetVideoBitrateAllocation(allocation);
719
720 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
721 EXPECT_EQ(1, parser()->xr()->num_packets());
722 EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
723 const absl::optional<rtcp::TargetBitrate>& target_bitrate =
724 parser()->xr()->target_bitrate();
725 ASSERT_TRUE(target_bitrate);
726 const std::vector<rtcp::TargetBitrate::BitrateItem>& bitrates =
727 target_bitrate->GetTargetBitrates();
728 EXPECT_EQ(kNumSpatialLayers * kNumTemporalLayers, bitrates.size());
729
730 for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
731 uint32_t start_bitrate_bps = (sl + 1) * 100000;
732 for (size_t tl = 0; tl < kNumTemporalLayers; ++tl) {
733 size_t index = (sl * kNumSpatialLayers) + tl;
734 const rtcp::TargetBitrate::BitrateItem& item = bitrates[index];
735 EXPECT_EQ(sl, item.spatial_layer);
736 EXPECT_EQ(tl, item.temporal_layer);
737 EXPECT_EQ(start_bitrate_bps + (tl * 20000),
738 item.target_bitrate_kbps * 1000);
739 }
740 }
741 }
742
TEST_F(RtcpSenderTest,SendImmediateXrWithTargetBitrate)743 TEST_F(RtcpSenderTest, SendImmediateXrWithTargetBitrate) {
744 // Initialize. Send a first report right away.
745 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
746 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
747 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
748 clock_.AdvanceTimeMilliseconds(5);
749
750 // Video bitrate allocation generated, save until next time we send a report.
751 VideoBitrateAllocation allocation;
752 allocation.SetBitrate(0, 0, 100000);
753 rtcp_sender->SetVideoBitrateAllocation(allocation);
754 // First seen instance will be sent immediately.
755 EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
756 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
757 clock_.AdvanceTimeMilliseconds(5);
758
759 // Update bitrate of existing layer, does not quality for immediate sending.
760 allocation.SetBitrate(0, 0, 150000);
761 rtcp_sender->SetVideoBitrateAllocation(allocation);
762 EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
763
764 // A new spatial layer enabled, signal this as soon as possible.
765 allocation.SetBitrate(1, 0, 200000);
766 rtcp_sender->SetVideoBitrateAllocation(allocation);
767 EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
768 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
769 clock_.AdvanceTimeMilliseconds(5);
770
771 // Explicitly disable top layer. The same set of layers now has a bitrate
772 // defined, but the explicit 0 indicates shutdown. Signal immediately.
773 allocation.SetBitrate(1, 0, 0);
774 EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
775 rtcp_sender->SetVideoBitrateAllocation(allocation);
776 EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
777 }
778
TEST_F(RtcpSenderTest,SendTargetBitrateExplicitZeroOnStreamRemoval)779 TEST_F(RtcpSenderTest, SendTargetBitrateExplicitZeroOnStreamRemoval) {
780 // Set up and send a bitrate allocation with two layers.
781
782 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
783 rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
784 VideoBitrateAllocation allocation;
785 allocation.SetBitrate(0, 0, 100000);
786 allocation.SetBitrate(1, 0, 200000);
787 rtcp_sender->SetVideoBitrateAllocation(allocation);
788 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
789 absl::optional<rtcp::TargetBitrate> target_bitrate =
790 parser()->xr()->target_bitrate();
791 ASSERT_TRUE(target_bitrate);
792 std::vector<rtcp::TargetBitrate::BitrateItem> bitrates =
793 target_bitrate->GetTargetBitrates();
794 ASSERT_EQ(2u, bitrates.size());
795 EXPECT_EQ(bitrates[0].target_bitrate_kbps,
796 allocation.GetBitrate(0, 0) / 1000);
797 EXPECT_EQ(bitrates[1].target_bitrate_kbps,
798 allocation.GetBitrate(1, 0) / 1000);
799
800 // Create a new allocation, where the second stream is no longer available.
801 VideoBitrateAllocation new_allocation;
802 new_allocation.SetBitrate(0, 0, 150000);
803 rtcp_sender->SetVideoBitrateAllocation(new_allocation);
804 EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
805 target_bitrate = parser()->xr()->target_bitrate();
806 ASSERT_TRUE(target_bitrate);
807 bitrates = target_bitrate->GetTargetBitrates();
808
809 // Two bitrates should still be set, with an explicit entry indicating the
810 // removed stream is gone.
811 ASSERT_EQ(2u, bitrates.size());
812 EXPECT_EQ(bitrates[0].target_bitrate_kbps,
813 new_allocation.GetBitrate(0, 0) / 1000);
814 EXPECT_EQ(bitrates[1].target_bitrate_kbps, 0u);
815 }
816
TEST_F(RtcpSenderTest,DoesntSchedulesInitialReportWhenSsrcSetOnConstruction)817 TEST_F(RtcpSenderTest, DoesntSchedulesInitialReportWhenSsrcSetOnConstruction) {
818 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
819 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
820 rtcp_sender->SetRemoteSSRC(kRemoteSsrc);
821 // New report should not have been scheduled yet.
822 clock_.AdvanceTimeMilliseconds(100);
823 EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
824 }
825
TEST_F(RtcpSenderTest,SendsCombinedRtcpPacket)826 TEST_F(RtcpSenderTest, SendsCombinedRtcpPacket) {
827 auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
828 rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
829
830 std::vector<std::unique_ptr<rtcp::RtcpPacket>> packets;
831 auto transport_feedback = std::make_unique<rtcp::TransportFeedback>();
832 transport_feedback->AddReceivedPacket(321, Timestamp::Millis(10));
833 packets.push_back(std::move(transport_feedback));
834 auto remote_estimate = std::make_unique<rtcp::RemoteEstimate>();
835 packets.push_back(std::move(remote_estimate));
836 rtcp_sender->SendCombinedRtcpPacket(std::move(packets));
837
838 EXPECT_EQ(parser()->transport_feedback()->num_packets(), 1);
839 EXPECT_EQ(parser()->transport_feedback()->sender_ssrc(), kSenderSsrc);
840 EXPECT_EQ(parser()->app()->num_packets(), 1);
841 EXPECT_EQ(parser()->app()->sender_ssrc(), kSenderSsrc);
842 }
843
844 } // namespace webrtc
845