blob: 8aad2324c4ebd7c819ec2f3ecd1350805054877e [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
Elad Alonef09c5b2019-05-31 13:25:50 +020030 void SendNack(const std::vector<uint16_t>& sequence_numbers,
31 bool buffering_allowed) override {
philipel5ab4c6d2016-03-08 03:36:15 -080032 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
33 sequence_numbers.end());
34 }
35
36 void RequestKeyFrame() override { ++keyframes_requested_; }
37
38 std::unique_ptr<SimulatedClock> clock_;
39 NackModule nack_module_;
40 std::vector<uint16_t> sent_nacks_;
41 int keyframes_requested_;
42};
43
44TEST_F(TestNackModule, NackOnePacket) {
Ying Wangb32bb952018-10-31 10:12:27 +010045 nack_module_.OnReceivedPacket(1, false, false);
46 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080047 EXPECT_EQ(1u, sent_nacks_.size());
48 EXPECT_EQ(2, sent_nacks_[0]);
49}
50
51TEST_F(TestNackModule, WrappingSeqNum) {
Ying Wangb32bb952018-10-31 10:12:27 +010052 nack_module_.OnReceivedPacket(0xfffe, false, false);
53 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080054 EXPECT_EQ(2u, sent_nacks_.size());
55 EXPECT_EQ(0xffff, sent_nacks_[0]);
56 EXPECT_EQ(0, sent_nacks_[1]);
57}
58
59TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
Ying Wangb32bb952018-10-31 10:12:27 +010060 nack_module_.OnReceivedPacket(0xfffe, false, false);
61 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080062 EXPECT_EQ(2u, sent_nacks_.size());
63 EXPECT_EQ(0xffff, sent_nacks_[0]);
64 EXPECT_EQ(0, sent_nacks_[1]);
65
66 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010067 nack_module_.OnReceivedPacket(2, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080068 EXPECT_EQ(0u, sent_nacks_.size());
69
Ying Wangb32bb952018-10-31 10:12:27 +010070 nack_module_.OnReceivedPacket(501, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080071 EXPECT_EQ(498u, sent_nacks_.size());
72 for (int seq_num = 3; seq_num < 501; ++seq_num)
73 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
74
75 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010076 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080077 EXPECT_EQ(499u, sent_nacks_.size());
78 for (int seq_num = 502; seq_num < 1001; ++seq_num)
79 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
80
81 sent_nacks_.clear();
82 clock_->AdvanceTimeMilliseconds(100);
83 nack_module_.Process();
84 EXPECT_EQ(999u, sent_nacks_.size());
85 EXPECT_EQ(0xffff, sent_nacks_[0]);
86 EXPECT_EQ(0, sent_nacks_[1]);
87 for (int seq_num = 3; seq_num < 501; ++seq_num)
88 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
89 for (int seq_num = 502; seq_num < 1001; ++seq_num)
90 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
91
92 // Adding packet 1004 will cause the nack list to reach it's max limit.
93 // It will then clear all nacks up to the next keyframe (seq num 2),
94 // thus removing 0xffff and 0 from the nack list.
95 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010096 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080097 EXPECT_EQ(2u, sent_nacks_.size());
98 EXPECT_EQ(1002, sent_nacks_[0]);
99 EXPECT_EQ(1003, sent_nacks_[1]);
100
101 sent_nacks_.clear();
102 clock_->AdvanceTimeMilliseconds(100);
103 nack_module_.Process();
104 EXPECT_EQ(999u, sent_nacks_.size());
105 for (int seq_num = 3; seq_num < 501; ++seq_num)
106 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
107 for (int seq_num = 502; seq_num < 1001; ++seq_num)
108 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
109
110 // Adding packet 1007 will cause the nack module to overflow again, thus
111 // clearing everything up to 501 which is the next keyframe.
Ying Wangb32bb952018-10-31 10:12:27 +0100112 nack_module_.OnReceivedPacket(1007, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800113 sent_nacks_.clear();
114 clock_->AdvanceTimeMilliseconds(100);
115 nack_module_.Process();
116 EXPECT_EQ(503u, sent_nacks_.size());
117 for (int seq_num = 502; seq_num < 1001; ++seq_num)
118 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
119 EXPECT_EQ(1005, sent_nacks_[501]);
120 EXPECT_EQ(1006, sent_nacks_[502]);
121}
122
123TEST_F(TestNackModule, DontBurstOnTimeSkip) {
124 nack_module_.Process();
125 clock_->AdvanceTimeMilliseconds(20);
126 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
127 nack_module_.Process();
128
129 clock_->AdvanceTimeMilliseconds(100);
130 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
131 nack_module_.Process();
132 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
133
134 clock_->AdvanceTimeMilliseconds(19);
135 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
136 clock_->AdvanceTimeMilliseconds(2);
137 nack_module_.Process();
138 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
139
140 clock_->AdvanceTimeMilliseconds(19);
141 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
142 nack_module_.Process();
143
144 clock_->AdvanceTimeMilliseconds(21);
145 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
146 nack_module_.Process();
147 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
148}
149
150TEST_F(TestNackModule, ResendNack) {
Ying Wangb32bb952018-10-31 10:12:27 +0100151 nack_module_.OnReceivedPacket(1, false, false);
152 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800153 EXPECT_EQ(1u, sent_nacks_.size());
154 EXPECT_EQ(2, sent_nacks_[0]);
155
156 // Default RTT is 100
157 clock_->AdvanceTimeMilliseconds(99);
158 nack_module_.Process();
159 EXPECT_EQ(1u, sent_nacks_.size());
160
161 clock_->AdvanceTimeMilliseconds(1);
162 nack_module_.Process();
163 EXPECT_EQ(2u, sent_nacks_.size());
164
165 nack_module_.UpdateRtt(50);
166 clock_->AdvanceTimeMilliseconds(100);
167 nack_module_.Process();
168 EXPECT_EQ(3u, sent_nacks_.size());
169
170 clock_->AdvanceTimeMilliseconds(50);
171 nack_module_.Process();
172 EXPECT_EQ(4u, sent_nacks_.size());
173
Ying Wangb32bb952018-10-31 10:12:27 +0100174 nack_module_.OnReceivedPacket(2, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800175 clock_->AdvanceTimeMilliseconds(50);
176 nack_module_.Process();
177 EXPECT_EQ(4u, sent_nacks_.size());
178}
179
180TEST_F(TestNackModule, ResendPacketMaxRetries) {
Ying Wangb32bb952018-10-31 10:12:27 +0100181 nack_module_.OnReceivedPacket(1, false, false);
182 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800183 EXPECT_EQ(1u, sent_nacks_.size());
184 EXPECT_EQ(2, sent_nacks_[0]);
185
186 for (size_t retries = 1; retries < 10; ++retries) {
187 clock_->AdvanceTimeMilliseconds(100);
188 nack_module_.Process();
189 EXPECT_EQ(retries + 1, sent_nacks_.size());
190 }
191
192 clock_->AdvanceTimeMilliseconds(100);
193 nack_module_.Process();
194 EXPECT_EQ(10u, sent_nacks_.size());
195}
196
197TEST_F(TestNackModule, TooLargeNackList) {
Ying Wangb32bb952018-10-31 10:12:27 +0100198 nack_module_.OnReceivedPacket(0, false, false);
199 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800200 EXPECT_EQ(1000u, sent_nacks_.size());
201 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100202 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800203 EXPECT_EQ(1000u, sent_nacks_.size());
204 EXPECT_EQ(1, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100205 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800206 EXPECT_EQ(1000u, sent_nacks_.size());
207 EXPECT_EQ(1, keyframes_requested_);
208}
209
210TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
Ying Wangb32bb952018-10-31 10:12:27 +0100211 nack_module_.OnReceivedPacket(0, false, false);
212 nack_module_.OnReceivedPacket(1, true, false);
213 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800214 EXPECT_EQ(999u, sent_nacks_.size());
215 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100216 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800217 EXPECT_EQ(1000u, sent_nacks_.size());
218 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100219 nack_module_.OnReceivedPacket(1005, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800220 EXPECT_EQ(1000u, sent_nacks_.size());
221 EXPECT_EQ(1, keyframes_requested_);
222}
223
224TEST_F(TestNackModule, ClearUpTo) {
Ying Wangb32bb952018-10-31 10:12:27 +0100225 nack_module_.OnReceivedPacket(0, false, false);
226 nack_module_.OnReceivedPacket(100, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800227 EXPECT_EQ(99u, sent_nacks_.size());
228
229 sent_nacks_.clear();
230 clock_->AdvanceTimeMilliseconds(100);
231 nack_module_.ClearUpTo(50);
232 nack_module_.Process();
233 EXPECT_EQ(50u, sent_nacks_.size());
234 EXPECT_EQ(50, sent_nacks_[0]);
235}
236
237TEST_F(TestNackModule, ClearUpToWrap) {
Ying Wangb32bb952018-10-31 10:12:27 +0100238 nack_module_.OnReceivedPacket(0xfff0, false, false);
239 nack_module_.OnReceivedPacket(0xf, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800240 EXPECT_EQ(30u, sent_nacks_.size());
241
242 sent_nacks_.clear();
243 clock_->AdvanceTimeMilliseconds(100);
244 nack_module_.ClearUpTo(0);
245 nack_module_.Process();
246 EXPECT_EQ(15u, sent_nacks_.size());
247 EXPECT_EQ(0, sent_nacks_[0]);
248}
249
philipel1a830c22016-05-13 11:12:00 +0200250TEST_F(TestNackModule, PacketNackCount) {
Ying Wangb32bb952018-10-31 10:12:27 +0100251 EXPECT_EQ(0, nack_module_.OnReceivedPacket(0, false, false));
252 EXPECT_EQ(0, nack_module_.OnReceivedPacket(2, false, false));
253 EXPECT_EQ(1, nack_module_.OnReceivedPacket(1, false, false));
philipel1a830c22016-05-13 11:12:00 +0200254
255 sent_nacks_.clear();
256 nack_module_.UpdateRtt(100);
Ying Wangb32bb952018-10-31 10:12:27 +0100257 EXPECT_EQ(0, nack_module_.OnReceivedPacket(5, false, false));
philipel1a830c22016-05-13 11:12:00 +0200258 clock_->AdvanceTimeMilliseconds(100);
259 nack_module_.Process();
260 clock_->AdvanceTimeMilliseconds(100);
261 nack_module_.Process();
Ying Wangb32bb952018-10-31 10:12:27 +0100262 EXPECT_EQ(3, nack_module_.OnReceivedPacket(3, false, false));
263 EXPECT_EQ(3, nack_module_.OnReceivedPacket(4, false, false));
264 EXPECT_EQ(0, nack_module_.OnReceivedPacket(4, false, false));
philipel1a830c22016-05-13 11:12:00 +0200265}
266
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200267TEST_F(TestNackModule, NackListFullAndNoOverlapWithKeyframes) {
268 const int kMaxNackPackets = 1000;
269 const unsigned int kFirstGap = kMaxNackPackets - 20;
270 const unsigned int kSecondGap = 200;
271 uint16_t seq_num = 0;
Ying Wangb32bb952018-10-31 10:12:27 +0100272 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200273 seq_num += kFirstGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100274 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200275 EXPECT_EQ(kFirstGap, sent_nacks_.size());
276 sent_nacks_.clear();
277 seq_num += kSecondGap;
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(kSecondGap, sent_nacks_.size());
280}
281
Ying Wangb32bb952018-10-31 10:12:27 +0100282TEST_F(TestNackModule, HandleFecRecoveredPacket) {
283 nack_module_.OnReceivedPacket(1, false, false);
284 nack_module_.OnReceivedPacket(4, false, true);
285 EXPECT_EQ(0u, sent_nacks_.size());
286 nack_module_.OnReceivedPacket(5, false, false);
287 EXPECT_EQ(2u, sent_nacks_.size());
288}
289
Ying Wang0367d1a2018-11-02 14:51:15 +0100290TEST_F(TestNackModule, SendNackWithoutDelay) {
291 nack_module_.OnReceivedPacket(0, false, false);
292 nack_module_.OnReceivedPacket(100, false, false);
293 EXPECT_EQ(99u, sent_nacks_.size());
294}
295
296class TestNackModuleWithFieldTrial : public ::testing::Test,
297 public NackSender,
298 public KeyFrameRequestSender {
299 protected:
300 TestNackModuleWithFieldTrial()
301 : nack_delay_field_trial_("WebRTC-SendNackDelayMs/10/"),
302 clock_(new SimulatedClock(0)),
303 nack_module_(clock_.get(), this, this),
304 keyframes_requested_(0) {}
305
Elad Alonef09c5b2019-05-31 13:25:50 +0200306 void SendNack(const std::vector<uint16_t>& sequence_numbers,
307 bool buffering_allowed) override {
Ying Wang0367d1a2018-11-02 14:51:15 +0100308 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
309 sequence_numbers.end());
310 }
311
312 void RequestKeyFrame() override { ++keyframes_requested_; }
313
314 test::ScopedFieldTrials nack_delay_field_trial_;
315 std::unique_ptr<SimulatedClock> clock_;
316 NackModule nack_module_;
317 std::vector<uint16_t> sent_nacks_;
318 int keyframes_requested_;
319};
320
321TEST_F(TestNackModuleWithFieldTrial, SendNackWithDelay) {
322 nack_module_.OnReceivedPacket(0, false, false);
323 nack_module_.OnReceivedPacket(100, false, false);
324 EXPECT_EQ(0u, sent_nacks_.size());
325 clock_->AdvanceTimeMilliseconds(10);
326 nack_module_.OnReceivedPacket(106, false, false);
327 EXPECT_EQ(99u, sent_nacks_.size());
328 clock_->AdvanceTimeMilliseconds(10);
329 nack_module_.OnReceivedPacket(109, false, false);
330 EXPECT_EQ(104u, sent_nacks_.size());
331}
philipel5ab4c6d2016-03-08 03:36:15 -0800332} // namespace webrtc