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

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: Format 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 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698