Index: webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc |
index 2efb693a275c4d3f5983e341a06b6f8b18c27582..786abd4518673bc86ee0a1ea2dfd8b1ffac0d415 100644 |
--- a/webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc |
@@ -45,61 +45,32 @@ class ReceiverFecTest : public ::testing::Test { |
receiver_fec_(FecReceiver::Create(&rtp_data_callback_)), |
packet_generator_(kMediaSsrc) {} |
+ // Generates |num_fec_packets| FEC packets, given |media_packets|. |
void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets, |
size_t num_fec_packets, |
- std::list<ForwardErrorCorrection::Packet*>* fec_packets) { |
- uint8_t protection_factor = num_fec_packets * 255 / media_packets.size(); |
- constexpr int kNumImportantPackets = |
- 0; // Irrelevant, since unequal protection is turned off. |
- constexpr bool kUseUnequalProtection = false; |
- constexpr FecMaskType kFecMaskType = kFecMaskBursty; |
- EXPECT_EQ(0, fec_->EncodeFec(media_packets, protection_factor, |
- kNumImportantPackets, kUseUnequalProtection, |
- kFecMaskType, fec_packets)); |
- ASSERT_EQ(num_fec_packets, fec_packets->size()); |
- } |
+ std::list<ForwardErrorCorrection::Packet*>* fec_packets); |
- void GenerateFrame(size_t num_media_packets, |
- size_t frame_offset, |
- std::list<AugmentedPacket*>* augmented_packets, |
- ForwardErrorCorrection::PacketList* media_packets) { |
- packet_generator_.NewFrame(num_media_packets); |
- for (size_t i = 0; i < num_media_packets; ++i) { |
- std::unique_ptr<AugmentedPacket> next_packet( |
- packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10)); |
- augmented_packets->push_back(next_packet.get()); |
- media_packets->push_back(std::move(next_packet)); |
- } |
- } |
+ // Generates |num_media_packets| corresponding to a single frame. |
+ void PacketizeFrame(size_t num_media_packets, |
+ size_t frame_offset, |
+ std::list<AugmentedPacket*>* augmented_packets, |
+ ForwardErrorCorrection::PacketList* packets); |
- void VerifyReconstructedMediaPacket(const AugmentedPacket* packet, |
- size_t times) { |
- // Verify that the content of the reconstructed packet is equal to the |
- // content of |packet|, and that the same content is received |times| number |
- // of times in a row. |
- EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) |
- .With(Args<0, 1>(ElementsAreArray(packet->data, |
- packet->length))) |
- .Times(times).WillRepeatedly(Return(true)); |
- } |
+ // Build a media packet using |packet_generator_| and add it |
+ // to the receiver. |
+ void BuildAndAddRedMediaPacket(AugmentedPacket* packet); |
- void BuildAndAddRedMediaPacket(AugmentedPacket* packet) { |
- std::unique_ptr<AugmentedPacket> red_packet( |
- packet_generator_.BuildMediaRedPacket(*packet)); |
- EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( |
- red_packet->header.header, red_packet->data, |
- red_packet->length, kFecPayloadType)); |
- } |
+ // Build a FEC packet using |packet_generator_| and add it |
+ // to the receiver. |
+ void BuildAndAddRedFecPacket(Packet* packet); |
- void BuildAndAddRedFecPacket(Packet* packet) { |
- std::unique_ptr<AugmentedPacket> red_packet( |
- packet_generator_.BuildUlpfecRedPacket(*packet)); |
- EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( |
- red_packet->header.header, red_packet->data, |
- red_packet->length, kFecPayloadType)); |
- } |
+ // Ensure that |rtp_data_callback_| will be called correctly |
+ // and that the recovered packet will be identical to the lost packet. |
+ void VerifyReconstructedMediaPacket(const AugmentedPacket* packet, |
+ size_t times); |
void InjectGarbagePacketLength(size_t fec_garbage_offset); |
+ |
static void SurvivesMaliciousPacket(const uint8_t* data, |
size_t length, |
uint8_t ulpfec_payload_type); |
@@ -110,30 +81,62 @@ class ReceiverFecTest : public ::testing::Test { |
UlpfecPacketGenerator packet_generator_; |
}; |
-TEST_F(ReceiverFecTest, TwoMediaOneFec) { |
- constexpr size_t kNumFecPackets = 1u; |
- std::list<AugmentedPacket*> augmented_media_packets; |
- ForwardErrorCorrection::PacketList media_packets; |
- GenerateFrame(2, 0, &augmented_media_packets, &media_packets); |
- std::list<ForwardErrorCorrection::Packet*> fec_packets; |
- EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
+void ReceiverFecTest::EncodeFec( |
+ const ForwardErrorCorrection::PacketList& media_packets, |
+ size_t num_fec_packets, |
+ std::list<ForwardErrorCorrection::Packet*>* fec_packets) { |
+ const uint8_t protection_factor = |
+ num_fec_packets * 255 / media_packets.size(); |
+ constexpr int kNumImportantPackets = |
+ 0; // Irrelevant, since unequal protection is turned off. |
philipel
2016/09/05 13:55:58
Move comment to its own line.
brandtr
2016/09/05 14:38:48
Done.
|
+ constexpr bool kUseUnequalProtection = false; |
+ constexpr FecMaskType kFecMaskType = kFecMaskBursty; |
+ EXPECT_EQ( |
+ 0, fec_->EncodeFec(media_packets, protection_factor, kNumImportantPackets, |
+ kUseUnequalProtection, kFecMaskType, fec_packets)); |
+ ASSERT_EQ(num_fec_packets, fec_packets->size()); |
+} |
- // Recovery |
- auto it = augmented_media_packets.begin(); |
- BuildAndAddRedMediaPacket(*it); |
- VerifyReconstructedMediaPacket(*it, 1); |
- EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
- // Drop one media packet. |
- auto fec_it = fec_packets.begin(); |
- BuildAndAddRedFecPacket(*fec_it); |
- ++it; |
- VerifyReconstructedMediaPacket(*it, 1); |
- EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
+void ReceiverFecTest::PacketizeFrame( |
+ size_t num_media_packets, |
+ size_t frame_offset, |
+ std::list<AugmentedPacket*>* augmented_packets, |
+ ForwardErrorCorrection::PacketList* packets) { |
+ packet_generator_.NewFrame(num_media_packets); |
+ for (size_t i = 0; i < num_media_packets; ++i) { |
+ std::unique_ptr<AugmentedPacket> next_packet( |
+ packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10)); |
+ augmented_packets->push_back(next_packet.get()); |
+ packets->push_back(std::move(next_packet)); |
+ } |
+} |
- FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
- EXPECT_EQ(2u, counter.num_packets); |
- EXPECT_EQ(1u, counter.num_fec_packets); |
- EXPECT_EQ(1u, counter.num_recovered_packets); |
+void ReceiverFecTest::BuildAndAddRedMediaPacket(AugmentedPacket* packet) { |
+ std::unique_ptr<AugmentedPacket> red_packet( |
+ packet_generator_.BuildMediaRedPacket(*packet)); |
+ EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( |
+ red_packet->header.header, red_packet->data, |
+ red_packet->length, kFecPayloadType)); |
+} |
+ |
+void ReceiverFecTest::BuildAndAddRedFecPacket(Packet* packet) { |
+ std::unique_ptr<AugmentedPacket> red_packet( |
+ packet_generator_.BuildUlpfecRedPacket(*packet)); |
+ EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( |
+ red_packet->header.header, red_packet->data, |
+ red_packet->length, kFecPayloadType)); |
+} |
+ |
+void ReceiverFecTest::VerifyReconstructedMediaPacket( |
+ const AugmentedPacket* packet, |
+ size_t times) { |
+ // Verify that the content of the reconstructed packet is equal to the |
+ // content of |packet|, and that the same content is received |times| number |
+ // of times in a row. |
+ EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) |
+ .With(Args<0, 1>(ElementsAreArray(packet->data, packet->length))) |
+ .Times(times) |
+ .WillRepeatedly(Return(true)); |
} |
void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
@@ -143,7 +146,7 @@ void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
constexpr size_t kNumFecPackets = 1u; |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
- GenerateFrame(2, 0, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
ByteWriter<uint16_t>::WriteBigEndian( |
@@ -161,6 +164,47 @@ void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
EXPECT_EQ(0u, counter.num_recovered_packets); |
} |
+void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, |
+ size_t length, |
+ uint8_t ulpfec_payload_type) { |
+ webrtc::RTPHeader header; |
+ std::unique_ptr<webrtc::RtpHeaderParser> parser( |
+ webrtc::RtpHeaderParser::Create()); |
+ ASSERT_TRUE(parser->Parse(data, length, &header)); |
+ |
+ webrtc::NullRtpData null_callback; |
+ std::unique_ptr<webrtc::FecReceiver> receiver_fec( |
+ webrtc::FecReceiver::Create(&null_callback)); |
+ |
+ receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type); |
+} |
+ |
+TEST_F(ReceiverFecTest, TwoMediaOneFec) { |
+ constexpr size_t kNumFecPackets = 1u; |
+ std::list<AugmentedPacket*> augmented_media_packets; |
+ ForwardErrorCorrection::PacketList media_packets; |
+ PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); |
+ std::list<ForwardErrorCorrection::Packet*> fec_packets; |
+ EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
+ |
+ // Recovery |
+ auto it = augmented_media_packets.begin(); |
+ BuildAndAddRedMediaPacket(*it); |
+ VerifyReconstructedMediaPacket(*it, 1); |
+ EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
+ // Drop one media packet. |
+ auto fec_it = fec_packets.begin(); |
+ BuildAndAddRedFecPacket(*fec_it); |
+ ++it; |
+ VerifyReconstructedMediaPacket(*it, 1); |
+ EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
+ |
+ FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
+ EXPECT_EQ(2u, counter.num_packets); |
+ EXPECT_EQ(1u, counter.num_fec_packets); |
+ EXPECT_EQ(1u, counter.num_recovered_packets); |
+} |
+ |
TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { |
// Byte offset 8 is the 'length recovery' field of the FEC header. |
InjectGarbagePacketLength(8); |
@@ -176,7 +220,7 @@ TEST_F(ReceiverFecTest, TwoMediaTwoFec) { |
constexpr size_t kNumFecPackets = 2u; |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
- GenerateFrame(2, 0, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
@@ -198,8 +242,8 @@ TEST_F(ReceiverFecTest, TwoFramesOneFec) { |
constexpr size_t kNumFecPackets = 1u; |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
- GenerateFrame(1, 0, &augmented_media_packets, &media_packets); |
- GenerateFrame(1, 1, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(1, 0, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(1, 1, &augmented_media_packets, &media_packets); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
@@ -219,8 +263,8 @@ TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { |
constexpr size_t kNumFecPackets = 1u; |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
- GenerateFrame(1, 0, &augmented_media_packets, &media_packets); |
- GenerateFrame(2, 1, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(1, 0, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(2, 1, &augmented_media_packets, &media_packets); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
@@ -242,7 +286,7 @@ TEST_F(ReceiverFecTest, MaxFramesOneFec) { |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
for (size_t i = 0; i < kNumMediaPackets; ++i) { |
- GenerateFrame(1, i, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(1, i, &augmented_media_packets, &media_packets); |
} |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets, kNumFecPackets, &fec_packets); |
@@ -267,7 +311,7 @@ TEST_F(ReceiverFecTest, TooManyFrames) { |
std::list<AugmentedPacket*> augmented_media_packets; |
ForwardErrorCorrection::PacketList media_packets; |
for (size_t i = 0; i < kNumMediaPackets; ++i) { |
- GenerateFrame(1, i, &augmented_media_packets, &media_packets); |
+ PacketizeFrame(1, i, &augmented_media_packets, &media_packets); |
} |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EXPECT_EQ(-1, fec_->EncodeFec(media_packets, |
@@ -283,8 +327,8 @@ TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { |
constexpr size_t kNumMediaPacketsBatch1 = 2u; |
std::list<AugmentedPacket*> augmented_media_packets_batch1; |
ForwardErrorCorrection::PacketList media_packets_batch1; |
- GenerateFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
- &media_packets_batch1); |
+ PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
+ &media_packets_batch1); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); |
@@ -299,7 +343,8 @@ TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { |
std::list<AugmentedPacket*> augmented_media_packets_batch2; |
ForwardErrorCorrection::PacketList media_packets_batch2; |
for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { |
- GenerateFrame(1, i, &augmented_media_packets_batch2, &media_packets_batch2); |
+ PacketizeFrame(1, i, &augmented_media_packets_batch2, |
+ &media_packets_batch2); |
} |
for (auto it = augmented_media_packets_batch2.begin(); |
it != augmented_media_packets_batch2.end(); ++it) { |
@@ -324,8 +369,8 @@ TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { |
constexpr size_t kNumMediaPacketsBatch1 = 2u; |
std::list<AugmentedPacket*> augmented_media_packets_batch1; |
ForwardErrorCorrection::PacketList media_packets_batch1; |
- GenerateFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
- &media_packets_batch1); |
+ PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, |
+ &media_packets_batch1); |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); |
@@ -340,7 +385,8 @@ TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { |
std::list<AugmentedPacket*> augmented_media_packets_batch2; |
ForwardErrorCorrection::PacketList media_packets_batch2; |
for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { |
- GenerateFrame(1, i, &augmented_media_packets_batch2, &media_packets_batch2); |
+ PacketizeFrame(1, i, &augmented_media_packets_batch2, |
+ &media_packets_batch2); |
} |
for (auto it = augmented_media_packets_batch2.begin(); |
it != augmented_media_packets_batch2.end(); ++it) { |
@@ -368,7 +414,7 @@ TEST_F(ReceiverFecTest, OldFecPacketDropped) { |
std::list<AugmentedPacket*> frame_augmented_media_packets; |
ForwardErrorCorrection::PacketList frame_media_packets; |
std::list<ForwardErrorCorrection::Packet*> fec_packets; |
- GenerateFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets); |
+ PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets); |
EncodeFec(frame_media_packets, 1, &fec_packets); |
for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { |
// Only FEC packets inserted. No packets recoverable at this time. |
@@ -394,21 +440,6 @@ TEST_F(ReceiverFecTest, OldFecPacketDropped) { |
EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
} |
-void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, |
- size_t length, |
- uint8_t ulpfec_payload_type) { |
- webrtc::RTPHeader header; |
- std::unique_ptr<webrtc::RtpHeaderParser> parser( |
- webrtc::RtpHeaderParser::Create()); |
- ASSERT_TRUE(parser->Parse(data, length, &header)); |
- |
- webrtc::NullRtpData null_callback; |
- std::unique_ptr<webrtc::FecReceiver> receiver_fec( |
- webrtc::FecReceiver::Create(&null_callback)); |
- |
- receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type); |
-} |
- |
TEST_F(ReceiverFecTest, TruncatedPacketWithFBitSet) { |
const uint8_t kTruncatedPacket[] = {0x80, |
0x2a, |