Index: webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc |
index 1334cb7be2bdff6dc0455c4a30af451c1245d6bc..a95c2cb3b054a804984bb33c82015ac86c4edde6 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc |
@@ -47,15 +47,6 @@ void DeepCopyEveryNthPacket(const ForwardErrorCorrection::PacketList& src, |
using ::testing::Types; |
-// Subclass ForwardErrorCorrection to use gTest typed tests. |
-class UlpfecForwardErrorCorrection : public ForwardErrorCorrection { |
- public: |
- UlpfecForwardErrorCorrection() |
- : ForwardErrorCorrection( |
- std::unique_ptr<FecHeaderReader>(new UlpfecHeaderReader()), |
- std::unique_ptr<FecHeaderWriter>(new UlpfecHeaderWriter())) {} |
-}; |
- |
template <typename ForwardErrorCorrectionType> |
class RtpFecTest : public ::testing::Test { |
protected: |
@@ -100,10 +91,98 @@ class RtpFecTest : public ::testing::Test { |
int fec_loss_mask_[kUlpfecMaxMediaPackets]; |
}; |
+template <typename ForwardErrorCorrectionType> |
+void RtpFecTest<ForwardErrorCorrectionType>::NetworkReceivedPackets( |
+ int* media_loss_mask, |
+ int* fec_loss_mask) { |
+ constexpr bool kFecPacket = true; |
+ ReceivedPackets(media_packets_, media_loss_mask, !kFecPacket); |
+ ReceivedPackets(generated_fec_packets_, fec_loss_mask, kFecPacket); |
+} |
+ |
+template <typename ForwardErrorCorrectionType> |
+template <typename PacketListType> |
+void RtpFecTest<ForwardErrorCorrectionType>::ReceivedPackets( |
+ const PacketListType& packet_list, |
+ int* loss_mask, |
+ bool is_fec) { |
+ uint16_t fec_seq_num = media_packet_generator_.GetFecSeqNum(); |
+ int packet_idx = 0; |
+ |
+ for (const auto& packet : packet_list) { |
+ if (loss_mask[packet_idx] == 0) { |
+ std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( |
+ new ForwardErrorCorrection::ReceivedPacket()); |
+ received_packet->pkt = new ForwardErrorCorrection::Packet(); |
+ received_packet->pkt->length = packet->length; |
+ memcpy(received_packet->pkt->data, packet->data, packet->length); |
+ received_packet->is_fec = is_fec; |
+ if (!is_fec) { |
+ // For media packets, the sequence number and marker bit is |
+ // obtained from RTP header. These were set in ConstructMediaPackets(). |
+ received_packet->seq_num = |
+ ByteReader<uint16_t>::ReadBigEndian(&packet->data[2]); |
+ } else { |
+ // The sequence number, marker bit, and ssrc number are defined in the |
+ // RTP header of the FEC packet, which is not constructed in this test. |
+ // So we set these values below based on the values generated in |
+ // ConstructMediaPackets(). |
+ received_packet->seq_num = fec_seq_num; |
+ // The ssrc value for FEC packets is set to the one used for the |
+ // media packets in ConstructMediaPackets(). |
+ received_packet->ssrc = kMediaSsrc; |
+ } |
+ received_packets_.push_back(std::move(received_packet)); |
+ } |
+ packet_idx++; |
+ // Sequence number of FEC packets are defined as increment by 1 from |
+ // last media packet in frame. |
+ if (is_fec) |
+ fec_seq_num++; |
+ } |
+} |
+ |
+template <typename ForwardErrorCorrectionType> |
+bool RtpFecTest<ForwardErrorCorrectionType>::IsRecoveryComplete() { |
+ // We must have equally many recovered packets as original packets. |
+ if (recovered_packets_.size() != media_packets_.size()) { |
+ return false; |
+ } |
+ |
+ // All recovered packets must be identical to the corresponding |
+ // original packets. |
+ using PacketPtr = std::unique_ptr<ForwardErrorCorrection::Packet>; |
+ using RecoveredPacketPtr = |
+ std::unique_ptr<ForwardErrorCorrection::RecoveredPacket>; |
+ auto cmp = [](const PacketPtr& media_packet, |
+ const RecoveredPacketPtr& recovered_packet) { |
+ if (media_packet->length != recovered_packet->pkt->length) { |
+ return false; |
+ } |
+ if (memcmp(media_packet->data, |
+ recovered_packet->pkt->data, |
+ media_packet->length) != 0) { |
+ return false; |
+ } |
+ return true; |
+ }; |
+ return std::equal(media_packets_.cbegin(), media_packets_.cend(), |
+ recovered_packets_.cbegin(), cmp); |
+} |
+ |
// Define gTest typed test to loop over both ULPFEC and FlexFEC. |
// Since the tests now are parameterized, we need to access |
// member variables using |this|, thereby enforcing runtime |
// resolution. |
+ |
+class UlpfecForwardErrorCorrection : public ForwardErrorCorrection { |
+ public: |
+ UlpfecForwardErrorCorrection() |
+ : ForwardErrorCorrection( |
+ std::unique_ptr<FecHeaderReader>(new UlpfecHeaderReader()), |
+ std::unique_ptr<FecHeaderWriter>(new UlpfecHeaderWriter())) {} |
+}; |
+ |
using FecTypes = Types<UlpfecForwardErrorCorrection>; |
TYPED_TEST_CASE(RtpFecTest, FecTypes); |
@@ -870,83 +949,4 @@ TYPED_TEST(RtpFecTest, FecRecoveryNonConsecutivePacketsWrap) { |
EXPECT_FALSE(this->IsRecoveryComplete()); |
} |
-template <typename ForwardErrorCorrectionType> |
-bool RtpFecTest<ForwardErrorCorrectionType>::IsRecoveryComplete() { |
- // We must have equally many recovered packets as original packets. |
- if (recovered_packets_.size() != media_packets_.size()) { |
- return false; |
- } |
- |
- // All recovered packets must be identical to the corresponding |
- // original packets. |
- using PacketPtr = std::unique_ptr<ForwardErrorCorrection::Packet>; |
- using RecoveredPacketPtr = |
- std::unique_ptr<ForwardErrorCorrection::RecoveredPacket>; |
- auto cmp = [](const PacketPtr& media_packet, |
- const RecoveredPacketPtr& recovered_packet) { |
- if (media_packet->length != recovered_packet->pkt->length) { |
- return false; |
- } |
- if (memcmp(media_packet->data, |
- recovered_packet->pkt->data, |
- media_packet->length) != 0) { |
- return false; |
- } |
- return true; |
- }; |
- return std::equal(media_packets_.cbegin(), media_packets_.cend(), |
- recovered_packets_.cbegin(), cmp); |
-} |
- |
-template <typename ForwardErrorCorrectionType> |
-void RtpFecTest<ForwardErrorCorrectionType>::NetworkReceivedPackets( |
- int* media_loss_mask, |
- int* fec_loss_mask) { |
- constexpr bool kFecPacket = true; |
- ReceivedPackets(media_packets_, media_loss_mask, !kFecPacket); |
- ReceivedPackets(generated_fec_packets_, fec_loss_mask, kFecPacket); |
-} |
- |
-template <typename ForwardErrorCorrectionType> |
-template <typename PacketListType> |
-void RtpFecTest<ForwardErrorCorrectionType>::ReceivedPackets( |
- const PacketListType& packet_list, |
- int* loss_mask, |
- bool is_fec) { |
- uint16_t fec_seq_num = media_packet_generator_.GetFecSeqNum(); |
- int packet_idx = 0; |
- |
- for (const auto& packet : packet_list) { |
- if (loss_mask[packet_idx] == 0) { |
- std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( |
- new ForwardErrorCorrection::ReceivedPacket()); |
- received_packet->pkt = new ForwardErrorCorrection::Packet(); |
- received_packet->pkt->length = packet->length; |
- memcpy(received_packet->pkt->data, packet->data, packet->length); |
- received_packet->is_fec = is_fec; |
- if (!is_fec) { |
- // For media packets, the sequence number and marker bit is |
- // obtained from RTP header. These were set in ConstructMediaPackets(). |
- received_packet->seq_num = |
- ByteReader<uint16_t>::ReadBigEndian(&packet->data[2]); |
- } else { |
- // The sequence number, marker bit, and ssrc number are defined in the |
- // RTP header of the FEC packet, which is not constructed in this test. |
- // So we set these values below based on the values generated in |
- // ConstructMediaPackets(). |
- received_packet->seq_num = fec_seq_num; |
- // The ssrc value for FEC packets is set to the one used for the |
- // media packets in ConstructMediaPackets(). |
- received_packet->ssrc = kMediaSsrc; |
- } |
- received_packets_.push_back(std::move(received_packet)); |
- } |
- packet_idx++; |
- // Sequence number of FEC packets are defined as increment by 1 from |
- // last media packet in frame. |
- if (is_fec) |
- fec_seq_num++; |
- } |
-} |
- |
} // namespace webrtc |