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

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

Issue 2101253002: Unit test for media packet reordering in ForwardErrorCorrection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@flexfec-pt1c_renames-and-fixes
Patch Set: Loss masks are parameters to NetworkReceivedPackets. fec_ is not dynamically allocated. 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
11 #include <algorithm> 11 #include <algorithm>
12 #include <list> 12 #include <list>
13 13
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webrtc/base/random.h" 15 #include "webrtc/base/random.h"
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
17 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" 17 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
18 18
19 using webrtc::ForwardErrorCorrection; 19 using webrtc::ForwardErrorCorrection;
20 20
21 // Minimum RTP header size in bytes. 21 // Minimum RTP header size in bytes.
22 const uint8_t kRtpHeaderSize = 12; 22 constexpr uint8_t kRtpHeaderSize = 12;
23 23
24 // Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum. 24 // Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum.
25 const uint8_t kTransportOverhead = 28; 25 constexpr uint8_t kTransportOverhead = 28;
26 26
27 // Maximum number of media packets used in the FEC (RFC 5109). 27 // Maximum number of media packets used in the FEC (RFC 5109).
28 const uint8_t kMaxNumberMediaPackets = ForwardErrorCorrection::kMaxMediaPackets; 28 constexpr uint8_t kMaxNumberMediaPackets =
29 ForwardErrorCorrection::kMaxMediaPackets;
29 30
30 using PacketList = ForwardErrorCorrection::PacketList; 31 using PacketList = ForwardErrorCorrection::PacketList;
31 using ReceivedPacketList = ForwardErrorCorrection::ReceivedPacketList; 32 using ReceivedPacketList = ForwardErrorCorrection::ReceivedPacketList;
32 using RecoveredPacketList = ForwardErrorCorrection::RecoveredPacketList; 33 using RecoveredPacketList = ForwardErrorCorrection::RecoveredPacketList;
33 34
34 template <typename T> void ClearList(std::list<T*>* my_list) { 35 template <typename T> void ClearList(std::list<T*>* my_list) {
35 T* packet = NULL; 36 T* packet = NULL;
36 while (!my_list->empty()) { 37 while (!my_list->empty()) {
37 packet = my_list->front(); 38 packet = my_list->front();
38 delete packet; 39 delete packet;
39 my_list->pop_front(); 40 my_list->pop_front();
40 } 41 }
41 } 42 }
42 43
43 class RtpFecTest : public ::testing::Test { 44 class RtpFecTest : public ::testing::Test {
44 protected: 45 protected:
45 RtpFecTest() 46 RtpFecTest()
46 : random_(0xfec133700742), 47 : random_(0xfec133700742),
47 fec_(new ForwardErrorCorrection()), 48 fec_(),
danilchap 2016/07/19 13:47:27 initialization of members with default constructor
brandtr 2016/07/21 09:04:33 Done.
48 ssrc_(random_.Rand<uint32_t>()), 49 ssrc_(random_.Rand<uint32_t>()),
49 fec_seq_num_(0) {} 50 fec_seq_num_(0) {}
50 51
51 webrtc::Random random_; 52 // Construct |media_packet_list_|, up to |num_media_packets| packets.
52 ForwardErrorCorrection* fec_;
53 int ssrc_;
54 uint16_t fec_seq_num_;
55
56 PacketList media_packet_list_;
57 PacketList fec_packet_list_;
58 ReceivedPacketList received_packet_list_;
59 RecoveredPacketList recovered_packet_list_;
60
61 // Media packet "i" is lost if media_loss_mask_[i] = 1,
62 // received if media_loss_mask_[i] = 0.
63 int media_loss_mask_[kMaxNumberMediaPackets];
64
65 // FEC packet "i" is lost if fec_loss_mask_[i] = 1,
66 // received if fec_loss_mask_[i] = 0.
67 int fec_loss_mask_[kMaxNumberMediaPackets];
68
69 // Construct the media packet list, up to |num_media_packets| packets.
70 // Returns the next sequence number after the last media packet. 53 // Returns the next sequence number after the last media packet.
71 // (this will be the sequence of the first FEC packet) 54 // (this will be the sequence of the first FEC packet)
72 int ConstructMediaPacketsSeqNum(int num_media_packets, int start_seq_num); 55 int ConstructMediaPacketsSeqNum(int num_media_packets, int start_seq_num);
73 int ConstructMediaPackets(int num_media_packets); 56 int ConstructMediaPackets(int num_media_packets);
74 57
75 // Construct the received packet list: a subset of the media and FEC packets. 58 // Construct |received_packet_list_|: a subset of the media and FEC packets.
76 void NetworkReceivedPackets(); 59 //
60 // Media packet "i" is lost if media_loss_mask_[i] = 1, received if
61 // media_loss_mask_[i] = 0.
62 // FEC packet "i" is lost if fec_loss_mask_[i] = 1, received if
63 // fec_loss_mask_[i] = 0.
64 void NetworkReceivedPackets(int* media_loss_mask, int* fec_loss_mask);
77 65
78 // Add packet from |packet_list| to list of received packets, using the 66 // Add packet from |packet_list| to list of received packets, using the
79 // |loss_mask|. 67 // |loss_mask|.
80 // The |packet_list| may be a media packet list (is_fec = false), or a 68 // The |packet_list| may be a media packet list (is_fec = false), or a
81 // FEC packet list (is_fec = true). 69 // FEC packet list (is_fec = true).
82 void ReceivedPackets(const PacketList& packet_list, int* loss_mask, 70 void ReceivedPackets(const PacketList& packet_list, int* loss_mask,
83 bool is_fec); 71 bool is_fec);
84 72
85 // Check for complete recovery after FEC decoding. 73 // Check for complete recovery after FEC decoding.
86 bool IsRecoveryComplete(); 74 bool IsRecoveryComplete();
87 75
88 // Delete the received packets. 76 // Delete the received packets.
89 void FreeRecoveredPacketList(); 77 void FreeRecoveredPacketList();
90 78
91 // Delete the media and FEC packets. 79 // Delete the media and FEC packets.
92 void TearDown(); 80 void TearDown();
81
82 webrtc::Random random_;
83 ForwardErrorCorrection fec_;
84 int ssrc_;
85 uint16_t fec_seq_num_;
86
87 PacketList media_packet_list_;
88 PacketList fec_packet_list_;
89 ReceivedPacketList received_packet_list_;
90 RecoveredPacketList recovered_packet_list_;
91
92 int media_loss_mask_[kMaxNumberMediaPackets];
93 int fec_loss_mask_[kMaxNumberMediaPackets];
93 }; 94 };
94 95
95 TEST_F(RtpFecTest, FecRecoveryNoLoss) { 96 TEST_F(RtpFecTest, FecRecoveryNoLoss) {
96 const int kNumImportantPackets = 0; 97 constexpr int kNumImportantPackets = 0;
97 const bool kUseUnequalProtection = false; 98 constexpr bool kUseUnequalProtection = false;
98 const int kNumMediaPackets = 4; 99 constexpr int kNumMediaPackets = 4;
99 uint8_t kProtectionFactor = 60; 100 constexpr uint8_t kProtectionFactor = 60;
100 101
101 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 102 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
102 103
103 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 104 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
104 kNumImportantPackets, kUseUnequalProtection, 105 kNumImportantPackets, kUseUnequalProtection,
105 webrtc::kFecMaskBursty, &fec_packet_list_)); 106 webrtc::kFecMaskBursty, &fec_packet_list_));
106 107
107 // Expect 1 FEC packet. 108 // Expect 1 FEC packet.
108 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 109 EXPECT_EQ(1u, fec_packet_list_.size());
109 110
110 // No packets lost. 111 // No packets lost.
111 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 112 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
112 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 113 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
113 NetworkReceivedPackets(); 114 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
114 115
115 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 116 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
116 &recovered_packet_list_)); 117 &recovered_packet_list_));
117 118
118 // No packets lost, expect complete recovery. 119 // No packets lost, expect complete recovery.
119 EXPECT_TRUE(IsRecoveryComplete()); 120 EXPECT_TRUE(IsRecoveryComplete());
120 } 121 }
121 122
122 TEST_F(RtpFecTest, FecRecoveryWithLoss) { 123 TEST_F(RtpFecTest, FecRecoveryWithLoss) {
123 const int kNumImportantPackets = 0; 124 constexpr int kNumImportantPackets = 0;
124 const bool kUseUnequalProtection = false; 125 constexpr bool kUseUnequalProtection = false;
125 const int kNumMediaPackets = 4; 126 constexpr int kNumMediaPackets = 4;
126 uint8_t kProtectionFactor = 60; 127 constexpr uint8_t kProtectionFactor = 60;
127 128
128 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 129 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
129 130
130 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 131 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
131 kNumImportantPackets, kUseUnequalProtection, 132 kNumImportantPackets, kUseUnequalProtection,
132 webrtc::kFecMaskBursty, &fec_packet_list_)); 133 webrtc::kFecMaskBursty, &fec_packet_list_));
133 134
134 // Expect 1 FEC packet. 135 // Expect 1 FEC packet.
135 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 136 EXPECT_EQ(1u, fec_packet_list_.size());
136 137
137 // 1 media packet lost 138 // 1 media packet lost
138 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 139 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
139 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 140 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
140 media_loss_mask_[3] = 1; 141 media_loss_mask_[3] = 1;
141 NetworkReceivedPackets(); 142 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
142 143
143 EXPECT_EQ(0, 144 EXPECT_EQ(0,
144 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 145 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
145 146
146 // One packet lost, one FEC packet, expect complete recovery. 147 // One packet lost, one FEC packet, expect complete recovery.
147 EXPECT_TRUE(IsRecoveryComplete()); 148 EXPECT_TRUE(IsRecoveryComplete());
148 FreeRecoveredPacketList(); 149 FreeRecoveredPacketList();
149 150
150 // 2 media packets lost. 151 // 2 media packets lost.
151 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 152 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
152 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 153 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
153 media_loss_mask_[1] = 1; 154 media_loss_mask_[1] = 1;
154 media_loss_mask_[3] = 1; 155 media_loss_mask_[3] = 1;
155 NetworkReceivedPackets(); 156 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
156 157
157 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 158 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
158 &recovered_packet_list_)); 159 &recovered_packet_list_));
159 160
160 // 2 packets lost, one FEC packet, cannot get complete recovery. 161 // 2 packets lost, one FEC packet, cannot get complete recovery.
161 EXPECT_FALSE(IsRecoveryComplete()); 162 EXPECT_FALSE(IsRecoveryComplete());
162 } 163 }
163 164
164 // Verify that we don't use an old FEC packet for FEC decoding. 165 // Verify that we don't use an old FEC packet for FEC decoding.
165 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapTwoFrames) { 166 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapTwoFrames) {
166 const int kNumImportantPackets = 0; 167 constexpr int kNumImportantPackets = 0;
167 const bool kUseUnequalProtection = false; 168 constexpr bool kUseUnequalProtection = false;
168 uint8_t kProtectionFactor = 20; 169 constexpr uint8_t kProtectionFactor = 20;
169 170
170 // Two frames: first frame (old) with two media packets and 1 FEC packet. 171 // Two frames: first frame (old) with two media packets and 1 FEC packet.
171 // Second frame (new) with 3 media packets, and no FEC packets. 172 // Second frame (new) with 3 media packets, and no FEC packets.
172 // ---Frame 1---- ----Frame 2------ 173 // ---Frame 1---- ----Frame 2------
173 // #0(media) #1(media) #2(FEC) #65535(media) #0(media) #1(media). 174 // #0(media) #1(media) #2(FEC) #65535(media) #0(media) #1(media).
174 // If we lose either packet 0 or 1 of second frame, FEC decoding should not 175 // If we lose either packet 0 or 1 of second frame, FEC decoding should not
175 // try to decode using "old" FEC packet #2. 176 // try to decode using "old" FEC packet #2.
176 177
177 // Construct media packets for first frame, starting at sequence number 0. 178 // Construct media packets for first frame, starting at sequence number 0.
178 fec_seq_num_ = ConstructMediaPacketsSeqNum(2, 0); 179 fec_seq_num_ = ConstructMediaPacketsSeqNum(2, 0);
179 180
180 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 181 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
181 kNumImportantPackets, kUseUnequalProtection, 182 kNumImportantPackets, kUseUnequalProtection,
182 webrtc::kFecMaskBursty, &fec_packet_list_)); 183 webrtc::kFecMaskBursty, &fec_packet_list_));
183 // Expect 1 FEC packet. 184 // Expect 1 FEC packet.
184 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 185 EXPECT_EQ(1u, fec_packet_list_.size());
185 // Add FEC packet (seq#2) of this first frame to received list (i.e., assume 186 // Add FEC packet (seq#2) of this first frame to received list (i.e., assume
186 // the two media packet were lost). 187 // the two media packet were lost).
187 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 188 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
188 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 189 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
189 190
190 // Construct media packets for second frame, with sequence number wrap. 191 // Construct media packets for second frame, with sequence number wrap.
191 ClearList(&media_packet_list_); 192 ClearList(&media_packet_list_);
192 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65535); 193 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65535);
193 194
194 // Expect 3 media packets for this frame. 195 // Expect 3 media packets for this frame.
195 EXPECT_EQ(3, static_cast<int>(media_packet_list_.size())); 196 EXPECT_EQ(3u, media_packet_list_.size());
196 197
197 // Second media packet lost (seq#0). 198 // Second media packet lost (seq#0).
198 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 199 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
199 media_loss_mask_[1] = 1; 200 media_loss_mask_[1] = 1;
200 // Add packets #65535, and #1 to received list. 201 // Add packets #65535, and #1 to received list.
201 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 202 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
202 203
203 EXPECT_EQ(0, 204 EXPECT_EQ(0,
204 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 205 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
205 206
206 // Expect that no decoding is done to get missing packet (seq#0) of second 207 // Expect that no decoding is done to get missing packet (seq#0) of second
207 // frame, using old FEC packet (seq#2) from first (old) frame. So number of 208 // frame, using old FEC packet (seq#2) from first (old) frame. So number of
208 // recovered packets is 2, and not equal to number of media packets (=3). 209 // recovered packets is 2, and not equal to number of media packets (=3).
209 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size())); 210 EXPECT_EQ(2u, recovered_packet_list_.size());
210 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size()); 211 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size());
211 FreeRecoveredPacketList(); 212 FreeRecoveredPacketList();
212 } 213 }
213 214
214 // Verify we can still recovery frame if sequence number wrap occurs within 215 // Verify we can still recover frame if sequence number wrap occurs within
215 // the frame and FEC packet following wrap is received after media packets. 216 // the frame and FEC packet following wrap is received after media packets.
216 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameRecovery) { 217 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameRecovery) {
217 const int kNumImportantPackets = 0; 218 constexpr int kNumImportantPackets = 0;
218 const bool kUseUnequalProtection = false; 219 constexpr bool kUseUnequalProtection = false;
219 uint8_t kProtectionFactor = 20; 220 constexpr uint8_t kProtectionFactor = 20;
220 221
221 // One frame, with sequence number wrap in media packets. 222 // One frame, with sequence number wrap in media packets.
222 // -----Frame 1---- 223 // -----Frame 1----
223 // #65534(media) #65535(media) #0(media) #1(FEC). 224 // #65534(media) #65535(media) #0(media) #1(FEC).
224 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65534); 225 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65534);
225 226
226 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 227 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
227 kNumImportantPackets, kUseUnequalProtection, 228 kNumImportantPackets, kUseUnequalProtection,
228 webrtc::kFecMaskBursty, &fec_packet_list_)); 229 webrtc::kFecMaskBursty, &fec_packet_list_));
229 230
230 // Expect 1 FEC packet. 231 // Expect 1 FEC packet.
231 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 232 EXPECT_EQ(1u, fec_packet_list_.size());
232 233
233 // Lose one media packet (seq# 65535). 234 // Lose one media packet (seq# 65535).
234 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 235 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
235 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 236 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
236 media_loss_mask_[1] = 1; 237 media_loss_mask_[1] = 1;
237 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 238 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
238 // Add FEC packet to received list following the media packets. 239 // Add FEC packet to received list following the media packets.
239 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 240 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
240 241
241 EXPECT_EQ(0, 242 EXPECT_EQ(0,
242 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 243 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
243 244
244 // Expect 3 media packets in recovered list, and complete recovery. 245 // Expect 3 media packets in recovered list, and complete recovery.
245 // Wrap-around won't remove FEC packet, as it follows the wrap. 246 // Wrap-around won't remove FEC packet, as it follows the wrap.
246 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size())); 247 EXPECT_EQ(3u, recovered_packet_list_.size());
247 EXPECT_TRUE(IsRecoveryComplete()); 248 EXPECT_TRUE(IsRecoveryComplete());
248 FreeRecoveredPacketList(); 249 FreeRecoveredPacketList();
249 } 250 }
250 251
251 // Sequence number wrap occurs within the FEC packets for the frame. 252 // Sequence number wrap occurs within the FEC packets for the frame.
252 // In this case we will discard FEC packet and full recovery is not expected. 253 // In this case we will discard FEC packet and full recovery is not expected.
253 // Same problem will occur if wrap is within media packets but FEC packet is 254 // Same problem will occur if wrap is within media packets but FEC packet is
254 // received before the media packets. This may be improved if timing information 255 // received before the media packets. This may be improved if timing information
255 // is used to detect old FEC packets. 256 // is used to detect old FEC packets.
256 // TODO(marpan): Update test if wrap-around handling changes in FEC decoding. 257 // TODO(marpan): Update test if wrap-around handling changes in FEC decoding.
257 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameNoRecovery) { 258 TEST_F(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameNoRecovery) {
258 const int kNumImportantPackets = 0; 259 constexpr int kNumImportantPackets = 0;
259 const bool kUseUnequalProtection = false; 260 constexpr bool kUseUnequalProtection = false;
260 uint8_t kProtectionFactor = 200; 261 constexpr uint8_t kProtectionFactor = 200;
261 262
262 // 1 frame: 3 media packets and 2 FEC packets. 263 // 1 frame: 3 media packets and 2 FEC packets.
263 // Sequence number wrap in FEC packets. 264 // Sequence number wrap in FEC packets.
264 // -----Frame 1---- 265 // -----Frame 1----
265 // #65532(media) #65533(media) #65534(media) #65535(FEC) #0(FEC). 266 // #65532(media) #65533(media) #65534(media) #65535(FEC) #0(FEC).
266 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65532); 267 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 65532);
267 268
268 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 269 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
269 kNumImportantPackets, kUseUnequalProtection, 270 kNumImportantPackets, kUseUnequalProtection,
270 webrtc::kFecMaskBursty, &fec_packet_list_)); 271 webrtc::kFecMaskBursty, &fec_packet_list_));
271 272
272 // Expect 2 FEC packets. 273 // Expect 2 FEC packets.
273 EXPECT_EQ(2, static_cast<int>(fec_packet_list_.size())); 274 EXPECT_EQ(2u, fec_packet_list_.size());
274 275
275 // Lose the last two media packets (seq# 65533, 65534). 276 // Lose the last two media packets (seq# 65533, 65534).
276 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 277 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
277 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 278 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
278 media_loss_mask_[1] = 1; 279 media_loss_mask_[1] = 1;
279 media_loss_mask_[2] = 1; 280 media_loss_mask_[2] = 1;
280 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 281 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
281 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 282 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
282 283
283 EXPECT_EQ(0, 284 EXPECT_EQ(0,
284 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 285 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
285 286
286 // The two FEC packets are received and should allow for complete recovery, 287 // The two FEC packets are received and should allow for complete recovery,
287 // but because of the wrap the second FEC packet will be discarded, and only 288 // but because of the wrap the second FEC packet will be discarded, and only
288 // one media packet is recoverable. So exepct 2 media packets on recovered 289 // one media packet is recoverable. So exepct 2 media packets on recovered
289 // list and no complete recovery. 290 // list and no complete recovery.
290 EXPECT_EQ(2, static_cast<int>(recovered_packet_list_.size())); 291 EXPECT_EQ(2u, recovered_packet_list_.size());
291 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size()); 292 EXPECT_TRUE(recovered_packet_list_.size() != media_packet_list_.size());
292 EXPECT_FALSE(IsRecoveryComplete()); 293 EXPECT_FALSE(IsRecoveryComplete());
293 FreeRecoveredPacketList(); 294 FreeRecoveredPacketList();
294 } 295 }
295 296
296 // Verify we can still recovery frame if FEC is received before media packets. 297 // Verify we can still recover frame if media packets are reordered.
297 TEST_F(RtpFecTest, FecRecoveryWithFecOutOfOrder) { 298 TEST_F(RtpFecTest, FecRecoveryWithMediaReordering) {
stefan-webrtc 2016/07/20 09:33:30 WithMediaOutOfOrder to align with test below, or r
brandtr 2016/07/21 09:04:33 Renamed the test. The reason for the different na
298 const int kNumImportantPackets = 0; 299 constexpr int kNumImportantPackets = 0;
299 const bool kUseUnequalProtection = false; 300 constexpr bool kUseUnequalProtection = false;
300 uint8_t kProtectionFactor = 20; 301 constexpr uint8_t kProtectionFactor = 20;
301 302
302 // One frame: 3 media packets, 1 FEC packet. 303 // One frame: 3 media packets, 1 FEC packet.
303 // -----Frame 1---- 304 // -----Frame 1----
304 // #0(media) #1(media) #2(media) #3(FEC). 305 // #0(media) #1(media) #2(media) #3(FEC).
305 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 0); 306 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 0);
306 307
307 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 308 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
308 kNumImportantPackets, kUseUnequalProtection, 309 kNumImportantPackets, kUseUnequalProtection,
309 webrtc::kFecMaskBursty, &fec_packet_list_)); 310 webrtc::kFecMaskBursty, &fec_packet_list_));
310 311
311 // Expect 1 FEC packet. 312 // Expect 1 FEC packet.
312 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 313 EXPECT_EQ(1u, fec_packet_list_.size());
313 314
314 // Lose one media packet (seq# 1). 315 // Lose one media packet (seq# 1).
315 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 316 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
317 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
318 media_loss_mask_[1] = 1;
319 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
320
321 // Reorder received media packets.
322 auto it0 = received_packet_list_.begin();
323 auto it2 = received_packet_list_.begin();
324 it2++;
325 std::swap(*it0, *it2);
326
327 EXPECT_EQ(0,
328 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
329
330 // Expect 3 media packets in recovered list, and complete recovery.
331 EXPECT_EQ(3u, recovered_packet_list_.size());
332 EXPECT_TRUE(IsRecoveryComplete());
333 }
334
335 // Verify we can still recover frame if FEC is received before media packets.
336 TEST_F(RtpFecTest, FecRecoveryWithFecOutOfOrder) {
337 constexpr int kNumImportantPackets = 0;
338 constexpr bool kUseUnequalProtection = false;
339 constexpr uint8_t kProtectionFactor = 20;
340
341 // One frame: 3 media packets, 1 FEC packet.
342 // -----Frame 1----
343 // #0(media) #1(media) #2(media) #3(FEC).
344 fec_seq_num_ = ConstructMediaPacketsSeqNum(3, 0);
345
346 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
347 kNumImportantPackets, kUseUnequalProtection,
348 webrtc::kFecMaskBursty, &fec_packet_list_));
349
350 // Expect 1 FEC packet.
351 EXPECT_EQ(1u, fec_packet_list_.size());
352
353 // Lose one media packet (seq# 1).
354 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
316 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 355 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
317 media_loss_mask_[1] = 1; 356 media_loss_mask_[1] = 1;
318 // Add FEC packet to received list before the media packets. 357 // Add FEC packet to received list before the media packets.
319 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true); 358 ReceivedPackets(fec_packet_list_, fec_loss_mask_, true);
320 // Add media packets to received list. 359 // Add media packets to received list.
321 ReceivedPackets(media_packet_list_, media_loss_mask_, false); 360 ReceivedPackets(media_packet_list_, media_loss_mask_, false);
322 361
323 EXPECT_EQ(0, 362 EXPECT_EQ(0,
324 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 363 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
325 364
326 // Expect 3 media packets in recovered list, and complete recovery. 365 // Expect 3 media packets in recovered list, and complete recovery.
327 EXPECT_EQ(3, static_cast<int>(recovered_packet_list_.size())); 366 EXPECT_EQ(3u, recovered_packet_list_.size());
328 EXPECT_TRUE(IsRecoveryComplete()); 367 EXPECT_TRUE(IsRecoveryComplete());
329 FreeRecoveredPacketList(); 368 FreeRecoveredPacketList();
330 } 369 }
331 370
332 // Test 50% protection with random mask type: Two cases are considered: 371 // Test 50% protection with random mask type: Two cases are considered:
333 // a 50% non-consecutive loss which can be fully recovered, and a 50% 372 // a 50% non-consecutive loss which can be fully recovered, and a 50%
334 // consecutive loss which cannot be fully recovered. 373 // consecutive loss which cannot be fully recovered.
335 TEST_F(RtpFecTest, FecRecoveryWithLoss50percRandomMask) { 374 TEST_F(RtpFecTest, FecRecoveryWithLoss50percRandomMask) {
336 const int kNumImportantPackets = 0; 375 constexpr int kNumImportantPackets = 0;
337 const bool kUseUnequalProtection = false; 376 constexpr bool kUseUnequalProtection = false;
338 const int kNumMediaPackets = 4; 377 constexpr int kNumMediaPackets = 4;
339 const uint8_t kProtectionFactor = 255; 378 constexpr uint8_t kProtectionFactor = 255;
340 379
341 // Packet Mask for (4,4,0) code, from random mask table. 380 // Packet Mask for (4,4,0) code, from random mask table.
342 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0) 381 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0)
343 382
344 // media#0 media#1 media#2 media#3 383 // media#0 media#1 media#2 media#3
345 // fec#0: 1 1 0 0 384 // fec#0: 1 1 0 0
346 // fec#1: 1 0 1 0 385 // fec#1: 1 0 1 0
347 // fec#2: 0 0 1 1 386 // fec#2: 0 0 1 1
348 // fec#3: 0 1 0 1 387 // fec#3: 0 1 0 1
349 // 388 //
350 389
351 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 390 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
352 391
353 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 392 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
354 kNumImportantPackets, kUseUnequalProtection, 393 kNumImportantPackets, kUseUnequalProtection,
355 webrtc::kFecMaskRandom, &fec_packet_list_)); 394 webrtc::kFecMaskRandom, &fec_packet_list_));
356 395
357 // Expect 4 FEC packets. 396 // Expect 4 FEC packets.
358 EXPECT_EQ(4, static_cast<int>(fec_packet_list_.size())); 397 EXPECT_EQ(4u, fec_packet_list_.size());
359 398
360 // 4 packets lost: 3 media packets (0, 2, 3), and one FEC packet (0) lost. 399 // 4 packets lost: 3 media packets (0, 2, 3), and one FEC packet (0) lost.
361 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 400 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
362 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 401 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
363 fec_loss_mask_[0] = 1; 402 fec_loss_mask_[0] = 1;
364 media_loss_mask_[0] = 1; 403 media_loss_mask_[0] = 1;
365 media_loss_mask_[2] = 1; 404 media_loss_mask_[2] = 1;
366 media_loss_mask_[3] = 1; 405 media_loss_mask_[3] = 1;
367 NetworkReceivedPackets(); 406 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
368 407
369 EXPECT_EQ(0, 408 EXPECT_EQ(0,
370 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 409 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
371 410
372 // With media packet#1 and FEC packets #1, #2, #3, expect complete recovery. 411 // With media packet#1 and FEC packets #1, #2, #3, expect complete recovery.
373 EXPECT_TRUE(IsRecoveryComplete()); 412 EXPECT_TRUE(IsRecoveryComplete());
374 FreeRecoveredPacketList(); 413 FreeRecoveredPacketList();
375 414
376 // 4 consecutive packets lost: media packets 0, 1, 2, 3. 415 // 4 consecutive packets lost: media packets 0, 1, 2, 3.
377 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 416 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
378 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 417 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
379 media_loss_mask_[0] = 1; 418 media_loss_mask_[0] = 1;
380 media_loss_mask_[1] = 1; 419 media_loss_mask_[1] = 1;
381 media_loss_mask_[2] = 1; 420 media_loss_mask_[2] = 1;
382 media_loss_mask_[3] = 1; 421 media_loss_mask_[3] = 1;
383 NetworkReceivedPackets(); 422 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
384 423
385 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 424 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
386 &recovered_packet_list_)); 425 &recovered_packet_list_));
387 426
388 // Cannot get complete recovery for this loss configuration with random mask. 427 // Cannot get complete recovery for this loss configuration with random mask.
389 EXPECT_FALSE(IsRecoveryComplete()); 428 EXPECT_FALSE(IsRecoveryComplete());
390 } 429 }
391 430
392 // Test 50% protection with bursty type: Three cases are considered: 431 // Test 50% protection with bursty type: Three cases are considered:
393 // two 50% consecutive losses which can be fully recovered, and one 432 // two 50% consecutive losses which can be fully recovered, and one
394 // non-consecutive which cannot be fully recovered. 433 // non-consecutive which cannot be fully recovered.
395 TEST_F(RtpFecTest, FecRecoveryWithLoss50percBurstyMask) { 434 TEST_F(RtpFecTest, FecRecoveryWithLoss50percBurstyMask) {
396 const int kNumImportantPackets = 0; 435 constexpr int kNumImportantPackets = 0;
397 const bool kUseUnequalProtection = false; 436 constexpr bool kUseUnequalProtection = false;
398 const int kNumMediaPackets = 4; 437 constexpr int kNumMediaPackets = 4;
399 const uint8_t kProtectionFactor = 255; 438 constexpr uint8_t kProtectionFactor = 255;
400 439
401 // Packet Mask for (4,4,0) code, from bursty mask table. 440 // Packet Mask for (4,4,0) code, from bursty mask table.
402 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0) 441 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0)
403 442
404 // media#0 media#1 media#2 media#3 443 // media#0 media#1 media#2 media#3
405 // fec#0: 1 0 0 0 444 // fec#0: 1 0 0 0
406 // fec#1: 1 1 0 0 445 // fec#1: 1 1 0 0
407 // fec#2: 0 1 1 0 446 // fec#2: 0 1 1 0
408 // fec#3: 0 0 1 1 447 // fec#3: 0 0 1 1
409 // 448 //
410 449
411 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 450 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
412 451
413 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 452 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
414 kNumImportantPackets, kUseUnequalProtection, 453 kNumImportantPackets, kUseUnequalProtection,
415 webrtc::kFecMaskBursty, &fec_packet_list_)); 454 webrtc::kFecMaskBursty, &fec_packet_list_));
416 455
417 // Expect 4 FEC packets. 456 // Expect 4 FEC packets.
418 EXPECT_EQ(4, static_cast<int>(fec_packet_list_.size())); 457 EXPECT_EQ(4u, fec_packet_list_.size());
419 458
420 // 4 consecutive packets lost: media packets 0,1,2,3. 459 // 4 consecutive packets lost: media packets 0,1,2,3.
421 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 460 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
422 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 461 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
423 media_loss_mask_[0] = 1; 462 media_loss_mask_[0] = 1;
424 media_loss_mask_[1] = 1; 463 media_loss_mask_[1] = 1;
425 media_loss_mask_[2] = 1; 464 media_loss_mask_[2] = 1;
426 media_loss_mask_[3] = 1; 465 media_loss_mask_[3] = 1;
427 NetworkReceivedPackets(); 466 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
428 467
429 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 468 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
430 &recovered_packet_list_)); 469 &recovered_packet_list_));
431 470
432 // Expect complete recovery for consecutive packet loss <= 50%. 471 // Expect complete recovery for consecutive packet loss <= 50%.
433 EXPECT_TRUE(IsRecoveryComplete()); 472 EXPECT_TRUE(IsRecoveryComplete());
434 FreeRecoveredPacketList(); 473 FreeRecoveredPacketList();
435 474
436 // 4 consecutive packets lost: media packets 1,2, 3, and FEC packet 0. 475 // 4 consecutive packets lost: media packets 1,2, 3, and FEC packet 0.
437 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 476 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
438 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 477 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
439 fec_loss_mask_[0] = 1; 478 fec_loss_mask_[0] = 1;
440 media_loss_mask_[1] = 1; 479 media_loss_mask_[1] = 1;
441 media_loss_mask_[2] = 1; 480 media_loss_mask_[2] = 1;
442 media_loss_mask_[3] = 1; 481 media_loss_mask_[3] = 1;
443 NetworkReceivedPackets(); 482 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
444 483
445 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 484 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
446 &recovered_packet_list_)); 485 &recovered_packet_list_));
447 486
448 // Expect complete recovery for consecutive packet loss <= 50%. 487 // Expect complete recovery for consecutive packet loss <= 50%.
449 EXPECT_TRUE(IsRecoveryComplete()); 488 EXPECT_TRUE(IsRecoveryComplete());
450 FreeRecoveredPacketList(); 489 FreeRecoveredPacketList();
451 490
452 // 4 packets lost (non-consecutive loss): media packets 0, 3, and FEC# 0, 3. 491 // 4 packets lost (non-consecutive loss): media packets 0, 3, and FEC# 0, 3.
453 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 492 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
454 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 493 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
455 fec_loss_mask_[0] = 1; 494 fec_loss_mask_[0] = 1;
456 fec_loss_mask_[3] = 1; 495 fec_loss_mask_[3] = 1;
457 media_loss_mask_[0] = 1; 496 media_loss_mask_[0] = 1;
458 media_loss_mask_[3] = 1; 497 media_loss_mask_[3] = 1;
459 NetworkReceivedPackets(); 498 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
460 499
461 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 500 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
462 &recovered_packet_list_)); 501 &recovered_packet_list_));
463 502
464 // Cannot get complete recovery for this loss configuration. 503 // Cannot get complete recovery for this loss configuration.
465 EXPECT_FALSE(IsRecoveryComplete()); 504 EXPECT_FALSE(IsRecoveryComplete());
466 } 505 }
467 506
468 TEST_F(RtpFecTest, FecRecoveryNoLossUep) { 507 TEST_F(RtpFecTest, FecRecoveryNoLossUep) {
469 const int kNumImportantPackets = 2; 508 constexpr int kNumImportantPackets = 2;
470 const bool kUseUnequalProtection = true; 509 constexpr bool kUseUnequalProtection = true;
471 const int kNumMediaPackets = 4; 510 constexpr int kNumMediaPackets = 4;
472 const uint8_t kProtectionFactor = 60; 511 constexpr uint8_t kProtectionFactor = 60;
473 512
474 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 513 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
475 514
476 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 515 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
477 kNumImportantPackets, kUseUnequalProtection, 516 kNumImportantPackets, kUseUnequalProtection,
478 webrtc::kFecMaskBursty, &fec_packet_list_)); 517 webrtc::kFecMaskBursty, &fec_packet_list_));
479 518
480 // Expect 1 FEC packet. 519 // Expect 1 FEC packet.
481 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 520 EXPECT_EQ(1u, fec_packet_list_.size());
482 521
483 // No packets lost. 522 // No packets lost.
484 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 523 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
485 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 524 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
486 NetworkReceivedPackets(); 525 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
487 526
488 EXPECT_EQ(0, 527 EXPECT_EQ(0,
489 fec_->DecodeFec(&received_packet_list_, &recovered_packet_list_)); 528 fec_.DecodeFec(&received_packet_list_, &recovered_packet_list_));
490 529
491 // No packets lost, expect complete recovery. 530 // No packets lost, expect complete recovery.
492 EXPECT_TRUE(IsRecoveryComplete()); 531 EXPECT_TRUE(IsRecoveryComplete());
493 } 532 }
494 533
495 TEST_F(RtpFecTest, FecRecoveryWithLossUep) { 534 TEST_F(RtpFecTest, FecRecoveryWithLossUep) {
496 const int kNumImportantPackets = 2; 535 constexpr int kNumImportantPackets = 2;
497 const bool kUseUnequalProtection = true; 536 constexpr bool kUseUnequalProtection = true;
498 const int kNumMediaPackets = 4; 537 constexpr int kNumMediaPackets = 4;
499 const uint8_t kProtectionFactor = 60; 538 constexpr uint8_t kProtectionFactor = 60;
500 539
501 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 540 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
502 541
503 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 542 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
504 kNumImportantPackets, kUseUnequalProtection, 543 kNumImportantPackets, kUseUnequalProtection,
505 webrtc::kFecMaskBursty, &fec_packet_list_)); 544 webrtc::kFecMaskBursty, &fec_packet_list_));
506 545
507 // Expect 1 FEC packet. 546 // Expect 1 FEC packet.
508 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 547 EXPECT_EQ(1u, fec_packet_list_.size());
509 548
510 // 1 media packet lost. 549 // 1 media packet lost.
511 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 550 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
512 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 551 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
513 media_loss_mask_[3] = 1; 552 media_loss_mask_[3] = 1;
514 NetworkReceivedPackets(); 553 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
515 554
516 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 555 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
517 &recovered_packet_list_)); 556 &recovered_packet_list_));
518 557
519 // One packet lost, one FEC packet, expect complete recovery. 558 // One packet lost, one FEC packet, expect complete recovery.
520 EXPECT_TRUE(IsRecoveryComplete()); 559 EXPECT_TRUE(IsRecoveryComplete());
521 FreeRecoveredPacketList(); 560 FreeRecoveredPacketList();
522 561
523 // 2 media packets lost. 562 // 2 media packets lost.
524 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 563 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
525 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 564 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
526 media_loss_mask_[1] = 1; 565 media_loss_mask_[1] = 1;
527 media_loss_mask_[3] = 1; 566 media_loss_mask_[3] = 1;
528 NetworkReceivedPackets(); 567 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
529 568
530 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 569 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
531 &recovered_packet_list_)); 570 &recovered_packet_list_));
532 571
533 // 2 packets lost, one FEC packet, cannot get complete recovery. 572 // 2 packets lost, one FEC packet, cannot get complete recovery.
534 EXPECT_FALSE(IsRecoveryComplete()); 573 EXPECT_FALSE(IsRecoveryComplete());
535 } 574 }
536 575
537 // Test 50% protection with random mask type for UEP on. 576 // Test 50% protection with random mask type for UEP on.
538 TEST_F(RtpFecTest, FecRecoveryWithLoss50percUepRandomMask) { 577 TEST_F(RtpFecTest, FecRecoveryWithLoss50percUepRandomMask) {
539 const int kNumImportantPackets = 1; 578 constexpr int kNumImportantPackets = 1;
540 const bool kUseUnequalProtection = true; 579 constexpr bool kUseUnequalProtection = true;
541 const int kNumMediaPackets = 4; 580 constexpr int kNumMediaPackets = 4;
542 const uint8_t kProtectionFactor = 255; 581 constexpr uint8_t kProtectionFactor = 255;
543 582
544 // Packet Mask for (4,4,1) code, from random mask table. 583 // Packet Mask for (4,4,1) code, from random mask table.
545 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 1) 584 // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 1)
546 585
547 // media#0 media#1 media#2 media#3 586 // media#0 media#1 media#2 media#3
548 // fec#0: 1 0 0 0 587 // fec#0: 1 0 0 0
549 // fec#1: 1 1 0 0 588 // fec#1: 1 1 0 0
550 // fec#2: 1 0 1 1 589 // fec#2: 1 0 1 1
551 // fec#3: 0 1 1 0 590 // fec#3: 0 1 1 0
552 // 591 //
553 592
554 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 593 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
555 594
556 EXPECT_EQ(0, fec_->GenerateFec(media_packet_list_, kProtectionFactor, 595 EXPECT_EQ(0, fec_.GenerateFec(media_packet_list_, kProtectionFactor,
557 kNumImportantPackets, kUseUnequalProtection, 596 kNumImportantPackets, kUseUnequalProtection,
558 webrtc::kFecMaskRandom, &fec_packet_list_)); 597 webrtc::kFecMaskRandom, &fec_packet_list_));
559 598
560 // Expect 4 FEC packets. 599 // Expect 4 FEC packets.
561 EXPECT_EQ(4, static_cast<int>(fec_packet_list_.size())); 600 EXPECT_EQ(4u, fec_packet_list_.size());
562 601
563 // 4 packets lost: 3 media packets and FEC packet#1 lost. 602 // 4 packets lost: 3 media packets and FEC packet#1 lost.
564 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 603 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
565 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 604 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
566 fec_loss_mask_[1] = 1; 605 fec_loss_mask_[1] = 1;
567 media_loss_mask_[0] = 1; 606 media_loss_mask_[0] = 1;
568 media_loss_mask_[2] = 1; 607 media_loss_mask_[2] = 1;
569 media_loss_mask_[3] = 1; 608 media_loss_mask_[3] = 1;
570 NetworkReceivedPackets(); 609 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
571 610
572 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 611 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
573 &recovered_packet_list_)); 612 &recovered_packet_list_));
574 613
575 // With media packet#3 and FEC packets #0, #1, #3, expect complete recovery. 614 // With media packet#3 and FEC packets #0, #1, #3, expect complete recovery.
576 EXPECT_TRUE(IsRecoveryComplete()); 615 EXPECT_TRUE(IsRecoveryComplete());
577 FreeRecoveredPacketList(); 616 FreeRecoveredPacketList();
578 617
579 // 5 packets lost: 4 media packets and one FEC packet#2 lost. 618 // 5 packets lost: 4 media packets and one FEC packet#2 lost.
580 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 619 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
581 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 620 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
582 fec_loss_mask_[2] = 1; 621 fec_loss_mask_[2] = 1;
583 media_loss_mask_[0] = 1; 622 media_loss_mask_[0] = 1;
584 media_loss_mask_[1] = 1; 623 media_loss_mask_[1] = 1;
585 media_loss_mask_[2] = 1; 624 media_loss_mask_[2] = 1;
586 media_loss_mask_[3] = 1; 625 media_loss_mask_[3] = 1;
587 NetworkReceivedPackets(); 626 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
588 627
589 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 628 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
590 &recovered_packet_list_)); 629 &recovered_packet_list_));
591 630
592 // Cannot get complete recovery for this loss configuration. 631 // Cannot get complete recovery for this loss configuration.
593 EXPECT_FALSE(IsRecoveryComplete()); 632 EXPECT_FALSE(IsRecoveryComplete());
594 } 633 }
595 634
596 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePackets) { 635 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePackets) {
597 const int kNumImportantPackets = 0; 636 constexpr int kNumImportantPackets = 0;
598 const bool kUseUnequalProtection = false; 637 constexpr bool kUseUnequalProtection = false;
599 const int kNumMediaPackets = 5; 638 constexpr int kNumMediaPackets = 5;
600 uint8_t kProtectionFactor = 60; 639 constexpr uint8_t kProtectionFactor = 60;
601 640
602 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 641 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
603 642
604 // Create a new temporary packet list for generating FEC packets. 643 // Create a new temporary packet list for generating FEC packets.
605 // This list should have every other packet removed. 644 // This list should have every other packet removed.
606 PacketList protected_media_packets; 645 PacketList protected_media_packets;
607 int i = 0; 646 int i = 0;
608 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end(); 647 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
609 ++it, ++i) { 648 ++it, ++i) {
610 if (i % 2 == 0) protected_media_packets.push_back(*it); 649 if (i % 2 == 0) protected_media_packets.push_back(*it);
611 } 650 }
612 651
613 EXPECT_EQ(0, fec_->GenerateFec(protected_media_packets, kProtectionFactor, 652 EXPECT_EQ(0, fec_.GenerateFec(protected_media_packets, kProtectionFactor,
614 kNumImportantPackets, kUseUnequalProtection, 653 kNumImportantPackets, kUseUnequalProtection,
615 webrtc::kFecMaskBursty, &fec_packet_list_)); 654 webrtc::kFecMaskBursty, &fec_packet_list_));
616 655
617 // Expect 1 FEC packet. 656 // Expect 1 FEC packet.
618 EXPECT_EQ(1, static_cast<int>(fec_packet_list_.size())); 657 EXPECT_EQ(1u, fec_packet_list_.size());
619 658
620 // 1 protected media packet lost 659 // 1 protected media packet lost
621 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 660 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
622 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 661 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
623 media_loss_mask_[2] = 1; 662 media_loss_mask_[2] = 1;
624 NetworkReceivedPackets(); 663 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
625 664
626 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 665 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
627 &recovered_packet_list_)); 666 &recovered_packet_list_));
628 667
629 // One packet lost, one FEC packet, expect complete recovery. 668 // One packet lost, one FEC packet, expect complete recovery.
630 EXPECT_TRUE(IsRecoveryComplete()); 669 EXPECT_TRUE(IsRecoveryComplete());
631 FreeRecoveredPacketList(); 670 FreeRecoveredPacketList();
632 671
633 // Unprotected packet lost. 672 // Unprotected packet lost.
634 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 673 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
635 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 674 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
636 media_loss_mask_[1] = 1; 675 media_loss_mask_[1] = 1;
637 NetworkReceivedPackets(); 676 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
638 677
639 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 678 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
640 &recovered_packet_list_)); 679 &recovered_packet_list_));
641 680
642 // Unprotected packet lost. Recovery not possible. 681 // Unprotected packet lost. Recovery not possible.
643 EXPECT_FALSE(IsRecoveryComplete()); 682 EXPECT_FALSE(IsRecoveryComplete());
644 FreeRecoveredPacketList(); 683 FreeRecoveredPacketList();
645 684
646 // 2 media packets lost. 685 // 2 media packets lost.
647 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 686 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
648 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 687 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
649 media_loss_mask_[0] = 1; 688 media_loss_mask_[0] = 1;
650 media_loss_mask_[2] = 1; 689 media_loss_mask_[2] = 1;
651 NetworkReceivedPackets(); 690 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
652 691
653 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 692 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
654 &recovered_packet_list_)); 693 &recovered_packet_list_));
655 694
656 // 2 protected packets lost, one FEC packet, cannot get complete recovery. 695 // 2 protected packets lost, one FEC packet, cannot get complete recovery.
657 EXPECT_FALSE(IsRecoveryComplete()); 696 EXPECT_FALSE(IsRecoveryComplete());
658 } 697 }
659 698
660 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsExtension) { 699 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsExtension) {
661 const int kNumImportantPackets = 0; 700 constexpr int kNumImportantPackets = 0;
662 const bool kUseUnequalProtection = false; 701 constexpr bool kUseUnequalProtection = false;
663 const int kNumMediaPackets = 21; 702 constexpr int kNumMediaPackets = 21;
664 uint8_t kProtectionFactor = 127; 703 uint8_t kProtectionFactor = 127;
665 704
666 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets); 705 fec_seq_num_ = ConstructMediaPackets(kNumMediaPackets);
667 706
668 // Create a new temporary packet list for generating FEC packets. 707 // Create a new temporary packet list for generating FEC packets.
669 // This list should have every other packet removed. 708 // This list should have every other packet removed.
670 PacketList protected_media_packets; 709 PacketList protected_media_packets;
671 int i = 0; 710 int i = 0;
672 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end(); 711 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
673 ++it, ++i) { 712 ++it, ++i) {
674 if (i % 2 == 0) protected_media_packets.push_back(*it); 713 if (i % 2 == 0) protected_media_packets.push_back(*it);
675 } 714 }
676 715
677 // Zero column insertion will have to extend the size of the packet 716 // Zero column insertion will have to extend the size of the packet
678 // mask since the number of actual packets are 21, while the number 717 // mask since the number of actual packets are 21, while the number
679 // of protected packets are 11. 718 // of protected packets are 11.
680 EXPECT_EQ(0, fec_->GenerateFec(protected_media_packets, kProtectionFactor, 719 EXPECT_EQ(0, fec_.GenerateFec(protected_media_packets, kProtectionFactor,
681 kNumImportantPackets, kUseUnequalProtection, 720 kNumImportantPackets, kUseUnequalProtection,
682 webrtc::kFecMaskBursty, &fec_packet_list_)); 721 webrtc::kFecMaskBursty, &fec_packet_list_));
683 722
684 // Expect 5 FEC packet. 723 // Expect 5 FEC packet.
685 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size())); 724 EXPECT_EQ(5u, fec_packet_list_.size());
686 725
687 // Last protected media packet lost 726 // Last protected media packet lost
688 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 727 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
689 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 728 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
690 media_loss_mask_[kNumMediaPackets - 1] = 1; 729 media_loss_mask_[kNumMediaPackets - 1] = 1;
691 NetworkReceivedPackets(); 730 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
692 731
693 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 732 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
694 &recovered_packet_list_)); 733 &recovered_packet_list_));
695 734
696 // One packet lost, one FEC packet, expect complete recovery. 735 // One packet lost, one FEC packet, expect complete recovery.
697 EXPECT_TRUE(IsRecoveryComplete()); 736 EXPECT_TRUE(IsRecoveryComplete());
698 FreeRecoveredPacketList(); 737 FreeRecoveredPacketList();
699 738
700 // Last unprotected packet lost. 739 // Last unprotected packet lost.
701 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 740 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
702 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 741 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
703 media_loss_mask_[kNumMediaPackets - 2] = 1; 742 media_loss_mask_[kNumMediaPackets - 2] = 1;
704 NetworkReceivedPackets(); 743 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
705 744
706 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 745 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
707 &recovered_packet_list_)); 746 &recovered_packet_list_));
708 747
709 // Unprotected packet lost. Recovery not possible. 748 // Unprotected packet lost. Recovery not possible.
710 EXPECT_FALSE(IsRecoveryComplete()); 749 EXPECT_FALSE(IsRecoveryComplete());
711 FreeRecoveredPacketList(); 750 FreeRecoveredPacketList();
712 751
713 // 6 media packets lost. 752 // 6 media packets lost.
714 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 753 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
715 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 754 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
716 media_loss_mask_[kNumMediaPackets - 11] = 1; 755 media_loss_mask_[kNumMediaPackets - 11] = 1;
717 media_loss_mask_[kNumMediaPackets - 9] = 1; 756 media_loss_mask_[kNumMediaPackets - 9] = 1;
718 media_loss_mask_[kNumMediaPackets - 7] = 1; 757 media_loss_mask_[kNumMediaPackets - 7] = 1;
719 media_loss_mask_[kNumMediaPackets - 5] = 1; 758 media_loss_mask_[kNumMediaPackets - 5] = 1;
720 media_loss_mask_[kNumMediaPackets - 3] = 1; 759 media_loss_mask_[kNumMediaPackets - 3] = 1;
721 media_loss_mask_[kNumMediaPackets - 1] = 1; 760 media_loss_mask_[kNumMediaPackets - 1] = 1;
722 NetworkReceivedPackets(); 761 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
723 762
724 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 763 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
725 &recovered_packet_list_)); 764 &recovered_packet_list_));
726 765
727 // 5 protected packets lost, one FEC packet, cannot get complete recovery. 766 // 5 protected packets lost, one FEC packet, cannot get complete recovery.
728 EXPECT_FALSE(IsRecoveryComplete()); 767 EXPECT_FALSE(IsRecoveryComplete());
729 } 768 }
730 769
731 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsWrap) { 770 TEST_F(RtpFecTest, FecRecoveryNonConsecutivePacketsWrap) {
732 const int kNumImportantPackets = 0; 771 constexpr int kNumImportantPackets = 0;
733 const bool kUseUnequalProtection = false; 772 constexpr bool kUseUnequalProtection = false;
734 const int kNumMediaPackets = 21; 773 constexpr int kNumMediaPackets = 21;
735 uint8_t kProtectionFactor = 127; 774 uint8_t kProtectionFactor = 127;
736 775
737 fec_seq_num_ = ConstructMediaPacketsSeqNum(kNumMediaPackets, 0xFFFF - 5); 776 fec_seq_num_ = ConstructMediaPacketsSeqNum(kNumMediaPackets, 0xFFFF - 5);
738 777
739 // Create a new temporary packet list for generating FEC packets. 778 // Create a new temporary packet list for generating FEC packets.
740 // This list should have every other packet removed. 779 // This list should have every other packet removed.
741 PacketList protected_media_packets; 780 PacketList protected_media_packets;
742 int i = 0; 781 int i = 0;
743 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end(); 782 for (auto it = media_packet_list_.begin(); it != media_packet_list_.end();
744 ++it, ++i) { 783 ++it, ++i) {
745 if (i % 2 == 0) protected_media_packets.push_back(*it); 784 if (i % 2 == 0) protected_media_packets.push_back(*it);
746 } 785 }
747 786
748 // Zero column insertion will have to extend the size of the packet 787 // Zero column insertion will have to extend the size of the packet
749 // mask since the number of actual packets are 21, while the number 788 // mask since the number of actual packets are 21, while the number
750 // of protected packets are 11. 789 // of protected packets are 11.
751 EXPECT_EQ(0, fec_->GenerateFec(protected_media_packets, kProtectionFactor, 790 EXPECT_EQ(0, fec_.GenerateFec(protected_media_packets, kProtectionFactor,
752 kNumImportantPackets, kUseUnequalProtection, 791 kNumImportantPackets, kUseUnequalProtection,
753 webrtc::kFecMaskBursty, &fec_packet_list_)); 792 webrtc::kFecMaskBursty, &fec_packet_list_));
754 793
755 // Expect 5 FEC packet. 794 // Expect 5 FEC packet.
756 EXPECT_EQ(5, static_cast<int>(fec_packet_list_.size())); 795 EXPECT_EQ(5u, fec_packet_list_.size());
757 796
758 // Last protected media packet lost 797 // Last protected media packet lost
759 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 798 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
760 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 799 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
761 media_loss_mask_[kNumMediaPackets - 1] = 1; 800 media_loss_mask_[kNumMediaPackets - 1] = 1;
762 NetworkReceivedPackets(); 801 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
763 802
764 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 803 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
765 &recovered_packet_list_)); 804 &recovered_packet_list_));
766 805
767 // One packet lost, one FEC packet, expect complete recovery. 806 // One packet lost, one FEC packet, expect complete recovery.
768 EXPECT_TRUE(IsRecoveryComplete()); 807 EXPECT_TRUE(IsRecoveryComplete());
769 FreeRecoveredPacketList(); 808 FreeRecoveredPacketList();
770 809
771 // Last unprotected packet lost. 810 // Last unprotected packet lost.
772 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 811 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
773 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 812 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
774 media_loss_mask_[kNumMediaPackets - 2] = 1; 813 media_loss_mask_[kNumMediaPackets - 2] = 1;
775 NetworkReceivedPackets(); 814 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
776 815
777 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 816 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
778 &recovered_packet_list_)); 817 &recovered_packet_list_));
779 818
780 // Unprotected packet lost. Recovery not possible. 819 // Unprotected packet lost. Recovery not possible.
781 EXPECT_FALSE(IsRecoveryComplete()); 820 EXPECT_FALSE(IsRecoveryComplete());
782 FreeRecoveredPacketList(); 821 FreeRecoveredPacketList();
783 822
784 // 6 media packets lost. 823 // 6 media packets lost.
785 memset(media_loss_mask_, 0, sizeof(media_loss_mask_)); 824 memset(media_loss_mask_, 0, sizeof(media_loss_mask_));
786 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_)); 825 memset(fec_loss_mask_, 0, sizeof(fec_loss_mask_));
787 media_loss_mask_[kNumMediaPackets - 11] = 1; 826 media_loss_mask_[kNumMediaPackets - 11] = 1;
788 media_loss_mask_[kNumMediaPackets - 9] = 1; 827 media_loss_mask_[kNumMediaPackets - 9] = 1;
789 media_loss_mask_[kNumMediaPackets - 7] = 1; 828 media_loss_mask_[kNumMediaPackets - 7] = 1;
790 media_loss_mask_[kNumMediaPackets - 5] = 1; 829 media_loss_mask_[kNumMediaPackets - 5] = 1;
791 media_loss_mask_[kNumMediaPackets - 3] = 1; 830 media_loss_mask_[kNumMediaPackets - 3] = 1;
792 media_loss_mask_[kNumMediaPackets - 1] = 1; 831 media_loss_mask_[kNumMediaPackets - 1] = 1;
793 NetworkReceivedPackets(); 832 NetworkReceivedPackets(media_loss_mask_, fec_loss_mask_);
794 833
795 EXPECT_EQ(0, fec_->DecodeFec(&received_packet_list_, 834 EXPECT_EQ(0, fec_.DecodeFec(&received_packet_list_,
796 &recovered_packet_list_)); 835 &recovered_packet_list_));
797 836
798 // 5 protected packets lost, one FEC packet, cannot get complete recovery. 837 // 5 protected packets lost, one FEC packet, cannot get complete recovery.
799 EXPECT_FALSE(IsRecoveryComplete()); 838 EXPECT_FALSE(IsRecoveryComplete());
800 } 839 }
801 840
802 void RtpFecTest::TearDown() { 841 void RtpFecTest::TearDown() {
803 fec_->ResetState(&recovered_packet_list_); 842 fec_.ResetState(&recovered_packet_list_);
804 delete fec_;
805 FreeRecoveredPacketList(); 843 FreeRecoveredPacketList();
806 ClearList(&media_packet_list_); 844 ClearList(&media_packet_list_);
807 EXPECT_TRUE(media_packet_list_.empty()); 845 EXPECT_TRUE(media_packet_list_.empty());
808 } 846 }
809 847
810 void RtpFecTest::FreeRecoveredPacketList() { 848 void RtpFecTest::FreeRecoveredPacketList() {
811 ClearList(&recovered_packet_list_); 849 ClearList(&recovered_packet_list_);
812 } 850 }
813 851
814 bool RtpFecTest::IsRecoveryComplete() { 852 bool RtpFecTest::IsRecoveryComplete() {
(...skipping 13 matching lines...) Expand all
828 recovered_packet->pkt->data, 866 recovered_packet->pkt->data,
829 media_packet->length) != 0) { 867 media_packet->length) != 0) {
830 return false; 868 return false;
831 } 869 }
832 return true; 870 return true;
833 }; 871 };
834 return std::equal(media_packet_list_.cbegin(), media_packet_list_.cend(), 872 return std::equal(media_packet_list_.cbegin(), media_packet_list_.cend(),
835 recovered_packet_list_.cbegin(), cmp); 873 recovered_packet_list_.cbegin(), cmp);
836 } 874 }
837 875
838 void RtpFecTest::NetworkReceivedPackets() { 876 void RtpFecTest::NetworkReceivedPackets(int* media_packet_list,
danilchap 2016/07/19 13:47:27 Declaration name parameters ..._mask, but definiti
brandtr 2016/07/21 09:04:33 This was sloppy by me, thanks for catching!
839 const bool kFecPacket = true; 877 int* fec_packet_list) {
878 constexpr bool kFecPacket = true;
840 ReceivedPackets(media_packet_list_, media_loss_mask_, !kFecPacket); 879 ReceivedPackets(media_packet_list_, media_loss_mask_, !kFecPacket);
841 ReceivedPackets(fec_packet_list_, fec_loss_mask_, kFecPacket); 880 ReceivedPackets(fec_packet_list_, fec_loss_mask_, kFecPacket);
842 } 881 }
843 882
844 void RtpFecTest::ReceivedPackets(const PacketList& packet_list, int* loss_mask, 883 void RtpFecTest::ReceivedPackets(const PacketList& packet_list, int* loss_mask,
845 bool is_fec) { 884 bool is_fec) {
846 int seq_num = fec_seq_num_; 885 int seq_num = fec_seq_num_;
847 int packet_idx = 0; 886 int packet_idx = 0;
848 887
849 for (const auto* packet : packet_list) { 888 for (const auto* packet : packet_list) {
(...skipping 30 matching lines...) Expand all
880 int RtpFecTest::ConstructMediaPacketsSeqNum(int num_media_packets, 919 int RtpFecTest::ConstructMediaPacketsSeqNum(int num_media_packets,
881 int start_seq_num) { 920 int start_seq_num) {
882 RTC_DCHECK_GT(num_media_packets, 0); 921 RTC_DCHECK_GT(num_media_packets, 0);
883 ForwardErrorCorrection::Packet* media_packet = NULL; 922 ForwardErrorCorrection::Packet* media_packet = NULL;
884 int sequence_number = start_seq_num; 923 int sequence_number = start_seq_num;
885 int time_stamp = random_.Rand<int>(); 924 int time_stamp = random_.Rand<int>();
886 925
887 for (int i = 0; i < num_media_packets; ++i) { 926 for (int i = 0; i < num_media_packets; ++i) {
888 media_packet = new ForwardErrorCorrection::Packet(); 927 media_packet = new ForwardErrorCorrection::Packet();
889 media_packet_list_.push_back(media_packet); 928 media_packet_list_.push_back(media_packet);
890 const uint32_t kMinPacketSize = kRtpHeaderSize; 929 constexpr uint32_t kMinPacketSize = kRtpHeaderSize;
891 const uint32_t kMaxPacketSize = IP_PACKET_SIZE - kRtpHeaderSize - 930 const uint32_t kMaxPacketSize = IP_PACKET_SIZE - kRtpHeaderSize -
892 kTransportOverhead - 931 kTransportOverhead -
893 ForwardErrorCorrection::PacketOverhead(); 932 ForwardErrorCorrection::PacketOverhead();
894 media_packet->length = random_.Rand(kMinPacketSize, kMaxPacketSize); 933 media_packet->length = random_.Rand(kMinPacketSize, kMaxPacketSize);
895 934
896 // Generate random values for the first 2 bytes 935 // Generate random values for the first 2 bytes
897 media_packet->data[0] = random_.Rand<uint8_t>(); 936 media_packet->data[0] = random_.Rand<uint8_t>();
898 media_packet->data[1] = random_.Rand<uint8_t>(); 937 media_packet->data[1] = random_.Rand<uint8_t>();
899 938
900 // The first two bits are assumed to be 10 by the FEC encoder. 939 // The first two bits are assumed to be 10 by the FEC encoder.
(...skipping 23 matching lines...) Expand all
924 } 963 }
925 // Last packet, set marker bit. 964 // Last packet, set marker bit.
926 RTC_DCHECK(media_packet); 965 RTC_DCHECK(media_packet);
927 media_packet->data[1] |= 0x80; 966 media_packet->data[1] |= 0x80;
928 return sequence_number; 967 return sequence_number;
929 } 968 }
930 969
931 int RtpFecTest::ConstructMediaPackets(int num_media_packets) { 970 int RtpFecTest::ConstructMediaPackets(int num_media_packets) {
932 return ConstructMediaPacketsSeqNum(num_media_packets, random_.Rand<int>()); 971 return ConstructMediaPacketsSeqNum(num_media_packets, random_.Rand<int>());
933 } 972 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698