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 <string.h> | 11 #include <string.h> |
12 | 12 |
13 #include <list> | 13 #include <list> |
14 #include <memory> | 14 #include <memory> |
15 | 15 |
16 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 16 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
17 #include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h" | 17 #include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h" |
18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" | 18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" |
| 19 #include "webrtc/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h" |
19 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 20 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
20 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" | 21 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" |
21 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" | 22 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" |
22 #include "webrtc/test/gmock.h" | 23 #include "webrtc/test/gmock.h" |
23 #include "webrtc/test/gtest.h" | 24 #include "webrtc/test/gtest.h" |
24 | 25 |
25 namespace webrtc { | 26 namespace webrtc { |
26 | 27 |
27 namespace { | 28 namespace { |
28 using ::testing::_; | 29 using ::testing::_; |
29 using ::testing::Args; | 30 using ::testing::Args; |
30 using ::testing::ElementsAreArray; | 31 using ::testing::ElementsAreArray; |
31 using ::testing::Return; | 32 using ::testing::Return; |
32 | 33 |
33 using test::fec::AugmentedPacket; | 34 using test::fec::AugmentedPacket; |
34 using Packet = ForwardErrorCorrection::Packet; | 35 using Packet = ForwardErrorCorrection::Packet; |
35 using test::fec::UlpfecPacketGenerator; | 36 using test::fec::UlpfecPacketGenerator; |
36 | 37 |
37 constexpr int kFecPayloadType = 96; | 38 constexpr int kFecPayloadType = 96; |
38 constexpr uint32_t kMediaSsrc = 835424; | 39 constexpr uint32_t kMediaSsrc = 835424; |
| 40 |
| 41 class NullRecoveredPacketReceiver : public RecoveredPacketReceiver { |
| 42 public: |
| 43 void OnRecoveredPacket(const uint8_t* packet, size_t length) override {} |
| 44 }; |
| 45 |
39 } // namespace | 46 } // namespace |
40 | 47 |
41 class UlpfecReceiverTest : public ::testing::Test { | 48 class UlpfecReceiverTest : public ::testing::Test { |
42 protected: | 49 protected: |
43 UlpfecReceiverTest() | 50 UlpfecReceiverTest() |
44 : fec_(ForwardErrorCorrection::CreateUlpfec()), | 51 : fec_(ForwardErrorCorrection::CreateUlpfec()), |
45 receiver_fec_(UlpfecReceiver::Create(&rtp_data_callback_)), | 52 receiver_fec_(UlpfecReceiver::Create(&recovered_packet_receiver_)), |
46 packet_generator_(kMediaSsrc) {} | 53 packet_generator_(kMediaSsrc) {} |
47 | 54 |
48 // Generates |num_fec_packets| FEC packets, given |media_packets|. | 55 // Generates |num_fec_packets| FEC packets, given |media_packets|. |
49 void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets, | 56 void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets, |
50 size_t num_fec_packets, | 57 size_t num_fec_packets, |
51 std::list<ForwardErrorCorrection::Packet*>* fec_packets); | 58 std::list<ForwardErrorCorrection::Packet*>* fec_packets); |
52 | 59 |
53 // Generates |num_media_packets| corresponding to a single frame. | 60 // Generates |num_media_packets| corresponding to a single frame. |
54 void PacketizeFrame(size_t num_media_packets, | 61 void PacketizeFrame(size_t num_media_packets, |
55 size_t frame_offset, | 62 size_t frame_offset, |
56 std::list<AugmentedPacket*>* augmented_packets, | 63 std::list<AugmentedPacket*>* augmented_packets, |
57 ForwardErrorCorrection::PacketList* packets); | 64 ForwardErrorCorrection::PacketList* packets); |
58 | 65 |
59 // Build a media packet using |packet_generator_| and add it | 66 // Build a media packet using |packet_generator_| and add it |
60 // to the receiver. | 67 // to the receiver. |
61 void BuildAndAddRedMediaPacket(AugmentedPacket* packet); | 68 void BuildAndAddRedMediaPacket(AugmentedPacket* packet); |
62 | 69 |
63 // Build a FEC packet using |packet_generator_| and add it | 70 // Build a FEC packet using |packet_generator_| and add it |
64 // to the receiver. | 71 // to the receiver. |
65 void BuildAndAddRedFecPacket(Packet* packet); | 72 void BuildAndAddRedFecPacket(Packet* packet); |
66 | 73 |
67 // Ensure that |rtp_data_callback_| will be called correctly | 74 // Ensure that |recovered_packet_receiver_| will be called correctly |
68 // and that the recovered packet will be identical to the lost packet. | 75 // and that the recovered packet will be identical to the lost packet. |
69 void VerifyReconstructedMediaPacket(const AugmentedPacket& packet, | 76 void VerifyReconstructedMediaPacket(const AugmentedPacket& packet, |
70 size_t times); | 77 size_t times); |
71 | 78 |
72 void InjectGarbagePacketLength(size_t fec_garbage_offset); | 79 void InjectGarbagePacketLength(size_t fec_garbage_offset); |
73 | 80 |
74 static void SurvivesMaliciousPacket(const uint8_t* data, | 81 static void SurvivesMaliciousPacket(const uint8_t* data, |
75 size_t length, | 82 size_t length, |
76 uint8_t ulpfec_payload_type); | 83 uint8_t ulpfec_payload_type); |
77 | 84 |
78 MockRtpData rtp_data_callback_; | 85 MockRecoveredPacketReceiver recovered_packet_receiver_; |
79 std::unique_ptr<ForwardErrorCorrection> fec_; | 86 std::unique_ptr<ForwardErrorCorrection> fec_; |
80 std::unique_ptr<UlpfecReceiver> receiver_fec_; | 87 std::unique_ptr<UlpfecReceiver> receiver_fec_; |
81 UlpfecPacketGenerator packet_generator_; | 88 UlpfecPacketGenerator packet_generator_; |
82 }; | 89 }; |
83 | 90 |
84 void UlpfecReceiverTest::EncodeFec( | 91 void UlpfecReceiverTest::EncodeFec( |
85 const ForwardErrorCorrection::PacketList& media_packets, | 92 const ForwardErrorCorrection::PacketList& media_packets, |
86 size_t num_fec_packets, | 93 size_t num_fec_packets, |
87 std::list<ForwardErrorCorrection::Packet*>* fec_packets) { | 94 std::list<ForwardErrorCorrection::Packet*>* fec_packets) { |
88 const uint8_t protection_factor = | 95 const uint8_t protection_factor = |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 red_packet->header.header, red_packet->data, | 134 red_packet->header.header, red_packet->data, |
128 red_packet->length, kFecPayloadType)); | 135 red_packet->length, kFecPayloadType)); |
129 } | 136 } |
130 | 137 |
131 void UlpfecReceiverTest::VerifyReconstructedMediaPacket( | 138 void UlpfecReceiverTest::VerifyReconstructedMediaPacket( |
132 const AugmentedPacket& packet, | 139 const AugmentedPacket& packet, |
133 size_t times) { | 140 size_t times) { |
134 // Verify that the content of the reconstructed packet is equal to the | 141 // Verify that the content of the reconstructed packet is equal to the |
135 // content of |packet|, and that the same content is received |times| number | 142 // content of |packet|, and that the same content is received |times| number |
136 // of times in a row. | 143 // of times in a row. |
137 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet.length)) | 144 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, packet.length)) |
138 .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length))) | 145 .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length))) |
139 .Times(times) | 146 .Times(times); |
140 .WillRepeatedly(Return(true)); | |
141 } | 147 } |
142 | 148 |
143 void UlpfecReceiverTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { | 149 void UlpfecReceiverTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
144 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 150 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)); |
145 .WillRepeatedly(Return(true)); | |
146 | 151 |
147 const size_t kNumFecPackets = 1; | 152 const size_t kNumFecPackets = 1; |
148 std::list<AugmentedPacket*> augmented_media_packets; | 153 std::list<AugmentedPacket*> augmented_media_packets; |
149 ForwardErrorCorrection::PacketList media_packets; | 154 ForwardErrorCorrection::PacketList media_packets; |
150 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); | 155 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); |
151 std::list<ForwardErrorCorrection::Packet*> fec_packets; | 156 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
152 EncodeFec(media_packets, kNumFecPackets, &fec_packets); | 157 EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
153 ByteWriter<uint16_t>::WriteBigEndian( | 158 ByteWriter<uint16_t>::WriteBigEndian( |
154 &fec_packets.front()->data[fec_garbage_offset], 0x4711); | 159 &fec_packets.front()->data[fec_garbage_offset], 0x4711); |
155 | 160 |
156 // Inject first media packet, then first FEC packet, skipping the second media | 161 // Inject first media packet, then first FEC packet, skipping the second media |
157 // packet to cause a recovery from the FEC packet. | 162 // packet to cause a recovery from the FEC packet. |
158 BuildAndAddRedMediaPacket(augmented_media_packets.front()); | 163 BuildAndAddRedMediaPacket(augmented_media_packets.front()); |
159 BuildAndAddRedFecPacket(fec_packets.front()); | 164 BuildAndAddRedFecPacket(fec_packets.front()); |
160 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 165 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
161 | 166 |
162 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 167 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
163 EXPECT_EQ(2U, counter.num_packets); | 168 EXPECT_EQ(2U, counter.num_packets); |
164 EXPECT_EQ(1U, counter.num_fec_packets); | 169 EXPECT_EQ(1U, counter.num_fec_packets); |
165 EXPECT_EQ(0U, counter.num_recovered_packets); | 170 EXPECT_EQ(0U, counter.num_recovered_packets); |
166 } | 171 } |
167 | 172 |
168 void UlpfecReceiverTest::SurvivesMaliciousPacket(const uint8_t* data, | 173 void UlpfecReceiverTest::SurvivesMaliciousPacket(const uint8_t* data, |
169 size_t length, | 174 size_t length, |
170 uint8_t ulpfec_payload_type) { | 175 uint8_t ulpfec_payload_type) { |
171 RTPHeader header; | 176 RTPHeader header; |
172 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 177 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
173 ASSERT_TRUE(parser->Parse(data, length, &header)); | 178 ASSERT_TRUE(parser->Parse(data, length, &header)); |
174 | 179 |
175 NullRtpData null_callback; | 180 NullRecoveredPacketReceiver null_callback; |
176 std::unique_ptr<UlpfecReceiver> receiver_fec( | 181 std::unique_ptr<UlpfecReceiver> receiver_fec( |
177 UlpfecReceiver::Create(&null_callback)); | 182 UlpfecReceiver::Create(&null_callback)); |
178 | 183 |
179 receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type); | 184 receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type); |
180 } | 185 } |
181 | 186 |
182 TEST_F(UlpfecReceiverTest, TwoMediaOneFec) { | 187 TEST_F(UlpfecReceiverTest, TwoMediaOneFec) { |
183 constexpr size_t kNumFecPackets = 1u; | 188 constexpr size_t kNumFecPackets = 1u; |
184 std::list<AugmentedPacket*> augmented_media_packets; | 189 std::list<AugmentedPacket*> augmented_media_packets; |
185 ForwardErrorCorrection::PacketList media_packets; | 190 ForwardErrorCorrection::PacketList media_packets; |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 const size_t kNumFecPacketsBatch1 = 1; | 343 const size_t kNumFecPacketsBatch1 = 1; |
339 const size_t kNumMediaPacketsBatch1 = 2; | 344 const size_t kNumMediaPacketsBatch1 = 2; |
340 std::list<AugmentedPacket*> augmented_media_packets_batch1; | 345 std::list<AugmentedPacket*> augmented_media_packets_batch1; |
341 ForwardErrorCorrection::PacketList media_packets_batch1; | 346 ForwardErrorCorrection::PacketList media_packets_batch1; |
342 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, | 347 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
343 &media_packets_batch1); | 348 &media_packets_batch1); |
344 std::list<ForwardErrorCorrection::Packet*> fec_packets; | 349 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
345 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); | 350 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); |
346 | 351 |
347 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); | 352 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); |
348 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 353 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
349 .Times(1) | 354 .Times(1); |
350 .WillRepeatedly(Return(true)); | |
351 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 355 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
352 delayed_fec = fec_packets.front(); | 356 delayed_fec = fec_packets.front(); |
353 | 357 |
354 // Fill the FEC decoder. No packets should be dropped. | 358 // Fill the FEC decoder. No packets should be dropped. |
355 const size_t kNumMediaPacketsBatch2 = 46; | 359 const size_t kNumMediaPacketsBatch2 = 46; |
356 std::list<AugmentedPacket*> augmented_media_packets_batch2; | 360 std::list<AugmentedPacket*> augmented_media_packets_batch2; |
357 ForwardErrorCorrection::PacketList media_packets_batch2; | 361 ForwardErrorCorrection::PacketList media_packets_batch2; |
358 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { | 362 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { |
359 PacketizeFrame(1, i, &augmented_media_packets_batch2, | 363 PacketizeFrame(1, i, &augmented_media_packets_batch2, |
360 &media_packets_batch2); | 364 &media_packets_batch2); |
361 } | 365 } |
362 for (auto it = augmented_media_packets_batch2.begin(); | 366 for (auto it = augmented_media_packets_batch2.begin(); |
363 it != augmented_media_packets_batch2.end(); ++it) { | 367 it != augmented_media_packets_batch2.end(); ++it) { |
364 BuildAndAddRedMediaPacket(*it); | 368 BuildAndAddRedMediaPacket(*it); |
365 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 369 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
366 .Times(1) | 370 .Times(1); |
367 .WillRepeatedly(Return(true)); | |
368 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 371 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
369 } | 372 } |
370 | 373 |
371 // Add the delayed FEC packet. One packet should be reconstructed. | 374 // Add the delayed FEC packet. One packet should be reconstructed. |
372 BuildAndAddRedFecPacket(delayed_fec); | 375 BuildAndAddRedFecPacket(delayed_fec); |
373 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 376 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
374 .Times(1) | 377 .Times(1); |
375 .WillRepeatedly(Return(true)); | |
376 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 378 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
377 } | 379 } |
378 | 380 |
379 TEST_F(UlpfecReceiverTest, PacketDroppedWhenTooOld) { | 381 TEST_F(UlpfecReceiverTest, PacketDroppedWhenTooOld) { |
380 // 1 frame with 2 media packets and one FEC packet. One media packet missing. | 382 // 1 frame with 2 media packets and one FEC packet. One media packet missing. |
381 // Delay the FEC packet. | 383 // Delay the FEC packet. |
382 Packet* delayed_fec = nullptr; | 384 Packet* delayed_fec = nullptr; |
383 const size_t kNumFecPacketsBatch1 = 1; | 385 const size_t kNumFecPacketsBatch1 = 1; |
384 const size_t kNumMediaPacketsBatch1 = 2; | 386 const size_t kNumMediaPacketsBatch1 = 2; |
385 std::list<AugmentedPacket*> augmented_media_packets_batch1; | 387 std::list<AugmentedPacket*> augmented_media_packets_batch1; |
386 ForwardErrorCorrection::PacketList media_packets_batch1; | 388 ForwardErrorCorrection::PacketList media_packets_batch1; |
387 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, | 389 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
388 &media_packets_batch1); | 390 &media_packets_batch1); |
389 std::list<ForwardErrorCorrection::Packet*> fec_packets; | 391 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
390 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); | 392 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); |
391 | 393 |
392 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); | 394 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); |
393 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 395 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
394 .Times(1) | 396 .Times(1); |
395 .WillRepeatedly(Return(true)); | |
396 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 397 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
397 delayed_fec = fec_packets.front(); | 398 delayed_fec = fec_packets.front(); |
398 | 399 |
399 // Fill the FEC decoder and force the last packet to be dropped. | 400 // Fill the FEC decoder and force the last packet to be dropped. |
400 const size_t kNumMediaPacketsBatch2 = 48; | 401 const size_t kNumMediaPacketsBatch2 = 48; |
401 std::list<AugmentedPacket*> augmented_media_packets_batch2; | 402 std::list<AugmentedPacket*> augmented_media_packets_batch2; |
402 ForwardErrorCorrection::PacketList media_packets_batch2; | 403 ForwardErrorCorrection::PacketList media_packets_batch2; |
403 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { | 404 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { |
404 PacketizeFrame(1, i, &augmented_media_packets_batch2, | 405 PacketizeFrame(1, i, &augmented_media_packets_batch2, |
405 &media_packets_batch2); | 406 &media_packets_batch2); |
406 } | 407 } |
407 for (auto it = augmented_media_packets_batch2.begin(); | 408 for (auto it = augmented_media_packets_batch2.begin(); |
408 it != augmented_media_packets_batch2.end(); ++it) { | 409 it != augmented_media_packets_batch2.end(); ++it) { |
409 BuildAndAddRedMediaPacket(*it); | 410 BuildAndAddRedMediaPacket(*it); |
410 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 411 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
411 .Times(1) | 412 .Times(1); |
412 .WillRepeatedly(Return(true)); | |
413 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 413 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
414 } | 414 } |
415 | 415 |
416 // Add the delayed FEC packet. No packet should be reconstructed since the | 416 // Add the delayed FEC packet. No packet should be reconstructed since the |
417 // first media packet of that frame has been dropped due to being too old. | 417 // first media packet of that frame has been dropped due to being too old. |
418 BuildAndAddRedFecPacket(delayed_fec); | 418 BuildAndAddRedFecPacket(delayed_fec); |
419 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)).Times(0); | 419 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)).Times(0); |
420 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 420 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
421 } | 421 } |
422 | 422 |
423 TEST_F(UlpfecReceiverTest, OldFecPacketDropped) { | 423 TEST_F(UlpfecReceiverTest, OldFecPacketDropped) { |
424 // 49 frames with 2 media packets and one FEC packet. All media packets | 424 // 49 frames with 2 media packets and one FEC packet. All media packets |
425 // missing. | 425 // missing. |
426 const size_t kNumMediaPackets = 49 * 2; | 426 const size_t kNumMediaPackets = 49 * 2; |
427 std::list<AugmentedPacket*> augmented_media_packets; | 427 std::list<AugmentedPacket*> augmented_media_packets; |
428 ForwardErrorCorrection::PacketList media_packets; | 428 ForwardErrorCorrection::PacketList media_packets; |
429 for (size_t i = 0; i < kNumMediaPackets / 2; ++i) { | 429 for (size_t i = 0; i < kNumMediaPackets / 2; ++i) { |
430 std::list<AugmentedPacket*> frame_augmented_media_packets; | 430 std::list<AugmentedPacket*> frame_augmented_media_packets; |
431 ForwardErrorCorrection::PacketList frame_media_packets; | 431 ForwardErrorCorrection::PacketList frame_media_packets; |
432 std::list<ForwardErrorCorrection::Packet*> fec_packets; | 432 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
433 PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets); | 433 PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets); |
434 EncodeFec(frame_media_packets, 1, &fec_packets); | 434 EncodeFec(frame_media_packets, 1, &fec_packets); |
435 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { | 435 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { |
436 // Only FEC packets inserted. No packets recoverable at this time. | 436 // Only FEC packets inserted. No packets recoverable at this time. |
437 BuildAndAddRedFecPacket(*it); | 437 BuildAndAddRedFecPacket(*it); |
438 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)).Times(0); | 438 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)).Times(0); |
439 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 439 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
440 } | 440 } |
441 // Move unique_ptr's to media_packets for lifetime management. | 441 // Move unique_ptr's to media_packets for lifetime management. |
442 media_packets.insert(media_packets.end(), | 442 media_packets.insert(media_packets.end(), |
443 std::make_move_iterator(frame_media_packets.begin()), | 443 std::make_move_iterator(frame_media_packets.begin()), |
444 std::make_move_iterator(frame_media_packets.end())); | 444 std::make_move_iterator(frame_media_packets.end())); |
445 augmented_media_packets.insert(augmented_media_packets.end(), | 445 augmented_media_packets.insert(augmented_media_packets.end(), |
446 frame_augmented_media_packets.begin(), | 446 frame_augmented_media_packets.begin(), |
447 frame_augmented_media_packets.end()); | 447 frame_augmented_media_packets.end()); |
448 } | 448 } |
449 // Insert the oldest media packet. The corresponding FEC packet is too old | 449 // Insert the oldest media packet. The corresponding FEC packet is too old |
450 // and should have been dropped. Only the media packet we inserted will be | 450 // and should have been dropped. Only the media packet we inserted will be |
451 // returned. | 451 // returned. |
452 BuildAndAddRedMediaPacket(augmented_media_packets.front()); | 452 BuildAndAddRedMediaPacket(augmented_media_packets.front()); |
453 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 453 EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)) |
454 .Times(1) | 454 .Times(1); |
455 .WillRepeatedly(Return(true)); | |
456 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 455 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
457 } | 456 } |
458 | 457 |
459 TEST_F(UlpfecReceiverTest, TruncatedPacketWithFBitSet) { | 458 TEST_F(UlpfecReceiverTest, TruncatedPacketWithFBitSet) { |
460 const uint8_t kTruncatedPacket[] = {0x80, 0x2a, 0x68, 0x71, 0x29, 0xa1, 0x27, | 459 const uint8_t kTruncatedPacket[] = {0x80, 0x2a, 0x68, 0x71, 0x29, 0xa1, 0x27, |
461 0x3a, 0x29, 0x12, 0x2a, 0x98, 0xe0, 0x29}; | 460 0x3a, 0x29, 0x12, 0x2a, 0x98, 0xe0, 0x29}; |
462 | 461 |
463 SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100); | 462 SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100); |
464 } | 463 } |
465 | 464 |
(...skipping 10 matching lines...) Expand all Loading... |
476 | 475 |
477 TEST_F(UlpfecReceiverTest, TruncatedPacketWithoutDataPastFirstBlock) { | 476 TEST_F(UlpfecReceiverTest, TruncatedPacketWithoutDataPastFirstBlock) { |
478 const uint8_t kPacket[] = { | 477 const uint8_t kPacket[] = { |
479 0x82, 0x38, 0x92, 0x38, 0x92, 0x38, 0xde, 0x2a, 0x11, 0xc8, 0xa3, 0xc4, | 478 0x82, 0x38, 0x92, 0x38, 0x92, 0x38, 0xde, 0x2a, 0x11, 0xc8, 0xa3, 0xc4, |
480 0x82, 0x38, 0x2a, 0x21, 0x2a, 0x28, 0x92, 0x38, 0x92, 0x00, 0x00, 0x0a, | 479 0x82, 0x38, 0x2a, 0x21, 0x2a, 0x28, 0x92, 0x38, 0x92, 0x00, 0x00, 0x0a, |
481 0x3a, 0xc8, 0xa3, 0x3a, 0x27, 0xc4, 0x2a, 0x21, 0x2a, 0x28}; | 480 0x3a, 0xc8, 0xa3, 0x3a, 0x27, 0xc4, 0x2a, 0x21, 0x2a, 0x28}; |
482 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); | 481 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); |
483 } | 482 } |
484 | 483 |
485 } // namespace webrtc | 484 } // namespace webrtc |
OLD | NEW |