OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } | |
OLD | NEW |