| 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 |