OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... |
31 namespace webrtc { | 31 namespace webrtc { |
32 | 32 |
33 class ReceiverFecTest : public ::testing::Test { | 33 class ReceiverFecTest : public ::testing::Test { |
34 protected: | 34 protected: |
35 virtual void SetUp() { | 35 virtual void SetUp() { |
36 fec_.reset(new ForwardErrorCorrection()); | 36 fec_.reset(new ForwardErrorCorrection()); |
37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); | 37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); |
38 generator_.reset(new FrameGenerator()); | 38 generator_.reset(new FrameGenerator()); |
39 } | 39 } |
40 | 40 |
41 void GenerateFEC(std::list<Packet*>* media_packets, | 41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets, |
42 std::list<Packet*>* fec_packets, | 42 ForwardErrorCorrection::PacketList* fec_packets, |
43 unsigned int num_fec_packets) { | 43 unsigned int num_fec_packets) { |
44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); | 44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); |
45 EXPECT_EQ(0, fec_->GenerateFEC(*media_packets, protection_factor, | 45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor, |
46 0, false, kFecMaskBursty, fec_packets)); | 46 0, false, kFecMaskBursty, fec_packets)); |
47 ASSERT_EQ(num_fec_packets, fec_packets->size()); | 47 ASSERT_EQ(num_fec_packets, fec_packets->size()); |
48 } | 48 } |
49 | 49 |
50 void GenerateFrame(int num_media_packets, | 50 void GenerateFrame(int num_media_packets, |
51 int frame_offset, | 51 int frame_offset, |
52 std::list<test::RawRtpPacket*>* media_rtp_packets, | 52 std::list<test::RawRtpPacket*>* media_rtp_packets, |
53 std::list<Packet*>* media_packets) { | 53 ForwardErrorCorrection::PacketList* media_packets) { |
54 generator_->NewFrame(num_media_packets); | 54 generator_->NewFrame(num_media_packets); |
55 for (int i = 0; i < num_media_packets; ++i) { | 55 for (int i = 0; i < num_media_packets; ++i) { |
56 media_rtp_packets->push_back( | 56 media_rtp_packets->push_back( |
57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); | 57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); |
58 media_packets->push_back(media_rtp_packets->back()); | 58 media_packets->push_back(media_rtp_packets->back()); |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, | 62 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, |
63 int times) { | 63 int times) { |
(...skipping 26 matching lines...) Expand all Loading... |
90 static void SurvivesMaliciousPacket(const uint8_t* data, | 90 static void SurvivesMaliciousPacket(const uint8_t* data, |
91 size_t length, | 91 size_t length, |
92 uint8_t ulpfec_payload_type); | 92 uint8_t ulpfec_payload_type); |
93 | 93 |
94 MockRtpData rtp_data_callback_; | 94 MockRtpData rtp_data_callback_; |
95 std::unique_ptr<ForwardErrorCorrection> fec_; | 95 std::unique_ptr<ForwardErrorCorrection> fec_; |
96 std::unique_ptr<FecReceiver> receiver_fec_; | 96 std::unique_ptr<FecReceiver> receiver_fec_; |
97 std::unique_ptr<FrameGenerator> generator_; | 97 std::unique_ptr<FrameGenerator> generator_; |
98 }; | 98 }; |
99 | 99 |
100 void DeletePackets(std::list<Packet*>* packets) { | 100 void DeletePackets(ForwardErrorCorrection::PacketList* packets) { |
101 while (!packets->empty()) { | 101 while (!packets->empty()) { |
102 delete packets->front(); | 102 delete packets->front(); |
103 packets->pop_front(); | 103 packets->pop_front(); |
104 } | 104 } |
105 } | 105 } |
106 | 106 |
107 TEST_F(ReceiverFecTest, TwoMediaOneFec) { | 107 TEST_F(ReceiverFecTest, TwoMediaOneFec) { |
108 const unsigned int kNumFecPackets = 1u; | 108 const unsigned int kNumFecPackets = 1u; |
109 std::list<test::RawRtpPacket*> media_rtp_packets; | 109 std::list<test::RawRtpPacket*> media_rtp_packets; |
110 std::list<Packet*> media_packets; | 110 ForwardErrorCorrection::PacketList media_packets; |
111 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 111 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
112 std::list<Packet*> fec_packets; | 112 ForwardErrorCorrection::PacketList fec_packets; |
113 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 113 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
114 | 114 |
115 // Recovery | 115 // Recovery |
116 std::list<test::RawRtpPacket*>::iterator it = media_rtp_packets.begin(); | 116 auto it = media_rtp_packets.begin(); |
117 BuildAndAddRedMediaPacket(*it); | 117 BuildAndAddRedMediaPacket(*it); |
118 VerifyReconstructedMediaPacket(*it, 1); | 118 VerifyReconstructedMediaPacket(*it, 1); |
119 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 119 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
120 // Drop one media packet. | 120 // Drop one media packet. |
121 std::list<Packet*>::iterator fec_it = fec_packets.begin(); | 121 auto fec_it = fec_packets.begin(); |
122 BuildAndAddRedFecPacket(*fec_it); | 122 BuildAndAddRedFecPacket(*fec_it); |
123 ++it; | 123 ++it; |
124 VerifyReconstructedMediaPacket(*it, 1); | 124 VerifyReconstructedMediaPacket(*it, 1); |
125 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 125 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
126 | 126 |
127 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 127 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
128 EXPECT_EQ(2U, counter.num_packets); | 128 EXPECT_EQ(2U, counter.num_packets); |
129 EXPECT_EQ(1U, counter.num_fec_packets); | 129 EXPECT_EQ(1U, counter.num_fec_packets); |
130 EXPECT_EQ(1U, counter.num_recovered_packets); | 130 EXPECT_EQ(1U, counter.num_recovered_packets); |
131 | 131 |
132 DeletePackets(&media_packets); | 132 DeletePackets(&media_packets); |
133 } | 133 } |
134 | 134 |
135 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { | 135 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
136 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 136 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
137 .WillRepeatedly(Return(true)); | 137 .WillRepeatedly(Return(true)); |
138 | 138 |
139 const unsigned int kNumFecPackets = 1u; | 139 const unsigned int kNumFecPackets = 1u; |
140 std::list<test::RawRtpPacket*> media_rtp_packets; | 140 std::list<test::RawRtpPacket*> media_rtp_packets; |
141 std::list<Packet*> media_packets; | 141 ForwardErrorCorrection::PacketList media_packets; |
142 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 142 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
143 std::list<Packet*> fec_packets; | 143 ForwardErrorCorrection::PacketList fec_packets; |
144 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 144 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
145 ByteWriter<uint16_t>::WriteBigEndian( | 145 ByteWriter<uint16_t>::WriteBigEndian( |
146 &fec_packets.front()->data[fec_garbage_offset], 0x4711); | 146 &fec_packets.front()->data[fec_garbage_offset], 0x4711); |
147 | 147 |
148 // Inject first media packet, then first FEC packet, skipping the second media | 148 // Inject first media packet, then first FEC packet, skipping the second media |
149 // packet to cause a recovery from the FEC packet. | 149 // packet to cause a recovery from the FEC packet. |
150 BuildAndAddRedMediaPacket(media_rtp_packets.front()); | 150 BuildAndAddRedMediaPacket(media_rtp_packets.front()); |
151 BuildAndAddRedFecPacket(fec_packets.front()); | 151 BuildAndAddRedFecPacket(fec_packets.front()); |
152 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 152 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
153 | 153 |
154 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 154 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
(...skipping 11 matching lines...) Expand all Loading... |
166 | 166 |
167 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { | 167 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { |
168 // Byte offset 10 is the 'protection length' field in the first FEC level | 168 // Byte offset 10 is the 'protection length' field in the first FEC level |
169 // header. | 169 // header. |
170 InjectGarbagePacketLength(10); | 170 InjectGarbagePacketLength(10); |
171 } | 171 } |
172 | 172 |
173 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { | 173 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { |
174 const unsigned int kNumFecPackets = 2u; | 174 const unsigned int kNumFecPackets = 2u; |
175 std::list<test::RawRtpPacket*> media_rtp_packets; | 175 std::list<test::RawRtpPacket*> media_rtp_packets; |
176 std::list<Packet*> media_packets; | 176 ForwardErrorCorrection::PacketList media_packets; |
177 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 177 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
178 std::list<Packet*> fec_packets; | 178 ForwardErrorCorrection::PacketList fec_packets; |
179 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 179 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
180 | 180 |
181 // Recovery | 181 // Recovery |
182 // Drop both media packets. | 182 // Drop both media packets. |
183 std::list<test::RawRtpPacket*>::iterator it = media_rtp_packets.begin(); | 183 auto it = media_rtp_packets.begin(); |
184 std::list<Packet*>::iterator fec_it = fec_packets.begin(); | 184 auto fec_it = fec_packets.begin(); |
185 BuildAndAddRedFecPacket(*fec_it); | 185 BuildAndAddRedFecPacket(*fec_it); |
186 VerifyReconstructedMediaPacket(*it, 1); | 186 VerifyReconstructedMediaPacket(*it, 1); |
187 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 187 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
188 ++fec_it; | 188 ++fec_it; |
189 BuildAndAddRedFecPacket(*fec_it); | 189 BuildAndAddRedFecPacket(*fec_it); |
190 ++it; | 190 ++it; |
191 VerifyReconstructedMediaPacket(*it, 1); | 191 VerifyReconstructedMediaPacket(*it, 1); |
192 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 192 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
193 | 193 |
194 DeletePackets(&media_packets); | 194 DeletePackets(&media_packets); |
195 } | 195 } |
196 | 196 |
197 TEST_F(ReceiverFecTest, TwoFramesOneFec) { | 197 TEST_F(ReceiverFecTest, TwoFramesOneFec) { |
198 const unsigned int kNumFecPackets = 1u; | 198 const unsigned int kNumFecPackets = 1u; |
199 std::list<test::RawRtpPacket*> media_rtp_packets; | 199 std::list<test::RawRtpPacket*> media_rtp_packets; |
200 std::list<Packet*> media_packets; | 200 ForwardErrorCorrection::PacketList media_packets; |
201 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); | 201 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); |
202 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); | 202 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); |
203 std::list<Packet*> fec_packets; | 203 ForwardErrorCorrection::PacketList fec_packets; |
204 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 204 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
205 | 205 |
206 // Recovery | 206 // Recovery |
207 std::list<test::RawRtpPacket*>::iterator it = media_rtp_packets.begin(); | 207 auto it = media_rtp_packets.begin(); |
208 BuildAndAddRedMediaPacket(media_rtp_packets.front()); | 208 BuildAndAddRedMediaPacket(media_rtp_packets.front()); |
209 VerifyReconstructedMediaPacket(*it, 1); | 209 VerifyReconstructedMediaPacket(*it, 1); |
210 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 210 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
211 // Drop one media packet. | 211 // Drop one media packet. |
212 BuildAndAddRedFecPacket(fec_packets.front()); | 212 BuildAndAddRedFecPacket(fec_packets.front()); |
213 ++it; | 213 ++it; |
214 VerifyReconstructedMediaPacket(*it, 1); | 214 VerifyReconstructedMediaPacket(*it, 1); |
215 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 215 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
216 | 216 |
217 DeletePackets(&media_packets); | 217 DeletePackets(&media_packets); |
218 } | 218 } |
219 | 219 |
220 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { | 220 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { |
221 const unsigned int kNumFecPackets = 1u; | 221 const unsigned int kNumFecPackets = 1u; |
222 std::list<test::RawRtpPacket*> media_rtp_packets; | 222 std::list<test::RawRtpPacket*> media_rtp_packets; |
223 std::list<Packet*> media_packets; | 223 ForwardErrorCorrection::PacketList media_packets; |
224 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); | 224 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); |
225 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); | 225 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); |
226 | 226 |
227 std::list<Packet*> fec_packets; | 227 ForwardErrorCorrection::PacketList fec_packets; |
228 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 228 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
229 | 229 |
230 // Recovery | 230 // Recovery |
231 std::list<test::RawRtpPacket*>::iterator it = media_rtp_packets.begin(); | 231 auto it = media_rtp_packets.begin(); |
232 BuildAndAddRedMediaPacket(*it); // First frame: one packet. | 232 BuildAndAddRedMediaPacket(*it); // First frame: one packet. |
233 VerifyReconstructedMediaPacket(*it, 1); | 233 VerifyReconstructedMediaPacket(*it, 1); |
234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
235 ++it; | 235 ++it; |
236 BuildAndAddRedMediaPacket(*it); // First packet of second frame. | 236 BuildAndAddRedMediaPacket(*it); // First packet of second frame. |
237 VerifyReconstructedMediaPacket(*it, 1); | 237 VerifyReconstructedMediaPacket(*it, 1); |
238 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 238 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
239 | 239 |
240 DeletePackets(&media_packets); | 240 DeletePackets(&media_packets); |
241 } | 241 } |
242 | 242 |
243 TEST_F(ReceiverFecTest, MaxFramesOneFec) { | 243 TEST_F(ReceiverFecTest, MaxFramesOneFec) { |
244 const unsigned int kNumFecPackets = 1u; | 244 const unsigned int kNumFecPackets = 1u; |
245 const unsigned int kNumMediaPackets = 48u; | 245 const unsigned int kNumMediaPackets = 48u; |
246 std::list<test::RawRtpPacket*> media_rtp_packets; | 246 std::list<test::RawRtpPacket*> media_rtp_packets; |
247 std::list<Packet*> media_packets; | 247 ForwardErrorCorrection::PacketList media_packets; |
248 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { | 248 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { |
249 GenerateFrame(1, i, &media_rtp_packets, &media_packets); | 249 GenerateFrame(1, i, &media_rtp_packets, &media_packets); |
250 } | 250 } |
251 std::list<Packet*> fec_packets; | 251 ForwardErrorCorrection::PacketList fec_packets; |
252 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 252 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
253 | 253 |
254 // Recovery | 254 // Recovery |
255 std::list<test::RawRtpPacket*>::iterator it = media_rtp_packets.begin(); | 255 auto it = media_rtp_packets.begin(); |
256 ++it; // Drop first packet. | 256 ++it; // Drop first packet. |
257 for (; it != media_rtp_packets.end(); ++it) { | 257 for (; it != media_rtp_packets.end(); ++it) { |
258 BuildAndAddRedMediaPacket(*it); | 258 BuildAndAddRedMediaPacket(*it); |
259 VerifyReconstructedMediaPacket(*it, 1); | 259 VerifyReconstructedMediaPacket(*it, 1); |
260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
261 } | 261 } |
262 BuildAndAddRedFecPacket(fec_packets.front()); | 262 BuildAndAddRedFecPacket(fec_packets.front()); |
263 it = media_rtp_packets.begin(); | 263 it = media_rtp_packets.begin(); |
264 VerifyReconstructedMediaPacket(*it, 1); | 264 VerifyReconstructedMediaPacket(*it, 1); |
265 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 265 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
266 | 266 |
267 DeletePackets(&media_packets); | 267 DeletePackets(&media_packets); |
268 } | 268 } |
269 | 269 |
270 TEST_F(ReceiverFecTest, TooManyFrames) { | 270 TEST_F(ReceiverFecTest, TooManyFrames) { |
271 const unsigned int kNumFecPackets = 1u; | 271 const unsigned int kNumFecPackets = 1u; |
272 const unsigned int kNumMediaPackets = 49u; | 272 const unsigned int kNumMediaPackets = 49u; |
273 std::list<test::RawRtpPacket*> media_rtp_packets; | 273 std::list<test::RawRtpPacket*> media_rtp_packets; |
274 std::list<Packet*> media_packets; | 274 ForwardErrorCorrection::PacketList media_packets; |
275 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { | 275 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { |
276 GenerateFrame(1, i, &media_rtp_packets, &media_packets); | 276 GenerateFrame(1, i, &media_rtp_packets, &media_packets); |
277 } | 277 } |
278 std::list<Packet*> fec_packets; | 278 ForwardErrorCorrection::PacketList fec_packets; |
279 EXPECT_EQ(-1, fec_->GenerateFEC(media_packets, | 279 EXPECT_EQ(-1, fec_->GenerateFec(media_packets, |
280 kNumFecPackets * 255 / kNumMediaPackets, 0, | 280 kNumFecPackets * 255 / kNumMediaPackets, 0, |
281 false, kFecMaskBursty, &fec_packets)); | 281 false, kFecMaskBursty, &fec_packets)); |
282 | 282 |
283 DeletePackets(&media_packets); | 283 DeletePackets(&media_packets); |
284 } | 284 } |
285 | 285 |
286 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { | 286 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { |
287 // 1 frame with 2 media packets and one FEC packet. One media packet missing. | 287 // 1 frame with 2 media packets and one FEC packet. One media packet missing. |
288 // Delay the FEC packet. | 288 // Delay the FEC packet. |
289 Packet* delayed_fec = NULL; | 289 Packet* delayed_fec = NULL; |
290 const unsigned int kNumFecPacketsBatch1 = 1u; | 290 const unsigned int kNumFecPacketsBatch1 = 1u; |
291 const unsigned int kNumMediaPacketsBatch1 = 2u; | 291 const unsigned int kNumMediaPacketsBatch1 = 2u; |
292 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; | 292 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; |
293 std::list<Packet*> media_packets_batch1; | 293 ForwardErrorCorrection::PacketList media_packets_batch1; |
294 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, | 294 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, |
295 &media_packets_batch1); | 295 &media_packets_batch1); |
296 std::list<Packet*> fec_packets; | 296 ForwardErrorCorrection::PacketList fec_packets; |
297 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); | 297 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); |
298 | 298 |
299 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); | 299 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); |
300 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 300 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
301 .Times(1).WillRepeatedly(Return(true)); | 301 .Times(1).WillRepeatedly(Return(true)); |
302 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 302 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
303 delayed_fec = fec_packets.front(); | 303 delayed_fec = fec_packets.front(); |
304 | 304 |
305 // Fill the FEC decoder. No packets should be dropped. | 305 // Fill the FEC decoder. No packets should be dropped. |
306 const unsigned int kNumMediaPacketsBatch2 = 46u; | 306 const unsigned int kNumMediaPacketsBatch2 = 46u; |
307 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; | 307 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; |
308 std::list<Packet*> media_packets_batch2; | 308 ForwardErrorCorrection::PacketList media_packets_batch2; |
309 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { | 309 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { |
310 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); | 310 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); |
311 } | 311 } |
312 for (std::list<test::RawRtpPacket*>::iterator it = | 312 for (auto it = media_rtp_packets_batch2.begin(); |
313 media_rtp_packets_batch2.begin(); | |
314 it != media_rtp_packets_batch2.end(); ++it) { | 313 it != media_rtp_packets_batch2.end(); ++it) { |
315 BuildAndAddRedMediaPacket(*it); | 314 BuildAndAddRedMediaPacket(*it); |
316 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 315 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
317 .Times(1).WillRepeatedly(Return(true)); | 316 .Times(1).WillRepeatedly(Return(true)); |
318 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 317 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
319 } | 318 } |
320 | 319 |
321 // Add the delayed FEC packet. One packet should be reconstructed. | 320 // Add the delayed FEC packet. One packet should be reconstructed. |
322 BuildAndAddRedFecPacket(delayed_fec); | 321 BuildAndAddRedFecPacket(delayed_fec); |
323 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 322 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
324 .Times(1).WillRepeatedly(Return(true)); | 323 .Times(1).WillRepeatedly(Return(true)); |
325 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 324 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
326 | 325 |
327 DeletePackets(&media_packets_batch1); | 326 DeletePackets(&media_packets_batch1); |
328 DeletePackets(&media_packets_batch2); | 327 DeletePackets(&media_packets_batch2); |
329 } | 328 } |
330 | 329 |
331 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { | 330 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { |
332 // 1 frame with 2 media packets and one FEC packet. One media packet missing. | 331 // 1 frame with 2 media packets and one FEC packet. One media packet missing. |
333 // Delay the FEC packet. | 332 // Delay the FEC packet. |
334 Packet* delayed_fec = NULL; | 333 Packet* delayed_fec = NULL; |
335 const unsigned int kNumFecPacketsBatch1 = 1u; | 334 const unsigned int kNumFecPacketsBatch1 = 1u; |
336 const unsigned int kNumMediaPacketsBatch1 = 2u; | 335 const unsigned int kNumMediaPacketsBatch1 = 2u; |
337 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; | 336 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; |
338 std::list<Packet*> media_packets_batch1; | 337 ForwardErrorCorrection::PacketList media_packets_batch1; |
339 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, | 338 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, |
340 &media_packets_batch1); | 339 &media_packets_batch1); |
341 std::list<Packet*> fec_packets; | 340 ForwardErrorCorrection::PacketList fec_packets; |
342 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); | 341 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); |
343 | 342 |
344 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); | 343 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); |
345 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 344 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
346 .Times(1).WillRepeatedly(Return(true)); | 345 .Times(1).WillRepeatedly(Return(true)); |
347 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 346 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
348 delayed_fec = fec_packets.front(); | 347 delayed_fec = fec_packets.front(); |
349 | 348 |
350 // Fill the FEC decoder and force the last packet to be dropped. | 349 // Fill the FEC decoder and force the last packet to be dropped. |
351 const unsigned int kNumMediaPacketsBatch2 = 48u; | 350 const unsigned int kNumMediaPacketsBatch2 = 48u; |
352 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; | 351 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; |
353 std::list<Packet*> media_packets_batch2; | 352 ForwardErrorCorrection::PacketList media_packets_batch2; |
354 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { | 353 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { |
355 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); | 354 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); |
356 } | 355 } |
357 for (std::list<test::RawRtpPacket*>::iterator it = | 356 for (auto it = media_rtp_packets_batch2.begin(); |
358 media_rtp_packets_batch2.begin(); | |
359 it != media_rtp_packets_batch2.end(); ++it) { | 357 it != media_rtp_packets_batch2.end(); ++it) { |
360 BuildAndAddRedMediaPacket(*it); | 358 BuildAndAddRedMediaPacket(*it); |
361 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 359 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
362 .Times(1).WillRepeatedly(Return(true)); | 360 .Times(1).WillRepeatedly(Return(true)); |
363 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 361 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
364 } | 362 } |
365 | 363 |
366 // Add the delayed FEC packet. No packet should be reconstructed since the | 364 // Add the delayed FEC packet. No packet should be reconstructed since the |
367 // first media packet of that frame has been dropped due to being too old. | 365 // first media packet of that frame has been dropped due to being too old. |
368 BuildAndAddRedFecPacket(delayed_fec); | 366 BuildAndAddRedFecPacket(delayed_fec); |
369 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 367 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
370 .Times(0); | 368 .Times(0); |
371 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 369 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
372 | 370 |
373 DeletePackets(&media_packets_batch1); | 371 DeletePackets(&media_packets_batch1); |
374 DeletePackets(&media_packets_batch2); | 372 DeletePackets(&media_packets_batch2); |
375 } | 373 } |
376 | 374 |
377 TEST_F(ReceiverFecTest, OldFecPacketDropped) { | 375 TEST_F(ReceiverFecTest, OldFecPacketDropped) { |
378 // 49 frames with 2 media packets and one FEC packet. All media packets | 376 // 49 frames with 2 media packets and one FEC packet. All media packets |
379 // missing. | 377 // missing. |
380 const unsigned int kNumMediaPackets = 49 * 2; | 378 const unsigned int kNumMediaPackets = 49 * 2; |
381 std::list<test::RawRtpPacket*> media_rtp_packets; | 379 std::list<test::RawRtpPacket*> media_rtp_packets; |
382 std::list<Packet*> media_packets; | 380 ForwardErrorCorrection::PacketList media_packets; |
383 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { | 381 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { |
384 std::list<test::RawRtpPacket*> frame_media_rtp_packets; | 382 std::list<test::RawRtpPacket*> frame_media_rtp_packets; |
385 std::list<Packet*> frame_media_packets; | 383 ForwardErrorCorrection::PacketList frame_media_packets; |
386 std::list<Packet*> fec_packets; | 384 ForwardErrorCorrection::PacketList fec_packets; |
387 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); | 385 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); |
388 GenerateFEC(&frame_media_packets, &fec_packets, 1); | 386 GenerateFec(&frame_media_packets, &fec_packets, 1); |
389 for (std::list<Packet*>::iterator it = fec_packets.begin(); | 387 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { |
390 it != fec_packets.end(); ++it) { | |
391 // Only FEC packets inserted. No packets recoverable at this time. | 388 // Only FEC packets inserted. No packets recoverable at this time. |
392 BuildAndAddRedFecPacket(*it); | 389 BuildAndAddRedFecPacket(*it); |
393 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 390 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
394 .Times(0); | 391 .Times(0); |
395 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 392 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
396 } | 393 } |
397 media_packets.insert(media_packets.end(), frame_media_packets.begin(), | 394 media_packets.insert(media_packets.end(), frame_media_packets.begin(), |
398 frame_media_packets.end()); | 395 frame_media_packets.end()); |
399 media_rtp_packets.insert(media_rtp_packets.end(), | 396 media_rtp_packets.insert(media_rtp_packets.end(), |
400 frame_media_rtp_packets.begin(), | 397 frame_media_rtp_packets.begin(), |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 0x27, | 530 0x27, |
534 0xc4, | 531 0xc4, |
535 0x2a, | 532 0x2a, |
536 0x21, | 533 0x21, |
537 0x2a, | 534 0x2a, |
538 0x28}; | 535 0x28}; |
539 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); | 536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); |
540 } | 537 } |
541 | 538 |
542 } // namespace webrtc | 539 } // namespace webrtc |
OLD | NEW |