From 8d02ea73c0d10b2853cafd9d47e2324549aed1d6 Mon Sep 17 00:00:00 2001 From: brandtr Date: Mon, 3 Oct 2016 23:47:05 -0700 Subject: [PATCH] Add FlexfecPacketGenerator. Helper class for FlexFEC unit tests to come. BUG=webrtc:5654 Review-Url: https://codereview.webrtc.org/2282473002 Cr-Commit-Position: refs/heads/master@{#14487} --- .../rtp_rtcp/source/fec_test_helper.cc | 36 +++++++++++++++++-- .../modules/rtp_rtcp/source/fec_test_helper.h | 16 +++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc index c2d2f9acfb..74406db086 100644 --- a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc +++ b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc @@ -13,6 +13,8 @@ #include #include +#include "webrtc/base/checks.h" +#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "webrtc/modules/rtp_rtcp/source/byte_io.h" #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" @@ -24,6 +26,8 @@ namespace { constexpr uint8_t kFecPayloadType = 96; constexpr uint8_t kRedPayloadType = 97; constexpr uint8_t kVp8PayloadType = 120; + +constexpr int kPacketTimestampIncrement = 3000; } // namespace ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets( @@ -93,7 +97,7 @@ AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc) void AugmentedPacketGenerator::NewFrame(size_t num_packets) { num_packets_ = num_packets; - timestamp_ += 3000; + timestamp_ += kPacketTimestampIncrement; } uint16_t AugmentedPacketGenerator::NextPacketSeqNum() { @@ -133,6 +137,35 @@ void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, ByteWriter::WriteBigEndian(data + 8, header.ssrc); } +FlexfecPacketGenerator::FlexfecPacketGenerator(uint32_t media_ssrc, + uint32_t flexfec_ssrc) + : AugmentedPacketGenerator(media_ssrc), + flexfec_ssrc_(flexfec_ssrc), + flexfec_seq_num_(0), + flexfec_timestamp_(0) {} + +std::unique_ptr FlexfecPacketGenerator::BuildFlexfecPacket( + const ForwardErrorCorrection::Packet& packet) { + RTC_DCHECK_LE(packet.length, + static_cast(IP_PACKET_SIZE - kRtpHeaderSize)); + + RTPHeader header; + header.sequenceNumber = flexfec_seq_num_; + ++flexfec_seq_num_; + header.timestamp = flexfec_timestamp_; + flexfec_timestamp_ += kPacketTimestampIncrement; + header.ssrc = flexfec_ssrc_; + + std::unique_ptr packet_with_rtp_header( + new AugmentedPacket()); + WriteRtpHeader(header, packet_with_rtp_header->data); + memcpy(packet_with_rtp_header->data + kRtpHeaderSize, packet.data, + packet.length); + packet_with_rtp_header->length = kRtpHeaderSize + packet.length; + + return packet_with_rtp_header; +} + UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) : AugmentedPacketGenerator(ssrc) {} @@ -143,7 +176,6 @@ std::unique_ptr UlpfecPacketGenerator::BuildMediaRedPacket( const size_t kHeaderLength = packet.header.header.headerLength; red_packet->header = packet.header; red_packet->length = packet.length + 1; // 1 byte RED header. - memset(red_packet->data, 0, red_packet->length); // Copy RTP header. memcpy(red_packet->data, packet.data, kHeaderLength); SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); diff --git a/webrtc/modules/rtp_rtcp/source/fec_test_helper.h b/webrtc/modules/rtp_rtcp/source/fec_test_helper.h index 36e40652c7..50594ec70e 100644 --- a/webrtc/modules/rtp_rtcp/source/fec_test_helper.h +++ b/webrtc/modules/rtp_rtcp/source/fec_test_helper.h @@ -88,6 +88,22 @@ class AugmentedPacketGenerator { uint32_t timestamp_; }; +// This class generates media and FlexFEC packets for a single frame. +class FlexfecPacketGenerator : public AugmentedPacketGenerator { + public: + FlexfecPacketGenerator(uint32_t media_ssrc, uint32_t flexfec_ssrc); + + // Creates a new AugmentedPacket (with RTP headers) from a + // FlexFEC packet (without RTP headers). + std::unique_ptr BuildFlexfecPacket( + const ForwardErrorCorrection::Packet& packet); + + private: + uint32_t flexfec_ssrc_; + uint16_t flexfec_seq_num_; + uint32_t flexfec_timestamp_; +}; + // This class generates media and ULPFEC packets (both encapsulated in RED) // for a single frame. class UlpfecPacketGenerator : public AugmentedPacketGenerator {