Chromium Code Reviews

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

Issue 2693123002: Make Call::OnRecoveredPacket parse RTP header and call OnRtpPacket. (Closed)
Patch Set: Update fuzzer. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
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...)
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...)
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...)
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...)
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...)
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...)
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
OLDNEW

Powered by Google App Engine