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 |