OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 209 matching lines...) Loading... |
220 receiver_.OnRtpPacket(ParsePacket(**media_it)); | 220 receiver_.OnRtpPacket(ParsePacket(**media_it)); |
221 | 221 |
222 // Receive FEC packet and ensure recovery of lost media packet. | 222 // Receive FEC packet and ensure recovery of lost media packet. |
223 auto fec_it = fec_packets.begin(); | 223 auto fec_it = fec_packets.begin(); |
224 std::unique_ptr<Packet> packet_with_rtp_header = | 224 std::unique_ptr<Packet> packet_with_rtp_header = |
225 packet_generator_.BuildFlexfecPacket(**fec_it); | 225 packet_generator_.BuildFlexfecPacket(**fec_it); |
226 media_it++; | 226 media_it++; |
227 EXPECT_CALL(recovered_packet_receiver_, | 227 EXPECT_CALL(recovered_packet_receiver_, |
228 OnRecoveredPacket(_, (*media_it)->length)) | 228 OnRecoveredPacket(_, (*media_it)->length)) |
229 .With( | 229 .With( |
230 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 230 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
231 .WillOnce(Return(true)); | |
232 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 231 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
233 } | 232 } |
234 | 233 |
235 TEST_F(FlexfecReceiverTest, RecoversFromDoubleMediaLoss) { | 234 TEST_F(FlexfecReceiverTest, RecoversFromDoubleMediaLoss) { |
236 const size_t kNumMediaPackets = 2; | 235 const size_t kNumMediaPackets = 2; |
237 const size_t kNumFecPackets = 2; | 236 const size_t kNumFecPackets = 2; |
238 | 237 |
239 PacketList media_packets; | 238 PacketList media_packets; |
240 PacketizeFrame(kNumMediaPackets, 0, &media_packets); | 239 PacketizeFrame(kNumMediaPackets, 0, &media_packets); |
241 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); | 240 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); |
242 | 241 |
243 // Drop both media packets. | 242 // Drop both media packets. |
244 | 243 |
245 // Receive first FEC packet and recover first lost media packet. | 244 // Receive first FEC packet and recover first lost media packet. |
246 auto fec_it = fec_packets.begin(); | 245 auto fec_it = fec_packets.begin(); |
247 std::unique_ptr<Packet> packet_with_rtp_header = | 246 std::unique_ptr<Packet> packet_with_rtp_header = |
248 packet_generator_.BuildFlexfecPacket(**fec_it); | 247 packet_generator_.BuildFlexfecPacket(**fec_it); |
249 auto media_it = media_packets.begin(); | 248 auto media_it = media_packets.begin(); |
250 EXPECT_CALL(recovered_packet_receiver_, | 249 EXPECT_CALL(recovered_packet_receiver_, |
251 OnRecoveredPacket(_, (*media_it)->length)) | 250 OnRecoveredPacket(_, (*media_it)->length)) |
252 .With( | 251 .With( |
253 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 252 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
254 .WillOnce(Return(true)); | |
255 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 253 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
256 | 254 |
257 // Receive second FEC packet and recover second lost media packet. | 255 // Receive second FEC packet and recover second lost media packet. |
258 fec_it++; | 256 fec_it++; |
259 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); | 257 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); |
260 media_it++; | 258 media_it++; |
261 EXPECT_CALL(recovered_packet_receiver_, | 259 EXPECT_CALL(recovered_packet_receiver_, |
262 OnRecoveredPacket(_, (*media_it)->length)) | 260 OnRecoveredPacket(_, (*media_it)->length)) |
263 .With( | 261 .With( |
264 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 262 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
265 .WillOnce(Return(true)); | |
266 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 263 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
267 } | 264 } |
268 | 265 |
269 TEST_F(FlexfecReceiverTest, DoesNotRecoverFromMediaAndFecLoss) { | 266 TEST_F(FlexfecReceiverTest, DoesNotRecoverFromMediaAndFecLoss) { |
270 const size_t kNumMediaPackets = 2; | 267 const size_t kNumMediaPackets = 2; |
271 const size_t kNumFecPackets = 1; | 268 const size_t kNumFecPackets = 1; |
272 | 269 |
273 PacketList media_packets; | 270 PacketList media_packets; |
274 PacketizeFrame(kNumMediaPackets, 0, &media_packets); | 271 PacketizeFrame(kNumMediaPackets, 0, &media_packets); |
275 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); | 272 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); |
(...skipping 18 matching lines...) Loading... |
294 receiver_.OnRtpPacket(ParsePacket(**media_it)); | 291 receiver_.OnRtpPacket(ParsePacket(**media_it)); |
295 | 292 |
296 // Receive FEC packet and ensure recovery of lost media packet. | 293 // Receive FEC packet and ensure recovery of lost media packet. |
297 auto fec_it = fec_packets.begin(); | 294 auto fec_it = fec_packets.begin(); |
298 std::unique_ptr<Packet> packet_with_rtp_header = | 295 std::unique_ptr<Packet> packet_with_rtp_header = |
299 packet_generator_.BuildFlexfecPacket(**fec_it); | 296 packet_generator_.BuildFlexfecPacket(**fec_it); |
300 media_it++; | 297 media_it++; |
301 EXPECT_CALL(recovered_packet_receiver_, | 298 EXPECT_CALL(recovered_packet_receiver_, |
302 OnRecoveredPacket(_, (*media_it)->length)) | 299 OnRecoveredPacket(_, (*media_it)->length)) |
303 .With( | 300 .With( |
304 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 301 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
305 .WillOnce(Return(true)); | |
306 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 302 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
307 | 303 |
308 // Receive FEC packet again. | 304 // Receive FEC packet again. |
309 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 305 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
310 | 306 |
311 // Do not call back again. | 307 // Do not call back again. |
312 } | 308 } |
313 | 309 |
314 // Here we are implicitly assuming packet masks that are suitable for | 310 // Here we are implicitly assuming packet masks that are suitable for |
315 // this type of 50% correlated loss. If we are changing our precomputed | 311 // this type of 50% correlated loss. If we are changing our precomputed |
(...skipping 25 matching lines...) Loading... |
341 for (const auto& fec_packet : fec_packets) { | 337 for (const auto& fec_packet : fec_packets) { |
342 std::unique_ptr<Packet> fec_packet_with_rtp_header = | 338 std::unique_ptr<Packet> fec_packet_with_rtp_header = |
343 packet_generator_.BuildFlexfecPacket(*fec_packet); | 339 packet_generator_.BuildFlexfecPacket(*fec_packet); |
344 ++media_it; | 340 ++media_it; |
345 if (media_it == media_packets.end()) { | 341 if (media_it == media_packets.end()) { |
346 break; | 342 break; |
347 } | 343 } |
348 EXPECT_CALL(recovered_packet_receiver_, | 344 EXPECT_CALL(recovered_packet_receiver_, |
349 OnRecoveredPacket(_, (*media_it)->length)) | 345 OnRecoveredPacket(_, (*media_it)->length)) |
350 .With(Args<0, 1>( | 346 .With(Args<0, 1>( |
351 ElementsAreArray((*media_it)->data, (*media_it)->length))) | 347 ElementsAreArray((*media_it)->data, (*media_it)->length))); |
352 .WillOnce(Return(true)); | |
353 receiver_.OnRtpPacket(ParsePacket(*fec_packet_with_rtp_header)); | 348 receiver_.OnRtpPacket(ParsePacket(*fec_packet_with_rtp_header)); |
354 ++media_it; | 349 ++media_it; |
355 } | 350 } |
356 } | 351 } |
357 | 352 |
358 TEST_F(FlexfecReceiverTest, DelayedFecPacketDoesHelp) { | 353 TEST_F(FlexfecReceiverTest, DelayedFecPacketDoesHelp) { |
359 // These values need to be updated if the underlying erasure code | 354 // These values need to be updated if the underlying erasure code |
360 // implementation changes. | 355 // implementation changes. |
361 const size_t kNumFrames = 48; | 356 const size_t kNumFrames = 48; |
362 const size_t kNumMediaPacketsPerFrame = 1; | 357 const size_t kNumMediaPacketsPerFrame = 1; |
(...skipping 19 matching lines...) Loading... |
382 } | 377 } |
383 | 378 |
384 // Receive FEC packet and recover first media packet. | 379 // Receive FEC packet and recover first media packet. |
385 auto fec_it = fec_packets.begin(); | 380 auto fec_it = fec_packets.begin(); |
386 std::unique_ptr<Packet> packet_with_rtp_header = | 381 std::unique_ptr<Packet> packet_with_rtp_header = |
387 packet_generator_.BuildFlexfecPacket(**fec_it); | 382 packet_generator_.BuildFlexfecPacket(**fec_it); |
388 media_it = media_packets.begin(); | 383 media_it = media_packets.begin(); |
389 EXPECT_CALL(recovered_packet_receiver_, | 384 EXPECT_CALL(recovered_packet_receiver_, |
390 OnRecoveredPacket(_, (*media_it)->length)) | 385 OnRecoveredPacket(_, (*media_it)->length)) |
391 .With( | 386 .With( |
392 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 387 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
393 .WillOnce(Return(true)); | |
394 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 388 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
395 } | 389 } |
396 | 390 |
397 TEST_F(FlexfecReceiverTest, TooDelayedFecPacketDoesNotHelp) { | 391 TEST_F(FlexfecReceiverTest, TooDelayedFecPacketDoesNotHelp) { |
398 // These values need to be updated if the underlying erasure code | 392 // These values need to be updated if the underlying erasure code |
399 // implementation changes. | 393 // implementation changes. |
400 const size_t kNumFrames = 49; | 394 const size_t kNumFrames = 49; |
401 const size_t kNumMediaPacketsPerFrame = 1; | 395 const size_t kNumMediaPacketsPerFrame = 1; |
402 const size_t kNumFecPackets = 1; | 396 const size_t kNumFecPackets = 1; |
403 | 397 |
(...skipping 43 matching lines...) Loading... |
447 auto media_packet5 = media_it++; | 441 auto media_packet5 = media_it++; |
448 receiver_.OnRtpPacket(ParsePacket(**media_packet5)); | 442 receiver_.OnRtpPacket(ParsePacket(**media_packet5)); |
449 receiver_.OnRtpPacket(ParsePacket(**media_packet2)); | 443 receiver_.OnRtpPacket(ParsePacket(**media_packet2)); |
450 receiver_.OnRtpPacket(ParsePacket(**media_packet3)); | 444 receiver_.OnRtpPacket(ParsePacket(**media_packet3)); |
451 receiver_.OnRtpPacket(ParsePacket(**media_packet0)); | 445 receiver_.OnRtpPacket(ParsePacket(**media_packet0)); |
452 | 446 |
453 // Expect to recover lost media packets. | 447 // Expect to recover lost media packets. |
454 EXPECT_CALL(recovered_packet_receiver_, | 448 EXPECT_CALL(recovered_packet_receiver_, |
455 OnRecoveredPacket(_, (*media_packet1)->length)) | 449 OnRecoveredPacket(_, (*media_packet1)->length)) |
456 .With(Args<0, 1>( | 450 .With(Args<0, 1>( |
457 ElementsAreArray((*media_packet1)->data, (*media_packet1)->length))) | 451 ElementsAreArray((*media_packet1)->data, (*media_packet1)->length))); |
458 .WillOnce(Return(true)); | |
459 EXPECT_CALL(recovered_packet_receiver_, | 452 EXPECT_CALL(recovered_packet_receiver_, |
460 OnRecoveredPacket(_, (*media_packet4)->length)) | 453 OnRecoveredPacket(_, (*media_packet4)->length)) |
461 .With(Args<0, 1>( | 454 .With(Args<0, 1>( |
462 ElementsAreArray((*media_packet4)->data, (*media_packet4)->length))) | 455 ElementsAreArray((*media_packet4)->data, (*media_packet4)->length))); |
463 .WillOnce(Return(true)); | |
464 | 456 |
465 // Add FEC packets. | 457 // Add FEC packets. |
466 auto fec_it = fec_packets.begin(); | 458 auto fec_it = fec_packets.begin(); |
467 std::unique_ptr<Packet> packet_with_rtp_header; | 459 std::unique_ptr<Packet> packet_with_rtp_header; |
468 while (fec_it != fec_packets.end()) { | 460 while (fec_it != fec_packets.end()) { |
469 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); | 461 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); |
470 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 462 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
471 ++fec_it; | 463 ++fec_it; |
472 } | 464 } |
473 } | 465 } |
(...skipping 11 matching lines...) Loading... |
485 receiver_.OnRtpPacket(ParsePacket(**media_it)); | 477 receiver_.OnRtpPacket(ParsePacket(**media_it)); |
486 | 478 |
487 // Receive FEC packet and ensure recovery of lost media packet. | 479 // Receive FEC packet and ensure recovery of lost media packet. |
488 auto fec_it = fec_packets.begin(); | 480 auto fec_it = fec_packets.begin(); |
489 std::unique_ptr<Packet> packet_with_rtp_header = | 481 std::unique_ptr<Packet> packet_with_rtp_header = |
490 packet_generator_.BuildFlexfecPacket(**fec_it); | 482 packet_generator_.BuildFlexfecPacket(**fec_it); |
491 media_it++; | 483 media_it++; |
492 EXPECT_CALL(recovered_packet_receiver_, | 484 EXPECT_CALL(recovered_packet_receiver_, |
493 OnRecoveredPacket(_, (*media_it)->length)) | 485 OnRecoveredPacket(_, (*media_it)->length)) |
494 .With( | 486 .With( |
495 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) | 487 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); |
496 .WillOnce(Return(true)); | |
497 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); | 488 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); |
498 | 489 |
499 // Check stats calculations. | 490 // Check stats calculations. |
500 FecPacketCounter packet_counter = receiver_.GetPacketCounter(); | 491 FecPacketCounter packet_counter = receiver_.GetPacketCounter(); |
501 EXPECT_EQ(2U, packet_counter.num_packets); | 492 EXPECT_EQ(2U, packet_counter.num_packets); |
502 EXPECT_EQ(1U, packet_counter.num_fec_packets); | 493 EXPECT_EQ(1U, packet_counter.num_fec_packets); |
503 EXPECT_EQ(1U, packet_counter.num_recovered_packets); | 494 EXPECT_EQ(1U, packet_counter.num_recovered_packets); |
504 } | 495 } |
505 | 496 |
506 } // namespace webrtc | 497 } // namespace webrtc |
OLD | NEW |