Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: webrtc/modules/video_coding/nack_module_unittest.cc

Issue 1715673002: Implement the NackModule as part of the new jitter buffer. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed commented code. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 int32_t SendNack(const uint16_t* sequence_numbers, uint16_t length) override {
29 for (int s = 0; s < length; ++s) {
30 sent_nacks_.push_back(sequence_numbers[s]);
31 }
32 return 0;
33 }
34
35 int32_t RequestKeyFrame() override {
36 ++keyframes_requested_;
37 return 0;
38 }
39
40 rtc::scoped_ptr<SimulatedClock> clock_;
41 NackModule nack_module_;
42 std::vector<uint16_t> sent_nacks_;
43 int keyframes_requested_;
44 };
45
46 TEST_F(TestNackModule, NackOnePacket) {
47 VCMPacket packet;
48 packet.seqNum = 1;
49 nack_module_.OnReceivedPacket(packet);
50 packet.seqNum = 3;
51 nack_module_.OnReceivedPacket(packet);
52 EXPECT_EQ(1u, sent_nacks_.size());
53 EXPECT_EQ(2, sent_nacks_[0]);
54 }
55
56 TEST_F(TestNackModule, WrappingSeqNum) {
57 VCMPacket packet;
58 packet.seqNum = 0xfffe;
59 nack_module_.OnReceivedPacket(packet);
60 packet.seqNum = 1;
61 nack_module_.OnReceivedPacket(packet);
62 EXPECT_EQ(2u, sent_nacks_.size());
63 EXPECT_EQ(0xffff, sent_nacks_[0]);
64 EXPECT_EQ(0, sent_nacks_[1]);
65 }
66
67 TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
68 VCMPacket packet;
69 packet.seqNum = 0xfffe;
70 nack_module_.OnReceivedPacket(packet);
71 packet.seqNum = 1;
72 nack_module_.OnReceivedPacket(packet);
73 EXPECT_EQ(2u, sent_nacks_.size());
74 EXPECT_EQ(0xffff, sent_nacks_[0]);
75 EXPECT_EQ(0, sent_nacks_[1]);
76
77 sent_nacks_.clear();
78 packet.frameType = kVideoFrameKey;
79 packet.isFirstPacket = true;
80 packet.seqNum = 2;
81 nack_module_.OnReceivedPacket(packet);
82 EXPECT_EQ(0u, sent_nacks_.size());
83
84 packet.seqNum = 501;
85 nack_module_.OnReceivedPacket(packet);
86 EXPECT_EQ(498u, sent_nacks_.size());
87 for (int seq_num = 3; seq_num < 501; ++seq_num)
88 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
89
90 sent_nacks_.clear();
91 packet.frameType = kVideoFrameDelta;
92 packet.seqNum = 1001;
93 nack_module_.OnReceivedPacket(packet);
94 EXPECT_EQ(499u, sent_nacks_.size());
95 for (int seq_num = 502; seq_num < 1001; ++seq_num)
96 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
97
98 sent_nacks_.clear();
99 clock_->AdvanceTimeMilliseconds(100);
100 nack_module_.Process();
101 EXPECT_EQ(999u, sent_nacks_.size());
102 EXPECT_EQ(0xffff, sent_nacks_[0]);
103 EXPECT_EQ(0, sent_nacks_[1]);
104 for (int seq_num = 3; seq_num < 501; ++seq_num)
105 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
106 for (int seq_num = 502; seq_num < 1001; ++seq_num)
107 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
108
109 // Adding packet 1004 will cause the nack list to reach it's max limit.
110 // It will then clear all nacks up to the next keyframe (seq num 2),
111 // thus removing 0xffff and 0 from the nack list.
112 sent_nacks_.clear();
113 packet.seqNum = 1004;
114 nack_module_.OnReceivedPacket(packet);
115 EXPECT_EQ(2u, sent_nacks_.size());
116 EXPECT_EQ(1002, sent_nacks_[0]);
117 EXPECT_EQ(1003, sent_nacks_[1]);
118
119 sent_nacks_.clear();
120 clock_->AdvanceTimeMilliseconds(100);
121 nack_module_.Process();
122 EXPECT_EQ(999u, sent_nacks_.size());
123 for (int seq_num = 3; seq_num < 501; ++seq_num)
124 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
125 for (int seq_num = 502; seq_num < 1001; ++seq_num)
126 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
127
128 // Adding packet 1007 will cause the nack module to overflow again, thus
129 // clearing everything up to 501 which is the next keyframe.
130 packet.seqNum = 1007;
131 nack_module_.OnReceivedPacket(packet);
132 sent_nacks_.clear();
133 clock_->AdvanceTimeMilliseconds(100);
134 nack_module_.Process();
135 EXPECT_EQ(503u, sent_nacks_.size());
136 for (int seq_num = 502; seq_num < 1001; ++seq_num)
137 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
138 EXPECT_EQ(1005, sent_nacks_[501]);
139 EXPECT_EQ(1006, sent_nacks_[502]);
140 }
141
142 TEST_F(TestNackModule, DontBurstOnTimeSkip) {
143 nack_module_.Process();
144 clock_->AdvanceTimeMilliseconds(20);
145 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
146 nack_module_.Process();
147
148 clock_->AdvanceTimeMilliseconds(100);
149 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
150 nack_module_.Process();
151 EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
152
153 clock_->AdvanceTimeMilliseconds(19);
154 EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
155 clock_->AdvanceTimeMilliseconds(2);
156 nack_module_.Process();
157 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
158
159 clock_->AdvanceTimeMilliseconds(19);
160 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
161 nack_module_.Process();
162
163 clock_->AdvanceTimeMilliseconds(21);
164 EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
165 nack_module_.Process();
166 EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
167 }
168
169 TEST_F(TestNackModule, ResendNack) {
170 VCMPacket packet;
171 packet.seqNum = 1;
172 nack_module_.OnReceivedPacket(packet);
173 packet.seqNum = 3;
174 nack_module_.OnReceivedPacket(packet);
175 EXPECT_EQ(1u, sent_nacks_.size());
176 EXPECT_EQ(2, sent_nacks_[0]);
177
178 // Default RTT is 100
179 clock_->AdvanceTimeMilliseconds(99);
180 nack_module_.Process();
181 EXPECT_EQ(1u, sent_nacks_.size());
182
183 clock_->AdvanceTimeMilliseconds(1);
184 nack_module_.Process();
185 EXPECT_EQ(2u, sent_nacks_.size());
186
187 nack_module_.UpdateRtt(50);
188 clock_->AdvanceTimeMilliseconds(100);
189 nack_module_.Process();
190 EXPECT_EQ(3u, sent_nacks_.size());
191
192 clock_->AdvanceTimeMilliseconds(50);
193 nack_module_.Process();
194 EXPECT_EQ(4u, sent_nacks_.size());
195
196 packet.seqNum = 2;
197 nack_module_.OnReceivedPacket(packet);
198 clock_->AdvanceTimeMilliseconds(50);
199 nack_module_.Process();
200 EXPECT_EQ(4u, sent_nacks_.size());
201 }
202
203 TEST_F(TestNackModule, ResendPacketMaxRetries) {
204 VCMPacket packet;
205 packet.seqNum = 1;
206 nack_module_.OnReceivedPacket(packet);
207 packet.seqNum = 3;
208 nack_module_.OnReceivedPacket(packet);
209 EXPECT_EQ(1u, sent_nacks_.size());
210 EXPECT_EQ(2, sent_nacks_[0]);
211
212 for (size_t retries = 1; retries < 10; ++retries) {
213 clock_->AdvanceTimeMilliseconds(100);
214 nack_module_.Process();
215 EXPECT_EQ(retries + 1, sent_nacks_.size());
216 }
217
218 clock_->AdvanceTimeMilliseconds(100);
219 nack_module_.Process();
220 EXPECT_EQ(10u, sent_nacks_.size());
221 }
222
223 TEST_F(TestNackModule, TooLargeNackList) {
224 VCMPacket packet;
225 packet.seqNum = 0;
226 nack_module_.OnReceivedPacket(packet);
227 packet.seqNum = 1001;
228 nack_module_.OnReceivedPacket(packet);
229 EXPECT_EQ(1000u, sent_nacks_.size());
230 EXPECT_EQ(0, keyframes_requested_);
231 packet.seqNum = 1003;
232 nack_module_.OnReceivedPacket(packet);
233 EXPECT_EQ(1000u, sent_nacks_.size());
234 EXPECT_EQ(1, keyframes_requested_);
235 packet.seqNum = 1004;
236 nack_module_.OnReceivedPacket(packet);
237 EXPECT_EQ(1000u, sent_nacks_.size());
238 EXPECT_EQ(1, keyframes_requested_);
239 }
240
241 TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
242 VCMPacket packet;
243 packet.seqNum = 0;
244 nack_module_.OnReceivedPacket(packet);
245 packet.seqNum = 1;
246 packet.isFirstPacket = true;
247 packet.frameType = kVideoFrameKey;
248 nack_module_.OnReceivedPacket(packet);
249 packet.seqNum = 1001;
250 packet.isFirstPacket = false;
251 packet.frameType = kVideoFrameKey;
252 nack_module_.OnReceivedPacket(packet);
253 EXPECT_EQ(999u, sent_nacks_.size());
254 EXPECT_EQ(0, keyframes_requested_);
255 packet.seqNum = 1003;
256 nack_module_.OnReceivedPacket(packet);
257 EXPECT_EQ(1000u, sent_nacks_.size());
258 EXPECT_EQ(0, keyframes_requested_);
259 packet.seqNum = 1005;
260 nack_module_.OnReceivedPacket(packet);
261 EXPECT_EQ(1000u, sent_nacks_.size());
262 EXPECT_EQ(1, keyframes_requested_);
263 }
264
265 TEST_F(TestNackModule, ClearUpTo) {
266 VCMPacket packet;
267 packet.seqNum = 0;
268 nack_module_.OnReceivedPacket(packet);
269 packet.seqNum = 100;
270 nack_module_.OnReceivedPacket(packet);
271 EXPECT_EQ(99u, sent_nacks_.size());
272
273 sent_nacks_.clear();
274 clock_->AdvanceTimeMilliseconds(100);
275 nack_module_.ClearUpTo(50);
276 nack_module_.Process();
277 EXPECT_EQ(50u, sent_nacks_.size());
278 EXPECT_EQ(50, sent_nacks_[0]);
279 }
280
281 TEST_F(TestNackModule, ClearUpToWrap) {
282 VCMPacket packet;
283 packet.seqNum = 0xfff0;
284 nack_module_.OnReceivedPacket(packet);
285 packet.seqNum = 0xf;
286 nack_module_.OnReceivedPacket(packet);
287 EXPECT_EQ(30u, sent_nacks_.size());
288
289 sent_nacks_.clear();
290 clock_->AdvanceTimeMilliseconds(100);
291 nack_module_.ClearUpTo(0);
292 nack_module_.Process();
293 EXPECT_EQ(15u, sent_nacks_.size());
294 EXPECT_EQ(0, sent_nacks_[0]);
295 }
296
297 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698