OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/audio_coding/neteq/nack.h" | 11 #include "webrtc/modules/audio_coding/neteq/nack.h" |
12 | 12 |
13 #include <stdint.h> | 13 #include <stdint.h> |
14 | 14 |
15 #include <algorithm> | 15 #include <algorithm> |
| 16 #include <memory> |
16 | 17 |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "webrtc/base/scoped_ptr.h" | |
19 #include "webrtc/typedefs.h" | 19 #include "webrtc/typedefs.h" |
20 #include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h" | 20 #include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h" |
21 | 21 |
22 namespace webrtc { | 22 namespace webrtc { |
23 namespace { | 23 namespace { |
24 | 24 |
25 const int kNackThreshold = 3; | 25 const int kNackThreshold = 3; |
26 const int kSampleRateHz = 16000; | 26 const int kSampleRateHz = 16000; |
27 const int kPacketSizeMs = 30; | 27 const int kPacketSizeMs = 30; |
28 const uint32_t kTimestampIncrement = 480; // 30 ms. | 28 const uint32_t kTimestampIncrement = 480; // 30 ms. |
(...skipping 19 matching lines...) Expand all Loading... |
48 } | 48 } |
49 if (!seq_num_matched) | 49 if (!seq_num_matched) |
50 return false; | 50 return false; |
51 } | 51 } |
52 return true; | 52 return true; |
53 } | 53 } |
54 | 54 |
55 } // namespace | 55 } // namespace |
56 | 56 |
57 TEST(NackTest, EmptyListWhenNoPacketLoss) { | 57 TEST(NackTest, EmptyListWhenNoPacketLoss) { |
58 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 58 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
59 nack->UpdateSampleRate(kSampleRateHz); | 59 nack->UpdateSampleRate(kSampleRateHz); |
60 | 60 |
61 int seq_num = 1; | 61 int seq_num = 1; |
62 uint32_t timestamp = 0; | 62 uint32_t timestamp = 0; |
63 | 63 |
64 std::vector<uint16_t> nack_list; | 64 std::vector<uint16_t> nack_list; |
65 for (int n = 0; n < 100; n++) { | 65 for (int n = 0; n < 100; n++) { |
66 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 66 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
67 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 67 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
68 seq_num++; | 68 seq_num++; |
69 timestamp += kTimestampIncrement; | 69 timestamp += kTimestampIncrement; |
70 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 70 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
71 EXPECT_TRUE(nack_list.empty()); | 71 EXPECT_TRUE(nack_list.empty()); |
72 } | 72 } |
73 } | 73 } |
74 | 74 |
75 TEST(NackTest, NoNackIfReorderWithinNackThreshold) { | 75 TEST(NackTest, NoNackIfReorderWithinNackThreshold) { |
76 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 76 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
77 nack->UpdateSampleRate(kSampleRateHz); | 77 nack->UpdateSampleRate(kSampleRateHz); |
78 | 78 |
79 int seq_num = 1; | 79 int seq_num = 1; |
80 uint32_t timestamp = 0; | 80 uint32_t timestamp = 0; |
81 std::vector<uint16_t> nack_list; | 81 std::vector<uint16_t> nack_list; |
82 | 82 |
83 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 83 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
84 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 84 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
85 EXPECT_TRUE(nack_list.empty()); | 85 EXPECT_TRUE(nack_list.empty()); |
86 int num_late_packets = kNackThreshold + 1; | 86 int num_late_packets = kNackThreshold + 1; |
87 | 87 |
88 // Push in reverse order | 88 // Push in reverse order |
89 while (num_late_packets > 0) { | 89 while (num_late_packets > 0) { |
90 nack->UpdateLastReceivedPacket( | 90 nack->UpdateLastReceivedPacket( |
91 seq_num + num_late_packets, | 91 seq_num + num_late_packets, |
92 timestamp + num_late_packets * kTimestampIncrement); | 92 timestamp + num_late_packets * kTimestampIncrement); |
93 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 93 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
94 EXPECT_TRUE(nack_list.empty()); | 94 EXPECT_TRUE(nack_list.empty()); |
95 num_late_packets--; | 95 num_late_packets--; |
96 } | 96 } |
97 } | 97 } |
98 | 98 |
99 TEST(NackTest, LatePacketsMovedToNackThenNackListDoesNotChange) { | 99 TEST(NackTest, LatePacketsMovedToNackThenNackListDoesNotChange) { |
100 const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9}; | 100 const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9}; |
101 static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) / | 101 static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) / |
102 sizeof(kSequenceNumberLostPackets[0]); | 102 sizeof(kSequenceNumberLostPackets[0]); |
103 | 103 |
104 for (int k = 0; k < 2; k++) { // Two iteration with/without wrap around. | 104 for (int k = 0; k < 2; k++) { // Two iteration with/without wrap around. |
105 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 105 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
106 nack->UpdateSampleRate(kSampleRateHz); | 106 nack->UpdateSampleRate(kSampleRateHz); |
107 | 107 |
108 uint16_t sequence_num_lost_packets[kNumAllLostPackets]; | 108 uint16_t sequence_num_lost_packets[kNumAllLostPackets]; |
109 for (int n = 0; n < kNumAllLostPackets; n++) { | 109 for (int n = 0; n < kNumAllLostPackets; n++) { |
110 sequence_num_lost_packets[n] = | 110 sequence_num_lost_packets[n] = |
111 kSequenceNumberLostPackets[n] + | 111 kSequenceNumberLostPackets[n] + |
112 k * 65531; // Have wrap around in sequence numbers for |k == 1|. | 112 k * 65531; // Have wrap around in sequence numbers for |k == 1|. |
113 } | 113 } |
114 uint16_t seq_num = sequence_num_lost_packets[0] - 1; | 114 uint16_t seq_num = sequence_num_lost_packets[0] - 1; |
115 | 115 |
(...skipping 28 matching lines...) Expand all Loading... |
144 } | 144 } |
145 } | 145 } |
146 } | 146 } |
147 | 147 |
148 TEST(NackTest, ArrivedPacketsAreRemovedFromNackList) { | 148 TEST(NackTest, ArrivedPacketsAreRemovedFromNackList) { |
149 const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9}; | 149 const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9}; |
150 static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) / | 150 static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) / |
151 sizeof(kSequenceNumberLostPackets[0]); | 151 sizeof(kSequenceNumberLostPackets[0]); |
152 | 152 |
153 for (int k = 0; k < 2; ++k) { // Two iteration with/without wrap around. | 153 for (int k = 0; k < 2; ++k) { // Two iteration with/without wrap around. |
154 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 154 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
155 nack->UpdateSampleRate(kSampleRateHz); | 155 nack->UpdateSampleRate(kSampleRateHz); |
156 | 156 |
157 uint16_t sequence_num_lost_packets[kNumAllLostPackets]; | 157 uint16_t sequence_num_lost_packets[kNumAllLostPackets]; |
158 for (int n = 0; n < kNumAllLostPackets; ++n) { | 158 for (int n = 0; n < kNumAllLostPackets; ++n) { |
159 sequence_num_lost_packets[n] = kSequenceNumberLostPackets[n] + | 159 sequence_num_lost_packets[n] = kSequenceNumberLostPackets[n] + |
160 k * 65531; // Wrap around for |k == 1|. | 160 k * 65531; // Wrap around for |k == 1|. |
161 } | 161 } |
162 | 162 |
163 uint16_t seq_num = sequence_num_lost_packets[0] - 1; | 163 uint16_t seq_num = sequence_num_lost_packets[0] - 1; |
164 uint32_t timestamp = 0; | 164 uint32_t timestamp = 0; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 | 206 |
207 // Assess if estimation of timestamps and time-to-play is correct. Introduce all | 207 // Assess if estimation of timestamps and time-to-play is correct. Introduce all |
208 // combinations that timestamps and sequence numbers might have wrap around. | 208 // combinations that timestamps and sequence numbers might have wrap around. |
209 TEST(NackTest, EstimateTimestampAndTimeToPlay) { | 209 TEST(NackTest, EstimateTimestampAndTimeToPlay) { |
210 const uint16_t kLostPackets[] = {2, 3, 4, 5, 6, 7, 8, | 210 const uint16_t kLostPackets[] = {2, 3, 4, 5, 6, 7, 8, |
211 9, 10, 11, 12, 13, 14, 15}; | 211 9, 10, 11, 12, 13, 14, 15}; |
212 static const int kNumAllLostPackets = | 212 static const int kNumAllLostPackets = |
213 sizeof(kLostPackets) / sizeof(kLostPackets[0]); | 213 sizeof(kLostPackets) / sizeof(kLostPackets[0]); |
214 | 214 |
215 for (int k = 0; k < 4; ++k) { | 215 for (int k = 0; k < 4; ++k) { |
216 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 216 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
217 nack->UpdateSampleRate(kSampleRateHz); | 217 nack->UpdateSampleRate(kSampleRateHz); |
218 | 218 |
219 // Sequence number wrap around if |k| is 2 or 3; | 219 // Sequence number wrap around if |k| is 2 or 3; |
220 int seq_num_offset = (k < 2) ? 0 : 65531; | 220 int seq_num_offset = (k < 2) ? 0 : 65531; |
221 | 221 |
222 // Timestamp wrap around if |k| is 1 or 3. | 222 // Timestamp wrap around if |k| is 1 or 3. |
223 uint32_t timestamp_offset = | 223 uint32_t timestamp_offset = |
224 (k & 0x1) ? static_cast<uint32_t>(0xffffffff) - 6 : 0; | 224 (k & 0x1) ? static_cast<uint32_t>(0xffffffff) - 6 : 0; |
225 | 225 |
226 uint32_t timestamp_lost_packets[kNumAllLostPackets]; | 226 uint32_t timestamp_lost_packets[kNumAllLostPackets]; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 int index = seq_num - kLostPackets[0]; | 277 int index = seq_num - kLostPackets[0]; |
278 EXPECT_EQ((index + 2) * kPacketSizeMs - 10, it->second.time_to_play_ms); | 278 EXPECT_EQ((index + 2) * kPacketSizeMs - 10, it->second.time_to_play_ms); |
279 ++it; | 279 ++it; |
280 } | 280 } |
281 } | 281 } |
282 } | 282 } |
283 | 283 |
284 TEST(NackTest, MissingPacketsPriorToLastDecodedRtpShouldNotBeInNackList) { | 284 TEST(NackTest, MissingPacketsPriorToLastDecodedRtpShouldNotBeInNackList) { |
285 for (int m = 0; m < 2; ++m) { | 285 for (int m = 0; m < 2; ++m) { |
286 uint16_t seq_num_offset = (m == 0) ? 0 : 65531; // Wrap around if |m| is 1. | 286 uint16_t seq_num_offset = (m == 0) ? 0 : 65531; // Wrap around if |m| is 1. |
287 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 287 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
288 nack->UpdateSampleRate(kSampleRateHz); | 288 nack->UpdateSampleRate(kSampleRateHz); |
289 | 289 |
290 // Two consecutive packets to have a correct estimate of timestamp increase. | 290 // Two consecutive packets to have a correct estimate of timestamp increase. |
291 uint16_t seq_num = 0; | 291 uint16_t seq_num = 0; |
292 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, | 292 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, |
293 seq_num * kTimestampIncrement); | 293 seq_num * kTimestampIncrement); |
294 seq_num++; | 294 seq_num++; |
295 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, | 295 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, |
296 seq_num * kTimestampIncrement); | 296 seq_num * kTimestampIncrement); |
297 | 297 |
(...skipping 30 matching lines...) Expand all Loading... |
328 seq_num++; | 328 seq_num++; |
329 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, | 329 nack->UpdateLastReceivedPacket(seq_num_offset + seq_num, |
330 seq_num * kTimestampIncrement); | 330 seq_num * kTimestampIncrement); |
331 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 331 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
332 EXPECT_TRUE(nack_list.empty()); | 332 EXPECT_TRUE(nack_list.empty()); |
333 } | 333 } |
334 } | 334 } |
335 } | 335 } |
336 | 336 |
337 TEST(NackTest, Reset) { | 337 TEST(NackTest, Reset) { |
338 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 338 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
339 nack->UpdateSampleRate(kSampleRateHz); | 339 nack->UpdateSampleRate(kSampleRateHz); |
340 | 340 |
341 // Two consecutive packets to have a correct estimate of timestamp increase. | 341 // Two consecutive packets to have a correct estimate of timestamp increase. |
342 uint16_t seq_num = 0; | 342 uint16_t seq_num = 0; |
343 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); | 343 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); |
344 seq_num++; | 344 seq_num++; |
345 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); | 345 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); |
346 | 346 |
347 // Skip 10 packets (larger than NACK threshold). | 347 // Skip 10 packets (larger than NACK threshold). |
348 const int kNumLostPackets = 10; | 348 const int kNumLostPackets = 10; |
349 seq_num += kNumLostPackets + 1; | 349 seq_num += kNumLostPackets + 1; |
350 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); | 350 nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement); |
351 | 351 |
352 const size_t kExpectedListSize = kNumLostPackets - kNackThreshold; | 352 const size_t kExpectedListSize = kNumLostPackets - kNackThreshold; |
353 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 353 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
354 EXPECT_EQ(kExpectedListSize, nack_list.size()); | 354 EXPECT_EQ(kExpectedListSize, nack_list.size()); |
355 | 355 |
356 nack->Reset(); | 356 nack->Reset(); |
357 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 357 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
358 EXPECT_TRUE(nack_list.empty()); | 358 EXPECT_TRUE(nack_list.empty()); |
359 } | 359 } |
360 | 360 |
361 TEST(NackTest, ListSizeAppliedFromBeginning) { | 361 TEST(NackTest, ListSizeAppliedFromBeginning) { |
362 const size_t kNackListSize = 10; | 362 const size_t kNackListSize = 10; |
363 for (int m = 0; m < 2; ++m) { | 363 for (int m = 0; m < 2; ++m) { |
364 uint16_t seq_num_offset = (m == 0) ? 0 : 65525; // Wrap around if |m| is 1. | 364 uint16_t seq_num_offset = (m == 0) ? 0 : 65525; // Wrap around if |m| is 1. |
365 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 365 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
366 nack->UpdateSampleRate(kSampleRateHz); | 366 nack->UpdateSampleRate(kSampleRateHz); |
367 nack->SetMaxNackListSize(kNackListSize); | 367 nack->SetMaxNackListSize(kNackListSize); |
368 | 368 |
369 uint16_t seq_num = seq_num_offset; | 369 uint16_t seq_num = seq_num_offset; |
370 uint32_t timestamp = 0x12345678; | 370 uint32_t timestamp = 0x12345678; |
371 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 371 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
372 | 372 |
373 // Packet lost more than NACK-list size limit. | 373 // Packet lost more than NACK-list size limit. |
374 uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5; | 374 uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5; |
375 | 375 |
376 seq_num += num_lost_packets + 1; | 376 seq_num += num_lost_packets + 1; |
377 timestamp += (num_lost_packets + 1) * kTimestampIncrement; | 377 timestamp += (num_lost_packets + 1) * kTimestampIncrement; |
378 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 378 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
379 | 379 |
380 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 380 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
381 EXPECT_EQ(kNackListSize - kNackThreshold, nack_list.size()); | 381 EXPECT_EQ(kNackListSize - kNackThreshold, nack_list.size()); |
382 } | 382 } |
383 } | 383 } |
384 | 384 |
385 TEST(NackTest, ChangeOfListSizeAppliedAndOldElementsRemoved) { | 385 TEST(NackTest, ChangeOfListSizeAppliedAndOldElementsRemoved) { |
386 const size_t kNackListSize = 10; | 386 const size_t kNackListSize = 10; |
387 for (int m = 0; m < 2; ++m) { | 387 for (int m = 0; m < 2; ++m) { |
388 uint16_t seq_num_offset = (m == 0) ? 0 : 65525; // Wrap around if |m| is 1. | 388 uint16_t seq_num_offset = (m == 0) ? 0 : 65525; // Wrap around if |m| is 1. |
389 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 389 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
390 nack->UpdateSampleRate(kSampleRateHz); | 390 nack->UpdateSampleRate(kSampleRateHz); |
391 | 391 |
392 uint16_t seq_num = seq_num_offset; | 392 uint16_t seq_num = seq_num_offset; |
393 uint32_t timestamp = 0x87654321; | 393 uint32_t timestamp = 0x87654321; |
394 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 394 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
395 | 395 |
396 // Packet lost more than NACK-list size limit. | 396 // Packet lost more than NACK-list size limit. |
397 uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5; | 397 uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5; |
398 | 398 |
399 rtc::scoped_ptr<uint16_t[]> seq_num_lost(new uint16_t[num_lost_packets]); | 399 std::unique_ptr<uint16_t[]> seq_num_lost(new uint16_t[num_lost_packets]); |
400 for (int n = 0; n < num_lost_packets; ++n) { | 400 for (int n = 0; n < num_lost_packets; ++n) { |
401 seq_num_lost[n] = ++seq_num; | 401 seq_num_lost[n] = ++seq_num; |
402 } | 402 } |
403 | 403 |
404 ++seq_num; | 404 ++seq_num; |
405 timestamp += (num_lost_packets + 1) * kTimestampIncrement; | 405 timestamp += (num_lost_packets + 1) * kTimestampIncrement; |
406 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 406 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
407 size_t expected_size = num_lost_packets - kNackThreshold; | 407 size_t expected_size = num_lost_packets - kNackThreshold; |
408 | 408 |
409 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 409 std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 ++seq_num; | 445 ++seq_num; |
446 timestamp += kTimestampIncrement; | 446 timestamp += kTimestampIncrement; |
447 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 447 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
448 nack_list = nack->GetNackList(kShortRoundTripTimeMs); | 448 nack_list = nack->GetNackList(kShortRoundTripTimeMs); |
449 EXPECT_TRUE(nack_list.empty()); | 449 EXPECT_TRUE(nack_list.empty()); |
450 } | 450 } |
451 } | 451 } |
452 | 452 |
453 TEST(NackTest, RoudTripTimeIsApplied) { | 453 TEST(NackTest, RoudTripTimeIsApplied) { |
454 const int kNackListSize = 200; | 454 const int kNackListSize = 200; |
455 rtc::scoped_ptr<Nack> nack(Nack::Create(kNackThreshold)); | 455 std::unique_ptr<Nack> nack(Nack::Create(kNackThreshold)); |
456 nack->UpdateSampleRate(kSampleRateHz); | 456 nack->UpdateSampleRate(kSampleRateHz); |
457 nack->SetMaxNackListSize(kNackListSize); | 457 nack->SetMaxNackListSize(kNackListSize); |
458 | 458 |
459 uint16_t seq_num = 0; | 459 uint16_t seq_num = 0; |
460 uint32_t timestamp = 0x87654321; | 460 uint32_t timestamp = 0x87654321; |
461 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 461 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
462 | 462 |
463 // Packet lost more than NACK-list size limit. | 463 // Packet lost more than NACK-list size limit. |
464 uint16_t kNumLostPackets = kNackThreshold + 5; | 464 uint16_t kNumLostPackets = kNackThreshold + 5; |
465 | 465 |
466 seq_num += (1 + kNumLostPackets); | 466 seq_num += (1 + kNumLostPackets); |
467 timestamp += (1 + kNumLostPackets) * kTimestampIncrement; | 467 timestamp += (1 + kNumLostPackets) * kTimestampIncrement; |
468 nack->UpdateLastReceivedPacket(seq_num, timestamp); | 468 nack->UpdateLastReceivedPacket(seq_num, timestamp); |
469 | 469 |
470 // Expected time-to-play are: | 470 // Expected time-to-play are: |
471 // kPacketSizeMs - 10, 2*kPacketSizeMs - 10, 3*kPacketSizeMs - 10, ... | 471 // kPacketSizeMs - 10, 2*kPacketSizeMs - 10, 3*kPacketSizeMs - 10, ... |
472 // | 472 // |
473 // sequence number: 1, 2, 3, 4, 5 | 473 // sequence number: 1, 2, 3, 4, 5 |
474 // time-to-play: 20, 50, 80, 110, 140 | 474 // time-to-play: 20, 50, 80, 110, 140 |
475 // | 475 // |
476 std::vector<uint16_t> nack_list = nack->GetNackList(100); | 476 std::vector<uint16_t> nack_list = nack->GetNackList(100); |
477 ASSERT_EQ(2u, nack_list.size()); | 477 ASSERT_EQ(2u, nack_list.size()); |
478 EXPECT_EQ(4, nack_list[0]); | 478 EXPECT_EQ(4, nack_list[0]); |
479 EXPECT_EQ(5, nack_list[1]); | 479 EXPECT_EQ(5, nack_list[1]); |
480 } | 480 } |
481 | 481 |
482 } // namespace webrtc | 482 } // namespace webrtc |
OLD | NEW |