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