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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc

Issue 2099243003: Use std::unique_ptr in ForwardErrorCorrection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@flexfec-pt1a_mini-fixes-in-ULPFEC
Patch Set: Rebase on top of FlexFEC pt. 1a. Created 4 years, 5 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
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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
(...skipping 12 matching lines...) Expand all
23 // Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum. 23 // Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum.
24 const uint8_t kTransportOverhead = 28; 24 const uint8_t kTransportOverhead = 28;
25 25
26 // Maximum number of media packets used in the FEC (RFC 5109). 26 // Maximum number of media packets used in the FEC (RFC 5109).
27 const uint8_t kMaxNumberMediaPackets = ForwardErrorCorrection::kMaxMediaPackets; 27 const uint8_t kMaxNumberMediaPackets = ForwardErrorCorrection::kMaxMediaPackets;
28 28
29 using PacketList = ForwardErrorCorrection::PacketList; 29 using PacketList = ForwardErrorCorrection::PacketList;
30 using ReceivedPacketList = ForwardErrorCorrection::ReceivedPacketList; 30 using ReceivedPacketList = ForwardErrorCorrection::ReceivedPacketList;
31 using RecoveredPacketList = ForwardErrorCorrection::RecoveredPacketList; 31 using RecoveredPacketList = ForwardErrorCorrection::RecoveredPacketList;
32 32
33 template <typename T> void ClearList(std::list<T*>* my_list) {
34 T* packet = NULL;
35 while (!my_list->empty()) {
36 packet = my_list->front();
37 delete packet;
38 my_list->pop_front();
39 }
40 }
41
42 class RtpFecTest : public ::testing::Test { 33 class RtpFecTest : public ::testing::Test {
43 protected: 34 protected:
44 RtpFecTest() 35 RtpFecTest()
45 : random_(0xfec133700742), 36 : random_(0xfec133700742),
46 fec_(new ForwardErrorCorrection()), 37 fec_(new ForwardErrorCorrection()),
47 ssrc_(random_.Rand<uint32_t>()), 38 ssrc_(random_.Rand<uint32_t>()),
48 fec_seq_num_(0) {} 39 fec_seq_num_(0) {}
49 40
50 webrtc::Random random_; 41 webrtc::Random random_;
51 ForwardErrorCorrection* fec_; 42 ForwardErrorCorrection* fec_;
52 int ssrc_; 43 int ssrc_;
53 uint16_t fec_seq_num_; 44 uint16_t fec_seq_num_;
54 45
55 PacketList media_packet_list_; 46 PacketList media_packet_list_;
56 PacketList fec_packet_list_; 47 std::list<ForwardErrorCorrection::Packet*> fec_packet_list_;
57 ReceivedPacketList received_packet_list_; 48 ReceivedPacketList received_packet_list_;
58 RecoveredPacketList recovered_packet_list_; 49 RecoveredPacketList recovered_packet_list_;
59 50
60 // Media packet "i" is lost if media_loss_mask_[i] = 1, 51 // Media packet "i" is lost if media_loss_mask_[i] = 1,
61 // received if media_loss_mask_[i] = 0. 52 // received if media_loss_mask_[i] = 0.
62 int media_loss_mask_[kMaxNumberMediaPackets]; 53 int media_loss_mask_[kMaxNumberMediaPackets];
63 54
64 // FEC packet "i" is lost if fec_loss_mask_[i] = 1, 55 // FEC packet "i" is lost if fec_loss_mask_[i] = 1,
65 // received if fec_loss_mask_[i] = 0. 56 // received if fec_loss_mask_[i] = 0.
66 int fec_loss_mask_[kMaxNumberMediaPackets]; 57 int fec_loss_mask_[kMaxNumberMediaPackets];
67 58
68 // Construct the media packet list, up to |num_media_packets| packets. 59 // Construct the media packet list, up to |num_media_packets| packets.
69 // Returns the next sequence number after the last media packet. 60 // Returns the next sequence number after the last media packet.
70 // (this will be the sequence of the first FEC packet) 61 // (this will be the sequence of the first FEC packet)
71 int ConstructMediaPacketsSeqNum(int num_media_packets, int start_seq_num); 62 int ConstructMediaPacketsSeqNum(int num_media_packets, int start_seq_num);
72 int ConstructMediaPackets(int num_media_packets); 63 int ConstructMediaPackets(int num_media_packets);
73 64
65 // Creates a deep copy of |src|, removes half the packets, and places
66 // the result in |dst|.
67 void DeepCopyAndRemoveHalf(const PacketList& src, PacketList* dst);
68
74 // Construct the received packet list: a subset of the media and FEC packets. 69 // Construct the received packet list: a subset of the media and FEC packets.
75 void NetworkReceivedPackets(); 70 void NetworkReceivedPackets();
76 71
77 // Add packet from |packet_list| to list of received packets, using the 72 // Add packet from |packet_list| to list of received packets, using the
78 // |loss_mask|. 73 // |loss_mask|.
79 // The |packet_list| may be a media packet list (is_fec = false), or a 74 // The |packet_list| may be a media packet list (is_fec = false), or a
80 // FEC packet list (is_fec = true). 75 // FEC packet list (is_fec = true).
81 void ReceivedPackets(const PacketList& packet_list, int* loss_mask, 76 template <typename T>
82 bool is_fec); 77 void ReceivedPackets(const T& packet_list, int* loss_mask, bool is_fec);
83 78
84 // Check for complete recovery after FEC decoding. 79 // Check for complete recovery after FEC decoding.
85 bool IsRecoveryComplete(); 80 bool IsRecoveryComplete();
86 81
87 // Delete the received packets.
88 void FreeRecoveredPacketList();
89
90 // Delete the media and FEC packets. 82 // Delete the media and FEC packets.
91 void TearDown(); 83 void TearDown();
92 }; 84 };
93 85
94 TEST_F(RtpFecTest, FecRecoveryNoLoss) { 86 TEST_F(RtpFecTest, FecRecoveryNoLoss) {
95 const int kNumImportantPackets = 0; 87 const int kNumImportantPackets = 0;
96 const bool kUseUnequalProtection = false; 88 const bool kUseUnequalProtection = false;
97 const int kNumMediaPackets = 4; 89 const int kNumMediaPackets = 4;
98 uint8_t kProtectionFactor = 60; 90 uint8_t kProtectionFactor = 60;
99 91
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 129 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
138 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 130 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
139 media_loss_mask_[3] = 1; 131 media_loss_mask_[3] = 1;
140 NetworkReceivedPackets(); 132 NetworkReceivedPackets();
141 133
142 EXPECT_EQ(0, 134 EXPECT_EQ(0,
143 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 135 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
144 136
145 // One packet lost, one FEC packet, expect complete recovery. 137 // One packet lost, one FEC packet, expect complete recovery.
146 EXPECT_TRUE(IsRecoveryComplete()); 138 EXPECT_TRUE(IsRecoveryComplete());
147 FreeRecoveredPacketList(); 139 recovered_packet_list_.clear();
148 140
149 // 2 media packets lost. 141 // 2 media packets lost.
150 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 142 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
151 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 143 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
152 media_loss_mask_[1] = 1; 144 media_loss_mask_[1] = 1;
153 media_loss_mask_[3] = 1; 145 media_loss_mask_[3] = 1;
154 NetworkReceivedPackets(); 146 NetworkReceivedPackets();
155 147
156 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 148 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
157 &recovered_packet_list_)); 149 &recovered_packet_list_));
(...skipping 22 matching lines...) Expand all
180 kNumImportantPackets, kUseUnequalProtection, 172 kNumImportantPackets, kUseUnequalProtection,
181 webrtc::kFecMaskBursty, &fec_packet_list_)); 173 webrtc::kFecMaskBursty, &fec_packet_list_));
182 // Expect 1 FEC packet. 174 // Expect 1 FEC packet.
183 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 175 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size()));
184 // Add FEC packet (seq#2) of this first frame to received list (i.e., assume 176 // Add FEC packet (seq#2) of this first frame to received list (i.e., assume
185 // the two media packet were lost). 177 // the two media packet were lost).
186 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 178 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
187 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 179 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
188 180
189 // Construct media packets for second frame, with sequence number wrap. 181 // Construct media packets for second frame, with sequence number wrap.
190 ClearList(&media_packet_list_); 182 media_packet_list_.clear();
191 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65535); 183 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65535);
192 184
193 // Expect 3 media packets for this frame. 185 // Expect 3 media packets for this frame.
194 EXPECT_EQ(3, static_cast<int>(media_packet_list_.size())); 186 EXPECT_EQ(3, static_cast<int>(media_packet_list_.size()));
195 187
196 // Second media packet lost (seq#0). 188 // Second media packet lost (seq#0).
197 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 189 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
198 media_loss_mask_[1] = 1; 190 media_loss_mask_[1] = 1;
199 // Add packets #65535, and #1 to received list. 191 // Add packets #65535, and #1 to received list.
200 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 192 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
201 193
202 EXPECT_EQ(0, 194 EXPECT_EQ(0,
203 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 195 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
204 196
205 // Expect that no decoding is done to get missing packet (seq#0) of second 197 // Expect that no decoding is done to get missing packet (seq#0) of second
206 // frame, using old FEC packet (seq#2) from first (old) frame. So number of 198 // frame, using old FEC packet (seq#2) from first (old) frame. So number of
207 // recovered packets is 2, and not equal to number of media packets (=3). 199 // recovered packets is 2, and not equal to number of media packets (=3).
208 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size())); 200 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size()));
209 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size()); 201 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size());
210 FreeRecoveredPacketList();
211 } 202 }
212 203
213 // Verify we can still recovery frame if sequence number wrap occurs within 204 // Verify we can still recovery frame if sequence number wrap occurs within
214 // the frame and FEC packet following wrap is received after media packets. 205 // the frame and FEC packet following wrap is received after media packets.
215 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameRecovery) { 206 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameRecovery) {
216 const int kNumImportantPackets = 0; 207 const int kNumImportantPackets = 0;
217 const bool kUseUnequalProtection = false; 208 const bool kUseUnequalProtection = false;
218 uint8_t kProtectionFactor = 20; 209 uint8_t kProtectionFactor = 20;
219 210
220 // One frame, with sequence number wrap in media packets. 211 // One frame, with sequence number wrap in media packets.
(...skipping 16 matching lines...) Expand all
237 // Add FEC packet to received list following the media packets. 228 // Add FEC packet to received list following the media packets.
238 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 229 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
239 230
240 EXPECT_EQ(0, 231 EXPECT_EQ(0,
241 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 232 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
242 233
243 // Expect 3 media packets in recovered list, and complete recovery. 234 // Expect 3 media packets in recovered list, and complete recovery.
244 // Wrap-around won't remove FEC packet, as it follows the wrap. 235 // Wrap-around won't remove FEC packet, as it follows the wrap.
245 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size())); 236 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size()));
246 EXPECT_TRUE(IsRecoveryComplete()); 237 EXPECT_TRUE(IsRecoveryComplete());
247 FreeRecoveredPacketList();
248 } 238 }
249 239
250 // Sequence number wrap occurs within the FEC packets for the frame. 240 // Sequence number wrap occurs within the FEC packets for the frame.
251 // In this case we will discard FEC packet and full recovery is not expected. 241 // In this case we will discard FEC packet and full recovery is not expected.
252 // Same problem will occur if wrap is within media packets but FEC packet is 242 // Same problem will occur if wrap is within media packets but FEC packet is
253 // received before the media packets. This may be improved if timing information 243 // received before the media packets. This may be improved if timing information
254 // is used to detect old FEC packets. 244 // is used to detect old FEC packets.
255 // TODO(marpan): Update test if wrap-around handling changes in FEC decoding. 245 // TODO(marpan): Update test if wrap-around handling changes in FEC decoding.
256 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameNoRecovery) { 246 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameNoRecovery) {
257 const int kNumImportantPackets = 0; 247 const int kNumImportantPackets = 0;
(...skipping 24 matching lines...) Expand all
282 EXPECT_EQ(0, 272 EXPECT_EQ(0,
283 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 273 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
284 274
285 // The two FEC packets are received and should allow for complete recovery, 275 // The two FEC packets are received and should allow for complete recovery,
286 // but because of the wrap the second FEC packet will be discarded, and only 276 // but because of the wrap the second FEC packet will be discarded, and only
287 // one media packet is recoverable. So exepct 2 media packets on recovered 277 // one media packet is recoverable. So exepct 2 media packets on recovered
288 // list and no complete recovery. 278 // list and no complete recovery.
289 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size())); 279 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size()));
290 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size()); 280 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size());
291 EXPECT_FALSE(IsRecoveryComplete()); 281 EXPECT_FALSE(IsRecoveryComplete());
292 FreeRecoveredPacketList();
293 } 282 }
294 283
295 // Verify we can still recovery frame if FEC is received before media packets. 284 // Verify we can still recovery frame if FEC is received before media packets.
296 TEST_F(RtpFecTest, FecRecoveryWithFecOutOfOrder) { 285 TEST_F(RtpFecTest, FecRecoveryWithFecOutOfOrder) {
297 const int kNumImportantPackets = 0; 286 const int kNumImportantPackets = 0;
298 const bool kUseUnequalProtection = false; 287 const bool kUseUnequalProtection = false;
299 uint8_t kProtectionFactor = 20; 288 uint8_t kProtectionFactor = 20;
300 289
301 // One frame: 3 media packets, 1 FEC packet. 290 // One frame: 3 media packets, 1 FEC packet.
302 // -----Frame 1---- 291 // -----Frame 1----
(...skipping 15 matching lines...) Expand all
318 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 307 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
319 // Add media packets to received list. 308 // Add media packets to received list.
320 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 309 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
321 310
322 EXPECT_EQ(0, 311 EXPECT_EQ(0,
323 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 312 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
324 313
325 // Expect 3 media packets in recovered list, and complete recovery. 314 // Expect 3 media packets in recovered list, and complete recovery.
326 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size())); 315 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size()));
327 EXPECT_TRUE(IsRecoveryComplete()); 316 EXPECT_TRUE(IsRecoveryComplete());
328 FreeRecoveredPacketList();
329 } 317 }
330 318
331 // Test 50% protection with random mask type: Two cases are considered: 319 // Test 50% protection with random mask type: Two cases are considered:
332 // a 50% non-consecutive loss which can be fully recovered, and a 50% 320 // a 50% non-consecutive loss which can be fully recovered, and a 50%
333 // consecutive loss which cannot be fully recovered. 321 // consecutive loss which cannot be fully recovered.
334 TEST_F(RtpFecTest, FecRecoveryWithLoss50percRandomMask) { 322 TEST_F(RtpFecTest, FecRecoveryWithLoss50percRandomMask) {
335 const int kNumImportantPackets = 0; 323 const int kNumImportantPackets = 0;
336 const bool kUseUnequalProtection = false; 324 const bool kUseUnequalProtection = false;
337 const int kNumMediaPackets = 4; 325 const int kNumMediaPackets = 4;
338 const uint8_t kProtectionFactor = 255; 326 const uint8_t kProtectionFactor = 255;
(...skipping 24 matching lines...) Expand all
363 media_loss_mask_[0] = 1; 351 media_loss_mask_[0] = 1;
364 media_loss_mask_[2] = 1; 352 media_loss_mask_[2] = 1;
365 media_loss_mask_[3] = 1; 353 media_loss_mask_[3] = 1;
366 NetworkReceivedPackets(); 354 NetworkReceivedPackets();
367 355
368 EXPECT_EQ(0, 356 EXPECT_EQ(0,
369 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_)); 357 fec_->DecodeFEC(&received_packet_list_, &recovered_packet_list_));
370 358
371 // With media packet#1 and FEC packets #1, #2, #3, expect complete recovery. 359 // With media packet#1 and FEC packets #1, #2, #3, expect complete recovery.
372 EXPECT_TRUE(IsRecoveryComplete()); 360 EXPECT_TRUE(IsRecoveryComplete());
373 FreeRecoveredPacketList(); 361 recovered_packet_list_.clear();
374 362
375 // 4 consecutive packets lost: media packets 0, 1, 2, 3. 363 // 4 consecutive packets lost: media packets 0, 1, 2, 3.
376 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 364 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
377 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 365 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
378 media_loss_mask_[0] = 1; 366 media_loss_mask_[0] = 1;
379 media_loss_mask_[1] = 1; 367 media_loss_mask_[1] = 1;
380 media_loss_mask_[2] = 1; 368 media_loss_mask_[2] = 1;
381 media_loss_mask_[3] = 1; 369 media_loss_mask_[3] = 1;
382 NetworkReceivedPackets(); 370 NetworkReceivedPackets();
383 371
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 media_loss_mask_[1] = 1; 411 media_loss_mask_[1] = 1;
424 media_loss_mask_[2] = 1; 412 media_loss_mask_[2] = 1;
425 media_loss_mask_[3] = 1; 413 media_loss_mask_[3] = 1;
426 NetworkReceivedPackets(); 414 NetworkReceivedPackets();
427 415
428 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 416 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
429 &recovered_packet_list_)); 417 &recovered_packet_list_));
430 418
431 // Expect complete recovery for consecutive packet loss <= 50%. 419 // Expect complete recovery for consecutive packet loss <= 50%.
432 EXPECT_TRUE(IsRecoveryComplete()); 420 EXPECT_TRUE(IsRecoveryComplete());
433 FreeRecoveredPacketList(); 421 recovered_packet_list_.clear();
434 422
435 // 4 consecutive packets lost: media packets 1,2, 3, and FEC packet 0. 423 // 4 consecutive packets lost: media packets 1,2, 3, and FEC packet 0.
436 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 424 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
437 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 425 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
438 fec_loss_mask_[0] = 1; 426 fec_loss_mask_[0] = 1;
439 media_loss_mask_[1] = 1; 427 media_loss_mask_[1] = 1;
440 media_loss_mask_[2] = 1; 428 media_loss_mask_[2] = 1;
441 media_loss_mask_[3] = 1; 429 media_loss_mask_[3] = 1;
442 NetworkReceivedPackets(); 430 NetworkReceivedPackets();
443 431
444 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 432 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
445 &recovered_packet_list_)); 433 &recovered_packet_list_));
446 434
447 // Expect complete recovery for consecutive packet loss <= 50%. 435 // Expect complete recovery for consecutive packet loss <= 50%.
448 EXPECT_TRUE(IsRecoveryComplete()); 436 EXPECT_TRUE(IsRecoveryComplete());
449 FreeRecoveredPacketList(); 437 recovered_packet_list_.clear();
450 438
451 // 4 packets lost (non-consecutive loss): media packets 0, 3, and FEC# 0, 3. 439 // 4 packets lost (non-consecutive loss): media packets 0, 3, and FEC# 0, 3.
452 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 440 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
453 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 441 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
454 fec_loss_mask_[0] = 1; 442 fec_loss_mask_[0] = 1;
455 fec_loss_mask_[3] = 1; 443 fec_loss_mask_[3] = 1;
456 media_loss_mask_[0] = 1; 444 media_loss_mask_[0] = 1;
457 media_loss_mask_[3] = 1; 445 media_loss_mask_[3] = 1;
458 NetworkReceivedPackets(); 446 NetworkReceivedPackets();
459 447
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 498 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
511 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 499 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
512 media_loss_mask_[3] = 1; 500 media_loss_mask_[3] = 1;
513 NetworkReceivedPackets(); 501 NetworkReceivedPackets();
514 502
515 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 503 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
516 &recovered_packet_list_)); 504 &recovered_packet_list_));
517 505
518 // One packet lost, one FEC packet, expect complete recovery. 506 // One packet lost, one FEC packet, expect complete recovery.
519 EXPECT_TRUE(IsRecoveryComplete()); 507 EXPECT_TRUE(IsRecoveryComplete());
520 FreeRecoveredPacketList(); 508 recovered_packet_list_.clear();
521 509
522 // 2 media packets lost. 510 // 2 media packets lost.
523 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 511 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
524 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 512 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
525 media_loss_mask_[1] = 1; 513 media_loss_mask_[1] = 1;
526 media_loss_mask_[3] = 1; 514 media_loss_mask_[3] = 1;
527 NetworkReceivedPackets(); 515 NetworkReceivedPackets();
528 516
529 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 517 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
530 &recovered_packet_list_)); 518 &recovered_packet_list_));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 media_loss_mask_[0] = 1; 554 media_loss_mask_[0] = 1;
567 media_loss_mask_[2] = 1; 555 media_loss_mask_[2] = 1;
568 media_loss_mask_[3] = 1; 556 media_loss_mask_[3] = 1;
569 NetworkReceivedPackets(); 557 NetworkReceivedPackets();
570 558
571 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 559 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
572 &recovered_packet_list_)); 560 &recovered_packet_list_));
573 561
574 // With media packet#3 and FEC packets #0, #1, #3, expect complete recovery. 562 // With media packet#3 and FEC packets #0, #1, #3, expect complete recovery.
575 EXPECT_TRUE(IsRecoveryComplete()); 563 EXPECT_TRUE(IsRecoveryComplete());
576 FreeRecoveredPacketList(); 564 recovered_packet_list_.clear();
577 565
578 // 5 packets lost: 4 media packets and one FEC packet#2 lost. 566 // 5 packets lost: 4 media packets and one FEC packet#2 lost.
579 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 567 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
580 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 568 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
581 fec_loss_mask_[2] = 1; 569 fec_loss_mask_[2] = 1;
582 media_loss_mask_[0] = 1; 570 media_loss_mask_[0] = 1;
583 media_loss_mask_[1] = 1; 571 media_loss_mask_[1] = 1;
584 media_loss_mask_[2] = 1; 572 media_loss_mask_[2] = 1;
585 media_loss_mask_[3] = 1; 573 media_loss_mask_[3] = 1;
586 NetworkReceivedPackets(); 574 NetworkReceivedPackets();
587 575
588 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 576 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
589 &recovered_packet_list_)); 577 &recovered_packet_list_));
590 578
591 // Cannot get complete recovery for this loss configuration. 579 // Cannot get complete recovery for this loss configuration.
592 EXPECT_FALSE(IsRecoveryComplete()); 580 EXPECT_FALSE(IsRecoveryComplete());
593 } 581 }
594 582
595 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePackets) { 583 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePackets) {
596 const int kNumImportantPackets = 0; 584 const int kNumImportantPackets = 0;
597 const bool kUseUnequalProtection = false; 585 const bool kUseUnequalProtection = false;
598 const int kNumMediaPackets = 5; 586 const int kNumMediaPackets = 5;
599 uint8_t kProtectionFactor = 60; 587 uint8_t kProtectionFactor = 60;
600 588
601 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 589 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
602 590
603 // Create a new temporary packet list for generating FEC packets. 591 // Create a new temporary packet list for generating FEC packets.
604 // This list should have every other packet removed. 592 // This list should have every other packet removed.
605 PacketList protected_media_packets; 593 PacketList protected_media_packets;
606 int i = 0; 594 DeepCopyAndRemoveHalf(media_packet_list_, &protected_media_packets);
607 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
608 ++it, ++i) {
609 if (i % 2 == 0) protected_media_packets.push_back(*it);
610 }
611 595
612 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor, 596 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor,
613 kNumImportantPackets, kUseUnequalProtection, 597 kNumImportantPackets, kUseUnequalProtection,
614 webrtc::kFecMaskBursty, &fec_packet_list_)); 598 webrtc::kFecMaskBursty, &fec_packet_list_));
615 599
616 // Expect 1 FEC packet. 600 // Expect 1 FEC packet.
617 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 601 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size()));
618 602
619 // 1 protected media packet lost 603 // 1 protected media packet lost
620 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 604 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
621 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 605 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
622 media_loss_mask_[2] = 1; 606 media_loss_mask_[2] = 1;
623 NetworkReceivedPackets(); 607 NetworkReceivedPackets();
624 608
625 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 609 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
626 &recovered_packet_list_)); 610 &recovered_packet_list_));
627 611
628 // One packet lost, one FEC packet, expect complete recovery. 612 // One packet lost, one FEC packet, expect complete recovery.
629 EXPECT_TRUE(IsRecoveryComplete()); 613 EXPECT_TRUE(IsRecoveryComplete());
630 FreeRecoveredPacketList(); 614 recovered_packet_list_.clear();
631 615
632 // Unprotected packet lost. 616 // Unprotected packet lost.
633 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 617 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
634 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 618 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
635 media_loss_mask_[1] = 1; 619 media_loss_mask_[1] = 1;
636 NetworkReceivedPackets(); 620 NetworkReceivedPackets();
637 621
638 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 622 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
639 &recovered_packet_list_)); 623 &recovered_packet_list_));
640 624
641 // Unprotected packet lost. Recovery not possible. 625 // Unprotected packet lost. Recovery not possible.
642 EXPECT_FALSE(IsRecoveryComplete()); 626 EXPECT_FALSE(IsRecoveryComplete());
643 FreeRecoveredPacketList(); 627 recovered_packet_list_.clear();
644 628
645 // 2 media packets lost. 629 // 2 media packets lost.
646 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 630 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
647 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 631 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
648 media_loss_mask_[0] = 1; 632 media_loss_mask_[0] = 1;
649 media_loss_mask_[2] = 1; 633 media_loss_mask_[2] = 1;
650 NetworkReceivedPackets(); 634 NetworkReceivedPackets();
651 635
652 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 636 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
653 &recovered_packet_list_)); 637 &recovered_packet_list_));
654 638
655 // 2 protected packets lost, one FEC packet, cannot get complete recovery. 639 // 2 protected packets lost, one FEC packet, cannot get complete recovery.
656 EXPECT_FALSE(IsRecoveryComplete()); 640 EXPECT_FALSE(IsRecoveryComplete());
657 } 641 }
658 642
659 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsExtension) { 643 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsExtension) {
660 const int kNumImportantPackets = 0; 644 const int kNumImportantPackets = 0;
661 const bool kUseUnequalProtection = false; 645 const bool kUseUnequalProtection = false;
662 const int kNumMediaPackets = 21; 646 const int kNumMediaPackets = 21;
663 uint8_t kProtectionFactor = 127; 647 uint8_t kProtectionFactor = 127;
664 648
665 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 649 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
666 650
667 // Create a new temporary packet list for generating FEC packets. 651 // Create a new temporary packet list for generating FEC packets.
668 // This list should have every other packet removed. 652 // This list should have every other packet removed.
669 PacketList protected_media_packets; 653 PacketList protected_media_packets;
670 int i = 0; 654 DeepCopyAndRemoveHalf(media_packet_list_, &protected_media_packets);
671 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
672 ++it, ++i) {
673 if (i % 2 == 0) protected_media_packets.push_back(*it);
674 }
675 655
676 // Zero column insertion will have to extend the size of the packet 656 // Zero column insertion will have to extend the size of the packet
677 // mask since the number of actual packets are 21, while the number 657 // mask since the number of actual packets are 21, while the number
678 // of protected packets are 11. 658 // of protected packets are 11.
679 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor, 659 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor,
680 kNumImportantPackets, kUseUnequalProtection, 660 kNumImportantPackets, kUseUnequalProtection,
681 webrtc::kFecMaskBursty, &fec_packet_list_)); 661 webrtc::kFecMaskBursty, &fec_packet_list_));
682 662
683 // Expect 5 FEC packet. 663 // Expect 5 FEC packet.
684 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size())); 664 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size()));
685 665
686 // Last protected media packet lost 666 // Last protected media packet lost
687 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 667 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
688 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 668 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
689 media_loss_mask_[kNumMediaPackets - 1] = 1; 669 media_loss_mask_[kNumMediaPackets - 1] = 1;
690 NetworkReceivedPackets(); 670 NetworkReceivedPackets();
691 671
692 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 672 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
693 &recovered_packet_list_)); 673 &recovered_packet_list_));
694 674
695 // One packet lost, one FEC packet, expect complete recovery. 675 // One packet lost, one FEC packet, expect complete recovery.
696 EXPECT_TRUE(IsRecoveryComplete()); 676 EXPECT_TRUE(IsRecoveryComplete());
697 FreeRecoveredPacketList(); 677 recovered_packet_list_.clear();
698 678
699 // Last unprotected packet lost. 679 // Last unprotected packet lost.
700 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 680 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
701 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 681 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
702 media_loss_mask_[kNumMediaPackets - 2] = 1; 682 media_loss_mask_[kNumMediaPackets - 2] = 1;
703 NetworkReceivedPackets(); 683 NetworkReceivedPackets();
704 684
705 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 685 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
706 &recovered_packet_list_)); 686 &recovered_packet_list_));
707 687
708 // Unprotected packet lost. Recovery not possible. 688 // Unprotected packet lost. Recovery not possible.
709 EXPECT_FALSE(IsRecoveryComplete()); 689 EXPECT_FALSE(IsRecoveryComplete());
710 FreeRecoveredPacketList(); 690 recovered_packet_list_.clear();
711 691
712 // 6 media packets lost. 692 // 6 media packets lost.
713 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 693 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
714 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 694 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
715 media_loss_mask_[kNumMediaPackets - 11] = 1; 695 media_loss_mask_[kNumMediaPackets - 11] = 1;
716 media_loss_mask_[kNumMediaPackets - 9] = 1; 696 media_loss_mask_[kNumMediaPackets - 9] = 1;
717 media_loss_mask_[kNumMediaPackets - 7] = 1; 697 media_loss_mask_[kNumMediaPackets - 7] = 1;
718 media_loss_mask_[kNumMediaPackets - 5] = 1; 698 media_loss_mask_[kNumMediaPackets - 5] = 1;
719 media_loss_mask_[kNumMediaPackets - 3] = 1; 699 media_loss_mask_[kNumMediaPackets - 3] = 1;
720 media_loss_mask_[kNumMediaPackets - 1] = 1; 700 media_loss_mask_[kNumMediaPackets - 1] = 1;
(...skipping 10 matching lines...) Expand all
731 const int kNumImportantPackets = 0; 711 const int kNumImportantPackets = 0;
732 const bool kUseUnequalProtection = false; 712 const bool kUseUnequalProtection = false;
733 const int kNumMediaPackets = 21; 713 const int kNumMediaPackets = 21;
734 uint8_t kProtectionFactor = 127; 714 uint8_t kProtectionFactor = 127;
735 715
736 fec_seq_num_ = ConstructMediaPacketsSeqNum(kNumMediaPackets, 0xFFFF - 5); 716 fec_seq_num_ = ConstructMediaPacketsSeqNum(kNumMediaPackets, 0xFFFF - 5);
737 717
738 // Create a new temporary packet list for generating FEC packets. 718 // Create a new temporary packet list for generating FEC packets.
739 // This list should have every other packet removed. 719 // This list should have every other packet removed.
740 PacketList protected_media_packets; 720 PacketList protected_media_packets;
741 int i = 0; 721 DeepCopyAndRemoveHalf(media_packet_list_, &protected_media_packets);
742 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
743 ++it, ++i) {
744 if (i % 2 == 0) protected_media_packets.push_back(*it);
745 }
746 722
747 // Zero column insertion will have to extend the size of the packet 723 // Zero column insertion will have to extend the size of the packet
748 // mask since the number of actual packets are 21, while the number 724 // mask since the number of actual packets are 21, while the number
749 // of protected packets are 11. 725 // of protected packets are 11.
750 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor, 726 EXPECT_EQ(0, fec_->GenerateFEC(protected_media_packets, kProtectionFactor,
751 kNumImportantPackets, kUseUnequalProtection, 727 kNumImportantPackets, kUseUnequalProtection,
752 webrtc::kFecMaskBursty, &fec_packet_list_)); 728 webrtc::kFecMaskBursty, &fec_packet_list_));
753 729
754 // Expect 5 FEC packet. 730 // Expect 5 FEC packet.
755 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size())); 731 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size()));
756 732
757 // Last protected media packet lost 733 // Last protected media packet lost
758 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 734 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
759 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 735 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
760 media_loss_mask_[kNumMediaPackets - 1] = 1; 736 media_loss_mask_[kNumMediaPackets - 1] = 1;
761 NetworkReceivedPackets(); 737 NetworkReceivedPackets();
762 738
763 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 739 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
764 &recovered_packet_list_)); 740 &recovered_packet_list_));
765 741
766 // One packet lost, one FEC packet, expect complete recovery. 742 // One packet lost, one FEC packet, expect complete recovery.
767 EXPECT_TRUE(IsRecoveryComplete()); 743 EXPECT_TRUE(IsRecoveryComplete());
768 FreeRecoveredPacketList(); 744 recovered_packet_list_.clear();
769 745
770 // Last unprotected packet lost. 746 // Last unprotected packet lost.
771 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 747 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
772 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 748 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
773 media_loss_mask_[kNumMediaPackets - 2] = 1; 749 media_loss_mask_[kNumMediaPackets - 2] = 1;
774 NetworkReceivedPackets(); 750 NetworkReceivedPackets();
775 751
776 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 752 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
777 &recovered_packet_list_)); 753 &recovered_packet_list_));
778 754
779 // Unprotected packet lost. Recovery not possible. 755 // Unprotected packet lost. Recovery not possible.
780 EXPECT_FALSE(IsRecoveryComplete()); 756 EXPECT_FALSE(IsRecoveryComplete());
781 FreeRecoveredPacketList(); 757 recovered_packet_list_.clear();
782 758
783 // 6 media packets lost. 759 // 6 media packets lost.
784 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 760 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
785 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 761 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
786 media_loss_mask_[kNumMediaPackets - 11] = 1; 762 media_loss_mask_[kNumMediaPackets - 11] = 1;
787 media_loss_mask_[kNumMediaPackets - 9] = 1; 763 media_loss_mask_[kNumMediaPackets - 9] = 1;
788 media_loss_mask_[kNumMediaPackets - 7] = 1; 764 media_loss_mask_[kNumMediaPackets - 7] = 1;
789 media_loss_mask_[kNumMediaPackets - 5] = 1; 765 media_loss_mask_[kNumMediaPackets - 5] = 1;
790 media_loss_mask_[kNumMediaPackets - 3] = 1; 766 media_loss_mask_[kNumMediaPackets - 3] = 1;
791 media_loss_mask_[kNumMediaPackets - 1] = 1; 767 media_loss_mask_[kNumMediaPackets - 1] = 1;
792 NetworkReceivedPackets(); 768 NetworkReceivedPackets();
793 769
794 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_, 770 EXPECT_EQ(0, fec_->DecodeFEC(&received_packet_list_,
795 &recovered_packet_list_)); 771 &recovered_packet_list_));
796 772
797 // 5 protected packets lost, one FEC packet, cannot get complete recovery. 773 // 5 protected packets lost, one FEC packet, cannot get complete recovery.
798 EXPECT_FALSE(IsRecoveryComplete()); 774 EXPECT_FALSE(IsRecoveryComplete());
799 } 775 }
800 776
801 void RtpFecTest::TearDown() { 777 void RtpFecTest::TearDown() {
802 fec_->ResetState(&recovered_packet_list_); 778 fec_->ResetState(&recovered_packet_list_);
803 delete fec_; 779 delete fec_;
804 FreeRecoveredPacketList(); 780 recovered_packet_list_.clear();
805 ClearList(&media_packet_list_); 781 media_packet_list_.clear();
806 EXPECT_TRUE(media_packet_list_.empty()); 782 EXPECT_TRUE(media_packet_list_.empty());
807 } 783 }
808 784
809 void RtpFecTest::FreeRecoveredPacketList() {
810 ClearList(&recovered_packet_list_);
811 }
812
813 bool RtpFecTest::IsRecoveryComplete() { 785 bool RtpFecTest::IsRecoveryComplete() {
814 // Check that the number of media and recovered packets are equal. 786 // Check that the number of media and recovered packets are equal.
815 if (media_packet_list_.size() != recovered_packet_list_.size()) { 787 if (media_packet_list_.size() != recovered_packet_list_.size()) {
816 return false; 788 return false;
817 } 789 }
818 790
819 ForwardErrorCorrection::Packet* media_packet; 791 ForwardErrorCorrection::Packet* media_packet;
820 ForwardErrorCorrection::RecoveredPacket* recovered_packet; 792 ForwardErrorCorrection::RecoveredPacket* recovered_packet;
821 793
822 bool recovery = true; 794 bool recovery = true;
823 795
824 auto media_packet_list_it = media_packet_list_.cbegin(); 796 auto media_packet_list_it = media_packet_list_.cbegin();
825 auto recovered_packet_list_it = recovered_packet_list_.cbegin(); 797 auto recovered_packet_list_it = recovered_packet_list_.cbegin();
826 while (media_packet_list_it != media_packet_list_.end()) { 798 while (media_packet_list_it != media_packet_list_.end()) {
827 if (recovered_packet_list_it == recovered_packet_list_.end()) { 799 if (recovered_packet_list_it == recovered_packet_list_.end()) {
828 return false; 800 return false;
829 } 801 }
830 media_packet = *media_packet_list_it; 802 media_packet = media_packet_list_it->get();
831 recovered_packet = *recovered_packet_list_it; 803 recovered_packet = recovered_packet_list_it->get();
832 if (recovered_packet->pkt->length != media_packet->length) { 804 if (recovered_packet->pkt->length != media_packet->length) {
833 return false; 805 return false;
834 } 806 }
835 if (memcmp(recovered_packet->pkt->data, media_packet->data, 807 if (memcmp(recovered_packet->pkt->data, media_packet->data,
836 media_packet->length) != 0) { 808 media_packet->length) != 0) {
837 return false; 809 return false;
838 } 810 }
839 media_packet_list_it++; 811 media_packet_list_it++;
840 recovered_packet_list_it++; 812 recovered_packet_list_it++;
841 } 813 }
842 return recovery; 814 return recovery;
843 } 815 }
844 816
845 void RtpFecTest::NetworkReceivedPackets() { 817 void RtpFecTest::NetworkReceivedPackets() {
846 const bool kFecPacket = true; 818 const bool kFecPacket = true;
847 ReceivedPackets(media_packet_list_, media_loss_mask_, !kFecPacket); 819 ReceivedPackets(media_packet_list_, media_loss_mask_, !kFecPacket);
848 ReceivedPackets(fec_packet_list_, fec_loss_mask_, kFecPacket); 820 ReceivedPackets(fec_packet_list_, fec_loss_mask_, kFecPacket);
849 } 821 }
850 822
851 void RtpFecTest::ReceivedPackets(const PacketList& packet_list, int* loss_mask, 823 template <typename T>
824 void RtpFecTest::ReceivedPackets(const T& packet_list, int* loss_mask,
852 bool is_fec) { 825 bool is_fec) {
853 ForwardErrorCorrection::Packet* packet;
854 ForwardErrorCorrection::ReceivedPacket* received_packet;
855 int seq_num = fec_seq_num_; 826 int seq_num = fec_seq_num_;
856 int packet_idx = 0; 827 int packet_idx = 0;
857 828
858 auto packet_list_it = packet_list.cbegin(); 829 auto packet_list_it = packet_list.cbegin();
859 while (packet_list_it != packet_list.end()) { 830 while (packet_list_it != packet_list.end()) {
860 packet = *packet_list_it;
861 if (loss_mask[packet_idx] == 0) { 831 if (loss_mask[packet_idx] == 0) {
862 received_packet = new ForwardErrorCorrection::ReceivedPacket; 832 std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet(
833 new ForwardErrorCorrection::ReceivedPacket);
863 received_packet->pkt = new ForwardErrorCorrection::Packet; 834 received_packet->pkt = new ForwardErrorCorrection::Packet;
864 received_packet_list_.push_back(received_packet); 835 received_packet->pkt->length = (*packet_list_it)->length;
865 received_packet->pkt->length = packet->length; 836 memcpy(received_packet->pkt->data,
866 memcpy(received_packet->pkt->data, packet->data, packet->length); 837 (*packet_list_it)->data,
838 (*packet_list_it)->length);
867 received_packet->is_fec = is_fec; 839 received_packet->is_fec = is_fec;
868 if (!is_fec) { 840 if (!is_fec) {
869 // For media packets, the sequence number and marker bit is 841 // For media packets, the sequence number and marker bit is
870 // obtained from RTP header. These were set in ConstructMediaPackets(). 842 // obtained from RTP header. These were set in ConstructMediaPackets().
871 received_packet->seq_num = 843 received_packet->seq_num =
872 webrtc::ByteReader<uint16_t>::ReadBigEndian(&packet->data[2]); 844 webrtc::ByteReader<uint16_t>::ReadBigEndian(
845 &(*packet_list_it)->data[2]);
873 } else { 846 } else {
874 // The sequence number, marker bit, and ssrc number are defined in the 847 // The sequence number, marker bit, and ssrc number are defined in the
875 // RTP header of the FEC packet, which is not constructed in this test. 848 // RTP header of the FEC packet, which is not constructed in this test.
876 // So we set these values below based on the values generated in 849 // So we set these values below based on the values generated in
877 // ConstructMediaPackets(). 850 // ConstructMediaPackets().
878 received_packet->seq_num = seq_num; 851 received_packet->seq_num = seq_num;
879 // The ssrc value for FEC packets is set to the one used for the 852 // The ssrc value for FEC packets is set to the one used for the
880 // media packets in ConstructMediaPackets(). 853 // media packets in ConstructMediaPackets().
881 received_packet->ssrc = ssrc_; 854 received_packet->ssrc = ssrc_;
882 } 855 }
856 received_packet_list_.push_back(std::move(received_packet));
883 } 857 }
884 packet_idx++; 858 packet_idx++;
885 packet_list_it++; 859 packet_list_it++;
886 // Sequence number of FEC packets are defined as increment by 1 from 860 // Sequence number of FEC packets are defined as increment by 1 from
887 // last media packet in frame. 861 // last media packet in frame.
888 if (is_fec) seq_num++; 862 if (is_fec) seq_num++;
889 } 863 }
890 } 864 }
891 865
892 int RtpFecTest::ConstructMediaPacketsSeqNum(int num_media_packets, 866 int RtpFecTest::ConstructMediaPacketsSeqNum(int num_media_packets,
893 int start_seq_num) { 867 int start_seq_num) {
894 RTC_DCHECK_GT(num_media_packets, 0); 868 RTC_DCHECK_GT(num_media_packets, 0);
895 ForwardErrorCorrection::Packet* media_packet = NULL;
896 int sequence_number = start_seq_num; 869 int sequence_number = start_seq_num;
897 int time_stamp = random_.Rand<int>(); 870 int time_stamp = random_.Rand<int>();
898 871
899 for (int i = 0; i < num_media_packets; ++i) { 872 for (int i = 0; i < num_media_packets; ++i) {
900 media_packet = new ForwardErrorCorrection::Packet; 873 std::unique_ptr<ForwardErrorCorrection::Packet> media_packet(
901 media_packet_list_.push_back(media_packet); 874 new ForwardErrorCorrection::Packet);
902 const uint32_t kMinPacketSize = kRtpHeaderSize; 875 const uint32_t kMinPacketSize = kRtpHeaderSize;
903 const uint32_t kMaxPacketSize = IP_PACKET_SIZE - kRtpHeaderSize - 876 const uint32_t kMaxPacketSize = IP_PACKET_SIZE - kRtpHeaderSize -
904 kTransportOverhead - 877 kTransportOverhead -
905 ForwardErrorCorrection::PacketOverhead(); 878 ForwardErrorCorrection::PacketOverhead();
906 media_packet->length = random_.Rand(kMinPacketSize, kMaxPacketSize); 879 media_packet->length = random_.Rand(kMinPacketSize, kMaxPacketSize);
907 880
908 // Generate random values for the first 2 bytes 881 // Generate random values for the first 2 bytes
909 media_packet->data[0] = random_.Rand<uint8_t>(); 882 media_packet->data[0] = random_.Rand<uint8_t>();
910 media_packet->data[1] = random_.Rand<uint8_t>(); 883 media_packet->data[1] = random_.Rand<uint8_t>();
911 884
(...skipping 14 matching lines...) Expand all
926 sequence_number); 899 sequence_number);
927 webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[4], 900 webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[4],
928 time_stamp); 901 time_stamp);
929 webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8], ssrc_); 902 webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8], ssrc_);
930 903
931 // Generate random values for payload. 904 // Generate random values for payload.
932 for (size_t j = 12; j < media_packet->length; ++j) { 905 for (size_t j = 12; j < media_packet->length; ++j) {
933 media_packet->data[j] = random_.Rand<uint8_t>(); 906 media_packet->data[j] = random_.Rand<uint8_t>();
934 } 907 }
935 sequence_number++; 908 sequence_number++;
909 media_packet_list_.push_back(std::move(media_packet));
936 } 910 }
937 // Last packet, set marker bit. 911 // Last packet, set marker bit.
912 ForwardErrorCorrection::Packet* media_packet =
913 media_packet_list_.back().get();
938 RTC_DCHECK(media_packet); 914 RTC_DCHECK(media_packet);
939 media_packet->data[1] |= 0x80; 915 media_packet->data[1] |= 0x80;
940 return sequence_number; 916 return sequence_number;
941 } 917 }
942 918
943 int RtpFecTest::ConstructMediaPackets(int num_media_packets) { 919 int RtpFecTest::ConstructMediaPackets(int num_media_packets) {
944 return ConstructMediaPacketsSeqNum(num_media_packets, random_.Rand<int>()); 920 return ConstructMediaPacketsSeqNum(num_media_packets, random_.Rand<int>());
945 } 921 }
922
923 void RtpFecTest::DeepCopyAndRemoveHalf(const PacketList& src,
stefan-webrtc 2016/06/29 19:36:18 DeepCopyEveryOtherPacket() is better I think. Or m
brandtr 2016/06/30 14:05:55 Done.
924 PacketList* dst) {
925 int i = 0;
926 for (auto& packet : src) {
927 if (i % 2 == 0) {
928 dst->emplace_back(new ForwardErrorCorrection::Packet(*packet));
929 }
930 ++i;
931 }
932 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698