blob: fab03ce332329f6c874db183ff6c7dfebfaed3a8 [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
11#include <cstring>
kwiberg22feaa32016-03-17 09:17:43 -070012#include <memory>
13
philipel5ab4c6d2016-03-08 03:36:15 -080014#include "testing/gtest/include/gtest/gtest.h"
15#include "webrtc/modules/video_coding/include/video_coding_defines.h"
16#include "webrtc/modules/video_coding/nack_module.h"
17#include "webrtc/system_wrappers/include/clock.h"
18#include "webrtc/base/mod_ops.h"
19
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) {
44 VCMPacket packet;
45 packet.seqNum = 1;
46 nack_module_.OnReceivedPacket(packet);
47 packet.seqNum = 3;
48 nack_module_.OnReceivedPacket(packet);
49 EXPECT_EQ(1u, sent_nacks_.size());
50 EXPECT_EQ(2, sent_nacks_[0]);
51}
52
53TEST_F(TestNackModule, WrappingSeqNum) {
54 VCMPacket packet;
55 packet.seqNum = 0xfffe;
56 nack_module_.OnReceivedPacket(packet);
57 packet.seqNum = 1;
58 nack_module_.OnReceivedPacket(packet);
59 EXPECT_EQ(2u, sent_nacks_.size());
60 EXPECT_EQ(0xffff, sent_nacks_[0]);
61 EXPECT_EQ(0, sent_nacks_[1]);
62}
63
64TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
65 VCMPacket packet;
66 packet.seqNum = 0xfffe;
67 nack_module_.OnReceivedPacket(packet);
68 packet.seqNum = 1;
69 nack_module_.OnReceivedPacket(packet);
70 EXPECT_EQ(2u, sent_nacks_.size());
71 EXPECT_EQ(0xffff, sent_nacks_[0]);
72 EXPECT_EQ(0, sent_nacks_[1]);
73
74 sent_nacks_.clear();
75 packet.frameType = kVideoFrameKey;
76 packet.isFirstPacket = true;
77 packet.seqNum = 2;
78 nack_module_.OnReceivedPacket(packet);
79 EXPECT_EQ(0u, sent_nacks_.size());
80
81 packet.seqNum = 501;
82 nack_module_.OnReceivedPacket(packet);
83 EXPECT_EQ(498u, sent_nacks_.size());
84 for (int seq_num = 3; seq_num < 501; ++seq_num)
85 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
86
87 sent_nacks_.clear();
88 packet.frameType = kVideoFrameDelta;
89 packet.seqNum = 1001;
90 nack_module_.OnReceivedPacket(packet);
91 EXPECT_EQ(499u, sent_nacks_.size());
92 for (int seq_num = 502; seq_num < 1001; ++seq_num)
93 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
94
95 sent_nacks_.clear();
96 clock_->AdvanceTimeMilliseconds(100);
97 nack_module_.Process();
98 EXPECT_EQ(999u, sent_nacks_.size());
99 EXPECT_EQ(0xffff, sent_nacks_[0]);
100 EXPECT_EQ(0, sent_nacks_[1]);
101 for (int seq_num = 3; seq_num < 501; ++seq_num)
102 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
103 for (int seq_num = 502; seq_num < 1001; ++seq_num)
104 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
105
106 // Adding packet 1004 will cause the nack list to reach it's max limit.
107 // It will then clear all nacks up to the next keyframe (seq num 2),
108 // thus removing 0xffff and 0 from the nack list.
109 sent_nacks_.clear();
110 packet.seqNum = 1004;
111 nack_module_.OnReceivedPacket(packet);
112 EXPECT_EQ(2u, sent_nacks_.size());
113 EXPECT_EQ(1002, sent_nacks_[0]);
114 EXPECT_EQ(1003, sent_nacks_[1]);
115
116 sent_nacks_.clear();
117 clock_->AdvanceTimeMilliseconds(100);
118 nack_module_.Process();
119 EXPECT_EQ(999u, sent_nacks_.size());
120 for (int seq_num = 3; seq_num < 501; ++seq_num)
121 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
122 for (int seq_num = 502; seq_num < 1001; ++seq_num)
123 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
124
125 // Adding packet 1007 will cause the nack module to overflow again, thus
126 // clearing everything up to 501 which is the next keyframe.
127 packet.seqNum = 1007;
128 nack_module_.OnReceivedPacket(packet);
129 sent_nacks_.clear();
130 clock_->AdvanceTimeMilliseconds(100);
131 nack_module_.Process();
132 EXPECT_EQ(503u, sent_nacks_.size());
133 for (int seq_num = 502; seq_num < 1001; ++seq_num)
134 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
135 EXPECT_EQ(1005, sent_nacks_[501]);
136 EXPECT_EQ(1006, sent_nacks_[502]);
137}
138
139TEST_F(TestNackModule, DontBurstOnTimeSkip) {
140 nack_module_.Process();
141 clock_->AdvanceTimeMilliseconds(20);
142 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
143 nack_module_.Process();
144
145 clock_->AdvanceTimeMilliseconds(100);
146 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
147 nack_module_.Process();
148 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
149
150 clock_->AdvanceTimeMilliseconds(19);
151 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
152 clock_->AdvanceTimeMilliseconds(2);
153 nack_module_.Process();
154 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
155
156 clock_->AdvanceTimeMilliseconds(19);
157 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
158 nack_module_.Process();
159
160 clock_->AdvanceTimeMilliseconds(21);
161 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
162 nack_module_.Process();
163 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
164}
165
166TEST_F(TestNackModule, ResendNack) {
167 VCMPacket packet;
168 packet.seqNum = 1;
169 nack_module_.OnReceivedPacket(packet);
170 packet.seqNum = 3;
171 nack_module_.OnReceivedPacket(packet);
172 EXPECT_EQ(1u, sent_nacks_.size());
173 EXPECT_EQ(2, sent_nacks_[0]);
174
175 // Default RTT is 100
176 clock_->AdvanceTimeMilliseconds(99);
177 nack_module_.Process();
178 EXPECT_EQ(1u, sent_nacks_.size());
179
180 clock_->AdvanceTimeMilliseconds(1);
181 nack_module_.Process();
182 EXPECT_EQ(2u, sent_nacks_.size());
183
184 nack_module_.UpdateRtt(50);
185 clock_->AdvanceTimeMilliseconds(100);
186 nack_module_.Process();
187 EXPECT_EQ(3u, sent_nacks_.size());
188
189 clock_->AdvanceTimeMilliseconds(50);
190 nack_module_.Process();
191 EXPECT_EQ(4u, sent_nacks_.size());
192
193 packet.seqNum = 2;
194 nack_module_.OnReceivedPacket(packet);
195 clock_->AdvanceTimeMilliseconds(50);
196 nack_module_.Process();
197 EXPECT_EQ(4u, sent_nacks_.size());
198}
199
200TEST_F(TestNackModule, ResendPacketMaxRetries) {
201 VCMPacket packet;
202 packet.seqNum = 1;
203 nack_module_.OnReceivedPacket(packet);
204 packet.seqNum = 3;
205 nack_module_.OnReceivedPacket(packet);
206 EXPECT_EQ(1u, sent_nacks_.size());
207 EXPECT_EQ(2, sent_nacks_[0]);
208
209 for (size_t retries = 1; retries < 10; ++retries) {
210 clock_->AdvanceTimeMilliseconds(100);
211 nack_module_.Process();
212 EXPECT_EQ(retries + 1, sent_nacks_.size());
213 }
214
215 clock_->AdvanceTimeMilliseconds(100);
216 nack_module_.Process();
217 EXPECT_EQ(10u, sent_nacks_.size());
218}
219
220TEST_F(TestNackModule, TooLargeNackList) {
221 VCMPacket packet;
222 packet.seqNum = 0;
223 nack_module_.OnReceivedPacket(packet);
224 packet.seqNum = 1001;
225 nack_module_.OnReceivedPacket(packet);
226 EXPECT_EQ(1000u, sent_nacks_.size());
227 EXPECT_EQ(0, keyframes_requested_);
228 packet.seqNum = 1003;
229 nack_module_.OnReceivedPacket(packet);
230 EXPECT_EQ(1000u, sent_nacks_.size());
231 EXPECT_EQ(1, keyframes_requested_);
232 packet.seqNum = 1004;
233 nack_module_.OnReceivedPacket(packet);
234 EXPECT_EQ(1000u, sent_nacks_.size());
235 EXPECT_EQ(1, keyframes_requested_);
236}
237
238TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
239 VCMPacket packet;
240 packet.seqNum = 0;
241 nack_module_.OnReceivedPacket(packet);
242 packet.seqNum = 1;
243 packet.isFirstPacket = true;
244 packet.frameType = kVideoFrameKey;
245 nack_module_.OnReceivedPacket(packet);
246 packet.seqNum = 1001;
247 packet.isFirstPacket = false;
248 packet.frameType = kVideoFrameKey;
249 nack_module_.OnReceivedPacket(packet);
250 EXPECT_EQ(999u, sent_nacks_.size());
251 EXPECT_EQ(0, keyframes_requested_);
252 packet.seqNum = 1003;
253 nack_module_.OnReceivedPacket(packet);
254 EXPECT_EQ(1000u, sent_nacks_.size());
255 EXPECT_EQ(0, keyframes_requested_);
256 packet.seqNum = 1005;
257 nack_module_.OnReceivedPacket(packet);
258 EXPECT_EQ(1000u, sent_nacks_.size());
259 EXPECT_EQ(1, keyframes_requested_);
260}
261
262TEST_F(TestNackModule, ClearUpTo) {
263 VCMPacket packet;
264 packet.seqNum = 0;
265 nack_module_.OnReceivedPacket(packet);
266 packet.seqNum = 100;
267 nack_module_.OnReceivedPacket(packet);
268 EXPECT_EQ(99u, sent_nacks_.size());
269
270 sent_nacks_.clear();
271 clock_->AdvanceTimeMilliseconds(100);
272 nack_module_.ClearUpTo(50);
273 nack_module_.Process();
274 EXPECT_EQ(50u, sent_nacks_.size());
275 EXPECT_EQ(50, sent_nacks_[0]);
276}
277
278TEST_F(TestNackModule, ClearUpToWrap) {
279 VCMPacket packet;
280 packet.seqNum = 0xfff0;
281 nack_module_.OnReceivedPacket(packet);
282 packet.seqNum = 0xf;
283 nack_module_.OnReceivedPacket(packet);
284 EXPECT_EQ(30u, sent_nacks_.size());
285
286 sent_nacks_.clear();
287 clock_->AdvanceTimeMilliseconds(100);
288 nack_module_.ClearUpTo(0);
289 nack_module_.Process();
290 EXPECT_EQ(15u, sent_nacks_.size());
291 EXPECT_EQ(0, sent_nacks_[0]);
292}
293
294} // namespace webrtc