| 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 "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" | 11 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" |
| 12 | 12 |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <utility> | 14 #include <utility> |
| 15 | 15 |
| 16 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
| 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 17 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 19 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| 18 | 20 |
| 19 namespace webrtc { | 21 namespace webrtc { |
| 20 namespace test { | 22 namespace test { |
| 21 namespace fec { | 23 namespace fec { |
| 22 | 24 |
| 23 namespace { | 25 namespace { |
| 24 constexpr uint8_t kFecPayloadType = 96; | 26 constexpr uint8_t kFecPayloadType = 96; |
| 25 constexpr uint8_t kRedPayloadType = 97; | 27 constexpr uint8_t kRedPayloadType = 97; |
| 26 constexpr uint8_t kVp8PayloadType = 120; | 28 constexpr uint8_t kVp8PayloadType = 120; |
| 29 |
| 30 constexpr int kPacketTimestampIncrement = 3000; |
| 27 } // namespace | 31 } // namespace |
| 28 | 32 |
| 29 ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets( | 33 ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets( |
| 30 int num_media_packets, | 34 int num_media_packets, |
| 31 uint16_t start_seq_num) { | 35 uint16_t start_seq_num) { |
| 32 RTC_DCHECK_GT(num_media_packets, 0); | 36 RTC_DCHECK_GT(num_media_packets, 0); |
| 33 uint16_t seq_num = start_seq_num; | 37 uint16_t seq_num = start_seq_num; |
| 34 int time_stamp = random_->Rand<int>(); | 38 int time_stamp = random_->Rand<int>(); |
| 35 | 39 |
| 36 ForwardErrorCorrection::PacketList media_packets; | 40 ForwardErrorCorrection::PacketList media_packets; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 | 90 |
| 87 uint16_t MediaPacketGenerator::GetFecSeqNum() { | 91 uint16_t MediaPacketGenerator::GetFecSeqNum() { |
| 88 return fec_seq_num_; | 92 return fec_seq_num_; |
| 89 } | 93 } |
| 90 | 94 |
| 91 AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc) | 95 AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc) |
| 92 : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {} | 96 : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {} |
| 93 | 97 |
| 94 void AugmentedPacketGenerator::NewFrame(size_t num_packets) { | 98 void AugmentedPacketGenerator::NewFrame(size_t num_packets) { |
| 95 num_packets_ = num_packets; | 99 num_packets_ = num_packets; |
| 96 timestamp_ += 3000; | 100 timestamp_ += kPacketTimestampIncrement; |
| 97 } | 101 } |
| 98 | 102 |
| 99 uint16_t AugmentedPacketGenerator::NextPacketSeqNum() { | 103 uint16_t AugmentedPacketGenerator::NextPacketSeqNum() { |
| 100 return ++seq_num_; | 104 return ++seq_num_; |
| 101 } | 105 } |
| 102 | 106 |
| 103 std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket( | 107 std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket( |
| 104 size_t offset, | 108 size_t offset, |
| 105 size_t length) { | 109 size_t length) { |
| 106 std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket()); | 110 std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 126 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, | 130 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, |
| 127 uint8_t* data) { | 131 uint8_t* data) { |
| 128 data[0] = 0x80; // Version 2. | 132 data[0] = 0x80; // Version 2. |
| 129 data[1] = header.payloadType; | 133 data[1] = header.payloadType; |
| 130 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0); | 134 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0); |
| 131 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber); | 135 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber); |
| 132 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp); | 136 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp); |
| 133 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc); | 137 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc); |
| 134 } | 138 } |
| 135 | 139 |
| 140 FlexfecPacketGenerator::FlexfecPacketGenerator(uint32_t media_ssrc, |
| 141 uint32_t flexfec_ssrc) |
| 142 : AugmentedPacketGenerator(media_ssrc), |
| 143 flexfec_ssrc_(flexfec_ssrc), |
| 144 flexfec_seq_num_(0), |
| 145 flexfec_timestamp_(0) {} |
| 146 |
| 147 std::unique_ptr<AugmentedPacket> FlexfecPacketGenerator::BuildFlexfecPacket( |
| 148 const ForwardErrorCorrection::Packet& packet) { |
| 149 RTC_DCHECK_LE(packet.length, |
| 150 static_cast<size_t>(IP_PACKET_SIZE - kRtpHeaderSize)); |
| 151 |
| 152 RTPHeader header; |
| 153 header.sequenceNumber = flexfec_seq_num_; |
| 154 ++flexfec_seq_num_; |
| 155 header.timestamp = flexfec_timestamp_; |
| 156 flexfec_timestamp_ += kPacketTimestampIncrement; |
| 157 header.ssrc = flexfec_ssrc_; |
| 158 |
| 159 std::unique_ptr<AugmentedPacket> packet_with_rtp_header( |
| 160 new AugmentedPacket()); |
| 161 WriteRtpHeader(header, packet_with_rtp_header->data); |
| 162 memcpy(packet_with_rtp_header->data + kRtpHeaderSize, packet.data, |
| 163 packet.length); |
| 164 packet_with_rtp_header->length = kRtpHeaderSize + packet.length; |
| 165 |
| 166 return packet_with_rtp_header; |
| 167 } |
| 168 |
| 136 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) | 169 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) |
| 137 : AugmentedPacketGenerator(ssrc) {} | 170 : AugmentedPacketGenerator(ssrc) {} |
| 138 | 171 |
| 139 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket( | 172 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket( |
| 140 const AugmentedPacket& packet) { | 173 const AugmentedPacket& packet) { |
| 141 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket()); | 174 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket()); |
| 142 | 175 |
| 143 const size_t kHeaderLength = packet.header.header.headerLength; | 176 const size_t kHeaderLength = packet.header.header.headerLength; |
| 144 red_packet->header = packet.header; | 177 red_packet->header = packet.header; |
| 145 red_packet->length = packet.length + 1; // 1 byte RED header. | 178 red_packet->length = packet.length + 1; // 1 byte RED header. |
| 146 memset(red_packet->data, 0, red_packet->length); | |
| 147 // Copy RTP header. | 179 // Copy RTP header. |
| 148 memcpy(red_packet->data, packet.data, kHeaderLength); | 180 memcpy(red_packet->data, packet.data, kHeaderLength); |
| 149 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); | 181 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); |
| 150 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength, | 182 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength, |
| 151 packet.length - kHeaderLength); | 183 packet.length - kHeaderLength); |
| 152 | 184 |
| 153 return red_packet; | 185 return red_packet; |
| 154 } | 186 } |
| 155 | 187 |
| 156 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket( | 188 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 176 red_packet->data[1] &= 0x80; // Reset. | 208 red_packet->data[1] &= 0x80; // Reset. |
| 177 red_packet->data[1] += kRedPayloadType; // Replace. | 209 red_packet->data[1] += kRedPayloadType; // Replace. |
| 178 | 210 |
| 179 // Add RED header, f-bit always 0. | 211 // Add RED header, f-bit always 0. |
| 180 red_packet->data[header_length] = payload_type; | 212 red_packet->data[header_length] = payload_type; |
| 181 } | 213 } |
| 182 | 214 |
| 183 } // namespace fec | 215 } // namespace fec |
| 184 } // namespace test | 216 } // namespace test |
| 185 } // namespace webrtc | 217 } // namespace webrtc |
| OLD | NEW |