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

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

Powered by Google App Engine
This is Rietveld 408576698