| Index: webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
|
| index 3799c7f0c2dfdf5bf161d4569035fb5e8785ec1e..c2d2f9acfb12be1606754fb72d306ab996fd8368 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
|
| @@ -64,9 +64,8 @@ ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets(
|
| webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8], ssrc_);
|
|
|
| // Generate random values for payload.
|
| - for (size_t j = 12; j < media_packet->length; ++j) {
|
| + for (size_t j = 12; j < media_packet->length; ++j)
|
| media_packet->data[j] = random_->Rand<uint8_t>();
|
| - }
|
| seq_num++;
|
| media_packets.push_back(std::move(media_packet));
|
| }
|
| @@ -89,73 +88,91 @@ uint16_t MediaPacketGenerator::GetFecSeqNum() {
|
| return fec_seq_num_;
|
| }
|
|
|
| -UlpfecPacketGenerator::UlpfecPacketGenerator()
|
| - : num_packets_(0), seq_num_(0), timestamp_(0) {}
|
| +AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc)
|
| + : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {}
|
|
|
| -void UlpfecPacketGenerator::NewFrame(int num_packets) {
|
| +void AugmentedPacketGenerator::NewFrame(size_t num_packets) {
|
| num_packets_ = num_packets;
|
| timestamp_ += 3000;
|
| }
|
|
|
| -uint16_t UlpfecPacketGenerator::NextSeqNum() {
|
| +uint16_t AugmentedPacketGenerator::NextPacketSeqNum() {
|
| return ++seq_num_;
|
| }
|
|
|
| -RawRtpPacket* UlpfecPacketGenerator::NextPacket(int offset, size_t length) {
|
| - RawRtpPacket* rtp_packet = new RawRtpPacket;
|
| +std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket(
|
| + size_t offset,
|
| + size_t length) {
|
| + std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket());
|
| +
|
| for (size_t i = 0; i < length; ++i)
|
| - rtp_packet->data[i + kRtpHeaderSize] = offset + i;
|
| - rtp_packet->length = length + kRtpHeaderSize;
|
| - memset(&rtp_packet->header, 0, sizeof(WebRtcRTPHeader));
|
| - rtp_packet->header.frameType = kVideoFrameDelta;
|
| - rtp_packet->header.header.headerLength = kRtpHeaderSize;
|
| - rtp_packet->header.header.markerBit = (num_packets_ == 1);
|
| - rtp_packet->header.header.sequenceNumber = seq_num_;
|
| - rtp_packet->header.header.timestamp = timestamp_;
|
| - rtp_packet->header.header.payloadType = kVp8PayloadType;
|
| - BuildRtpHeader(rtp_packet->data, &rtp_packet->header.header);
|
| + packet->data[i + kRtpHeaderSize] = offset + i;
|
| + packet->length = length + kRtpHeaderSize;
|
| + memset(&packet->header, 0, sizeof(WebRtcRTPHeader));
|
| + packet->header.frameType = kVideoFrameDelta;
|
| + packet->header.header.headerLength = kRtpHeaderSize;
|
| + packet->header.header.markerBit = (num_packets_ == 1);
|
| + packet->header.header.payloadType = kVp8PayloadType;
|
| + packet->header.header.sequenceNumber = seq_num_;
|
| + packet->header.header.timestamp = timestamp_;
|
| + packet->header.header.ssrc = ssrc_;
|
| + WriteRtpHeader(packet->header.header, packet->data);
|
| ++seq_num_;
|
| --num_packets_;
|
| - return rtp_packet;
|
| +
|
| + return packet;
|
| }
|
|
|
| -// Creates a new RtpPacket with the RED header added to the packet.
|
| -RawRtpPacket* UlpfecPacketGenerator::BuildMediaRedPacket(
|
| - const RawRtpPacket* packet) {
|
| - const size_t kHeaderLength = packet->header.header.headerLength;
|
| - RawRtpPacket* red_packet = new RawRtpPacket;
|
| - red_packet->header = packet->header;
|
| - red_packet->length = packet->length + 1; // 1 byte RED header.
|
| +void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header,
|
| + uint8_t* data) {
|
| + data[0] = 0x80; // Version 2.
|
| + data[1] = header.payloadType;
|
| + data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0);
|
| + ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber);
|
| + ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp);
|
| + ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc);
|
| +}
|
| +
|
| +UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc)
|
| + : AugmentedPacketGenerator(ssrc) {}
|
| +
|
| +std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket(
|
| + const AugmentedPacket& packet) {
|
| + std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket());
|
| +
|
| + 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, red_packet->data[1] & 0x7f, kHeaderLength);
|
| - memcpy(red_packet->data + kHeaderLength + 1, packet->data + kHeaderLength,
|
| - packet->length - kHeaderLength);
|
| + memcpy(red_packet->data, packet.data, kHeaderLength);
|
| + SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get());
|
| + memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength,
|
| + packet.length - kHeaderLength);
|
| +
|
| return red_packet;
|
| }
|
|
|
| -// Creates a new RtpPacket with FEC payload and RED header. Does this by
|
| -// creating a new fake media RtpPacket, clears the marker bit and adds a RED
|
| -// header. Finally replaces the payload with the content of |packet->data|.
|
| -RawRtpPacket* UlpfecPacketGenerator::BuildFecRedPacket(
|
| - const ForwardErrorCorrection::Packet* packet) {
|
| +std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket(
|
| + const ForwardErrorCorrection::Packet& packet) {
|
| // Create a fake media packet to get a correct header. 1 byte RED header.
|
| ++num_packets_;
|
| - RawRtpPacket* red_packet = NextPacket(0, packet->length + 1);
|
| + std::unique_ptr<AugmentedPacket> red_packet =
|
| + NextPacket(0, packet.length + 1);
|
| +
|
| red_packet->data[1] &= ~0x80; // Clear marker bit.
|
| const size_t kHeaderLength = red_packet->header.header.headerLength;
|
| - SetRedHeader(red_packet, kFecPayloadType, kHeaderLength);
|
| - memcpy(red_packet->data + kHeaderLength + 1, packet->data, packet->length);
|
| - red_packet->length = kHeaderLength + 1 + packet->length;
|
| + SetRedHeader(kFecPayloadType, kHeaderLength, red_packet.get());
|
| + memcpy(red_packet->data + kHeaderLength + 1, packet.data, packet.length);
|
| + red_packet->length = kHeaderLength + 1 + packet.length;
|
| +
|
| return red_packet;
|
| }
|
|
|
| -void UlpfecPacketGenerator::SetRedHeader(
|
| - ForwardErrorCorrection::Packet* red_packet,
|
| - uint8_t payload_type,
|
| - size_t header_length) const {
|
| - // Replace pltype.
|
| +void UlpfecPacketGenerator::SetRedHeader(uint8_t payload_type,
|
| + size_t header_length,
|
| + AugmentedPacket* red_packet) {
|
| + // Replace payload type.
|
| red_packet->data[1] &= 0x80; // Reset.
|
| red_packet->data[1] += kRedPayloadType; // Replace.
|
|
|
| @@ -163,16 +180,6 @@ void UlpfecPacketGenerator::SetRedHeader(
|
| red_packet->data[header_length] = payload_type;
|
| }
|
|
|
| -void UlpfecPacketGenerator::BuildRtpHeader(uint8_t* data,
|
| - const RTPHeader* header) {
|
| - data[0] = 0x80; // Version 2.
|
| - data[1] = header->payloadType;
|
| - data[1] |= (header->markerBit ? kRtpMarkerBitMask : 0);
|
| - ByteWriter<uint16_t>::WriteBigEndian(data + 2, header->sequenceNumber);
|
| - ByteWriter<uint32_t>::WriteBigEndian(data + 4, header->timestamp);
|
| - ByteWriter<uint32_t>::WriteBigEndian(data + 8, header->ssrc);
|
| -}
|
| -
|
| } // namespace fec
|
| } // namespace test
|
| } // namespace webrtc
|
|
|