blob: 2028092251aaaa22727d8a8569572cc5cff1c309 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/video_coding/nack_module.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
philipel5ab4c6d2016-03-08 03:36:15 -080014#include <cstring>
kwiberg22feaa32016-03-17 09:17:43 -070015#include <memory>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "system_wrappers/include/clock.h"
Ying Wang0367d1a2018-11-02 14:51:15 +010018#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "test/gtest.h"
philipel5ab4c6d2016-03-08 03:36:15 -080020
21namespace webrtc {
22class TestNackModule : public ::testing::Test,
23 public NackSender,
24 public KeyFrameRequestSender {
25 protected:
26 TestNackModule()
27 : clock_(new SimulatedClock(0)),
28 nack_module_(clock_.get(), this, this),
29 keyframes_requested_(0) {}
30
Elad Alonef09c5b2019-05-31 13:25:50 +020031 void SendNack(const std::vector<uint16_t>& sequence_numbers,
32 bool buffering_allowed) override {
philipel5ab4c6d2016-03-08 03:36:15 -080033 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
34 sequence_numbers.end());
35 }
36
37 void RequestKeyFrame() override { ++keyframes_requested_; }
38
39 std::unique_ptr<SimulatedClock> clock_;
40 NackModule nack_module_;
41 std::vector<uint16_t> sent_nacks_;
42 int keyframes_requested_;
43};
44
45TEST_F(TestNackModule, NackOnePacket) {
Ying Wangb32bb952018-10-31 10:12:27 +010046 nack_module_.OnReceivedPacket(1, false, false);
47 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080048 EXPECT_EQ(1u, sent_nacks_.size());
49 EXPECT_EQ(2, sent_nacks_[0]);
50}
51
52TEST_F(TestNackModule, WrappingSeqNum) {
Ying Wangb32bb952018-10-31 10:12:27 +010053 nack_module_.OnReceivedPacket(0xfffe, false, false);
54 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080055 EXPECT_EQ(2u, sent_nacks_.size());
56 EXPECT_EQ(0xffff, sent_nacks_[0]);
57 EXPECT_EQ(0, sent_nacks_[1]);
58}
59
60TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
Ying Wangb32bb952018-10-31 10:12:27 +010061 nack_module_.OnReceivedPacket(0xfffe, false, false);
62 nack_module_.OnReceivedPacket(1, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080063 EXPECT_EQ(2u, sent_nacks_.size());
64 EXPECT_EQ(0xffff, sent_nacks_[0]);
65 EXPECT_EQ(0, sent_nacks_[1]);
66
67 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010068 nack_module_.OnReceivedPacket(2, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080069 EXPECT_EQ(0u, sent_nacks_.size());
70
Ying Wangb32bb952018-10-31 10:12:27 +010071 nack_module_.OnReceivedPacket(501, true, false);
philipel5ab4c6d2016-03-08 03:36:15 -080072 EXPECT_EQ(498u, sent_nacks_.size());
73 for (int seq_num = 3; seq_num < 501; ++seq_num)
74 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
75
76 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010077 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080078 EXPECT_EQ(499u, sent_nacks_.size());
79 for (int seq_num = 502; seq_num < 1001; ++seq_num)
80 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
81
82 sent_nacks_.clear();
83 clock_->AdvanceTimeMilliseconds(100);
84 nack_module_.Process();
85 EXPECT_EQ(999u, sent_nacks_.size());
86 EXPECT_EQ(0xffff, sent_nacks_[0]);
87 EXPECT_EQ(0, sent_nacks_[1]);
88 for (int seq_num = 3; seq_num < 501; ++seq_num)
89 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
90 for (int seq_num = 502; seq_num < 1001; ++seq_num)
91 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
92
93 // Adding packet 1004 will cause the nack list to reach it's max limit.
94 // It will then clear all nacks up to the next keyframe (seq num 2),
95 // thus removing 0xffff and 0 from the nack list.
96 sent_nacks_.clear();
Ying Wangb32bb952018-10-31 10:12:27 +010097 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -080098 EXPECT_EQ(2u, sent_nacks_.size());
99 EXPECT_EQ(1002, sent_nacks_[0]);
100 EXPECT_EQ(1003, sent_nacks_[1]);
101
102 sent_nacks_.clear();
103 clock_->AdvanceTimeMilliseconds(100);
104 nack_module_.Process();
105 EXPECT_EQ(999u, sent_nacks_.size());
106 for (int seq_num = 3; seq_num < 501; ++seq_num)
107 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
108 for (int seq_num = 502; seq_num < 1001; ++seq_num)
109 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
110
111 // Adding packet 1007 will cause the nack module to overflow again, thus
112 // clearing everything up to 501 which is the next keyframe.
Ying Wangb32bb952018-10-31 10:12:27 +0100113 nack_module_.OnReceivedPacket(1007, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800114 sent_nacks_.clear();
115 clock_->AdvanceTimeMilliseconds(100);
116 nack_module_.Process();
117 EXPECT_EQ(503u, sent_nacks_.size());
118 for (int seq_num = 502; seq_num < 1001; ++seq_num)
119 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
120 EXPECT_EQ(1005, sent_nacks_[501]);
121 EXPECT_EQ(1006, sent_nacks_[502]);
122}
123
124TEST_F(TestNackModule, DontBurstOnTimeSkip) {
125 nack_module_.Process();
126 clock_->AdvanceTimeMilliseconds(20);
127 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
128 nack_module_.Process();
129
130 clock_->AdvanceTimeMilliseconds(100);
131 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
132 nack_module_.Process();
133 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
134
135 clock_->AdvanceTimeMilliseconds(19);
136 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
137 clock_->AdvanceTimeMilliseconds(2);
138 nack_module_.Process();
139 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
140
141 clock_->AdvanceTimeMilliseconds(19);
142 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
143 nack_module_.Process();
144
145 clock_->AdvanceTimeMilliseconds(21);
146 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
147 nack_module_.Process();
148 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
149}
150
151TEST_F(TestNackModule, ResendNack) {
Ying Wangb32bb952018-10-31 10:12:27 +0100152 nack_module_.OnReceivedPacket(1, false, false);
153 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800154 EXPECT_EQ(1u, sent_nacks_.size());
155 EXPECT_EQ(2, sent_nacks_[0]);
156
157 // Default RTT is 100
158 clock_->AdvanceTimeMilliseconds(99);
159 nack_module_.Process();
160 EXPECT_EQ(1u, sent_nacks_.size());
161
162 clock_->AdvanceTimeMilliseconds(1);
163 nack_module_.Process();
164 EXPECT_EQ(2u, sent_nacks_.size());
165
166 nack_module_.UpdateRtt(50);
167 clock_->AdvanceTimeMilliseconds(100);
168 nack_module_.Process();
169 EXPECT_EQ(3u, sent_nacks_.size());
170
171 clock_->AdvanceTimeMilliseconds(50);
172 nack_module_.Process();
173 EXPECT_EQ(4u, sent_nacks_.size());
174
Ying Wangb32bb952018-10-31 10:12:27 +0100175 nack_module_.OnReceivedPacket(2, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800176 clock_->AdvanceTimeMilliseconds(50);
177 nack_module_.Process();
178 EXPECT_EQ(4u, sent_nacks_.size());
179}
180
181TEST_F(TestNackModule, ResendPacketMaxRetries) {
Ying Wangb32bb952018-10-31 10:12:27 +0100182 nack_module_.OnReceivedPacket(1, false, false);
183 nack_module_.OnReceivedPacket(3, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800184 EXPECT_EQ(1u, sent_nacks_.size());
185 EXPECT_EQ(2, sent_nacks_[0]);
186
187 for (size_t retries = 1; retries < 10; ++retries) {
188 clock_->AdvanceTimeMilliseconds(100);
189 nack_module_.Process();
190 EXPECT_EQ(retries + 1, sent_nacks_.size());
191 }
192
193 clock_->AdvanceTimeMilliseconds(100);
194 nack_module_.Process();
195 EXPECT_EQ(10u, sent_nacks_.size());
196}
197
198TEST_F(TestNackModule, TooLargeNackList) {
Ying Wangb32bb952018-10-31 10:12:27 +0100199 nack_module_.OnReceivedPacket(0, false, false);
200 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800201 EXPECT_EQ(1000u, sent_nacks_.size());
202 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100203 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800204 EXPECT_EQ(1000u, sent_nacks_.size());
205 EXPECT_EQ(1, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100206 nack_module_.OnReceivedPacket(1004, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800207 EXPECT_EQ(1000u, sent_nacks_.size());
208 EXPECT_EQ(1, keyframes_requested_);
209}
210
211TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
Ying Wangb32bb952018-10-31 10:12:27 +0100212 nack_module_.OnReceivedPacket(0, false, false);
213 nack_module_.OnReceivedPacket(1, true, false);
214 nack_module_.OnReceivedPacket(1001, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800215 EXPECT_EQ(999u, sent_nacks_.size());
216 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100217 nack_module_.OnReceivedPacket(1003, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800218 EXPECT_EQ(1000u, sent_nacks_.size());
219 EXPECT_EQ(0, keyframes_requested_);
Ying Wangb32bb952018-10-31 10:12:27 +0100220 nack_module_.OnReceivedPacket(1005, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800221 EXPECT_EQ(1000u, sent_nacks_.size());
222 EXPECT_EQ(1, keyframes_requested_);
223}
224
225TEST_F(TestNackModule, ClearUpTo) {
Ying Wangb32bb952018-10-31 10:12:27 +0100226 nack_module_.OnReceivedPacket(0, false, false);
227 nack_module_.OnReceivedPacket(100, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800228 EXPECT_EQ(99u, sent_nacks_.size());
229
230 sent_nacks_.clear();
231 clock_->AdvanceTimeMilliseconds(100);
232 nack_module_.ClearUpTo(50);
233 nack_module_.Process();
234 EXPECT_EQ(50u, sent_nacks_.size());
235 EXPECT_EQ(50, sent_nacks_[0]);
236}
237
238TEST_F(TestNackModule, ClearUpToWrap) {
Ying Wangb32bb952018-10-31 10:12:27 +0100239 nack_module_.OnReceivedPacket(0xfff0, false, false);
240 nack_module_.OnReceivedPacket(0xf, false, false);
philipel5ab4c6d2016-03-08 03:36:15 -0800241 EXPECT_EQ(30u, sent_nacks_.size());
242
243 sent_nacks_.clear();
244 clock_->AdvanceTimeMilliseconds(100);
245 nack_module_.ClearUpTo(0);
246 nack_module_.Process();
247 EXPECT_EQ(15u, sent_nacks_.size());
248 EXPECT_EQ(0, sent_nacks_[0]);
249}
250
philipel1a830c22016-05-13 11:12:00 +0200251TEST_F(TestNackModule, PacketNackCount) {
Ying Wangb32bb952018-10-31 10:12:27 +0100252 EXPECT_EQ(0, nack_module_.OnReceivedPacket(0, false, false));
253 EXPECT_EQ(0, nack_module_.OnReceivedPacket(2, false, false));
254 EXPECT_EQ(1, nack_module_.OnReceivedPacket(1, false, false));
philipel1a830c22016-05-13 11:12:00 +0200255
256 sent_nacks_.clear();
257 nack_module_.UpdateRtt(100);
Ying Wangb32bb952018-10-31 10:12:27 +0100258 EXPECT_EQ(0, nack_module_.OnReceivedPacket(5, false, false));
philipel1a830c22016-05-13 11:12:00 +0200259 clock_->AdvanceTimeMilliseconds(100);
260 nack_module_.Process();
261 clock_->AdvanceTimeMilliseconds(100);
262 nack_module_.Process();
Ying Wangb32bb952018-10-31 10:12:27 +0100263 EXPECT_EQ(3, nack_module_.OnReceivedPacket(3, false, false));
264 EXPECT_EQ(3, nack_module_.OnReceivedPacket(4, false, false));
265 EXPECT_EQ(0, nack_module_.OnReceivedPacket(4, false, false));
philipel1a830c22016-05-13 11:12:00 +0200266}
267
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200268TEST_F(TestNackModule, NackListFullAndNoOverlapWithKeyframes) {
269 const int kMaxNackPackets = 1000;
270 const unsigned int kFirstGap = kMaxNackPackets - 20;
271 const unsigned int kSecondGap = 200;
272 uint16_t seq_num = 0;
Ying Wangb32bb952018-10-31 10:12:27 +0100273 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200274 seq_num += kFirstGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100275 nack_module_.OnReceivedPacket(seq_num++, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200276 EXPECT_EQ(kFirstGap, sent_nacks_.size());
277 sent_nacks_.clear();
278 seq_num += kSecondGap;
Ying Wangb32bb952018-10-31 10:12:27 +0100279 nack_module_.OnReceivedPacket(seq_num, true, false);
Johannes Kron6fbeeeb2018-09-27 11:49:22 +0200280 EXPECT_EQ(kSecondGap, sent_nacks_.size());
281}
282
Ying Wangb32bb952018-10-31 10:12:27 +0100283TEST_F(TestNackModule, HandleFecRecoveredPacket) {
284 nack_module_.OnReceivedPacket(1, false, false);
285 nack_module_.OnReceivedPacket(4, false, true);
286 EXPECT_EQ(0u, sent_nacks_.size());
287 nack_module_.OnReceivedPacket(5, false, false);
288 EXPECT_EQ(2u, sent_nacks_.size());
289}
290
Ying Wang0367d1a2018-11-02 14:51:15 +0100291TEST_F(TestNackModule, SendNackWithoutDelay) {
292 nack_module_.OnReceivedPacket(0, false, false);
293 nack_module_.OnReceivedPacket(100, false, false);
294 EXPECT_EQ(99u, sent_nacks_.size());
295}
296
297class TestNackModuleWithFieldTrial : public ::testing::Test,
298 public NackSender,
299 public KeyFrameRequestSender {
300 protected:
301 TestNackModuleWithFieldTrial()
302 : nack_delay_field_trial_("WebRTC-SendNackDelayMs/10/"),
303 clock_(new SimulatedClock(0)),
304 nack_module_(clock_.get(), this, this),
305 keyframes_requested_(0) {}
306
Elad Alonef09c5b2019-05-31 13:25:50 +0200307 void SendNack(const std::vector<uint16_t>& sequence_numbers,
308 bool buffering_allowed) override {
Ying Wang0367d1a2018-11-02 14:51:15 +0100309 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
310 sequence_numbers.end());
311 }
312
313 void RequestKeyFrame() override { ++keyframes_requested_; }
314
315 test::ScopedFieldTrials nack_delay_field_trial_;
316 std::unique_ptr<SimulatedClock> clock_;
317 NackModule nack_module_;
318 std::vector<uint16_t> sent_nacks_;
319 int keyframes_requested_;
320};
321
322TEST_F(TestNackModuleWithFieldTrial, SendNackWithDelay) {
323 nack_module_.OnReceivedPacket(0, false, false);
324 nack_module_.OnReceivedPacket(100, false, false);
325 EXPECT_EQ(0u, sent_nacks_.size());
326 clock_->AdvanceTimeMilliseconds(10);
327 nack_module_.OnReceivedPacket(106, false, false);
328 EXPECT_EQ(99u, sent_nacks_.size());
329 clock_->AdvanceTimeMilliseconds(10);
330 nack_module_.OnReceivedPacket(109, false, false);
331 EXPECT_EQ(104u, sent_nacks_.size());
332}
philipel5ab4c6d2016-03-08 03:36:15 -0800333} // namespace webrtc