blob: 0fd3d3252bd6ce947b228b175f251245ddb5f5d7 [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 {
31 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
32 sequence_numbers.end());
33 }
34
35 void RequestKeyFrame() override { ++keyframes_requested_; }
36
37 std::unique_ptr<SimulatedClock> clock_;
38 NackModule nack_module_;
39 std::vector<uint16_t> sent_nacks_;
40 int keyframes_requested_;
41};
42
43TEST_F(TestNackModule, NackOnePacket) {
Ying Wangb32bb952018-10-31 10:12:27 +010044 nack_module_.OnReceivedPacket(1, false, false);
45 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080046 EXPECT_EQ(1u, sent_nacks_.size());
47 EXPECT_EQ(2, sent_nacks_[0]);
48}
49
50TEST_F(TestNackModule, WrappingSeqNum) {
Ying Wangb32bb952018-10-31 10:12:27 +010051 nack_module_.OnReceivedPacket(0xfffe, false, false);
52 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080053 EXPECT_EQ(2u, sent_nacks_.size());
54 EXPECT_EQ(0xffff, sent_nacks_[0]);
55 EXPECT_EQ(0, sent_nacks_[1]);
56}
57
58TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
Ying Wangb32bb952018-10-31 10:12:27 +010059 nack_module_.OnReceivedPacket(0xfffe, false, false);
60 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080061 EXPECT_EQ(2u, sent_nacks_.size());
62 EXPECT_EQ(0xffff, sent_nacks_[0]);
63 EXPECT_EQ(0, sent_nacks_[1]);
64
65 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010066 nack_module_.OnReceivedPacket(2, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080067 EXPECT_EQ(0u, sent_nacks_.size());
68
Ying Wangb32bb952018-10-31 10:12:27 +010069 nack_module_.OnReceivedPacket(501, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080070 EXPECT_EQ(498u, sent_nacks_.size());
71 for (int seq_num = 3; seq_num < 501; ++seq_num)
72 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
73
74 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010075 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080076 EXPECT_EQ(499u, sent_nacks_.size());
77 for (int seq_num = 502; seq_num < 1001; ++seq_num)
78 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
79
80 sent_nacks_.clear();
81 clock_->AdvanceTimeMilliseconds(100);
82 nack_module_.Process();
83 EXPECT_EQ(999u, sent_nacks_.size());
84 EXPECT_EQ(0xffff, sent_nacks_[0]);
85 EXPECT_EQ(0, sent_nacks_[1]);
86 for (int seq_num = 3; seq_num < 501; ++seq_num)
87 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
88 for (int seq_num = 502; seq_num < 1001; ++seq_num)
89 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
90
91 // Adding packet 1004 will cause the nack list to reach it's max limit.
92 // It will then clear all nacks up to the next keyframe (seq num 2),
93 // thus removing 0xffff and 0 from the nack list.
94 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010095 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080096 EXPECT_EQ(2u, sent_nacks_.size());
97 EXPECT_EQ(1002, sent_nacks_[0]);
98 EXPECT_EQ(1003, sent_nacks_[1]);
99
100 sent_nacks_.clear();
101 clock_->AdvanceTimeMilliseconds(100);
102 nack_module_.Process();
103 EXPECT_EQ(999u, sent_nacks_.size());
104 for (int seq_num = 3; seq_num < 501; ++seq_num)
105 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
106 for (int seq_num = 502; seq_num < 1001; ++seq_num)
107 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
108
109 // Adding packet 1007 will cause the nack module to overflow again, thus
110 // clearing everything up to 501 which is the next keyframe.
Ying Wangb32bb952018-10-31 10:12:27 +0100111 nack_module_.OnReceivedPacket(1007, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800112 sent_nacks_.clear();
113 clock_->AdvanceTimeMilliseconds(100);
114 nack_module_.Process();
115 EXPECT_EQ(503u, sent_nacks_.size());
116 for (int seq_num = 502; seq_num < 1001; ++seq_num)
117 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
118 EXPECT_EQ(1005, sent_nacks_[501]);
119 EXPECT_EQ(1006, sent_nacks_[502]);
120}
121
122TEST_F(TestNackModule, DontBurstOnTimeSkip) {
123 nack_module_.Process();
124 clock_->AdvanceTimeMilliseconds(20);
125 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
126 nack_module_.Process();
127
128 clock_->AdvanceTimeMilliseconds(100);
129 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
130 nack_module_.Process();
131 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
132
133 clock_->AdvanceTimeMilliseconds(19);
134 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
135 clock_->AdvanceTimeMilliseconds(2);
136 nack_module_.Process();
137 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
138
139 clock_->AdvanceTimeMilliseconds(19);
140 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
141 nack_module_.Process();
142
143 clock_->AdvanceTimeMilliseconds(21);
144 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
145 nack_module_.Process();
146 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
147}
148
149TEST_F(TestNackModule, ResendNack) {
Ying Wangb32bb952018-10-31 10:12:27 +0100150 nack_module_.OnReceivedPacket(1, false, false);
151 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800152 EXPECT_EQ(1u, sent_nacks_.size());
153 EXPECT_EQ(2, sent_nacks_[0]);
154
155 // Default RTT is 100
156 clock_->AdvanceTimeMilliseconds(99);
157 nack_module_.Process();
158 EXPECT_EQ(1u, sent_nacks_.size());
159
160 clock_->AdvanceTimeMilliseconds(1);
161 nack_module_.Process();
162 EXPECT_EQ(2u, sent_nacks_.size());
163
164 nack_module_.UpdateRtt(50);
165 clock_->AdvanceTimeMilliseconds(100);
166 nack_module_.Process();
167 EXPECT_EQ(3u, sent_nacks_.size());
168
169 clock_->AdvanceTimeMilliseconds(50);
170 nack_module_.Process();
171 EXPECT_EQ(4u, sent_nacks_.size());
172
Ying Wangb32bb952018-10-31 10:12:27 +0100173 nack_module_.OnReceivedPacket(2, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800174 clock_->AdvanceTimeMilliseconds(50);
175 nack_module_.Process();
176 EXPECT_EQ(4u, sent_nacks_.size());
177}
178
179TEST_F(TestNackModule, ResendPacketMaxRetries) {
Ying Wangb32bb952018-10-31 10:12:27 +0100180 nack_module_.OnReceivedPacket(1, false, false);
181 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800182 EXPECT_EQ(1u, sent_nacks_.size());
183 EXPECT_EQ(2, sent_nacks_[0]);
184
185 for (size_t retries = 1; retries < 10; ++retries) {
186 clock_->AdvanceTimeMilliseconds(100);
187 nack_module_.Process();
188 EXPECT_EQ(retries + 1, sent_nacks_.size());
189 }
190
191 clock_->AdvanceTimeMilliseconds(100);
192 nack_module_.Process();
193 EXPECT_EQ(10u, sent_nacks_.size());
194}
195
196TEST_F(TestNackModule, TooLargeNackList) {
Ying Wangb32bb952018-10-31 10:12:27 +0100197 nack_module_.OnReceivedPacket(0, false, false);
198 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800199 EXPECT_EQ(1000u, sent_nacks_.size());
200 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100201 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800202 EXPECT_EQ(1000u, sent_nacks_.size());
203 EXPECT_EQ(1, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100204 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800205 EXPECT_EQ(1000u, sent_nacks_.size());
206 EXPECT_EQ(1, keyframes_requested_);
207}
208
209TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
Ying Wangb32bb952018-10-31 10:12:27 +0100210 nack_module_.OnReceivedPacket(0, false, false);
211 nack_module_.OnReceivedPacket(1, true, false);
212 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800213 EXPECT_EQ(999u, sent_nacks_.size());
214 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100215 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800216 EXPECT_EQ(1000u, sent_nacks_.size());
217 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100218 nack_module_.OnReceivedPacket(1005, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800219 EXPECT_EQ(1000u, sent_nacks_.size());
220 EXPECT_EQ(1, keyframes_requested_);
221}
222
223TEST_F(TestNackModule, ClearUpTo) {
Ying Wangb32bb952018-10-31 10:12:27 +0100224 nack_module_.OnReceivedPacket(0, false, false);
225 nack_module_.OnReceivedPacket(100, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800226 EXPECT_EQ(99u, sent_nacks_.size());
227
228 sent_nacks_.clear();
229 clock_->AdvanceTimeMilliseconds(100);
230 nack_module_.ClearUpTo(50);
231 nack_module_.Process();
232 EXPECT_EQ(50u, sent_nacks_.size());
233 EXPECT_EQ(50, sent_nacks_[0]);
234}
235
236TEST_F(TestNackModule, ClearUpToWrap) {
Ying Wangb32bb952018-10-31 10:12:27 +0100237 nack_module_.OnReceivedPacket(0xfff0, false, false);
238 nack_module_.OnReceivedPacket(0xf, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800239 EXPECT_EQ(30u, sent_nacks_.size());
240
241 sent_nacks_.clear();
242 clock_->AdvanceTimeMilliseconds(100);
243 nack_module_.ClearUpTo(0);
244 nack_module_.Process();
245 EXPECT_EQ(15u, sent_nacks_.size());
246 EXPECT_EQ(0, sent_nacks_[0]);
247}
248
philipel1a830c22016-05-13 11:12:00 +0200249TEST_F(TestNackModule, PacketNackCount) {
Ying Wangb32bb952018-10-31 10:12:27 +0100250 EXPECT_EQ(0, nack_module_.OnReceivedPacket(0, false, false));
251 EXPECT_EQ(0, nack_module_.OnReceivedPacket(2, false, false));
252 EXPECT_EQ(1, nack_module_.OnReceivedPacket(1, false, false));
philipel1a830c22016-05-13 11:12:00 +0200253
254 sent_nacks_.clear();
255 nack_module_.UpdateRtt(100);
Ying Wangb32bb952018-10-31 10:12:27 +0100256 EXPECT_EQ(0, nack_module_.OnReceivedPacket(5, false, false));
philipel1a830c22016-05-13 11:12:00 +0200257 clock_->AdvanceTimeMilliseconds(100);
258 nack_module_.Process();
259 clock_->AdvanceTimeMilliseconds(100);
260 nack_module_.Process();
Ying Wangb32bb952018-10-31 10:12:27 +0100261 EXPECT_EQ(3, nack_module_.OnReceivedPacket(3, false, false));
262 EXPECT_EQ(3, nack_module_.OnReceivedPacket(4, false, false));
263 EXPECT_EQ(0, nack_module_.OnReceivedPacket(4, false, false));
philipel1a830c22016-05-13 11:12:00 +0200264}
265
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200266TEST_F(TestNackModule, NackListFullAndNoOverlapWithKeyframes) {
267 const int kMaxNackPackets = 1000;
268 const unsigned int kFirstGap = kMaxNackPackets - 20;
269 const unsigned int kSecondGap = 200;
270 uint16_t seq_num = 0;
Ying Wangb32bb952018-10-31 10:12:27 +0100271 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200272 seq_num += kFirstGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100273 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200274 EXPECT_EQ(kFirstGap, sent_nacks_.size());
275 sent_nacks_.clear();
276 seq_num += kSecondGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100277 nack_module_.OnReceivedPacket(seq_num, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200278 EXPECT_EQ(kSecondGap, sent_nacks_.size());
279}
280
Ying Wangb32bb952018-10-31 10:12:27 +0100281TEST_F(TestNackModule, HandleFecRecoveredPacket) {
282 nack_module_.OnReceivedPacket(1, false, false);
283 nack_module_.OnReceivedPacket(4, false, true);
284 EXPECT_EQ(0u, sent_nacks_.size());
285 nack_module_.OnReceivedPacket(5, false, false);
286 EXPECT_EQ(2u, sent_nacks_.size());
287}
288
Ying Wang0367d1a2018-11-02 14:51:15 +0100289TEST_F(TestNackModule, SendNackWithoutDelay) {
290 nack_module_.OnReceivedPacket(0, false, false);
291 nack_module_.OnReceivedPacket(100, false, false);
292 EXPECT_EQ(99u, sent_nacks_.size());
293}
294
295class TestNackModuleWithFieldTrial : public ::testing::Test,
296 public NackSender,
297 public KeyFrameRequestSender {
298 protected:
299 TestNackModuleWithFieldTrial()
300 : nack_delay_field_trial_("WebRTC-SendNackDelayMs/10/"),
301 clock_(new SimulatedClock(0)),
302 nack_module_(clock_.get(), this, this),
303 keyframes_requested_(0) {}
304
305 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
306 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
307 sequence_numbers.end());
308 }
309
310 void RequestKeyFrame() override { ++keyframes_requested_; }
311
312 test::ScopedFieldTrials nack_delay_field_trial_;
313 std::unique_ptr<SimulatedClock> clock_;
314 NackModule nack_module_;
315 std::vector<uint16_t> sent_nacks_;
316 int keyframes_requested_;
317};
318
319TEST_F(TestNackModuleWithFieldTrial, SendNackWithDelay) {
320 nack_module_.OnReceivedPacket(0, false, false);
321 nack_module_.OnReceivedPacket(100, false, false);
322 EXPECT_EQ(0u, sent_nacks_.size());
323 clock_->AdvanceTimeMilliseconds(10);
324 nack_module_.OnReceivedPacket(106, false, false);
325 EXPECT_EQ(99u, sent_nacks_.size());
326 clock_->AdvanceTimeMilliseconds(10);
327 nack_module_.OnReceivedPacket(109, false, false);
328 EXPECT_EQ(104u, sent_nacks_.size());
329}
philipel5ab4c6d2016-03-08 03:36:15 -0800330} // namespace webrtc