1 /*
2 * Copyright (c) 2013 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/rtp_rtcp_impl.h"
12
13 #include <map>
14 #include <memory>
15 #include <set>
16
17 #include "api/transport/field_trial_based_config.h"
18 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19 #include "modules/rtp_rtcp/source/rtcp_packet.h"
20 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
21 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
22 #include "modules/rtp_rtcp/source/rtp_sender_video.h"
23 #include "rtc_base/rate_limiter.h"
24 #include "test/gmock.h"
25 #include "test/gtest.h"
26 #include "test/rtcp_packet_parser.h"
27
28 using ::testing::ElementsAre;
29 using ::testing::Eq;
30 using ::testing::Field;
31 using ::testing::Gt;
32 using ::testing::Not;
33 using ::testing::Optional;
34
35 namespace webrtc {
36 namespace {
37 const uint32_t kSenderSsrc = 0x12345;
38 const uint32_t kReceiverSsrc = 0x23456;
39 const int64_t kOneWayNetworkDelayMs = 100;
40 const uint8_t kBaseLayerTid = 0;
41 const uint8_t kHigherLayerTid = 1;
42 const uint16_t kSequenceNumber = 100;
43 const uint8_t kPayloadType = 100;
44 const int kWidth = 320;
45 const int kHeight = 100;
46
47 #pragma clang diagnostic push
48 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
49
50 class RtcpRttStatsTestImpl : public RtcpRttStats {
51 public:
RtcpRttStatsTestImpl()52 RtcpRttStatsTestImpl() : rtt_ms_(0) {}
53 ~RtcpRttStatsTestImpl() override = default;
54
OnRttUpdate(int64_t rtt_ms)55 void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; }
LastProcessedRtt() const56 int64_t LastProcessedRtt() const override { return rtt_ms_; }
57 int64_t rtt_ms_;
58 };
59
60 class SendTransport : public Transport {
61 public:
SendTransport()62 SendTransport()
63 : receiver_(nullptr),
64 clock_(nullptr),
65 delay_ms_(0),
66 rtp_packets_sent_(0),
67 rtcp_packets_sent_(0) {}
68
SetRtpRtcpModule(ModuleRtpRtcpImpl * receiver)69 void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { receiver_ = receiver; }
SimulateNetworkDelay(int64_t delay_ms,SimulatedClock * clock)70 void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) {
71 clock_ = clock;
72 delay_ms_ = delay_ms;
73 }
SendRtp(const uint8_t * data,size_t len,const PacketOptions & options)74 bool SendRtp(const uint8_t* data,
75 size_t len,
76 const PacketOptions& options) override {
77 RtpPacket packet;
78 EXPECT_TRUE(packet.Parse(data, len));
79 ++rtp_packets_sent_;
80 last_rtp_sequence_number_ = packet.SequenceNumber();
81 return true;
82 }
SendRtcp(const uint8_t * data,size_t len)83 bool SendRtcp(const uint8_t* data, size_t len) override {
84 test::RtcpPacketParser parser;
85 parser.Parse(data, len);
86 last_nack_list_ = parser.nack()->packet_ids();
87
88 if (clock_) {
89 clock_->AdvanceTimeMilliseconds(delay_ms_);
90 }
91 EXPECT_TRUE(receiver_);
92 receiver_->IncomingRtcpPacket(data, len);
93 ++rtcp_packets_sent_;
94 return true;
95 }
NumRtcpSent()96 size_t NumRtcpSent() { return rtcp_packets_sent_; }
97 ModuleRtpRtcpImpl* receiver_;
98 SimulatedClock* clock_;
99 int64_t delay_ms_;
100 int rtp_packets_sent_;
101 size_t rtcp_packets_sent_;
102 uint16_t last_rtp_sequence_number_;
103 std::vector<uint16_t> last_nack_list_;
104 };
105
106 class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
107 public:
RtpRtcpModule(SimulatedClock * clock,bool is_sender)108 RtpRtcpModule(SimulatedClock* clock, bool is_sender)
109 : is_sender_(is_sender),
110 receive_statistics_(ReceiveStatistics::Create(clock)),
111 clock_(clock) {
112 CreateModuleImpl();
113 transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock);
114 }
115
116 const bool is_sender_;
117 RtcpPacketTypeCounter packets_sent_;
118 RtcpPacketTypeCounter packets_received_;
119 std::unique_ptr<ReceiveStatistics> receive_statistics_;
120 SendTransport transport_;
121 RtcpRttStatsTestImpl rtt_stats_;
122 std::unique_ptr<ModuleRtpRtcpImpl> impl_;
123 int rtcp_report_interval_ms_ = 0;
124
RtcpPacketTypesCounterUpdated(uint32_t ssrc,const RtcpPacketTypeCounter & packet_counter)125 void RtcpPacketTypesCounterUpdated(
126 uint32_t ssrc,
127 const RtcpPacketTypeCounter& packet_counter) override {
128 counter_map_[ssrc] = packet_counter;
129 }
130
RtcpSent()131 RtcpPacketTypeCounter RtcpSent() {
132 // RTCP counters for remote SSRC.
133 return counter_map_[is_sender_ ? kReceiverSsrc : kSenderSsrc];
134 }
135
RtcpReceived()136 RtcpPacketTypeCounter RtcpReceived() {
137 // Received RTCP stats for (own) local SSRC.
138 return counter_map_[impl_->SSRC()];
139 }
RtpSent()140 int RtpSent() { return transport_.rtp_packets_sent_; }
LastRtpSequenceNumber()141 uint16_t LastRtpSequenceNumber() {
142 return transport_.last_rtp_sequence_number_;
143 }
LastNackListSent()144 std::vector<uint16_t> LastNackListSent() {
145 return transport_.last_nack_list_;
146 }
SetRtcpReportIntervalAndReset(int rtcp_report_interval_ms)147 void SetRtcpReportIntervalAndReset(int rtcp_report_interval_ms) {
148 rtcp_report_interval_ms_ = rtcp_report_interval_ms;
149 CreateModuleImpl();
150 }
151
152 private:
CreateModuleImpl()153 void CreateModuleImpl() {
154 RtpRtcpInterface::Configuration config;
155 config.audio = false;
156 config.clock = clock_;
157 config.outgoing_transport = &transport_;
158 config.receive_statistics = receive_statistics_.get();
159 config.rtcp_packet_type_counter_observer = this;
160 config.rtt_stats = &rtt_stats_;
161 config.rtcp_report_interval_ms = rtcp_report_interval_ms_;
162 config.local_media_ssrc = is_sender_ ? kSenderSsrc : kReceiverSsrc;
163 config.need_rtp_packet_infos = true;
164 config.non_sender_rtt_measurement = true;
165
166 impl_.reset(new ModuleRtpRtcpImpl(config));
167 impl_->SetRemoteSSRC(is_sender_ ? kReceiverSsrc : kSenderSsrc);
168 impl_->SetRTCPStatus(RtcpMode::kCompound);
169 }
170
171 SimulatedClock* const clock_;
172 std::map<uint32_t, RtcpPacketTypeCounter> counter_map_;
173 };
174 } // namespace
175
176 class RtpRtcpImplTest : public ::testing::Test {
177 protected:
RtpRtcpImplTest()178 RtpRtcpImplTest()
179 : clock_(133590000000000),
180 sender_(&clock_, /*is_sender=*/true),
181 receiver_(&clock_, /*is_sender=*/false) {}
182
SetUp()183 void SetUp() override {
184 // Send module.
185 EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true));
186 sender_.impl_->SetSendingMediaStatus(true);
187 sender_.impl_->SetSequenceNumber(kSequenceNumber);
188 sender_.impl_->SetStorePacketsStatus(true, 100);
189
190 FieldTrialBasedConfig field_trials;
191 RTPSenderVideo::Config video_config;
192 video_config.clock = &clock_;
193 video_config.rtp_sender = sender_.impl_->RtpSender();
194 video_config.field_trials = &field_trials;
195 sender_video_ = std::make_unique<RTPSenderVideo>(video_config);
196
197 // Receive module.
198 EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false));
199 receiver_.impl_->SetSendingMediaStatus(false);
200 // Transport settings.
201 sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get());
202 receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get());
203 }
204
205 SimulatedClock clock_;
206 RtpRtcpModule sender_;
207 std::unique_ptr<RTPSenderVideo> sender_video_;
208 RtpRtcpModule receiver_;
209
SendFrame(const RtpRtcpModule * module,RTPSenderVideo * sender,uint8_t tid)210 void SendFrame(const RtpRtcpModule* module,
211 RTPSenderVideo* sender,
212 uint8_t tid) {
213 RTPVideoHeaderVP8 vp8_header = {};
214 vp8_header.temporalIdx = tid;
215 RTPVideoHeader rtp_video_header;
216 rtp_video_header.frame_type = VideoFrameType::kVideoFrameKey;
217 rtp_video_header.width = kWidth;
218 rtp_video_header.height = kHeight;
219 rtp_video_header.rotation = kVideoRotation_0;
220 rtp_video_header.content_type = VideoContentType::UNSPECIFIED;
221 rtp_video_header.playout_delay = {-1, -1};
222 rtp_video_header.is_first_packet_in_frame = true;
223 rtp_video_header.simulcastIdx = 0;
224 rtp_video_header.codec = kVideoCodecVP8;
225 rtp_video_header.video_type_header = vp8_header;
226 rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
227
228 const uint8_t payload[100] = {0};
229 EXPECT_TRUE(module->impl_->OnSendingRtpFrame(0, 0, kPayloadType, true));
230 EXPECT_TRUE(sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8,
231 0, 0, payload, rtp_video_header, 0));
232 }
233
IncomingRtcpNack(const RtpRtcpModule * module,uint16_t sequence_number)234 void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) {
235 bool sender = module->impl_->SSRC() == kSenderSsrc;
236 rtcp::Nack nack;
237 uint16_t list[1];
238 list[0] = sequence_number;
239 const uint16_t kListLength = sizeof(list) / sizeof(list[0]);
240 nack.SetSenderSsrc(sender ? kReceiverSsrc : kSenderSsrc);
241 nack.SetMediaSsrc(sender ? kSenderSsrc : kReceiverSsrc);
242 nack.SetPacketIds(list, kListLength);
243 rtc::Buffer packet = nack.Build();
244 module->impl_->IncomingRtcpPacket(packet.data(), packet.size());
245 }
246 };
247
TEST_F(RtpRtcpImplTest,RetransmitsAllLayers)248 TEST_F(RtpRtcpImplTest, RetransmitsAllLayers) {
249 // Send frames.
250 EXPECT_EQ(0, sender_.RtpSent());
251 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid); // kSequenceNumber
252 SendFrame(&sender_, sender_video_.get(),
253 kHigherLayerTid); // kSequenceNumber + 1
254 SendFrame(&sender_, sender_video_.get(),
255 kNoTemporalIdx); // kSequenceNumber + 2
256 EXPECT_EQ(3, sender_.RtpSent());
257 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
258
259 // Min required delay until retransmit = 5 + RTT ms (RTT = 0).
260 clock_.AdvanceTimeMilliseconds(5);
261
262 // Frame with kBaseLayerTid re-sent.
263 IncomingRtcpNack(&sender_, kSequenceNumber);
264 EXPECT_EQ(4, sender_.RtpSent());
265 EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
266 // Frame with kHigherLayerTid re-sent.
267 IncomingRtcpNack(&sender_, kSequenceNumber + 1);
268 EXPECT_EQ(5, sender_.RtpSent());
269 EXPECT_EQ(kSequenceNumber + 1, sender_.LastRtpSequenceNumber());
270 // Frame with kNoTemporalIdx re-sent.
271 IncomingRtcpNack(&sender_, kSequenceNumber + 2);
272 EXPECT_EQ(6, sender_.RtpSent());
273 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
274 }
275
TEST_F(RtpRtcpImplTest,Rtt)276 TEST_F(RtpRtcpImplTest, Rtt) {
277 RtpPacketReceived packet;
278 packet.SetTimestamp(1);
279 packet.SetSequenceNumber(123);
280 packet.SetSsrc(kSenderSsrc);
281 packet.AllocatePayload(100 - 12);
282 receiver_.receive_statistics_->OnRtpPacket(packet);
283
284 // Send Frame before sending an SR.
285 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
286 // Sender module should send an SR.
287 EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
288
289 // Receiver module should send a RR with a response to the last received SR.
290 clock_.AdvanceTimeMilliseconds(1000);
291 EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
292
293 // Verify RTT.
294 int64_t rtt;
295 int64_t avg_rtt;
296 int64_t min_rtt;
297 int64_t max_rtt;
298 EXPECT_EQ(
299 0, sender_.impl_->RTT(kReceiverSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt));
300 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, rtt, 1);
301 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, avg_rtt, 1);
302 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, min_rtt, 1);
303 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, max_rtt, 1);
304
305 // No RTT from other ssrc.
306 EXPECT_EQ(-1, sender_.impl_->RTT(kReceiverSsrc + 1, &rtt, &avg_rtt, &min_rtt,
307 &max_rtt));
308
309 // Verify RTT from rtt_stats config.
310 EXPECT_EQ(0, sender_.rtt_stats_.LastProcessedRtt());
311 EXPECT_EQ(0, sender_.impl_->rtt_ms());
312 sender_.impl_->Process();
313 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.rtt_stats_.LastProcessedRtt(),
314 1);
315 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms(), 1);
316 }
317
TEST_F(RtpRtcpImplTest,RttForReceiverOnly)318 TEST_F(RtpRtcpImplTest, RttForReceiverOnly) {
319 // Receiver module should send a Receiver time reference report (RTRR).
320 EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
321
322 // Sender module should send a response to the last received RTRR (DLRR).
323 clock_.AdvanceTimeMilliseconds(1000);
324 // Send Frame before sending a SR.
325 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
326 EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
327
328 // Verify RTT.
329 EXPECT_EQ(0, receiver_.rtt_stats_.LastProcessedRtt());
330 EXPECT_EQ(0, receiver_.impl_->rtt_ms());
331 receiver_.impl_->Process();
332 EXPECT_NEAR(2 * kOneWayNetworkDelayMs,
333 receiver_.rtt_stats_.LastProcessedRtt(), 1);
334 EXPECT_NEAR(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms(), 1);
335 }
336
TEST_F(RtpRtcpImplTest,NoSrBeforeMedia)337 TEST_F(RtpRtcpImplTest, NoSrBeforeMedia) {
338 // Ignore fake transport delays in this test.
339 sender_.transport_.SimulateNetworkDelay(0, &clock_);
340 receiver_.transport_.SimulateNetworkDelay(0, &clock_);
341
342 sender_.impl_->Process();
343 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
344
345 // Verify no SR is sent before media has been sent, RR should still be sent
346 // from the receiving module though.
347 clock_.AdvanceTimeMilliseconds(2000);
348 sender_.impl_->Process();
349 receiver_.impl_->Process();
350 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
351 EXPECT_EQ(receiver_.transport_.NumRtcpSent(), 1u);
352
353 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
354 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
355 }
356
TEST_F(RtpRtcpImplTest,RtcpPacketTypeCounter_Nack)357 TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_Nack) {
358 EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets);
359 EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
360
361 // Receive module sends a NACK.
362 const uint16_t kNackLength = 1;
363 uint16_t nack_list[kNackLength] = {123};
364 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
365 EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
366
367 // Send module receives the NACK.
368 EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
369 }
370
TEST_F(RtpRtcpImplTest,AddStreamDataCounters)371 TEST_F(RtpRtcpImplTest, AddStreamDataCounters) {
372 StreamDataCounters rtp;
373 rtp.transmitted.packets = 1;
374 rtp.transmitted.payload_bytes = 1;
375 rtp.transmitted.header_bytes = 2;
376 rtp.transmitted.padding_bytes = 3;
377 EXPECT_EQ(rtp.transmitted.TotalBytes(), rtp.transmitted.payload_bytes +
378 rtp.transmitted.header_bytes +
379 rtp.transmitted.padding_bytes);
380
381 StreamDataCounters rtp2;
382 rtp2.transmitted.packets = 10;
383 rtp2.transmitted.payload_bytes = 10;
384 rtp2.retransmitted.header_bytes = 4;
385 rtp2.retransmitted.payload_bytes = 5;
386 rtp2.retransmitted.padding_bytes = 6;
387 rtp2.retransmitted.packets = 7;
388 rtp2.fec.packets = 8;
389
390 StreamDataCounters sum = rtp;
391 sum.Add(rtp2);
392 EXPECT_EQ(11U, sum.transmitted.packets);
393 EXPECT_EQ(11U, sum.transmitted.payload_bytes);
394 EXPECT_EQ(2U, sum.transmitted.header_bytes);
395 EXPECT_EQ(3U, sum.transmitted.padding_bytes);
396 EXPECT_EQ(4U, sum.retransmitted.header_bytes);
397 EXPECT_EQ(5U, sum.retransmitted.payload_bytes);
398 EXPECT_EQ(6U, sum.retransmitted.padding_bytes);
399 EXPECT_EQ(7U, sum.retransmitted.packets);
400 EXPECT_EQ(8U, sum.fec.packets);
401 EXPECT_EQ(sum.transmitted.TotalBytes(),
402 rtp.transmitted.TotalBytes() + rtp2.transmitted.TotalBytes());
403 }
404
TEST_F(RtpRtcpImplTest,SendsInitialNackList)405 TEST_F(RtpRtcpImplTest, SendsInitialNackList) {
406 // Send module sends a NACK.
407 const uint16_t kNackLength = 1;
408 uint16_t nack_list[kNackLength] = {123};
409 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
410 // Send Frame before sending a compound RTCP that starts with SR.
411 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
412 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
413 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
414 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
415 }
416
TEST_F(RtpRtcpImplTest,SendsExtendedNackList)417 TEST_F(RtpRtcpImplTest, SendsExtendedNackList) {
418 // Send module sends a NACK.
419 const uint16_t kNackLength = 1;
420 uint16_t nack_list[kNackLength] = {123};
421 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
422 // Send Frame before sending a compound RTCP that starts with SR.
423 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
424 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
425 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
426 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
427
428 // Same list not re-send.
429 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
430 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
431 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
432
433 // Only extended list sent.
434 const uint16_t kNackExtLength = 2;
435 uint16_t nack_list_ext[kNackExtLength] = {123, 124};
436 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list_ext, kNackExtLength));
437 EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
438 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(124));
439 }
440
TEST_F(RtpRtcpImplTest,ReSendsNackListAfterRttMs)441 TEST_F(RtpRtcpImplTest, ReSendsNackListAfterRttMs) {
442 sender_.transport_.SimulateNetworkDelay(0, &clock_);
443 // Send module sends a NACK.
444 const uint16_t kNackLength = 2;
445 uint16_t nack_list[kNackLength] = {123, 125};
446 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
447 // Send Frame before sending a compound RTCP that starts with SR.
448 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
449 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
450 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
451 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
452
453 // Same list not re-send, rtt interval has not passed.
454 const int kStartupRttMs = 100;
455 clock_.AdvanceTimeMilliseconds(kStartupRttMs);
456 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
457 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
458
459 // Rtt interval passed, full list sent.
460 clock_.AdvanceTimeMilliseconds(1);
461 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
462 EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
463 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
464 }
465
TEST_F(RtpRtcpImplTest,UniqueNackRequests)466 TEST_F(RtpRtcpImplTest, UniqueNackRequests) {
467 receiver_.transport_.SimulateNetworkDelay(0, &clock_);
468 EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
469 EXPECT_EQ(0U, receiver_.RtcpSent().nack_requests);
470 EXPECT_EQ(0U, receiver_.RtcpSent().unique_nack_requests);
471 EXPECT_EQ(0, receiver_.RtcpSent().UniqueNackRequestsInPercent());
472
473 // Receive module sends NACK request.
474 const uint16_t kNackLength = 4;
475 uint16_t nack_list[kNackLength] = {10, 11, 13, 18};
476 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
477 EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
478 EXPECT_EQ(4U, receiver_.RtcpSent().nack_requests);
479 EXPECT_EQ(4U, receiver_.RtcpSent().unique_nack_requests);
480 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(10, 11, 13, 18));
481
482 // Send module receives the request.
483 EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
484 EXPECT_EQ(4U, sender_.RtcpReceived().nack_requests);
485 EXPECT_EQ(4U, sender_.RtcpReceived().unique_nack_requests);
486 EXPECT_EQ(100, sender_.RtcpReceived().UniqueNackRequestsInPercent());
487
488 // Receive module sends new request with duplicated packets.
489 const int kStartupRttMs = 100;
490 clock_.AdvanceTimeMilliseconds(kStartupRttMs + 1);
491 const uint16_t kNackLength2 = 4;
492 uint16_t nack_list2[kNackLength2] = {11, 18, 20, 21};
493 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list2, kNackLength2));
494 EXPECT_EQ(2U, receiver_.RtcpSent().nack_packets);
495 EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests);
496 EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests);
497 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21));
498
499 // Send module receives the request.
500 EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets);
501 EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests);
502 EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests);
503 EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent());
504 }
505
TEST_F(RtpRtcpImplTest,ConfigurableRtcpReportInterval)506 TEST_F(RtpRtcpImplTest, ConfigurableRtcpReportInterval) {
507 const int kVideoReportInterval = 3000;
508
509 // Recreate sender impl with new configuration, and redo setup.
510 sender_.SetRtcpReportIntervalAndReset(kVideoReportInterval);
511 SetUp();
512
513 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
514
515 // Initial state
516 sender_.impl_->Process();
517 EXPECT_EQ(0u, sender_.transport_.NumRtcpSent());
518
519 // Move ahead to the last ms before a rtcp is expected, no action.
520 clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2 - 1);
521 sender_.impl_->Process();
522 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
523
524 // Move ahead to the first rtcp. Send RTCP.
525 clock_.AdvanceTimeMilliseconds(1);
526 sender_.impl_->Process();
527 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
528
529 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
530
531 // Move ahead to the last possible second before second rtcp is expected.
532 clock_.AdvanceTimeMilliseconds(kVideoReportInterval * 1 / 2 - 1);
533 sender_.impl_->Process();
534 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
535
536 // Move ahead into the range of second rtcp, the second rtcp may be sent.
537 clock_.AdvanceTimeMilliseconds(1);
538 sender_.impl_->Process();
539 EXPECT_GE(sender_.transport_.NumRtcpSent(), 1u);
540
541 clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2);
542 sender_.impl_->Process();
543 EXPECT_GE(sender_.transport_.NumRtcpSent(), 1u);
544
545 // Move out the range of second rtcp, the second rtcp must have been sent.
546 clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2);
547 sender_.impl_->Process();
548 EXPECT_EQ(sender_.transport_.NumRtcpSent(), 2u);
549 }
550
TEST_F(RtpRtcpImplTest,StoresPacketInfoForSentPackets)551 TEST_F(RtpRtcpImplTest, StoresPacketInfoForSentPackets) {
552 const uint32_t kStartTimestamp = 1u;
553 SetUp();
554 sender_.impl_->SetStartTimestamp(kStartTimestamp);
555 sender_.impl_->SetSequenceNumber(1);
556
557 PacedPacketInfo pacing_info;
558 RtpPacketToSend packet(nullptr);
559 packet.set_packet_type(RtpPacketToSend::Type::kVideo);
560 packet.SetSsrc(kSenderSsrc);
561
562 // Single-packet frame.
563 packet.SetTimestamp(1);
564 packet.set_first_packet_of_frame(true);
565 packet.SetMarker(true);
566 sender_.impl_->TrySendPacket(&packet, pacing_info);
567
568 std::vector<RtpSequenceNumberMap::Info> seqno_info =
569 sender_.impl_->GetSentRtpPacketInfos(std::vector<uint16_t>{1});
570
571 EXPECT_THAT(seqno_info, ElementsAre(RtpSequenceNumberMap::Info(
572 /*timestamp=*/1 - kStartTimestamp,
573 /*is_first=*/1,
574 /*is_last=*/1)));
575
576 // Three-packet frame.
577 packet.SetTimestamp(2);
578 packet.set_first_packet_of_frame(true);
579 packet.SetMarker(false);
580 sender_.impl_->TrySendPacket(&packet, pacing_info);
581
582 packet.set_first_packet_of_frame(false);
583 sender_.impl_->TrySendPacket(&packet, pacing_info);
584
585 packet.SetMarker(true);
586 sender_.impl_->TrySendPacket(&packet, pacing_info);
587
588 seqno_info =
589 sender_.impl_->GetSentRtpPacketInfos(std::vector<uint16_t>{2, 3, 4});
590
591 EXPECT_THAT(seqno_info, ElementsAre(RtpSequenceNumberMap::Info(
592 /*timestamp=*/2 - kStartTimestamp,
593 /*is_first=*/1,
594 /*is_last=*/0),
595 RtpSequenceNumberMap::Info(
596 /*timestamp=*/2 - kStartTimestamp,
597 /*is_first=*/0,
598 /*is_last=*/0),
599 RtpSequenceNumberMap::Info(
600 /*timestamp=*/2 - kStartTimestamp,
601 /*is_first=*/0,
602 /*is_last=*/1)));
603 }
604
605 // Checks that the remote sender stats are not available if no RTCP SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsNotAvailable)606 TEST_F(RtpRtcpImplTest, SenderReportStatsNotAvailable) {
607 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Eq(absl::nullopt));
608 }
609
610 // Checks that the remote sender stats are available if an RTCP SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsAvailable)611 TEST_F(RtpRtcpImplTest, SenderReportStatsAvailable) {
612 // Send a frame in order to send an SR.
613 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
614 // Send an SR.
615 ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
616 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Not(Eq(absl::nullopt)));
617 }
618
619 // Checks that the remote sender stats are not available if an RTCP SR with an
620 // unexpected SSRC is received.
TEST_F(RtpRtcpImplTest,SenderReportStatsNotUpdatedWithUnexpectedSsrc)621 TEST_F(RtpRtcpImplTest, SenderReportStatsNotUpdatedWithUnexpectedSsrc) {
622 constexpr uint32_t kUnexpectedSenderSsrc = 0x87654321;
623 static_assert(kUnexpectedSenderSsrc != kSenderSsrc, "");
624 // Forge a sender report and pass it to the receiver as if an RTCP SR were
625 // sent by an unexpected sender.
626 rtcp::SenderReport sr;
627 sr.SetSenderSsrc(kUnexpectedSenderSsrc);
628 sr.SetNtp({/*seconds=*/1u, /*fractions=*/1u << 31});
629 sr.SetPacketCount(123u);
630 sr.SetOctetCount(456u);
631 auto raw_packet = sr.Build();
632 receiver_.impl_->IncomingRtcpPacket(raw_packet.data(), raw_packet.size());
633 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Eq(absl::nullopt));
634 }
635
636 // Checks the stats derived from the last received RTCP SR are set correctly.
TEST_F(RtpRtcpImplTest,SenderReportStatsCheckStatsFromLastReport)637 TEST_F(RtpRtcpImplTest, SenderReportStatsCheckStatsFromLastReport) {
638 using SenderReportStats = RtpRtcpInterface::SenderReportStats;
639 const NtpTime ntp(/*seconds=*/1u, /*fractions=*/1u << 31);
640 constexpr uint32_t kPacketCount = 123u;
641 constexpr uint32_t kOctetCount = 456u;
642 // Forge a sender report and pass it to the receiver as if an RTCP SR were
643 // sent by the sender.
644 rtcp::SenderReport sr;
645 sr.SetSenderSsrc(kSenderSsrc);
646 sr.SetNtp(ntp);
647 sr.SetPacketCount(kPacketCount);
648 sr.SetOctetCount(kOctetCount);
649 auto raw_packet = sr.Build();
650 receiver_.impl_->IncomingRtcpPacket(raw_packet.data(), raw_packet.size());
651
652 EXPECT_THAT(
653 receiver_.impl_->GetSenderReportStats(),
654 Optional(AllOf(Field(&SenderReportStats::last_remote_timestamp, Eq(ntp)),
655 Field(&SenderReportStats::packets_sent, Eq(kPacketCount)),
656 Field(&SenderReportStats::bytes_sent, Eq(kOctetCount)))));
657 }
658
659 // Checks that the remote sender stats count equals the number of sent RTCP SRs.
TEST_F(RtpRtcpImplTest,SenderReportStatsCount)660 TEST_F(RtpRtcpImplTest, SenderReportStatsCount) {
661 using SenderReportStats = RtpRtcpInterface::SenderReportStats;
662 // Send a frame in order to send an SR.
663 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
664 // Send the first SR.
665 ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
666 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
667 Optional(Field(&SenderReportStats::reports_count, Eq(1u))));
668 // Send the second SR.
669 ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
670 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
671 Optional(Field(&SenderReportStats::reports_count, Eq(2u))));
672 }
673
674 // Checks that the remote sender stats include a valid arrival time if an RTCP
675 // SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsArrivalTimestampSet)676 TEST_F(RtpRtcpImplTest, SenderReportStatsArrivalTimestampSet) {
677 // Send a frame in order to send an SR.
678 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
679 // Send an SR.
680 ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
681 auto stats = receiver_.impl_->GetSenderReportStats();
682 ASSERT_THAT(stats, Not(Eq(absl::nullopt)));
683 EXPECT_TRUE(stats->last_arrival_timestamp.Valid());
684 }
685
686 // Checks that the packet and byte counters from an RTCP SR are not zero once
687 // a frame is sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsPacketByteCounters)688 TEST_F(RtpRtcpImplTest, SenderReportStatsPacketByteCounters) {
689 using SenderReportStats = RtpRtcpInterface::SenderReportStats;
690 // Send a frame in order to send an SR.
691 SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
692 ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0));
693 // Advance time otherwise the RTCP SR report will not include any packets
694 // generated by `SendFrame()`.
695 clock_.AdvanceTimeMilliseconds(1);
696 // Send an SR.
697 ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
698 EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
699 Optional(AllOf(Field(&SenderReportStats::packets_sent, Gt(0u)),
700 Field(&SenderReportStats::bytes_sent, Gt(0u)))));
701 }
702
703 #pragma clang diagnostic pop
704
705 } // namespace webrtc
706