blob: 5d88702f53faf32656f09aeeeccbbf2636a09efc [file] [log] [blame]
philipel5ab4c6d2016-03-08 03:36:15 -08001/*
2 * Copyright (c) 2016 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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <cstdint>
philipel5ab4c6d2016-03-08 03:36:15 -080012#include <cstring>
kwiberg22feaa32016-03-17 09:17:43 -070013#include <memory>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/video_coding/nack_module.h"
16#include "system_wrappers/include/clock.h"
Ying Wang0367d1a2018-11-02 14:51:15 +010017#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gtest.h"
philipel5ab4c6d2016-03-08 03:36:15 -080019
20namespace webrtc {
21class TestNackModule : public ::testing::Test,
22 public NackSender,
23 public KeyFrameRequestSender {
24 protected:
25 TestNackModule()
26 : clock_(new SimulatedClock(0)),
27 nack_module_(clock_.get(), this, this),
28 keyframes_requested_(0) {}
29
30 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
Elad Alonef09c5b2019-05-31 13:25:50 +020031 RTC_NOTREACHED();
32 }
33
34 void SendNack(const std::vector<uint16_t>& sequence_numbers,
35 bool buffering_allowed) override {
philipel5ab4c6d2016-03-08 03:36:15 -080036 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
37 sequence_numbers.end());
38 }
39
40 void RequestKeyFrame() override { ++keyframes_requested_; }
41
42 std::unique_ptr<SimulatedClock> clock_;
43 NackModule nack_module_;
44 std::vector<uint16_t> sent_nacks_;
45 int keyframes_requested_;
46};
47
48TEST_F(TestNackModule, NackOnePacket) {
Ying Wangb32bb952018-10-31 10:12:27 +010049 nack_module_.OnReceivedPacket(1, false, false);
50 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080051 EXPECT_EQ(1u, sent_nacks_.size());
52 EXPECT_EQ(2, sent_nacks_[0]);
53}
54
55TEST_F(TestNackModule, WrappingSeqNum) {
Ying Wangb32bb952018-10-31 10:12:27 +010056 nack_module_.OnReceivedPacket(0xfffe, false, false);
57 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080058 EXPECT_EQ(2u, sent_nacks_.size());
59 EXPECT_EQ(0xffff, sent_nacks_[0]);
60 EXPECT_EQ(0, sent_nacks_[1]);
61}
62
63TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
Ying Wangb32bb952018-10-31 10:12:27 +010064 nack_module_.OnReceivedPacket(0xfffe, false, false);
65 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080066 EXPECT_EQ(2u, sent_nacks_.size());
67 EXPECT_EQ(0xffff, sent_nacks_[0]);
68 EXPECT_EQ(0, sent_nacks_[1]);
69
70 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010071 nack_module_.OnReceivedPacket(2, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080072 EXPECT_EQ(0u, sent_nacks_.size());
73
Ying Wangb32bb952018-10-31 10:12:27 +010074 nack_module_.OnReceivedPacket(501, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080075 EXPECT_EQ(498u, sent_nacks_.size());
76 for (int seq_num = 3; seq_num < 501; ++seq_num)
77 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
78
79 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010080 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080081 EXPECT_EQ(499u, sent_nacks_.size());
82 for (int seq_num = 502; seq_num < 1001; ++seq_num)
83 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
84
85 sent_nacks_.clear();
86 clock_->AdvanceTimeMilliseconds(100);
87 nack_module_.Process();
88 EXPECT_EQ(999u, sent_nacks_.size());
89 EXPECT_EQ(0xffff, sent_nacks_[0]);
90 EXPECT_EQ(0, sent_nacks_[1]);
91 for (int seq_num = 3; seq_num < 501; ++seq_num)
92 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
93 for (int seq_num = 502; seq_num < 1001; ++seq_num)
94 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
95
96 // Adding packet 1004 will cause the nack list to reach it's max limit.
97 // It will then clear all nacks up to the next keyframe (seq num 2),
98 // thus removing 0xffff and 0 from the nack list.
99 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +0100100 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800101 EXPECT_EQ(2u, sent_nacks_.size());
102 EXPECT_EQ(1002, sent_nacks_[0]);
103 EXPECT_EQ(1003, sent_nacks_[1]);
104
105 sent_nacks_.clear();
106 clock_->AdvanceTimeMilliseconds(100);
107 nack_module_.Process();
108 EXPECT_EQ(999u, sent_nacks_.size());
109 for (int seq_num = 3; seq_num < 501; ++seq_num)
110 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
111 for (int seq_num = 502; seq_num < 1001; ++seq_num)
112 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
113
114 // Adding packet 1007 will cause the nack module to overflow again, thus
115 // clearing everything up to 501 which is the next keyframe.
Ying Wangb32bb952018-10-31 10:12:27 +0100116 nack_module_.OnReceivedPacket(1007, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800117 sent_nacks_.clear();
118 clock_->AdvanceTimeMilliseconds(100);
119 nack_module_.Process();
120 EXPECT_EQ(503u, sent_nacks_.size());
121 for (int seq_num = 502; seq_num < 1001; ++seq_num)
122 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
123 EXPECT_EQ(1005, sent_nacks_[501]);
124 EXPECT_EQ(1006, sent_nacks_[502]);
125}
126
127TEST_F(TestNackModule, DontBurstOnTimeSkip) {
128 nack_module_.Process();
129 clock_->AdvanceTimeMilliseconds(20);
130 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
131 nack_module_.Process();
132
133 clock_->AdvanceTimeMilliseconds(100);
134 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
135 nack_module_.Process();
136 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
137
138 clock_->AdvanceTimeMilliseconds(19);
139 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
140 clock_->AdvanceTimeMilliseconds(2);
141 nack_module_.Process();
142 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
143
144 clock_->AdvanceTimeMilliseconds(19);
145 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
146 nack_module_.Process();
147
148 clock_->AdvanceTimeMilliseconds(21);
149 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
150 nack_module_.Process();
151 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
152}
153
154TEST_F(TestNackModule, ResendNack) {
Ying Wangb32bb952018-10-31 10:12:27 +0100155 nack_module_.OnReceivedPacket(1, false, false);
156 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800157 EXPECT_EQ(1u, sent_nacks_.size());
158 EXPECT_EQ(2, sent_nacks_[0]);
159
160 // Default RTT is 100
161 clock_->AdvanceTimeMilliseconds(99);
162 nack_module_.Process();
163 EXPECT_EQ(1u, sent_nacks_.size());
164
165 clock_->AdvanceTimeMilliseconds(1);
166 nack_module_.Process();
167 EXPECT_EQ(2u, sent_nacks_.size());
168
169 nack_module_.UpdateRtt(50);
170 clock_->AdvanceTimeMilliseconds(100);
171 nack_module_.Process();
172 EXPECT_EQ(3u, sent_nacks_.size());
173
174 clock_->AdvanceTimeMilliseconds(50);
175 nack_module_.Process();
176 EXPECT_EQ(4u, sent_nacks_.size());
177
Ying Wangb32bb952018-10-31 10:12:27 +0100178 nack_module_.OnReceivedPacket(2, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800179 clock_->AdvanceTimeMilliseconds(50);
180 nack_module_.Process();
181 EXPECT_EQ(4u, sent_nacks_.size());
182}
183
184TEST_F(TestNackModule, ResendPacketMaxRetries) {
Ying Wangb32bb952018-10-31 10:12:27 +0100185 nack_module_.OnReceivedPacket(1, false, false);
186 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800187 EXPECT_EQ(1u, sent_nacks_.size());
188 EXPECT_EQ(2, sent_nacks_[0]);
189
190 for (size_t retries = 1; retries < 10; ++retries) {
191 clock_->AdvanceTimeMilliseconds(100);
192 nack_module_.Process();
193 EXPECT_EQ(retries + 1, sent_nacks_.size());
194 }
195
196 clock_->AdvanceTimeMilliseconds(100);
197 nack_module_.Process();
198 EXPECT_EQ(10u, sent_nacks_.size());
199}
200
201TEST_F(TestNackModule, TooLargeNackList) {
Ying Wangb32bb952018-10-31 10:12:27 +0100202 nack_module_.OnReceivedPacket(0, false, false);
203 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800204 EXPECT_EQ(1000u, sent_nacks_.size());
205 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100206 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800207 EXPECT_EQ(1000u, sent_nacks_.size());
208 EXPECT_EQ(1, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100209 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800210 EXPECT_EQ(1000u, sent_nacks_.size());
211 EXPECT_EQ(1, keyframes_requested_);
212}
213
214TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
Ying Wangb32bb952018-10-31 10:12:27 +0100215 nack_module_.OnReceivedPacket(0, false, false);
216 nack_module_.OnReceivedPacket(1, true, false);
217 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800218 EXPECT_EQ(999u, sent_nacks_.size());
219 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100220 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800221 EXPECT_EQ(1000u, sent_nacks_.size());
222 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100223 nack_module_.OnReceivedPacket(1005, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800224 EXPECT_EQ(1000u, sent_nacks_.size());
225 EXPECT_EQ(1, keyframes_requested_);
226}
227
228TEST_F(TestNackModule, ClearUpTo) {
Ying Wangb32bb952018-10-31 10:12:27 +0100229 nack_module_.OnReceivedPacket(0, false, false);
230 nack_module_.OnReceivedPacket(100, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800231 EXPECT_EQ(99u, sent_nacks_.size());
232
233 sent_nacks_.clear();
234 clock_->AdvanceTimeMilliseconds(100);
235 nack_module_.ClearUpTo(50);
236 nack_module_.Process();
237 EXPECT_EQ(50u, sent_nacks_.size());
238 EXPECT_EQ(50, sent_nacks_[0]);
239}
240
241TEST_F(TestNackModule, ClearUpToWrap) {
Ying Wangb32bb952018-10-31 10:12:27 +0100242 nack_module_.OnReceivedPacket(0xfff0, false, false);
243 nack_module_.OnReceivedPacket(0xf, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800244 EXPECT_EQ(30u, sent_nacks_.size());
245
246 sent_nacks_.clear();
247 clock_->AdvanceTimeMilliseconds(100);
248 nack_module_.ClearUpTo(0);
249 nack_module_.Process();
250 EXPECT_EQ(15u, sent_nacks_.size());
251 EXPECT_EQ(0, sent_nacks_[0]);
252}
253
philipel1a830c22016-05-13 11:12:00 +0200254TEST_F(TestNackModule, PacketNackCount) {
Ying Wangb32bb952018-10-31 10:12:27 +0100255 EXPECT_EQ(0, nack_module_.OnReceivedPacket(0, false, false));
256 EXPECT_EQ(0, nack_module_.OnReceivedPacket(2, false, false));
257 EXPECT_EQ(1, nack_module_.OnReceivedPacket(1, false, false));
philipel1a830c22016-05-13 11:12:00 +0200258
259 sent_nacks_.clear();
260 nack_module_.UpdateRtt(100);
Ying Wangb32bb952018-10-31 10:12:27 +0100261 EXPECT_EQ(0, nack_module_.OnReceivedPacket(5, false, false));
philipel1a830c22016-05-13 11:12:00 +0200262 clock_->AdvanceTimeMilliseconds(100);
263 nack_module_.Process();
264 clock_->AdvanceTimeMilliseconds(100);
265 nack_module_.Process();
Ying Wangb32bb952018-10-31 10:12:27 +0100266 EXPECT_EQ(3, nack_module_.OnReceivedPacket(3, false, false));
267 EXPECT_EQ(3, nack_module_.OnReceivedPacket(4, false, false));
268 EXPECT_EQ(0, nack_module_.OnReceivedPacket(4, false, false));
philipel1a830c22016-05-13 11:12:00 +0200269}
270
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200271TEST_F(TestNackModule, NackListFullAndNoOverlapWithKeyframes) {
272 const int kMaxNackPackets = 1000;
273 const unsigned int kFirstGap = kMaxNackPackets - 20;
274 const unsigned int kSecondGap = 200;
275 uint16_t seq_num = 0;
Ying Wangb32bb952018-10-31 10:12:27 +0100276 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200277 seq_num += kFirstGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100278 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200279 EXPECT_EQ(kFirstGap, sent_nacks_.size());
280 sent_nacks_.clear();
281 seq_num += kSecondGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100282 nack_module_.OnReceivedPacket(seq_num, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200283 EXPECT_EQ(kSecondGap, sent_nacks_.size());
284}
285
Ying Wangb32bb952018-10-31 10:12:27 +0100286TEST_F(TestNackModule, HandleFecRecoveredPacket) {
287 nack_module_.OnReceivedPacket(1, false, false);
288 nack_module_.OnReceivedPacket(4, false, true);
289 EXPECT_EQ(0u, sent_nacks_.size());
290 nack_module_.OnReceivedPacket(5, false, false);
291 EXPECT_EQ(2u, sent_nacks_.size());
292}
293
Ying Wang0367d1a2018-11-02 14:51:15 +0100294TEST_F(TestNackModule, SendNackWithoutDelay) {
295 nack_module_.OnReceivedPacket(0, false, false);
296 nack_module_.OnReceivedPacket(100, false, false);
297 EXPECT_EQ(99u, sent_nacks_.size());
298}
299
300class TestNackModuleWithFieldTrial : public ::testing::Test,
301 public NackSender,
302 public KeyFrameRequestSender {
303 protected:
304 TestNackModuleWithFieldTrial()
305 : nack_delay_field_trial_("WebRTC-SendNackDelayMs/10/"),
306 clock_(new SimulatedClock(0)),
307 nack_module_(clock_.get(), this, this),
308 keyframes_requested_(0) {}
309
310 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
Elad Alonef09c5b2019-05-31 13:25:50 +0200311 RTC_NOTREACHED();
312 }
313
314 void SendNack(const std::vector<uint16_t>& sequence_numbers,
315 bool buffering_allowed) override {
Ying Wang0367d1a2018-11-02 14:51:15 +0100316 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
317 sequence_numbers.end());
318 }
319
320 void RequestKeyFrame() override { ++keyframes_requested_; }
321
322 test::ScopedFieldTrials nack_delay_field_trial_;
323 std::unique_ptr<SimulatedClock> clock_;
324 NackModule nack_module_;
325 std::vector<uint16_t> sent_nacks_;
326 int keyframes_requested_;
327};
328
329TEST_F(TestNackModuleWithFieldTrial, SendNackWithDelay) {
330 nack_module_.OnReceivedPacket(0, false, false);
331 nack_module_.OnReceivedPacket(100, false, false);
332 EXPECT_EQ(0u, sent_nacks_.size());
333 clock_->AdvanceTimeMilliseconds(10);
334 nack_module_.OnReceivedPacket(106, false, false);
335 EXPECT_EQ(99u, sent_nacks_.size());
336 clock_->AdvanceTimeMilliseconds(10);
337 nack_module_.OnReceivedPacket(109, false, false);
338 EXPECT_EQ(104u, sent_nacks_.size());
339}
philipel5ab4c6d2016-03-08 03:36:15 -0800340} // namespace webrtc