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